ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDQ2NTg5M2QuLmM4N2MyNmYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNiwzICs2LDQgQEAKIC90ZXN0X3NpdGUKIC8uaWRlYQogL2dlcnJpdC1wYXJlbnQuaW1sCisqLnN1YmxpbWUtKgpkaWZmIC0tZ2l0IGEvLmdpdG1vZHVsZXMgYi8uZ2l0bW9kdWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ4M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdG1vZHVsZXMKQEAgLTAsMCArMSwxMSBAQAorW3N1Ym1vZHVsZSAicGx1Z2lucy9yZXBsaWNhdGlvbiJdCisJcGF0aCA9IHBsdWdpbnMvcmVwbGljYXRpb24KKwl1cmwgPSAuLi9wbHVnaW5zL3JlcGxpY2F0aW9uCisKK1tzdWJtb2R1bGUgInBsdWdpbnMvcmV2aWV3bm90ZXMiXQorCXBhdGggPSBwbHVnaW5zL3Jldmlld25vdGVzCisJdXJsID0gLi4vcGx1Z2lucy9yZXZpZXdub3RlcworCitbc3VibW9kdWxlICJwbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IiXQorCXBhdGggPSBwbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IKKwl1cmwgPSAuLi9wbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCmluZGV4IDRjNjRkZmUuLjU5ZGUyMDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogCiBBU0NJSURPQyAgICAgICA/PSBhc2NpaWRvYwogQVNDSUlET0NfRVhUUkEgPz0KK0FTQ0lJRE9DX1ZFUiAgID89IDguNi4zCiBTVk4gICAgICAgICAgICA/PSBzdm4KIFBVQl9ST09UICAgICAgID89IGh0dHBzOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24KIApAQCAtMjMsNiArMjQsMTYgQEAKIAlybSAtZiAqLmh0bWwKIAlybSAtcmYgJChMT0NBTF9ST09UKQogCitBU0NJSURPQ19FWEUgOj0gJChzaGVsbCB3aGljaCAkKEFTQ0lJRE9DKSkKK2lmZXEgKCQod2lsZGNhcmQgJChBU0NJSURPQ19FWEUpKSwpCisgICQoZXJyb3IgJChBU0NJSURPQykgbXVzdCBiZSBhdmFpbGFibGUpCitlbHNlCisgIEFTQ0lJRE9DX09LIDo9ICQoc2hlbGwgZXhwciBgYXNjaWlkb2MgLS12ZXJzaW9uIHwgY3V0IC1mMiAtZCcgJ2AgXD49ICQoQVNDSUlET0NfVkVSKSkKKyAgaWZlcSAoJChBU0NJSURPQ19PSyksMCkKKyAgICAkKGVycm9yICQoQVNDSUlET0MpIHZlcnNpb24gJChBU0NJSURPQ19WRVIpIG9yIGhpZ2hlciBpcyByZXF1aXJlZCkKKyAgZW5kaWYKK2VuZGlmCisKIGlmZXEgKCQob3JpZ2luIFZFUlNJT04pLCB1bmRlZmluZWQpCiAgIFZFUlNJT04gOj0gJChzaGVsbCAuL0dFTi1ET0MtVkVSU0lPTiAyPi9kZXYvbnVsbCkKIGVuZGlmCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY2Vzcy1jb250cm9sLnR4dCBiL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CmluZGV4IDg3OWQxYWMuLjEwMGU0NzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CkBAIC0xNSw2ICsxNSw3IEBACiBpbiB0aGUgYHN5c3RlbV9jb25maWdgIHRhYmxlIHdpdGhpbiB0aGUgZGF0YWJhc2UsIHNvIHRoZSBncm91cHMKIGNhbiBiZSByZW5hbWVkIGFmdGVyIGluc3RhbGxhdGlvbiBpZiBkZXNpcmVkLgogCisKIFtbYWRtaW5pc3RyYXRvcnNdXQogQWRtaW5pc3RyYXRvcnMKIH5+fn5+fn5+fn5+fn5+CkBAIC0zMyw2ICszNCw3IEBACiB0byBwZXJtaXQgYWRtaW5pc3RyYXRpdmUgdXNlcnMgdG8gb3RoZXJ3aXNlIGFjY2VzcyBHZXJyaXQgYXMgYW55CiBvdGhlciBub3JtYWwgdXNlciB3b3VsZCwgd2l0aG91dCBuZWVkaW5nIHR3byBkaWZmZXJlbnQgYWNjb3VudHMuCiAKKwogW1thbm9ueW1vdXNfdXNlcnNdXQogQW5vbnltb3VzIFVzZXJzCiB+fn5+fn5+fn5+fn5+fn4KQEAgLTQ4LDEyICs1MCwxMyBAQAogdG8gZ3JhbnQgYFJlYWRgIGFjY2VzcyB0byB0aGlzIGdyb3VwIGFzIEdlcnJpdCByZXF1aXJlcyBhbiBhY2NvdW50CiBpZGVudGl0eSBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMuCiAKKwogW1tub24taW50ZXJhY3RpdmVfdXNlcnNdXQogTm9uLUludGVyYWN0aXZlIFVzZXJzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogVGhpcyBpcyBhbiBpbnRlcm5hbCB1c2VyIGdyb3VwLCBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAgYXJlIG5vdCBleHBlY3RlZAotdG8gcGVyZm9ybSBpbnRlcmFjdGl2ZSBvcGVyYXRpb25zIG9uIHRoZSBHZXJyaXQgd2ViIGZyb250ZW5kLgordG8gcGVyZm9ybSBpbnRlcmFjdGl2ZSBvcGVyYXRpb25zIG9uIHRoZSBHZXJyaXQgd2ViIGZyb250LWVuZC4KIAogSG93ZXZlciwgc29tZXRpbWVzIHN1Y2ggYSB1c2VyIG1heSBuZWVkIGEgc2VwYXJhdGUgdGhyZWFkIHBvb2wgaW4KIG9yZGVyIHRvIHByZXZlbnQgaXQgZnJvbSBncmFiYmluZyB0aHJlYWRzIGZyb20gdGhlIGludGVyYWN0aXZlIHVzZXJzLgpAQCAtNjMsNiArNjYsNyBAQAogdXNlcnMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBpbnRlcmFjdGl2ZSB1c2VycyBjYW4ga2VlcCB3b3JraW5nIHdoZW4KIHJlc291cmNlcyBhcmUgdGlnaHQuCiAKKwogW1twcm9qZWN0X293bmVyc11dCiBQcm9qZWN0IE93bmVycwogfn5+fn5+fn5+fn5+fn4KQEAgLTgwLDYgKzg0LDcgQEAKIGF2b2lkIHRoZSBuZWVkIHRvIGluaXRpYWxseSBjb25maWd1cmUgYWNjZXNzIHJpZ2h0cyBmb3IKIG5ld2x5IGNyZWF0ZWQgY2hpbGQgcHJvamVjdHMuCiAKKwogW1tyZWdpc3RlcmVkX3VzZXJzXV0KIFJlZ2lzdGVyZWQgVXNlcnMKIH5+fn5+fn5+fn5+fn5+fn4KQEAgLTkzLDcgKzk4LDcgQEAKIGdyb3VwIGlzIHZlcnkgZWFzeS4gIENhdXRpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gYXNzaWduaW5nIGFueQogcGVybWlzc2lvbnMgdG8gdGhpcyBncm91cC4KIAotSXQgaXMgdHlwaWNhbCB0byBhc3NpZ24gYENvZGUgUmV2aWV3IC0xLi4rMWAgdG8gdGhpcyBncm91cCwKK0l0IGlzIHR5cGljYWwgdG8gYXNzaWduIGBDb2RlLVJldmlldyAtMS4uKzFgIHRvIHRoaXMgZ3JvdXAsCiBhbGxvd2luZyBzaWduZWQtaW4gdXNlcnMgdG8gdm90ZSBvbiBhIGNoYW5nZSwgYnV0IG5vdCBhY3R1YWxseQogY2F1c2UgaXQgdG8gYmVjb21lIGFwcHJvdmVkIG9yIHJlamVjdGVkLgogCkBAIC0xMzUsNiArMTQwLDE4IEBACiBgRm9vLWFkbWluYCB0eXBpY2FsbHkgZG8gbm90IG5lZWQgdG8gaGF2ZSBzdWNoIHJpZ2h0cy4KIAogCitbW2xkYXBfZ3JvdXBzXV0KK0xEQVAgR3JvdXBzCistLS0tLS0tLS0tLQorCitMREFQIGdyb3VwcyBhcmUgQWNjb3VudCBHcm91cHMgdGhhdCBhcmUgbWFpbnRhaW5lZCBpbnNpZGUgb2YgeW91cgorTERBUCBpbnN0YW5jZS4gSWYgeW91IGFyZSB1c2luZyBMREFQIHRvIG1hbmFnZSB5b3VyIGdyb3VwcyB0aGV5IHdpbGwKK25vdCBhcHBlYXIgaW4gdGhlIEdyb3VwcyBsaXN0LiBIb3dldmVyIHlvdSBjYW4gdXNlIHRoZW0ganVzdCBsaWtlCityZWd1bGFyIEFjY291bnQgR3JvdXBzIGJ5IHByZWZpeGluZyB5b3VyIGdyb3VwIHdpdGggImxkYXAvIiBpbiB0aGUKK0FjY2VzcyBDb250cm9sIGZvciBhIHByb2plY3QuIEZvciBleGFtcGxlICJsZGFwL2Zvby1wcm9qZWN0IiB3aWxsCithZGQgdGhlIExEQVAgImZvby1wcm9qZWN0IiBncm91cCB0byB0aGUgYWNjZXNzIGxpc3QuCisKKwogUHJvamVjdCBBY2Nlc3MgQ29udHJvbCBMaXN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNDUsMTYgKzE2MiwxNiBAQAogUGVyLXByb2plY3QgYWNjZXNzIGNvbnRyb2wgbGlzdHMgYXJlIGFsc28gc3VwcG9ydGVkLgogCiBVc2VycyBhcmUgcGVybWl0dGVkIHRvIHVzZSB0aGUgbWF4aW11bSByYW5nZSBncmFudGVkIHRvIGFueSBvZiB0aGVpcgotZ3JvdXBzIGluIGFuIGFwcHJvdmFsIGNhdGVnb3J5LiAgRm9yIGV4YW1wbGUsIGEgdXNlciBpcyBhIG1lbWJlciBvZgotYEZvbyBMZWFkc2AsIGFuZCB0aGUgZm9sbG93aW5nIEFDTHMgYXJlIGdyYW50ZWQgb24gYSBwcm9qZWN0OgorZ3JvdXBzIG9uIGEgbGFiZWwuICBGb3IgZXhhbXBsZSwgYSB1c2VyIGlzIGEgbWVtYmVyIG9mIGBGb28gTGVhZHNgLCBhbmQKK3RoZSBmb2xsb3dpbmcgQUNMcyBhcmUgZ3JhbnRlZCBvbiBhIHByb2plY3Q6CiAKIFtvcHRpb25zPSJoZWFkZXIiXQotfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxHcm91cCAgICAgICAgICAgfFJlZmVyZW5jZSBOYW1lIHxDYXRlZ29yeXxSYW5nZQotfEFub255bW91cyBVc2VycyB8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0xLi4rMQotfFJlZ2lzdGVyZWQgVXNlcnN8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0xLi4rMgotfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0yLi4wCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWUgfExhYmVsICAgICAgfFJhbmdlCit8QW5vbnltb3VzIFVzZXJzIHxyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTEuLisxCit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTEuLisyCit8Rm9vIExlYWRzICAgICAgIHxyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTIuLjAKK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlbiB0aGUgZWZmZWN0aXZlIHJhbmdlIHBlcm1pdHRlZCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyIGlzCiBgLTIuLisyYCwgYXMgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb2YgYWxsIHRocmVlIGdyb3VwcyAoc2VlIGFib3ZlCkBAIC0xOTUsMTAgKzIxMiwxMCBAQAogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxHcm91cCAgICAgICAgICAgIHxSZWZlcmVuY2UgTmFtZXxDYXRlZ29yeSAgIHxSYW5nZSAgIHxFeGNsdXNpdmUKLXxSZWdpc3RlcmVkIFVzZXJzIHxyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgIHxyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTIuLisyIHwKLXxRQSBMZWFkcyAgICAgICAgIHxyZWZzL2hlYWRzL3FhIHxDb2RlIFJldmlld3wgLTIuLisyIHwKK3xHcm91cCAgICAgICAgICAgIHxSZWZlcmVuY2UgTmFtZXxMYWJlbCAgICAgIHxSYW5nZSAgIHxFeGNsdXNpdmUKK3xSZWdpc3RlcmVkIFVzZXJzIHxyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgIHxyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTIuLisyIHwKK3xRQSBMZWFkcyAgICAgICAgIHxyZWZzL2hlYWRzL3FhIHxDb2RlLVJldmlld3wgLTIuLisyIHwKIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlbiB0aGUgZWZmZWN0aXZlIHJhbmdlIHBlcm1pdHRlZCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyIGlzCkBAIC0yMTksMzEgKzIzNiwzMiBAQAogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8Q2F0ZWdvcnkgICB8UmFuZ2UgICB8RXhjbHVzaXZlCi18UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUgUmV2aWV3fCAtMi4uKzIgfAotfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8WAorfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8TGFiZWwgICAgICB8UmFuZ2UgICB8RXhjbHVzaXZlCit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUtUmV2aWV3fCAtMi4uKzIgfAorfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8WAogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZW4gdGhpcyB1c2VyIHdpbGwgbm90IGhhdmUgYENvZGUgUmV2aWV3YCByaWdodHMgb24gdGhhdCBjaGFuZ2UsCitUaGVuIHRoaXMgdXNlciB3aWxsIG5vdCBoYXZlIGBDb2RlLVJldmlld2AgcmlnaHRzIG9uIHRoYXQgY2hhbmdlLAogc2luY2UgdGhlcmUgaXMgYW4gZXhjbHVzaXZlIGFjY2VzcyByaWdodCBpbiBwbGFjZSBmb3IgdGhlCiBgcmVmcy9oZWFkcy9xYWAgYnJhbmNoLiBUaGlzIGFsbG93cyBsb2NraW5nIGRvd24gYWNjZXNzIGZvciBhCiBwYXJ0aWN1bGFyIGJyYW5jaCB0byBhIGxpbWl0ZWQgc2V0IG9mIHVzZXJzLCBieXBhc3NpbmcgaW5oZXJpdGVkCiByaWdodHMgYW5kIHdpbGRjYXJkcy4KIAotSW4gb3JkZXIgdG8gZ3JhbnQgdGhlIGFiaWxpdHkgdG8gYENvZGUgUmV2aWV3YCB0byB0aGUgbWVtYmVycyBvZgorSW4gb3JkZXIgdG8gZ3JhbnQgdGhlIGFiaWxpdHkgdG8gYENvZGUtUmV2aWV3YCB0byB0aGUgbWVtYmVycyBvZgogYEZvbyBMZWFkc2AsIGluIGByZWZzL2hlYWRzL3FhYCB0aGVuIHRoZSBmb2xsb3dpbmcgYWNjZXNzIHJpZ2h0cwogd291bGQgYmUgbmVlZGVkOgogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8Q2F0ZWdvcnkgICB8UmFuZ2UgICB8RXhjbHVzaXZlCi18UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUgUmV2aWV3fCAtMi4uKzIgfAotfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8WAotfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8Cit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUtUmV2aWV3fCAtMi4uKzIgfAorfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8WAorfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8CiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorCiBPcGVuSUQgQXV0aGVudGljYXRpb24KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0yNTMsNiArMjcxLDcgQEAKIG9mIGl0cyBPcGVuSUQgaWRlbnRpdGllcyBtYXRjaCBvbmUgb3IgbW9yZSBvZiB0aGUgcGF0dGVybnMgbGlzdGVkCiBpbiB0aGUgYGF1dGgudHJ1c3RlZE9wZW5JRGAgbGlzdCBmcm9tIGBnZXJyaXQuY29uZmlnYC4KIAorCiBBbGwgUHJvamVjdHMKIH5+fn5+fn5+fn5+fgogCkBAIC0yNzIsNiArMjkxLDcgQEAKIGBBZG1pbmlzdHJhdG9yc2AgZG9lcywgYXMgZ3JvdXAgbWVtYmVycyB3b3VsZCBiZSBhYmxlIHRvIGFsdGVyCiBwZXJtaXNzaW9ucyBmb3IgZXZlcnkgbWFuYWdlZCBwcm9qZWN0IGluY2x1ZGluZyBnbG9iYWwgY2FwYWJpbGl0aWVzLgogCisKIFBlci1Qcm9qZWN0CiB+fn5+fn5+fn5+fgogCkBAIC0yODEsMTMgKzMwMSwxMTQgQEAKIGdyYW50aW5nICdERU5ZJyB3aXRoaW4gYSBzcGVjaWZpYyBwcm9qZWN0IHRvIGRlbnkgYSBncm91cCBhY2Nlc3MuCiAKIAotW1thY2Nlc3NfY2F0ZWdvcnldXQorW1tyZWZlcmVuY2VzXV0KK1NwZWNpYWwgYW5kIG1hZ2ljIHJlZmVyZW5jZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlZmVyZW5jZSBuYW1lc3BhY2VzIHVzZWQgaW4gZ2l0IGFyZSBnZW5lcmFsbHkgdHdvLCBvbmUgZm9yIGJyYW5jaGVzIGFuZAorb25lIGZvciB0YWdzOgorCisqICtyZWZzL2hlYWRzLyorCisqICtyZWZzL3RhZ3MvKisKKworSG93ZXZlciwgZXZlcnkgcmVmZXJlbmNlIHVuZGVyICtyZWZzLyorIGlzIHJlYWxseSBhdmFpbGFibGUsIGFuZCBpbiBHZXJyaXQgdGhpcworb3Bwb3J0dW5pdHkgZm9yIGdpdmluZyBvdGhlciByZWZzIGEgc3BlY2lhbCBtZWFuaW5nIGlzIHVzZWQuICBJbiBHZXJyaXQgdGhleQorYXJlIHNvbWV0aW1lcyB1c2VkIGFzIG1hZ2ljL3ZpcnR1YWwgcmVmZXJlbmNlcyB0aGF0IGdpdmUgdGhlIHB1c2ggdG8gR2Vycml0IGEKK3NwZWNpYWwgbWVhbmluZy4KKworCitbW3JlZmVyZW5jZXNfc3BlY2lhbF1dCitTcGVjaWFsIHJlZmVyZW5jZXMKK35+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgc3BlY2lhbCByZWZlcmVuY2VzIGhhdmUgY29udGVudCB0aGF0J3MgZWl0aGVyIGdlbmVyYXRlZCBieSBHZXJyaXQgb3IKK2NvbnRhaW5zIGltcG9ydGFudCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gdGhhdCBHZXJyaXQgbmVlZHMuIFdoZW4gbWFraW5nCitjaGFuZ2VzIHRvIHRoZXNlIHJlZmVyZW5jZXMsIEdlcnJpdCB3aWxsIHRha2UgZXh0cmEgcHJlY2F1dGlvbnMgdG8gdmVyaWZ5IHRoZQorY29udGVudHMgY29tcGF0aWJpbGl0eSBhdCB1cGxvYWQgdGltZS4KKworCityZWZzL2NoYW5nZXMvKgorXl5eXl5eXl5eXl5eXl4KKworVW5kZXIgdGhpcyBuYW1lc3BhY2UgZWFjaCB1cGxvYWRlZCBwYXRjaCBzZXQgZm9yIGV2ZXJ5IGNoYW5nZSBnZXRzIGEgc3RhdGljCityZWZlcmVuY2UgaW4gdGhlaXIgZ2l0LiAgVGhlIGZvcm1hdCBpcyBjb252ZW5pZW50IGJ1dCBzdGlsbCBpbnRlbmRlZCB0byBzY2FsZSB0bworaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIHBhdGNoIHNldHMuICBUbyBhY2Nlc3MgYSBnaXZlbiBwYXRjaCBzZXQgeW91IHdpbGwKK25lZWQgdGhlIGNoYW5nZSBudW1iZXIgYW5kIHBhdGNoIHNldCBudW1iZXIuCisKK1t2ZXJzZV0KKydyZWZzL2NoYW5nZXMvJzxsYXN0IHR3byBkaWdpdHMgb2YgY2hhbmdlIG51bWJlcj4vCisgIDxjaGFuZ2UgbnVtYmVyPi8KKyAgPHBhdGNoIHNldCBudW1iZXI+CisKK1lvdSBjYW4gYWxzbyBmaW5kIHRoZXNlIHN0YXRpYyByZWZlcmVuY2VzIGxpbmtlZCBvbiB0aGUgcGFnZSBvZiBlYWNoIGNoYW5nZS4KKworCityZWZzL21ldGEvY29uZmlnCiteXl5eXl5eXl5eXl5eXl5eCisKK1RoaXMgaXMgd2hlcmUgdGhlIEdlcnJpdCBjb25maWd1cmF0aW9uIG9mIGVhY2ggcHJvamVjdCBpcyByZXNpZGluZy4gIFRoaXMKK2JyYW5jaCBjb250YWlucyBzZXZlcmFsIGZpbGVzIG9mIGltcG9ydGFuY2U6ICtwcm9qZWN0LmNvbmZpZyssICtncm91cHMrIGFuZAorK3J1bGVzLnBsKy4gIFRvcmdldGhlciB0aGV5IGNvbnRyb2wgYWNjZXNzIGFuZCBiZWhhdmlvdXIgZHVyaW5nIHRoZSBjaGFuZ2UKK3JldmlldyBwcm9jZXNzLgorCisKK3JlZnMvbWV0YS9kYXNoYm9hcmRzLyoKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhlcmUncyBhIGRlZGljYXRlZCBwYWdlIHdoZXJlIHlvdSBjYW4gcmVhZCBtb3JlIGFib3V0CitsaW5rOnVzZXItZGFzaGJvYXJkcy5odG1sW1VzZXIgRGFzaGJvYXJkc10uCisKKworcmVmcy9ub3Rlcy9yZXZpZXcKK15eXl5eXl5eXl5eXl5eXl5eCisKK0F1dG9nZW5lcmF0ZWQgY29weSBvZiByZXZpZXcgbm90ZXMgZm9yIGFsbCBjaGFuZ2VzIGluIHRoZSBnaXQuICBFYWNoIGxvZyBlbnRyeQorb24gdGhlIHJlZnMvbm90ZXMvcmV2aWV3IGJyYW5jaCBhbHNvIHJlZmVyZW5jZXMgdGhlIHBhdGNoIHNldCBvbiB3aGljaCB0aGUKK3JldmlldyBpcyBtYWRlLiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSByZXZpZXctbm90ZXMgcGx1Z2luLgorCisKK1tbcmVmZXJlbmNlc19tYWdpY11dCitNYWdpYyByZWZlcmVuY2VzCit+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXNlIGFyZSByZWZlcmVuY2VzIHdpdGggYWRkZWQgZnVuY3Rpb25hbGl0eSB0byB0aGVtIGNvbXBhcmVkIHRvIGEgcmVndWxhcgorZ2l0IHB1c2ggb3BlcmF0aW9uLgorCisKK3JlZnMvZm9yLzxicmFuY2ggcmVmPgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK01vc3QgcHJvbWluZW50IGlzIHRoZSBgcmVmcy9mb3IvPGJyYW5jaCByZWY+YCByZWZlcmVuY2Ugd2hpY2ggaXMgdGhlIHJlZmVyZW5jZQordXBvbiB3aGljaCB3ZSBidWlsZCB0aGUgY29kZSByZXZpZXcgaW50ZXJjZXB0IGJlZm9yZSBzdWJtaXR0aW5nIGEgY29tbWl0IHRvCit0aGUgYnJhbmNoIGl0J3MgdXBsb2FkZWQgdG8uCisKK0Z1cnRoZXIgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gcHVzaCBjYW4gYmUgZm91bmQgb24gdGhlCitsaW5rOnVzZXItdXBsb2FkLmh0bWwjcHVzaF9jcmVhdGVbVXBsb2FkIGNoYW5nZXNdIHBhZ2UuCisKKworcmVmcy9wdWJsaXNoLyoKK15eXl5eXl5eXl5eXl5eCisKK2ByZWZzL3B1Ymxpc2gvKmAgaXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSB0byBgcmVmcy9mb3IvKmAgd2hlbiBwdXNoaW5nIG5ldyBjaGFuZ2VzCithbmQgcGF0Y2ggc2V0cy4KKworCityZWZzL2RyYWZ0cy8qCiteXl5eXl5eXl5eXl5eCisKK1B1c2ggdG8gYHJlZnMvZHJhZnRzLypgIGNyZWF0ZXMgYSBjaGFuZ2UgbGlrZSBwdXNoIHRvIGByZWZzL2Zvci8qYCwgZXhjZXB0IHRoZQorcmVzdWx0aW5nIGNoYW5nZSByZW1haW5zIGhpZGRlbiBmcm9tIHB1YmxpYyByZXZpZXcuICBZb3UgdGhlbiBoYXZlIHRoZSBvcHRpb24KK29mIGFkZGluZyBpbmRpdmlkdWFsIHJldmlld2VycyBiZWZvcmUgbWFraW5nIHRoZSBjaGFuZ2UgcHVibGljIHRvIGFsbC4gIFRoZQorY2hhbmdlIHBhZ2Ugd2lsbCBoYXZlIGEgJ1B1Ymxpc2gnIGJ1dHRvbiB3aGljaCBhbGxvd3MgeW91IHRvIGNvbnZlcnQgaW5kaXZpZHVhbAorZHJhZnQgcGF0Y2ggc2V0cyBvZiBhIGNoYW5nZSBpbnRvIHB1YmxpYyBwYXRjaCBzZXRzIGZvciByZXZpZXcuCisKKworW1thY2Nlc3NfY2F0ZWdvcmllc11dCiBBY2Nlc3MgQ2F0ZWdvcmllcwogLS0tLS0tLS0tLS0tLS0tLS0KIAotR2Vycml0IGNvbWVzIHByZS1jb25maWd1cmVkIHdpdGggc2V2ZXJhbCBkZWZhdWx0IGNhdGVnb3JpZXMgdGhhdAotY2FuIGJlIGdyYW50ZWQgdG8gZ3JvdXBzIHdpdGhpbiBwcm9qZWN0cywgZW5hYmxpbmcgZnVuY3Rpb25hbGl0eQotZm9yIHRoYXQgZ3JvdXAncyBtZW1iZXJzLgorR2Vycml0IGhhcyBzZXZlcmFsIHBlcm1pc3Npb24gY2F0ZWdvcmllcyB0aGF0IGNhbiBiZSBncmFudGVkIHRvIGdyb3Vwcword2l0aGluIHByb2plY3RzLCBlbmFibGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGF0IGdyb3VwJ3MgbWVtYmVycy4KIAogV2l0aCB0aGUgcmVsZWFzZSBvZiB0aGUgR2Vycml0IDIuMi54IHNlcmllcywgdGhlIHdlYiBHVUkgZm9yIEFDTAogY29uZmlndXJhdGlvbiB3YXMgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4gIFVzZSB0aGlzCkBAIC0yOTUsMTU1ICs0MTYsNiBAQAogY29udmVyc2lvbnMgZnJvbSB0aGUgR2Vycml0IDIuMS54IHRvIHRoZSBHZXJyaXQgMi4yLnggc2VyaWVzLgogCiAKLVtbY2F0ZWdvcnlfbGFiZWwtVmVyaWZpZWRdXQotTGFiZWw6IFZlcmlmaWVkCi1+fn5+fn5+fn5+fn5+fn4KLQotVGhlIHZlcmlmaWVkIGNhdGVnb3J5IGlzIG9uZSBvZiB0d28gZGVmYXVsdCBjYXRlZ29yaWVzIHRoYXQgaXMKLWNvbmZpZ3VyZWQgdXBvbiB0aGUgY3JlYXRpb24gb2YgYSBHZXJyaXQgaW5zdGFuY2UuIEl0IG1heSBoYXZlCi1hbnkgbWVhbmluZyB0aGUgcHJvamVjdCBkZXNpcmVzLiAgSXQgd2FzIG9yaWdpbmFsbHkgaW52ZW50ZWQgYnkKLXRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgdG8gbWVhbgotJ2NvbXBpbGVzLCBwYXNzZXMgYmFzaWMgdW5pdCB0ZXN0cycuCi0KLVRoZSByYW5nZSBvZiB2YWx1ZXMgaXM6Ci0KLSogLTEgRmFpbHMKLSsKLVRyaWVkIHRvIGNvbXBpbGUsIGJ1dCBnb3QgYSBjb21waWxlIGVycm9yLCBvciB0cmllZCB0byBydW4gdGVzdHMsCi1idXQgb25lIG9yIG1vcmUgdGVzdHMgZGlkIG5vdCBwYXNzLiAgVGhpcyB2YWx1ZSBpcyB2YWxpZAotYWNyb3NzIGFsbCBwYXRjaCBzZXRzIGluIHRoZSBzYW1lIGNoYW5nZSwgaS5lLiB0aGUgcmV2aWV3ZXIgbXVzdAotYWN0aXZlbHkgY2hhbmdlIGhpcy9oZXIgcmV2aWV3IHRvIHNvbWV0aGluZyBlbHNlIGJlZm9yZSB0aGUgY2hhbmdlCi1pcyBzdWJtaXR0YWJsZS4KLSsKLSpBbnkgLTEgYmxvY2tzIHN1Ym1pdC4qCi0KLSogMCBObyBzY29yZQotKwotRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSB2ZXJpZmljYXRpb24gdGFza3MuCi0KLSogKzEgVmVyaWZpZWQKLSsKLUNvbXBpbGVkIChhbmQgcmFuIHRlc3RzKSBzdWNjZXNzZnVsbHkuCi0rCi0qQW55ICsxIGVuYWJsZXMgc3VibWl0LioKLQotRm9yIGEgY2hhbmdlIHRvIGJlIHN1Ym1pdHRhYmxlLCB0aGUgY2hhbmdlIG11c3QgaGF2ZSBhIGArMSBWZXJpZmllZGAKLWluIHRoaXMgY2F0ZWdvcnkgZnJvbSBhdCBsZWFzdCBvbmUgYXV0aG9yaXplZCB1c2VyLCBhbmQgbm8gYC0xIEZhaWxzYAotZnJvbSBhbiBhdXRob3JpemVkIHVzZXIuICBUaHVzLCBgLTEgRmFpbHNgIGNhbiBibG9jayBhIHN1Ym1pdCwKLXdoaWxlIGArMSBWZXJpZmllZGAgZW5hYmxlcyBhIHN1Ym1pdC4KLQotSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIGRvZXMgbm90IHdpc2ggdG8gdXNlIHRoaXMgY2F0ZWdvcnkgaW4gYW55Ci1wcm9qZWN0LCBpdCBjYW4gYmUgZGVsZXRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLQotPT09PQotICBERUxFVEUgRlJPTSBhcHByb3ZhbF9jYXRlZ29yaWVzICAgICAgV0hFUkUgY2F0ZWdvcnlfaWQgPSAnVlJJRic7Ci0gIERFTEVURSBGUk9NIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcyBXSEVSRSBjYXRlZ29yeV9pZCA9ICdWUklGJzsKLT09PT0KLQotSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIHdhbnRzIHRvIG1vZGlmeSB0aGUgZGVzY3JpcHRpb24gdGV4dAotYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGNhdGVnb3J5IHZhbHVlcywgdGhlIHRleHQgY2FuIGJlIHVwZGF0ZWQKLWluIHRoZSBgbmFtZWAgY29sdW1uIG9mIHRoZSBgY2F0ZWdvcnlfaWQgPSAnVlJJRidgIHJvd3MgaW4gdGhlCi1gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzYCB0YWJsZS4KLQotQWRkaXRpb25hbCB2YWx1ZXMgY291bGQgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGNhdGVnb3J5LCB0byBhbGxvdyBpdAotdG8gYmVoYXZlIG1vcmUgbGlrZSBgQ29kZSBSZXZpZXdgIChiZWxvdykuICBJbnNlcnQgLTIgYW5kICsyIHZhbHVlCi1yb3dzIGludG8gdGhlIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHdpdGggYGNhdGVnb3J5X2lkYCBzZXQgdG8KLWBWUklGYCB0byBnZXQgdGhlIHNhbWUgYmVoYXZpb3IuCi0KLVtOT1RFXQotQSByZXN0YXJ0IGlzIHJlcXVpcmVkIGFmdGVyIG1ha2luZyBkYXRhYmFzZSBjaGFuZ2VzLgotU2VlIDw8cmVzdGFydF9jaGFuZ2VzLGJlbG93Pj4uCi0KLVtbY2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXddXQotTGFiZWw6IENvZGUgUmV2aWV3Ci1+fn5+fn5+fn5+fn5+fn5+fn4KLQotVGhlIGNvZGUgcmV2aWV3IGNhdGVnb3J5IGlzIHRoZSBzZWNvbmQgb2YgdHdvIGRlZmF1bHQgY2F0ZWdvcmllcyB0aGF0Ci1pcyBjb25maWd1cmVkIHVwb24gdGhlIGNyZWF0aW9uIG9mIGEgR2Vycml0IGluc3RhbmNlLiBJdCBtYXkgaGF2ZQotYW55IG1lYW5pbmcgdGhlIHByb2plY3QgZGVzaXJlcy4gIEl0IHdhcyBvcmlnaW5hbGx5IGludmVudGVkIGJ5IHRoZQotQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IHRvIG1lYW4gJ0kgcmVhZCB0aGUgY29kZSBhbmQgaXQgc2VlbXMKLXJlYXNvbmFibHkgY29ycmVjdCcuCi0KLVRoZSByYW5nZSBvZiB2YWx1ZXMgaXM6Ci0KLSogLTIgRG8gbm90IHN1Ym1pdAotKwotVGhlIGNvZGUgaXMgc28gaG9ycmlibHkgaW5jb3JyZWN0L2J1Z2d5L2Jyb2tlbiB0aGF0IGl0IG11c3Qgbm90IGJlCi1zdWJtaXR0ZWQgdG8gdGhpcyBwcm9qZWN0LCBvciB0byB0aGlzIGJyYW5jaC4gIFRoaXMgdmFsdWUgaXMgdmFsaWQKLWFjcm9zcyBhbGwgcGF0Y2ggc2V0cyBpbiB0aGUgc2FtZSBjaGFuZ2UsIGkuZS4gdGhlIHJldmlld2VyIG11c3QKLWFjdGl2ZWx5IGNoYW5nZSBoaXMvaGVyIHJldmlldyB0byBzb21ldGhpbmcgZWxzZSBiZWZvcmUgdGhlIGNoYW5nZQotaXMgc3VibWl0dGFibGUuCi0rCi0qQW55IC0yIGJsb2NrcyBzdWJtaXQuKgotCi0qIC0xIEkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcwotKwotVGhlIGNvZGUgZG9lc24ndCBsb29rIHJpZ2h0LCBvciBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5LCBidXQKLXRoZSByZXZpZXdlciBpcyB3aWxsaW5nIHRvIGxpdmUgd2l0aCBpdCBhcy1pcyBpZiBhbm90aGVyIHJldmlld2VyCi1hY2NlcHRzIGl0LCBwZXJoYXBzIGJlY2F1c2UgaXQgaXMgYmV0dGVyIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgaW4KLXRoZSBwcm9qZWN0LiAgT2Z0ZW4gdGhpcyBpcyBhbHNvIHVzZWQgYnkgY29udHJpYnV0b3JzIHdobyBkb24ndCBsaWtlCi10aGUgY2hhbmdlLCBidXQgYWxzbyBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm9qZWN0IGxvbmctdGVybQotYW5kIHRodXMgZG9uJ3QgaGF2ZSBmaW5hbCBzYXkgb24gY2hhbmdlIHN1Ym1pc3Npb24uCi0rCi1Eb2VzIG5vdCBibG9jayBzdWJtaXQuCi0KLSogMCBObyBzY29yZQotKwotRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSBjb2RlIHJldmlldyB0YXNrLCBvciBnbGFuY2VkIG92ZXIgaXQgYnV0Ci1kb24ndCBoYXZlIGFuIGluZm9ybWVkIG9waW5pb24geWV0LgotCi0qICsxIExvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlCi0rCi1UaGUgY29kZSBsb29rcyByaWdodCB0byB0aGlzIHJldmlld2VyLCBidXQgdGhlIHJldmlld2VyIGRvZXNuJ3QKLWhhdmUgYWNjZXNzIHRvIHRoZSBgKzJgIHZhbHVlIGZvciB0aGlzIGNhdGVnb3J5LiAgT2Z0ZW4gdGhpcyBpcwotdXNlZCBieSBjb250cmlidXRvcnMgdG8gYSBwcm9qZWN0IHdobyB3ZXJlIGFibGUgdG8gcmV2aWV3IHRoZSBjaGFuZ2UKLWFuZCBsaWtlIHdoYXQgaXQgaXMgZG9pbmcsIGJ1dCBkb24ndCBoYXZlIGZpbmFsIGFwcHJvdmFsIG92ZXIgd2hhdAotZ2V0cyBzdWJtaXR0ZWQuCi0KLSogKzIgTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQKLSsKLUJhc2ljYWxseSB0aGUgc2FtZSBhcyBgKzFgLCBidXQgZm9yIHRob3NlIHdobyBoYXZlIGZpbmFsIHNheSBvdmVyCi1ob3cgdGhlIHByb2plY3Qgd2lsbCBkZXZlbG9wLgotKwotKkFueSArMiBlbmFibGVzIHN1Ym1pdC4qCi0KLUZvciBhIGNoYW5nZSB0byBiZSBzdWJtaXR0YWJsZSwgdGhlIGxhdGVzdCBwYXRjaCBzZXQgbXVzdCBoYXZlIGEKLWArMiBMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZGAgaW4gdGhpcyBjYXRlZ29yeSBmcm9tIGF0IGxlYXN0IG9uZQotYXV0aG9yaXplZCB1c2VyLCBhbmQgbm8gYC0yIERvIG5vdCBzdWJtaXRgIGZyb20gYW4gYXV0aG9yaXplZCB1c2VyLgotVGh1cyBgLTJgIG9uIGFueSBwYXRjaCBzZXQgY2FuIGJsb2NrIGEgc3VibWl0LCB3aGlsZSBgKzJgIG9uIHRoZQotbGF0ZXN0IHBhdGNoIHNldCBjYW4gZW5hYmxlIGl0LgotCi1JZiBhIEdlcnJpdCBpbnN0YWxsYXRpb24gZG9lcyBub3Qgd2lzaCB0byB1c2UgdGhpcyBjYXRlZ29yeSBpbiBhbnkKLXByb2plY3QsIGl0IGNhbiBiZSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlOgotCi09PT09Ci0gIERFTEVURSBGUk9NIGFwcHJvdmFsX2NhdGVnb3JpZXMgICAgICBXSEVSRSBjYXRlZ29yeV9pZCA9ICdDUlZXJzsKLSAgREVMRVRFIEZST00gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzIFdIRVJFIGNhdGVnb3J5X2lkID0gJ0NSVlcnOwotPT09PQotCi1JZiBhIEdlcnJpdCBpbnN0YWxsYXRpb24gd2FudHMgdG8gbW9kaWZ5IHRoZSBkZXNjcmlwdGlvbiB0ZXh0Ci1hc3NvY2lhdGVkIHdpdGggdGhlc2UgY2F0ZWdvcnkgdmFsdWVzLCB0aGUgdGV4dCBjYW4gYmUgdXBkYXRlZAotaW4gdGhlIGBuYW1lYCBjb2x1bW4gb2YgdGhlIGBjYXRlZ29yeV9pZCA9ICdDUlZXJ2Agcm93cyBpbiB0aGUKLWBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHRhYmxlLgotCi1BZGRpdGlvbmFsIHZhbHVlcyBjb3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgCi10byBmdXJ0aGVyIGV4dGVuZCB0aGUgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHJhbmdlLCBidXQgdGhlcmUgaXMKLWxpa2VseSBsaXR0bGUgdmFsdWUgaW4gZG9pbmcgc28gYXMgdGhpcyBvbmx5IGV4cGFuZHMgdGhlIG1pZGRsZQotcmVnaW9uLiAgVGhpcyBjYXRlZ29yeSBpcyBhIGBNYXhXaXRoQmxvY2tgIHR5cGUsIHdoaWNoIG1lYW5zIHRoYXQKLXRoZSBsb3dlc3QgbmVnYXRpdmUgdmFsdWUgaWYgcHJlc2VudCBibG9ja3MgYSBzdWJtaXQsIHdoaWxlIHRoZQotaGlnaGVzdCBwb3NpdGl2ZSB2YWx1ZSBpcyByZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgotCi1bW2Z1bmN0aW9uX01heE5vQmxvY2tdXQotVGhlcmUgaXMgYWxzbyBhIGBNYXhOb0Jsb2NrYCBjYXRlZ29yeSB3aGljaCBzdGlsbCByZXF1aXJlcyB0aGUKLWhpZ2hlc3QgcG9zaXRpdmUgdmFsdWUgdG8gc3VibWl0LCBidXQgdGhlIGxvd2VzdCBuZWdhdGl2ZSB2YWx1ZSB3aWxsCi1ub3QgYmxvY2sgdGhlIGNoYW5nZSwgYW5kIGRvZXMgbm90IGNhcnJ5IG92ZXIgYmV0d2VlbiBwYXRjaCBzZXRzLgotVGhpcyBsZXZlbCBpcyBtb3N0bHkgdXNlZnVsIGZvciBhdXRvbWF0ZWQgY29kZS1yZXZpZXdzIHRoYXQgbWF5Ci1oYXZlIGZhbHNlLW5lZ2F0aXZlcyB0aGF0IHNob3VsZG4ndCBibG9jayB0aGUgY2hhbmdlLgotCi1bTk9URV0KLUEgcmVzdGFydCBpcyByZXF1aXJlZCBhZnRlciBtYWtpbmcgZGF0YWJhc2UgY2hhbmdlcy4KLVNlZSA8PHJlc3RhcnRfY2hhbmdlcyxiZWxvdz4+LgotCiBbW2NhdGVnb3J5X2FiYW5kb25dXQogQWJhbmRvbgogfn5+fn5+fgpAQCAtNDU1LDYgKzQyNyw3IEBACiBUaGlzIGFsc28gZ3JhbnRzIHRoZSBwZXJtaXNzaW9uIHRvIHJlc3RvcmUgYSBjaGFuZ2UgaWYgdGhlIGNoYW5nZQogY2FuIGJlIHVwbG9hZGVkLgogCisKIFtbY2F0ZWdvcnlfY3JlYXRlXV0KIENyZWF0ZSByZWZlcmVuY2UKIH5+fn5+fn5+fn5+fn5+fn4KQEAgLTU2Miw3ICs1MzUsNyBAQAogT3duZXJzaGlwIG92ZXIgYSBwYXJ0aWN1bGFyIGJyYW5jaCBzdWJzcGFjZSBtYXkgYmUgZGVsZWdhdGVkIGJ5CiBlbnRlcmluZyBhIGJyYW5jaCBwYXR0ZXJuLiAgVG8gZGVsZWdhdGUgY29udHJvbCBvdmVyIGFsbCBicmFuY2hlcwogdGhhdCBiZWdpbiB3aXRoIGBxYS9gIHRvIHRoZSBRQSBncm91cCwgYWRkIGBPd25lcmAgY2F0ZWdvcnkKLWZvciByZWZlcmVuY2UgYHJlZnMvaGVhZHMvcWEvXCpgLiAgTWVtYmVycyBvZiB0aGUgUUEgZ3JvdXAgY2FuCitmb3IgcmVmZXJlbmNlIGByZWZzL2hlYWRzL3FhLypgLiAgTWVtYmVycyBvZiB0aGUgUUEgZ3JvdXAgY2FuCiBmdXJ0aGVyIHJlZmluZSBhY2Nlc3MsIGJ1dCBvbmx5IGZvciByZWZlcmVuY2VzIHRoYXQgYmVnaW4gd2l0aAogYHJlZnMvaGVhZHMvcWEvYC4gU2VlIDw8cHJvamVjdF9vd25lcnMscHJvamVjdCBvd25lcnM+PiB0byBmaW5kCiBvdXQgbW9yZSBhYm91dCB0aGlzIHJvbGUuCkBAIC01ODUsNyArNTU4LDcgQEAKIF5eXl5eXl5eXl5eCiAKIEFueSBleGlzdGluZyBicmFuY2ggY2FuIGJlIGZhc3QtZm9yd2FyZGVkIHRvIGEgbmV3IGNvbW1pdC4KLUNyZWF0aW9uIG9mIG5ldyBicmFuY2hlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAKK0NyZWF0aW9uIG9mIG5ldyBicmFuY2hlcyBpcyBjb250cm9sbGVkIGJ5IHRoZQogbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X2NyZWF0ZVsnQ3JlYXRlIFJlZmVyZW5jZSddCiBjYXRlZ29yeS4gIERlbGV0aW9uIG9mIGV4aXN0aW5nIGJyYW5jaGVzIGlzIHJlamVjdGVkLiAgVGhpcyBpcyB0aGUKIHNhZmVzdCBtb2RlIGFzIGNvbW1pdHMgY2Fubm90IGJlIGRpc2NhcmRlZC4KQEAgLTYzNCw3ICs2MDcsNyBAQAogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogVGhlIGBQdXNoIE1lcmdlIENvbW1pdGAgYWNjZXNzIHJpZ2h0IHBlcm1pdHMgdGhlIHVzZXIgdG8gdXBsb2FkIG1lcmdlCi1jb21taXRzLiAgSXQncyBhbiBhZGRvbiB0byB0aGUgPDxjYXRlZ29yeV9wdXNoLFB1c2g+PiBhY2Nlc3MgcmlnaHQsIGFuZAorY29tbWl0cy4gIEl0J3MgYW4gYWRkLW9uIHRvIHRoZSA8PGNhdGVnb3J5X3B1c2gsUHVzaD4+IGFjY2VzcyByaWdodCwgYW5kCiBzbyBpdCB3b24ndCBiZSBzdWZmaWNpZW50IHdpdGggb25seSBgUHVzaCBNZXJnZSBDb21taXRgIGdyYW50ZWQgZm9yIGEKIHB1c2ggdG8gaGFwcGVuLiAgU29tZSBwcm9qZWN0cyB3aXNoIHRvIHJlc3RyaWN0IG1lcmdlcyB0byBiZWluZyBjcmVhdGVkCiBieSBHZXJyaXQuIEJ5IGdyYW50aW5nIGBQdXNoYCB3aXRob3V0IGBQdXNoIE1lcmdlIENvbW1pdGAsIHRoZSBvbmx5CkBAIC02NDcsMjAgKzYyMCwyNyBAQAogdGhlIGludGVudGlvbiBvZiB0aGUgYFB1c2ggTWVyZ2UgQ29tbWl0YCBlbnRyeSBpcyB0byBhbGxvdyBkaXJlY3QgcHVzaGVzCiBvZiBtZXJnZSBjb21taXRzLgogCisKIFtbY2F0ZWdvcnlfcHVzaF9hbm5vdGF0ZWRdXQogUHVzaCBBbm5vdGF0ZWQgVGFnCiB+fn5+fn5+fn5+fn5+fn5+fn4KIAotVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYW4gYW5ub3RhdGVkIHRhZyBvYmplY3Qgb3ZlcgotU1NIIGludG8gdGhlIHByb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZQotd2l0aCBhIGNvbW1hbmQgbGluZSBzdWNoIGFzOgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYW4gYW5ub3RhdGVkIHRhZyBvYmplY3QgaW50byB0aGUKK3Byb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGEgY29tbWFuZCBsaW5lCitzdWNoIGFzOgogCiA9PT09CiAgIGdpdCBwdXNoIHNzaDovL1VTRVJASE9TVDpQT1JUL1BST0pFQ1QgdGFnIHYxLjAKID09PT0KIAotVGFncyBtdXN0IGJlIGFubm90YXRlZCAoY3JlYXRlZCB3aXRoIGBnaXQgdGFnIC1hYCBvciBgZ2l0IHRhZyAtc2ApLAotc2hvdWxkIGV4aXN0IGluIHRoZSBgcmVmcy90YWdzL2AgbmFtZXNwYWNlLCBhbmQgc2hvdWxkIGJlIG5ldy4KK09yOgorCis9PT09CisgIGdpdCBwdXNoIGh0dHBzOi8vSE9TVC9QUk9KRUNUIHRhZyB2MS4wCis9PT09CisKK1RhZ3MgbXVzdCBiZSBhbm5vdGF0ZWQgKGNyZWF0ZWQgd2l0aCBgZ2l0IHRhZyAtYWApLCBzaG91bGQgZXhpc3QgaW4KK3RoZSBgcmVmcy90YWdzL2AgbmFtZXNwYWNlLCBhbmQgc2hvdWxkIGJlIG5ldy4KIAogVGhpcyBjYXRlZ29yeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHB1Ymxpc2ggdGFncyB3aGVuIGEgcHJvamVjdAogcmVhY2hlcyBhIHN0YWJsZSByZWxlYXNlIHBvaW50IHdvcnRoIHJlbWVtYmVyaW5nIGluIGhpc3RvcnkuCkBAIC02ODIsNiArNjYyLDI4IEBACiByZXF1aXJlcyB0aGUgc2FtZSBwZXJtaXNzaW9uIGFzIGRlbGV0aW5nIGEgYnJhbmNoLgogCiAKK1tbY2F0ZWdvcnlfcHVzaF9zaWduZWRdXQorUHVzaCBTaWduZWQgVGFnCit+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYSBQR1Agc2lnbmVkIHRhZyBvYmplY3QgaW50byB0aGUKK3Byb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGEgY29tbWFuZAorbGluZSBzdWNoIGFzOgorCis9PT09CisgIGdpdCBwdXNoIHNzaDovL1VTRVJASE9TVDpQT1JUL1BST0pFQ1QgdGFnIHYxLjAKKz09PT0KKworT3I6CisKKz09PT0KKyAgZ2l0IHB1c2ggaHR0cHM6Ly9IT1NUL1BST0pFQ1QgdGFnIHYxLjAKKz09PT0KKworVGFncyBtdXN0IGJlIHNpZ25lZCAoY3JlYXRlZCB3aXRoIGBnaXQgdGFnIC1zYCksIHNob3VsZCBleGlzdCBpbiB0aGUKK2ByZWZzL3RhZ3MvYCBuYW1lc3BhY2UsIGFuZCBzaG91bGQgYmUgbmV3LgorCisKIFtbY2F0ZWdvcnlfcmVhZF1dCiBSZWFkCiB+fn5+CkBAIC03MjksNiArNzMxLDM1IEBACiBwYXRjaCBzZXQuCiAKIAorW1tjYXRlZ29yeV9yZW1vdmVfcmV2aWV3ZXJdXQorUmVtb3ZlIFJldmlld2VyCit+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHJlbW92ZSBvdGhlciB1c2VycyBmcm9tIHRoZSBsaXN0IG9mCityZXZpZXdlcnMgb24gYSBjaGFuZ2UuCisKK1RoZSBjaGFuZ2Ugb3duZXIsIHByb2plY3Qgb3duZXIgYW5kIHNpdGUgYWRtaW5pc3RyYXRvciBjYW4gYWx3YXlzCityZW1vdmUgcmV2aWV3ZXJzIChldmVuIHdpdGhvdXQgaGF2aW5nIHRoZSBgUmVtb3ZlIFJldmlld2VyYCBhY2Nlc3MKK3JpZ2h0IGFzc2lnbmVkKS4KKworVXNlcnMgd2l0aG91dCB0aGlzIGFjY2VzcyByaWdodCBjYW4gb25seSByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZQorcmV2aWV3ZXIgbGlzdCBvbiBhIGNoYW5nZS4KKworCitbW2NhdGVnb3J5X3Jldmlld19sYWJlbHNdXQorUmV2aWV3IExhYmVscworfn5+fn5+fn5+fn5+fgorCitGb3IgZXZlcnkgY29uZmlndXJlZCBsYWJlbCBgTXktTmFtZWAgaW4gdGhlIHByb2plY3QsIHRoZXJlIGlzIGEKK2NvcnJlc3BvbmRpbmcgcGVybWlzc2lvbiBgbGFiZWwtTXktTmFtZWAgd2l0aCBhIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8KK3RoZSBkZWZpbmVkIHZhbHVlcy4KKworR2Vycml0IGNvbWVzIHByZS1jb25maWd1cmVkIHdpdGggYSBkZWZhdWx0ICdDb2RlLVJldmlldycgbGFiZWwgdGhhdCBjYW4KK2JlIGdyYW50ZWQgdG8gZ3JvdXBzIHdpdGhpbiBwcm9qZWN0cywgZW5hYmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgdGhhdAorZ3JvdXAncyBtZW1iZXJzLiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbFtDdXN0b20gbGFiZWxzXSBtYXkgYWxzbyBiZQorZGVmaW5lZCBnbG9iYWxseSBvciBvbiBhIHBlci1wcm9qZWN0IGJhc2lzLgorCisKIFtbY2F0ZWdvcnlfc3VibWl0XV0KIFN1Ym1pdAogfn5+fn5+CkBAIC03NDAsODUgKzc3MSw1NSBAQAogYnJhbmNoIGFzIHNvb24gYXMgcG9zc2libGUsIG1ha2luZyBpdCBhIHBlcm1hbmVudCBwYXJ0IG9mIHRoZQogcHJvamVjdCdzIGhpc3RvcnkuCiAKLUluIG9yZGVyIHRvIHN1Ym1pdCwgYWxsIGFwcHJvdmFsIGNhdGVnb3JpZXMgKHN1Y2ggYXMgYFZlcmlmaWVkYCBhbmQKLWBDb2RlIFJldmlld2AsIGFib3ZlKSBtdXN0IGVuYWJsZSBzdWJtaXQsIGFuZCBhbHNvIG11c3Qgbm90IGJsb2NrIGl0LgotU2VlIGFib3ZlIGZvciBkZXRhaWxzIG9uIGVhY2ggY2F0ZWdvcnkuCitJbiBvcmRlciB0byBzdWJtaXQsIGFsbCBsYWJlbHMgKHN1Y2ggYXMgYFZlcmlmaWVkYCBhbmQgYENvZGUtUmV2aWV3YCwKK2Fib3ZlKSBtdXN0IGVuYWJsZSBzdWJtaXQsIGFuZCBhbHNvIG11c3Qgbm90IGJsb2NrIGl0LiAgU2VlIGFib3ZlIGZvcgorZGV0YWlscyBvbiBlYWNoIGxhYmVsLgogCiAKLVtbY2F0ZWdvcnlfbWFrZW9uZXVwXV0KLVlvdXIgQ2F0ZWdvcnkgSGVyZQotfn5+fn5+fn5+fn5+fn5+fn5+CitbW2NhdGVnb3J5X3ZpZXdfZHJhZnRzXV0KK1ZpZXcgRHJhZnRzCit+fn5+fn5+fn5+fgogCi1HZXJyaXQgYWRtaW5pc3RyYXRvcnMgY2FuIGFsc28gbWFrZSB1cCB0aGVpciBvd24gY2F0ZWdvcmllcy4KK1RoaXMgY2F0ZWdvcnkgcGVybWl0cyB1c2VycyB0byB2aWV3IGRyYWZ0IGNoYW5nZXMgdXBsb2FkZWQgYnkgb3RoZXIKK3VzZXJzLgogCi1TZWUgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucyBvZiBob3cgPDxjYXRlZ29yeV92ZXJpZmllZCxgVmVyaWZpZWRgPj4KLWFuZCA8PGNhdGVnb3J5X3JldmlldyxgQ29kZSBSZXZpZXdgPj4gd29yaywgYW5kIGluc2VydCB5b3VyIG93bgotY2F0ZWdvcnkgd2l0aCBgZnVuY3Rpb25fbmFtZSA9ICdNYXhXaXRoQmxvY2snYCB0byBnZXQgdGhlIHNhbWUKLWJlaGF2aW9yIG92ZXIgeW91ciBvd24gcmFuZ2Ugb2YgdmFsdWVzLCBpbiBhbnkgY2F0ZWdvcnkgeW91IGRlc2lyZS4KK1RoZSBjaGFuZ2Ugb3duZXIgYW5kIGFueSBleHBsaWNpdGx5IGFkZGVkIHJldmlld2VycyBjYW4gYWx3YXlzIHNlZQorZHJhZnQgY2hhbmdlcyAoZXZlbiB3aXRob3V0IGhhdmluZyB0aGUgYFZpZXcgRHJhZnRzYCBhY2Nlc3MgcmlnaHQKK2Fzc2lnbmVkKS4KIAotRW5zdXJlIGBjYXRlZ29yeV9pZGAgaXMgdW5pcXVlIHdpdGhpbiB5b3VyIGBhcHByb3ZhbF9jYXRlZ29yaWVzYAotdGFibGUuICBUaGUgZGVmYXVsdCB2YWx1ZXMgYFZSSUZgIGFuZCBgQ1ZSRmAgdXNlZCBmb3IgdGhlIGNhdGVnb3JpZXMKLWRlc2NyaWJlZCBhYm92ZSBhcmUgc2ltcGx5IHRoYXQsIGRlZmF1bHRzLCBhbmQgaGF2ZSBubyBzcGVjaWFsCi1tZWFuaW5nIHRvIEdlcnJpdC4KIAotVGhlIGBwb3NpdGlvbmAgY29sdW1uIG9mIGBhcHByb3ZhbF9jYXRlZ29yaWVzYCBjb250cm9scyB3aGljaCBjb2x1bW4KLW9mIHRoZSAnQXBwcm92YWxzJyB0YWJsZSB0aGUgY2F0ZWdvcnkgYXBwZWFycyBpbiwgcHJvdmlkaW5nIHNvbWUKLWxheW91dCBjb250cm9sIHRvIHRoZSBhZG1pbmlzdHJhdG9yLgorW1tjYXRlZ29yeV9wdWJsaXNoX2RyYWZ0c11dCitQdWJsaXNoIERyYWZ0cworfn5+fn5+fn5+fn5+fn4KIAotQWxsIGBNYXhXaXRoQmxvY2tgIGNhdGVnb3JpZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3NpdGl2ZSB2YWx1ZQotaW4gdGhlIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHRhYmxlLCBvciBlbHNlIHN1Ym1pdCB3aWxsIG5ldmVyCi1iZSBlbmFibGVkLgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1Ymxpc2ggZHJhZnQgY2hhbmdlcyB1cGxvYWRlZCBieSBvdGhlcgordXNlcnMuCiAKLVRvIHBlcm1pdCBibG9ja2luZyBzdWJtaXRzLCBlbnN1cmUgYSBuZWdhdGl2ZSB2YWx1ZSBpcyBkZWZpbmVkIGZvcgoteW91ciBuZXcgY2F0ZWdvcnkuICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gaGF2ZSBhIGJsb2NraW5nIHN1Ym1pdAotbGV2ZWwgZm9yIHlvdXIgY2F0ZWdvcnksIGRvIG5vdCBkZWZpbmUgdmFsdWVzIGxlc3MgdGhhbiAwLgorVGhlIGNoYW5nZSBvd25lciBjYW4gYWx3YXlzIHB1Ymxpc2ggZHJhZnQgY2hhbmdlcyAoZXZlbiB3aXRob3V0IGhhdmluZwordGhlIGBQdWJsaXNoIERyYWZ0c2AgYWNjZXNzIHJpZ2h0IGFzc2lnbmVkKS4KIAotS2VlcCBpbiBtaW5kIHRoYXQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgYXJlIGN1cnJlbnRseSBnbG9iYWwgdG8KLXRoZSBlbnRpcmUgR2Vycml0IGluc3RhbmNlLCBhbmQgYWZmZWN0IGFsbCBwcm9qZWN0cyBob3N0ZWQgb24gaXQuCi1BbnkgY2hhbmdlIHRvIGEgY2F0ZWdvcnkgZGVmaW5pdGlvbiBhZmZlY3RzIGV2ZXJ5b25lLgogCi1Gb3IgZXhhbXBsZSwgdG8gZGVmaW5lIGEgbmV3IDMtdmFsdWVkIGNhdGVnb3J5IHRoYXQgYmVoYXZlcyBleGFjdGx5Ci1saWtlIGBWZXJpZmllZGAsIGJ1dCBoYXMgZGlmZmVyZW50IG5hbWVzL2xhYmVsczoKK1tbY2F0ZWdvcnlfZGVsZXRlX2RyYWZ0c11dCitEZWxldGUgRHJhZnRzCit+fn5+fn5+fn5+fn5+CiAKLT09PT0KLSAgSU5TRVJUIElOVE8gYXBwcm92YWxfY2F0ZWdvcmllcwotICAgIChuYW1lCi0gICAgLHBvc2l0aW9uCi0gICAgLGZ1bmN0aW9uX25hbWUKLSAgICAsY2F0ZWdvcnlfaWQpCi0gIFZBTFVFUwotICAgICgnQ29weXJpZ2h0IENoZWNrJwotICAgICwzCi0gICAgLCdNYXhXaXRoQmxvY2snCi0gICAgLCdjb3B5Jyk7CitUaGlzIGNhdGVnb3J5IHBlcm1pdHMgdXNlcnMgdG8gZGVsZXRlIGRyYWZ0IGNoYW5nZXMgdXBsb2FkZWQgYnkgb3RoZXIKK3VzZXJzLgogCi0gIElOU0VSVCBJTlRPIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcwotICAgIChjYXRlZ29yeV9pZCx2YWx1ZSxuYW1lKQotICBWQUxVRVMKLSAgICAoJ2NvcHknLCAtMSwgJ0RvIG5vdCBoYXZlIGNvcHlyaWdodCcpOworVGhlIGNoYW5nZSBvd25lciBjYW4gYWx3YXlzIGRlbGV0ZSBkcmFmdCBjaGFuZ2VzIChldmVuIHdpdGhvdXQgaGF2aW5nCit0aGUgYERlbGV0ZSBEcmFmdHNgIGFjY2VzcyByaWdodCBhc3NpZ25lZCkuCiAKLSAgSU5TRVJUIElOVE8gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzCi0gICAgKGNhdGVnb3J5X2lkLHZhbHVlLG5hbWUpCi0gIFZBTFVFUwotICAgICgnY29weScsIDAsICdObyBzY29yZScpOwogCi0gIElOU0VSVCBJTlRPIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcwotICAgIChjYXRlZ29yeV9pZCx2YWx1ZSxuYW1lKQotICBWQUxVRVMKLSAgICAoJ2NvcHknLCAxLCAnQ29weXJpZ2h0IGNsZWFyJyk7Ci09PT09CitbW2NhdGVnb3J5X2VkaXRfdG9waWNfbmFtZV1dCitFZGl0IFRvcGljIE5hbWUKK35+fn5+fn5+fn5+fn5+fgogCi1UaGUgbmV3IGNvbHVtbiB3aWxsIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAoaW4gcG9zaXRpb24gMyksCi1hbmQgYC0xIERvIG5vdCBoYXZlIGNvcHlyaWdodGAgd2lsbCBibG9jayBzdWJtaXQsIHdoaWxlIGArMSBDb3B5cmlnaHQKLWNsZWFyYCBpcyByZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIGVkaXQgdGhlIHRvcGljIG5hbWUgb2YgYSBjaGFuZ2UgdGhhdAoraXMgdXBsb2FkZWQgZm9yIHJldmlldy4KIAotW1tyZXN0YXJ0X2NoYW5nZXNdXQotW05PVEVdCi1SZXN0YXJ0IHRoZSBHZXJyaXQgd2ViIGFwcGxpY2F0aW9uIGFuZCByZWxvYWQgYWxsIGJyb3dzZXJzIGFmdGVyCi1tYWtpbmcgYW55IGRhdGFiYXNlIGNoYW5nZXMgdG8gYXBwcm92YWwgY2F0ZWdvcmllcy4gIEJyb3dzZXJzIGFyZQotc2VudCB0aGUgbGlzdCBvZiBrbm93biBjYXRlZ29yaWVzIHdoZW4gdGhleSBmaXJzdCB2aXNpdCB0aGUgc2l0ZSwKLWFuZCBkb24ndCBub3RpY2UgY2hhbmdlcyB1bnRpbCB0aGUgcGFnZSBpcyBjbG9zZWQgYW5kIG9wZW5lZCBhZ2FpbiwKLW9yIGlzIHJlbG9hZGVkLgorVGhlIGNoYW5nZSBvd25lciwgYnJhbmNoIG93bmVycywgcHJvamVjdCBvd25lcnMsIGFuZCBzaXRlIGFkbWluaXN0cmF0b3JzCitjYW4gYWx3YXlzIGVkaXQgdGhlIHRvcGljIG5hbWUgKGV2ZW4gd2l0aG91dCBoYXZpbmcgdGhlIGBFZGl0IFRvcGljIE5hbWVgCithY2Nlc3MgcmlnaHQgYXNzaWduZWQpLgogCiAKIEV4YW1wbGVzIG9mIHR5cGljYWwgcm9sZXMgaW4gYSBwcm9qZWN0CkBAIC04MjksNiArODMwLDcgQEAKIGdlbmVyYWwgZ3VpZGVsaW5lcyBmb3IgYSB0eXBpY2FsIHdheSB0byBzZXQgdXAgeW91ciBwcm9qZWN0IG9uIGEKIGJyYW5kIG5ldyBHZXJyaXQgaW5zdGFuY2UuCiAKKwogW1tleGFtcGxlc19jb250cmlidXRvcl1dCiBDb250cmlidXRvcgogfn5+fn5+fn5+fn4KQEAgLTg0MCw5ICs4NDIsOSBAQAogCiBTdWdnZXN0ZWQgYWNjZXNzIHJpZ2h0cyB0byBncmFudDoKIAotKiA8PGNhdGVnb3J5X3JlYWQsYFJlYWRgPj4gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCi0qIDw8Y2F0ZWdvcnlfcHVzaCxgUHVzaGA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL2NoYW5nZXMvKicKLSogPDxjYXRlZ29yeV9sYWJlbC1Db2RlLVJldmlldyxgQ29kZSByZXZpZXdgPj4gd2l0aCByYW5nZSAnLTEnIHRvICcrMScKKyogeHJlZjpjYXRlZ29yeV9yZWFkW2BSZWFkYF0gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCisqIGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX0NvZGUtUmV2aWV3W2BDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnIGZvciAncmVmcy9oZWFkcy8qJwogCiAKIFtbZXhhbXBsZXNfZGV2ZWxvcGVyXV0KQEAgLTg2NCwxMyArODY2LDEzIEBACiAKIFN1Z2dlc3RlZCBhY2Nlc3MgcmlnaHRzIHRvIGdyYW50OgogCi0qIDw8Y2F0ZWdvcnlfcmVhZCxgUmVhZGA+PiBvbiAncmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL3RhZ3MvKicKLSogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJwotKiA8PGNhdGVnb3J5X3B1c2hfbWVyZ2UsYFB1c2ggbWVyZ2UgY29tbWl0YD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJwotKiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixgRm9yZ2UgQXV0aG9yIElkZW50aXR5YD4+Ci0qIDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsYExhYmVsOiBDb2RlIHJldmlld2A+PiB3aXRoIHJhbmdlICctMicgdG8gJysyJwotKiA8PGNhdGVnb3J5X2xhYmVsLVZlcmlmaWVkLGBMYWJlbDogVmVyaWZ5YD4+IHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnCi0qIDw8Y2F0ZWdvcnlfc3VibWl0LGBTdWJtaXRgPj4KKyogeHJlZjpjYXRlZ29yeV9yZWFkW2BSZWFkYF0gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaF9tZXJnZVtgUHVzaCBtZXJnZSBjb21taXRgXSB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy8qJworKiB4cmVmOmNhdGVnb3J5X2ZvcmdlX2F1dGhvcltgRm9yZ2UgQXV0aG9yIElkZW50aXR5YF0gdG8gJ3JlZnMvaGVhZHMvKicKKyogbGluazpjb25maWctbGFiZWxzLmh0bWwjbGFiZWxfQ29kZS1SZXZpZXdbYExhYmVsOiBDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0yJyB0byAnKzInIGZvciAncmVmcy9oZWFkcy8qJworKiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9WZXJpZmllZFtgTGFiZWw6IFZlcmlmeWBdIHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnIGZvciAncmVmcy9oZWFkcy8qJworKiB4cmVmOmNhdGVnb3J5X3N1Ym1pdFtgU3VibWl0YF0KIAogSWYgdGhlIHByb2plY3QgaXMgc21hbGwgb3IgdGhlIGRldmVsb3BlcnMgYXJlIHNlYXNvbmVkIGl0IG1pZ2h0IG1ha2UKIHNlbnNlIHRvIGdpdmUgdGhlbSB0aGUgZnJlZWRvbSB0byBwdXNoIGNvbW1pdHMgZGlyZWN0bHkgdG8gYSBicmFuY2guCkBAIC04ODUsNyArODg3LDcgQEAKIENJIHN5c3RlbQogfn5+fn5+fn5+CiAKLUEgdHlwaWNhbCBDb250aW5vdXMgSW50ZWdyYXRpb24gc3lzdGVtIHNob3VsZCBiZSBhYmxlIHRvIGRvd25sb2FkIG5ldyBjaGFuZ2VzCitBIHR5cGljYWwgQ29udGludW91cyBJbnRlZ3JhdGlvbiBzeXN0ZW0gc2hvdWxkIGJlIGFibGUgdG8gZG93bmxvYWQgbmV3IGNoYW5nZXMKIHRvIGJ1aWxkIGFuZCB0aGVuIGxlYXZlIGEgdmVyZGljdCBzb21laG93LgogCiBBcyBhbiBleGFtcGxlLCB0aGUgcG9wdWxhcgpAQCAtOTIwLDE0ICs5MjIsMTQgQEAKIAogU3VnZ2VzdGVkIGFjY2VzcyByaWdodHMgdG8gZ3JhbnQsIHRoYXQgd29uJ3QgYmxvY2sgY2hhbmdlczoKIAotKiA8PGNhdGVnb3J5X3JlYWQsYFJlYWRgPj4gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCi0qIDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsYExhYmVsOiBDb2RlIHJldmlld2A+PiB3aXRoIHJhbmdlICctMScgdG8gJzAnCi0qIDw8Y2F0ZWdvcnlfbGFiZWwtVmVyaWZpZWQsYExhYmVsOiBWZXJpZnlgPj4gd2l0aCByYW5nZSAnMCcgdG8gJysxJworKiB4cmVmOmNhdGVnb3J5X3JlYWRbYFJlYWRgXSBvbiAncmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL3RhZ3MvKicKKyogbGluazpjb25maWctbGFiZWxzLmh0bWwjbGFiZWxfQ29kZS1SZXZpZXdbYExhYmVsOiBDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0xJyB0byAnMCcgZm9yICdyZWZzL2hlYWRzLyonCisqIGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX1ZlcmlmaWVkW2BMYWJlbDogVmVyaWZ5YF0gd2l0aCByYW5nZSAnMCcgdG8gJysxJyBmb3IgJ3JlZnMvaGVhZHMvKicKIAogT3B0aW9uYWwgYWNjZXNzIHJpZ2h0cyB0byBncmFudDoKIAotKiA8PGNhdGVnb3J5X2xhYmVsLUNvZGUtUmV2aWV3LGBMYWJlbDogQ29kZSByZXZpZXdgPj4gd2l0aCByYW5nZSAnLTEnIHRvICcrMScKLSogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJworKiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9Db2RlLVJldmlld1tgTGFiZWw6IENvZGUtUmV2aWV3YF0gd2l0aCByYW5nZSAnLTEnIHRvICcrMScgZm9yICdyZWZzL2hlYWRzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCiAKIAogW1tleGFtcGxlc19pbnRlZ3JhdG9yXV0KQEAgLTk0NCw3ICs5NDYsNyBAQAogKiA8PGV4YW1wbGVzX2RldmVsb3BlcixEZXZlbG9wZXIgcmlnaHRzPj4KICogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2hlYWRzLyonCiAqIDw8Y2F0ZWdvcnlfcHVzaF9tZXJnZSxgUHVzaCBtZXJnZSBjb21taXRgPj4gdG8gJ3JlZnMvaGVhZHMvKicKLSogPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsYEZvcmdlIENvbW1pdHRlciBJZGVudGl0eWA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL2NoYW5nZXMvKicKKyogPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsYEZvcmdlIENvbW1pdHRlciBJZGVudGl0eWA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy8qJwogKiA8PGNhdGVnb3J5X2NyZWF0ZSxgQ3JlYXRlIFJlZmVyZW5jZWA+PiB0byAncmVmcy9oZWFkcy8qJwogKiA8PGNhdGVnb3J5X3B1c2hfYW5ub3RhdGVkLGBQdXNoIEFubm90YXRlZCBUYWdgPj4gdG8gJ3JlZnMvdGFncy8qJwogCkBAIC05NTgsNyArOTYwLDcgQEAKIGFsc28gaGF2ZSB0aGUgcG93ZXIgdG8gY29uZmlndXJlIGFjY2VzcyByaWdodHMgaW4gZ2l0cyBhc3NpZ25lZCB0byB0aGVtLgogCiBbV0FSTklOR10KLVRoZXNlIHVzZXJzIHNob3VsZCBiZSByZWFsbHkga25vd2xlZGdhYmxlIGFib3V0IGdpdCwgZm9yIGluc3RhbmNlIGtub3dpbmcgd2h5CitUaGVzZSB1c2VycyBzaG91bGQgYmUgcmVhbGx5IGtub3dsZWRnZWFibGUgYWJvdXQgZ2l0LCBmb3IgaW5zdGFuY2Uga25vd2luZyB3aHkKIHRhZ3MgbmV2ZXIgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBhIHNlcnZlci4gIFRoaXMgcm9sZSBpcyBncmFudGVkIHBvdGVudGlhbGx5CiBkZXN0cnVjdGl2ZSBhY2Nlc3MgcmlnaHRzIGFuZCBjbGVhbmluZyB1cCBhZnRlciBzdWNoIGEgbWlzaGFwIGNvdWxkIGJlIHRpbWUKIGNvbnN1bWluZyEKQEAgLTk3Miw2ICs5NzQsNyBAQAogCiAqIDw8Y2F0ZWdvcnlfb3duZXIsYE93bmVyYD4+IGluIHRoZSBnaXRzIHRoZXkgbW9zdGx5IHdvcmsgd2l0aC4KIAorCiBbW2V4YW1wbGVzX2FkbWluaXN0cmF0b3JdXQogQWRtaW5pc3RyYXRvcgogfn5+fn5+fn5+fn5+fgpAQCAtOTkwLDYgKzk5MywxMjggQEAKICogPDxleGFtcGxlc19wcm9qZWN0LW93bmVyLFByb2plY3Qgb3duZXIgcmlnaHRzPj4KIAogCitFbmZvcmNpbmcgc2l0ZSB3aWRlIGFjY2VzcyBwb2xpY2llcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZ3JhbnRpbmcgdGhlIDw8Y2F0ZWdvcnlfb3duZXIsYE93bmVyYD4+IGFjY2VzcyByaWdodCBvbiB0aGUgYHJlZnMvKmAgdG8gYQorZ3JvdXAsIEdlcnJpdCBhZG1pbmlzdHJhdG9ycyBjYW4gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIG1haW50YWluaW5nCithY2Nlc3MgcmlnaHRzIGZvciB0aGF0IHByb2plY3QgdG8gdGhhdCBncm91cC4KKworSW4gYSBjb3Jwb3JhdGUgZGVwbG95bWVudCBpdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gZW5mb3JjZSBzb21lIGFjY2VzcworcG9saWNpZXMuIEFuIGV4YW1wbGUgY291bGQgYmUgdGhhdCBuby1vbmUgY2FuIHVwZGF0ZSBvciBkZWxldGUgYSB0YWcsIG5vdCBldmVuCit0aGUgcHJvamVjdCBvd25lcnMuIFRoZSAnQUxMT1cnIGFuZCAnREVOWScgcnVsZXMgYXJlIG5vdCBlbm91Z2ggZm9yIHRoaXMKK3B1cnBvc2UgYXMgcHJvamVjdCBvd25lcnMgY2FuIGdyYW50IHRoZW1zZWx2ZXMgYW55IGFjY2VzcyByaWdodCB0aGV5IHdpc2ggYW5kLAordGh1cywgZWZmZWN0aXZlbHkgb3ZlcnJpZGUgYW55IGluaGVyaXRlZCBhY2Nlc3MgcmlnaHRzIGZyb20gdGhlCisiYEFsbC1Qcm9qZWN0c2AiIG9yIHNvbWUgb3RoZXIgY29tbW9uIHBhcmVudCBwcm9qZWN0LgorCitXaGF0IGlzIG5lZWRlZCBpcyBhIG1lY2hhbmlzbSB0byBibG9jayBhIHBlcm1pc3Npb24gaW4gYSBwYXJlbnQgcHJvamVjdCBzbwordGhhdCBldmVuIHByb2plY3Qgb3duZXJzIGNhbm5vdCBhbGxvdyBhIGJsb2NrZWQgcGVybWlzc2lvbiBpbiB0aGVpciBjaGlsZAorcHJvamVjdC4gU3RpbGwsIHByb2plY3Qgb3duZXJzIHNob3VsZCByZXRhaW4gdGhlIHBvc3NpYmlsaXR5IHRvIG1hbmFnZSBhbGwKK25vbi1ibG9ja2VkIHJ1bGVzIGFzIHRoZXkgd2lzaC4gVGhpcyBnaXZlcyBiZXN0IG9mIGJvdGggd29ybGRzOgorCisqIEdlcnJpdCBhZG1pbmlzdHJhdG9ycyBjYW4gY29uY2VudHJhdGUgb24gZW5mb3JjaW5nIHNpdGUgd2lkZSBwb2xpY2llcworICBhbmQgcHJvdmlkaW5nIGEgbWVhbmluZ2Z1bCBzZXQgb2YgZGVmYXVsdCBhY2Nlc3MgcGVybWlzc2lvbnMKKyogUHJvamVjdCBvd25lcnMgY2FuIG1hbmFnZSBhY2Nlc3MgcmlnaHRzIG9mIHRoZWlyIHByb2plY3RzIHdpdGhvdXQgYSBkYW5nZXIKKyAgb2YgdmlvbGF0aW5nIGEgc2l0ZSB3aWRlIHBvbGljeQorCisKK1tbYmxvY2tdXQorJ0JMT0NLJyBhY2Nlc3MgcnVsZQorfn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgJ0JMT0NLJyBydWxlIGJsb2NrcyBhIHBlcm1pc3Npb24gZ2xvYmFsbHkuIEFuIGluaGVyaXRlZCAnQkxPQ0snIHJ1bGUgY2Fubm90CitiZSBvdmVycmlkZGVuIGluIHRoZSBpbmhlcml0aW5nIHByb2plY3QuIEFueSAnQUxMT1cnIHJ1bGUsIGZyb20gYSBkaWZmZXJlbnQKK2FjY2VzcyBzZWN0aW9uIG9yIGZyb20gYW4gaW5oZXJpdGluZyBwcm9qZWN0LCB3aGljaCBjb25mbGljdHMgd2l0aCBhbgoraW5oZXJpdGVkICdCTE9DSycgcnVsZSB3aWxsIG5vdCBiZSBob25vcmVkLiAgU2VhcmNoaW5nIGZvciAnQkxPQ0snIHJ1bGVzLCBpbgordGhlIGNoYWluIG9mIHBhcmVudCBwcm9qZWN0cywgaWdub3JlcyB0aGUgRXhjbHVzaXZlIGZsYWcgdGhhdCBpcyBub3JtYWxseQorYXBwbGllZCB0byBhY2Nlc3Mgc2VjdGlvbnMuCisKK0EgJ0JMT0NLJyBydWxlIHRoYXQgYmxvY2tzIHRoZSAncHVzaCcgcGVybWlzc2lvbiBibG9ja3MgYW55IHR5cGUgb2YgcHVzaCwKK2ZvcmNlIG9yIG5vdC4gQSBibG9ja2luZyBmb3JjZSBwdXNoIHJ1bGUgYmxvY2tzIG9ubHkgZm9yY2UgcHVzaGVzLCBidXQKK2FsbG93cyBub24tZm9yY2VkIHB1c2hlcyBpZiBhbiAnQUxMT1cnIHJ1bGUgd291bGQgaGF2ZSBwZXJtaXR0ZWQgaXQuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gYmxvY2sgbGFiZWwgcmFuZ2VzLiAgVG8gYmxvY2sgYSBncm91cCAnWCcgZnJvbSB2b3RpbmcKKyctMicgYW5kICcrMicsIGJ1dCBrZWVwIHRoZWlyIGV4aXN0aW5nIHZvdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlICctMS4uKzEnCityYW5nZSBpbnRhY3Qgd2Ugd291bGQgZGVmaW5lOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvKiJdCisgICAgbGFiZWwtQ29kZS1SZXZpZXcgPSBibG9jayAtMi4uKzIgZ3JvdXAgWAorPT09PQorCitUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICdtaW4uLm1heCcgcmFuZ2UgaW4gY2FzZSBvZiBhIGJsb2NraW5nIHJ1bGUgaXM6IGJsb2NrCitldmVyeSB2b3RlIGZyb20gJy1JTkZJTklURS4ubWluJyBhbmQgJ21heC4uSU5GSU5JVEUnLiBGb3IgdGhlIGV4YW1wbGUgYWJvdmUgaXQKK21lYW5zIHRoYXQgdGhlIHJhbmdlICctMS4uKzEnIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIGJsb2NrLgorCisnQkxPQ0snIGFuZCAnQUxMT1cnIHJ1bGVzIGluIHRoZSBzYW1lIGFjY2VzcyBzZWN0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1doZW4gYW4gYWNjZXNzIHNlY3Rpb24gb2YgYSBwcm9qZWN0IGNvbnRhaW5zIGEgJ0JMT0NLJyBhbmQgYW4gJ0FMTE9XJyBydWxlIGZvcgordGhlIHNhbWUgcGVybWlzc2lvbiB0aGVuIHRoaXMgJ0FMTE9XJyBydWxlIG92ZXJyaWRlcyB0aGUgJ0JMT0NLJyBydWxlOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvKiJdCisgICAgcHVzaCA9IGJsb2NrIGdyb3VwIFgKKyAgICBwdXNoID0gZ3JvdXAgWQorPT09PQorCitJbiB0aGlzIGNhc2UgYSB1c2VyIHdoaWNoIGlzIGEgbWVtYmVyIG9mIHRoZSBncm91cCAnWScgd2lsbCBzdGlsbCBiZSBhbGxvd2VkIHRvCitwdXNoIHRvICdyZWZzL2hlYWRzLyonIGV2ZW4gaWYgaXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdyb3VwICdYJy4KKworTk9URTogQW4gJ0FMTE9XJyBydWxlIG92ZXJyaWRlcyBhICdCTE9DSycgcnVsZSBvbmx5IHdoZW4gYm90aCBvZiB0aGVtIGFyZQoraW5zaWRlIHRoZSBzYW1lIGFjY2VzcyBzZWN0aW9uIG9mIHRoZSBzYW1lIHByb2plY3QuIEFuICdBTExPVycgcnVsZSBpbiBhCitkaWZmZXJlbnQgYWNjZXNzIHNlY3Rpb24gb2YgdGhlIHNhbWUgcHJvamVjdCBvciBpbiBhbnkgYWNjZXNzIHNlY3Rpb24gaW4gYW4KK2luaGVyaXRpbmcgcHJvamVjdCBjYW5ub3Qgb3ZlcnJpZGUgYSAnQkxPQ0snIHJ1bGUuCisKKworRXhhbXBsZXMKK35+fn5+fn5+CisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBzb21lIHBvc3NpYmxlIHVzZSBjYXNlcyBmb3IgdGhlICdCTE9DSycgcnVsZXMuCisKK01ha2Ugc3VyZSBubyBvbmUgY2FuIHVwZGF0ZSBvciBkZWxldGUgYSB0YWcKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhpcyByZXF1aXJlbWVudCBpcyBxdWl0ZSBjb21tb24gaW4gYSBjb3Jwb3JhdGUgZGVwbG95bWVudCB3aGVyZQorcmVwcm9kdWNpYmlsaXR5IG9mIGEgYnVpbGQgbXVzdCBiZSBndWFyYW50ZWVkLiBUbyBhY2hpZXZlIHRoYXQgd2UgYmxvY2sgJ3B1c2gnCitwZXJtaXNzaW9uIGZvciB0aGUgPDxhbm9ueW1vdXNfdXNlcnMsJ0Fub255bW91cyBVc2Vycyc+PiBpbiAiYEFsbC1Qcm9qZWN0c2AiOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvdGFncy8qIl0KKyAgICBwdXNoID0gYmxvY2sgZ3JvdXAgQW5vbnltb3VzIFVzZXJzCis9PT09CisKK0J5IGJsb2NraW5nIHRoZSA8PGFub255bW91c191c2VycywnQW5vbnltb3VzIFVzZXJzJz4+IHdlIGVmZmVjdGl2ZWx5IGJsb2NrCitldmVyeW9uZSBhcyBldmVyeW9uZSBpcyBhIG1lbWJlciBvZiB0aGF0IGdyb3VwLiBOb3RlIHRoYXQgdGhlIHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBhIHRhZyBpcyBzdGlsbCBuZWNlc3NhcnkuIEFzc3VtaW5nIHRoYXQgb25seSA8PGNhdGVnb3J5X293bmVyLHByb2plY3QKK293bmVycz4+IGFyZSBhbGxvd2VkIHRvIGNyZWF0ZSB0YWdzLCB3ZSB3b3VsZCBleHRlbmQgdGhlIGV4YW1wbGUgYWJvdmU6CisKKz09PT0KKyAgW2FjY2VzcyAicmVmcy90YWdzLyoiXQorICAgIHB1c2ggPSBibG9jayBncm91cCBBbm9ueW1vdXMgVXNlcnMKKyAgICBjcmVhdGUgPSBncm91cCBQcm9qZWN0IE93bmVycworICAgIHB1c2hUYWcgPSBncm91cCBQcm9qZWN0IE93bmVycworPT09PQorCisKK0xldCBvbmx5IGEgZGVkaWNhdGVkIGdyb3VwIHZvdGUgaW4gYSBzcGVjaWFsIGNhdGVnb3J5CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitBc3N1bWUgdGhlcmUgaXMgYSBtb3JlIHJlc3RyaWN0aXZlIHByb2Nlc3MgZm9yIHN1Ym1pdHRpbmcgY2hhbmdlcyBpbiBzdGFibGUKK3JlbGVhc2UgYnJhbmNoZXMgd2hpY2ggaXMgbWFuaWZlc3RlZCBhcyBhIG5ldyB2b3RpbmcgY2F0ZWdvcnkKKydSZWxlYXNlLVByb2Nlc3MnLiBBc3N1bWUgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IGEgJ1JlbGVhc2UgRW5naW5lZXJzJworZ3JvdXAgY2FuIHZvdGUgaW4gdGhpcyBjYXRlZ29yeSBhbmQgdGhhdCBldmVuIHByb2plY3Qgb3duZXJzIGNhbm5vdCBhcHByb3ZlCit0aGlzIGNhdGVnb3J5LiBXZSBoYXZlIHRvIGJsb2NrIGV2ZXJ5b25lIGV4Y2VwdCB0aGUgJ1JlbGVhc2UgRW5naW5lZXJzJyB0byB2b3RlCitpbiB0aGlzIGNhdGVnb3J5IGFuZCwgb2YgY291cnNlLCBhbGxvdyAnUmVsZWFzZSBFbmdpbmVlcnMnIHRvIHZvdGUgaW4gdGhhdAorY2F0ZWdvcnkuIEluIHRoZSAiYEFsbC1Qcm9qZWN0c2AiIHdlIGRlZmluZSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvc3RhYmxlKiJdCisgICAgbGFiZWwtUmVsZWFzZS1Qcm9jZXNzID0gYmxvY2sgLTEuLisxIGdyb3VwIEFub255bW91cyBVc2VycworICAgIGxhYmVsLVJlbGVhc2UtUHJvY2VzcyA9IC0xLi4rMSBncm91cCBSZWxlYXNlIEVuZ2luZWVycworPT09PQorCisKIFtbY29udmVyc2lvbl90YWJsZV1dCiBDb252ZXJzaW9uIHRhYmxlIGZyb20gMi4xLnggc2VyaWVzIHRvIDIuMi54IHNlcmllcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk5Nyw4ICsxMTIyLDggQEAKIFtvcHRpb25zPSJoZWFkZXIiXQogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogfEdlcnJpdCAyLjEueCAgICAgICAgICAgICAgICAgfEdlcnJpdCAyLjIueAotfENvZGUgcmV2aWV3ICAgICAgICAgICAgICAgICAgfDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsTGFiZWw6IENvZGUgcmV2aWV3Pj4KLXxWZXJpZnkgICAgICAgICAgICAgICAgICAgICAgIHw8PGNhdGVnb3J5X2xhYmVsLVZlcmlmaWVkLExhYmVsOiBWZXJpZnk+PgorfENvZGUgcmV2aWV3ICAgICAgICAgICAgICAgICAgfGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX0NvZGUtUmV2aWV3W0xhYmVsOiBDb2RlLVJldmlld10KK3xWZXJpZnkgICAgICAgICAgICAgICAgICAgICAgIHxsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9WZXJpZmllZFtMYWJlbDogVmVyaWZ5XQogfEZvcmdlIElkZW50aXR5ICsxICAgICAgICAgICAgfEZvcmdlIDw8Y2F0ZWdvcnlfZm9yZ2VfYXV0aG9yLGF1dGhvcj4+IGlkZW50aXR5CiB8Rm9yZ2UgSWRlbnRpdHkgKzIgICAgICAgICAgICB8Rm9yZ2UgPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsY29tbWl0dGVyPj4gJiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixhdXRob3I+PiBpZGVudGl0eQogfEZvcmdlIElkZW50aXR5ICszICAgICAgICAgICAgfEZvcmdlIDw8Y2F0ZWdvcnlfZm9yZ2Vfc2VydmVyLHNlcnZlcj4+ICYgPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsY29tbWl0dGVyPj4gJiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixhdXRob3I+PiBpZGVudGl0eQpAQCAtMTAyMSwxNSArMTE0NiwxNiBAQAogSW4gR2Vycml0IDIuMi54LCB0aGUgd2F5IHRvIHNldCBwZXJtaXNzaW9ucyBmb3IgdXBsb2FkIGhhcyBjaGFuZ2VkIGVudGlyZWx5LgogVG8gdXBsb2FkIGEgY2hhbmdlIGZvciByZXZpZXcgaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgcGVybWlzc2lvbiB0eXBlLAogaW5zdGVhZCB5b3UgZ3JhbnQgb3JkaW5hcnkgcHVzaCBwZXJtaXNzaW9ucyB0byB0aGUgYWN0dWFsCi1yZWNpZXZpbmcgcmVmZXJlbmNlLiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgeW91IHNldCBwdXNoIHBlcm1pc3Npb25zCityZWNlaXZpbmcgcmVmZXJlbmNlLiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgeW91IHNldCBwdXNoIHBlcm1pc3Npb25zCiBvbiBgcmVmcy9mb3IvcmVmcy9oZWFkcy88YnJhbmNoPmAgcmF0aGVyIHRoYW4gcGVybWlzc2lvbnMgdG8gdXBsb2FkIGNoYW5nZXMKIG9uIGByZWZzL2hlYWRzLzxicmFuY2g+YC4KIAogCi1TeXN0ZW0gY2FwYWJpbGl0aWVzCitbW2dsb2JhbF9jYXBhYmlsaXRpZXNdXQorR2xvYmFsIENhcGFiaWxpdGllcwogLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgc3lzdGVtIGNhcGFiaWxpdGllcyBjb250cm9sIGFjdGlvbnMgdGhhdCB0aGUgYWRtaW5pc3RyYXRvcnMgb2YKK1RoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIGNvbnRyb2wgYWN0aW9ucyB0aGF0IHRoZSBhZG1pbmlzdHJhdG9ycyBvZgogdGhlIHNlcnZlciBjYW4gcGVyZm9ybSB3aGljaCB1c3VhbGx5IGFmZmVjdCB0aGUgZW50aXJlCiBzZXJ2ZXIgaW4gc29tZSB3YXkuICBUaGUgYWRtaW5pc3RyYXRvcnMgbWF5IGRlbGVnYXRlIHRoZXNlCiBjYXBhYmlsaXRpZXMgdG8gdHJ1c3RlZCBncm91cHMgb2YgdXNlcnMuCkBAIC0xMDQwLDYgKzExNjYsOSBAQAoga2VlcCBmZXdlciB1c2VycyBpbiB0aGUgYWRtaW5pc3RyYXRvcnMgZ3JvdXAsIGV2ZW4gd2hpbGUgc3ByZWFkaW5nCiBtdWNoIG9mIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRpb24gYnVyZGVuIG91dCB0byBtb3JlIHVzZXJzLgogCitHbG9iYWwgY2FwYWJpbGl0aWVzIGFyZSBhc3NpZ25lZCB0byBncm91cHMgaW4gdGhlIGFjY2VzcyByaWdodHMgc2V0dGluZ3MKK29mIHRoZSByb290IHByb2plY3QgKCJgQWxsLVByb2plY3RzYCIpLgorCiBCZWxvdyB5b3UgZmluZCBhIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIGF2YWlsYWJsZToKIAogCkBAIC0xMDgxLDYgKzEyMTAsNyBAQAogZWl0aGVyIGxpbms6Y21kLWNyZWF0ZS1wcm9qZWN0Lmh0bWxbY3JlYXRlIG5ldyBnaXQgcHJvamVjdHMgdmlhIHNzaF0KIG9yIHZpYSB0aGUgd2ViIFVJLgogCisKIFtbY2FwYWJpbGl0eV9lbWFpbFJldmlld2Vyc11dCiBFbWFpbCBSZXZpZXdlcnMKIH5+fn5+fn5+fn5+fn5+fgpAQCAtMTA5MSw2ICsxMjIxLDcgQEAKIGVtYWlsZWQuICBUaGUgYWxsb3cgcnVsZXMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgZGVueSBydWxlcywgaG93ZXZlciB0aGUgZGVmYXVsdAogaXMgdG8gYWxsb3cgZW1haWxpbmcsIGlmIG5vIGV4cGxpY2l0IHJ1bGUgaXMgbWF0Y2hlZC4KIAorCiBbW2NhcGFiaWxpdHlfZmx1c2hDYWNoZXNdXQogRmx1c2ggQ2FjaGVzCiB+fn5+fn5+fn5+fn4KQEAgLTExMTAsNyArMTI0MSw3IEBACiBBbGxvdyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBsaW5rOmNtZC1raWxsLmh0bWxba2lsbCBjb21tYW5kIG92ZXIgc3NoXS4gIFRoZQoga2lsbCBjb21tYW5kIGVuZHMgdGFza3MgdGhhdCBjdXJyZW50bHkgb2NjdXB5IHRoZSBHZXJyaXQgc2VydmVyLCB1c3VhbGx5CiBhIHJlcGxpY2F0aW9uIHRhc2sgb3IgYSB1c2VyIGluaXRpYXRlZCB0YXNrIHN1Y2ggYXMgYW4gdXBsb2FkLXBhY2sgb3IKLXJlY2lldmUtcGFjay4KK3JlY2VpdmUtcGFjay4KIAogCiBbW2NhcGFiaWxpdHlfcHJpb3JpdHldXQpAQCAtMTE1OCw2ICsxMjg5LDIxIEBACiBjb21tYW5kLCBidXQgYWxzbyB0byB0aGUgd2ViIFVJIHJlc3VsdHMgcGFnaW5hdGlvbiBzaXplLgogCiAKK1tbY2FwYWJpbGl0eV9hY2Nlc3NEYXRhYmFzZV1dCitBY2Nlc3MgRGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fgorCitBbGxvdyB1c2VycyB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHVzaW5nIHRoZSBgZ3NxbGAgY29tbWFuZC4KKworCitbW2NhcGFiaWxpdHlfcnVuR0NdXQorUnVuIEdhcmJhZ2UgQ29sbGVjdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbGxvdyB1c2VycyB0byBydW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHRoZSByZXBvc2l0b3JpZXMgb2YKK2FsbCBwcm9qZWN0cy4KKworCiBbW2NhcGFiaWxpdHlfc3RhcnRSZXBsaWNhdGlvbl1dCiBTdGFydCBSZXBsaWNhdGlvbgogfn5+fn5+fn5+fn5+fn5+fn4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZiBiL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgppbmRleCA5MjQyZjA5Li4yZmU2MjEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKKysrIGIvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCkBAIC0xNiwzICsxNiwxNCBAQAogICBtYXJnaW4tdG9wOiAxLjJlbTsKICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAiPgorCitbbWFjcm9zXQorKD91KV4oP1A8bmFtZT5nZXQpOjooP1A8dGFyZ2V0PlxTKj8pJD0jCisKK1tnZXQtYmxvY2ttYWNyb10KKzxhIGlkPSJ7dGFyZ2V0fSIgb25tb3VzZWRvd249ImphdmFzY3JpcHQ6CisgIHZhciBpID0gIGRvY3VtZW50LlVSTC5sYXN0SW5kZXhPZignL0RvY3VtZW50YXRpb24vJyk7CisgIHZhciB1cmwgPSBkb2N1bWVudC5VUkwuc3Vic3RyaW5nKDAsIGkpICsgJ3t0YXJnZXR9JzsKKyAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3t0YXJnZXR9JykuaHJlZiA9IHVybDsiPgorICAgIEdFVCB7dGFyZ2V0fSBIVFRQLzEuMAorPC9hPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWQtY3JlYXRlLWFjY291bnQudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtY3JlYXRlLWFjY291bnQudHh0CmluZGV4IDE2YjJlYjUuLjg1YjliNTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWNyZWF0ZS1hY2NvdW50LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1jcmVhdGUtYWNjb3VudC50eHQKQEAgLTE4LDkgKzE4LDExIEBACiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQotQ3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBvbmx5IHVzZXIgYWNjb3VudCBmb3IgYmF0Y2gvcm9sZSBhY2Nlc3MsIHN1Y2gKLWFzIGZyb20gYW4gYXV0b21hdGVkIGJ1aWxkIHN5c3RlbSBvciBldmVudCBtb25pdG9yaW5nIG92ZXIKLWxpbms6Y21kLXN0cmVhbS1ldmVudHMuaHRtbFtnZXJyaXQgc3RyZWFtLWV2ZW50c10uCitDcmVhdGVzIGEgbmV3IGludGVybmFsLW9ubHkgdXNlciBhY2NvdW50LgorCitJZiB0aGUgYWNjb3VudCBpcyBjcmVhdGVkIHdpdGhvdXQgYW4gZW1haWwgYWRkcmVzcywgaXQgbWF5IG9ubHkgYmUKK3VzZWQgZm9yIGJhdGNoL3JvbGUgYWNjZXNzLCBzdWNoIGFzIGZyb20gYW4gYXV0b21hdGVkIGJ1aWxkIHN5c3RlbQorb3IgZXZlbnQgbW9uaXRvcmluZyBvdmVyIGxpbms6Y21kLXN0cmVhbS1ldmVudHMuaHRtbFtnZXJyaXQgc3RyZWFtLWV2ZW50c10uCiAKIElmIExEQVAgYXV0aGVudGljYXRpb24gaXMgYmVpbmcgdXNlZCwgdGhlIHVzZXIgYWNjb3VudCBpcyBjcmVhdGVkCiB3aXRob3V0IGNoZWNraW5nIHRoZSBMREFQIGRpcmVjdG9yeS4gIENvbnNlcXVlbnRseSB1c2VycyBjYW4gYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLWdjLnR4dCBiL0RvY3VtZW50YXRpb24vY21kLWdjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I4OTlhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtZ2MudHh0CkBAIC0wLDAgKzEsNzIgQEAKK2dlcnJpdCBnYworPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dlcnJpdCBnYyAtIFJ1biB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBnYycKKyAgWy0tYWxsXQorICA8TkFNRT4gLi4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0cy4KKworQSBHZXJyaXQgc3lzdGVtIGFkbWluaXN0cmF0b3IgY2FuIGRlZmluZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHRoYXQKK3Nob3VsZCBiZSB1c2VkIGZvciBydW5uaW5nIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gdGhlIHVzZXIgZ2xvYmFsCitHaXQgY29uZmlndXJhdGlvbiBmaWxlIG9mIHRoZSBzeXN0ZW0gdXNlciB0aGF0IHJ1bnMgdGhlIEdlcnJpdAorc2VydmVyLgorCitTaW5jZSB0aGUgdXNlciBnbG9iYWwgR2l0IGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBvdmVybGFpZCB3aXRoIHRoZSBHaXQKK2NvbmZpZ3VyYXRpb24gb24gcmVwb3NpdG9yeSBsZXZlbCBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5CityZXBvc2l0b3J5IHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gdGhlIEdpdAorcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIG9mIGV2ZXJ5IHByb2plY3QuCisKK0FDQ0VTUworLS0tLS0tCitDYWxsZXIgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgcHJpdmlsZWdlZCAnQWRtaW5pc3RyYXRvcnMnIGdyb3VwLAorb3IgaGF2ZSBiZWVuIGdyYW50ZWQgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9ydW5HQ1tSdW4gR2FyYmFnZSBDb2xsZWN0aW9uXQorZ2xvYmFsIGNhcGFiaWxpdHkuCisKK1NDUklQVElORworLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBzY3JpcHRzLgorCitPUFRJT05TCistLS0tLS0tCis8TkFNRT46OgorCU5hbWUgb2YgdGhlIHByb2plY3RzIGZvciB3aGljaCB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBzaG91bGQgYmUgcnVuLgorCistLWFsbDo6CisJSWYgc3BlY2lmaWVkIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIHJ1biBmb3IgYWxsIHByb2plY3RzCisJc2VxdWVudGlhbGx5LgorCitFWEFNUExFUworLS0tLS0tLS0KKworUnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB0aGUgcHJvamVjdHMgJ215UHJvamVjdCcgYW5kCisneW91clByb2plY3QnOgorPT09PT0KKwkkIHNzaCAtcCAyOTQxOCByZXZpZXcuZXhhbXBsZS5jb20gZ2Vycml0IGdjIG15UHJvamVjdCB5b3VyUHJvamVjdAorCWNvbGxlY3RpbmcgZ2FyYmFnZSBmb3IgIm15UHJvamVjdCI6CisJLi4uCisJZG9uZS4KKworCWNvbGxlY3RpbmcgZ2FyYmFnZSBmb3IgInlvdXJQcm9qZWN0IjoKKwkuLi4KKwlkb25lLgorPT09PT0KKworUnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhbGwgcHJvamVjdHM6Cis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgZ2MgLS1hbGwKKz09PT09CisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1nc3FsLnR4dCBiL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CmluZGV4IDNjNGYxYjUuLmI1MzY3MGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CkBAIC00OSw3ICs0OSw3IEBACiAKIAlUeXBlICdcaCcgZm9yIGhlbHAuICBUeXBlICdccicgdG8gY2xlYXIgdGhlIGJ1ZmZlci4KIAotCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7ICAgICAgIAorCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7CiAJVVBEQVRFIDE7IDEgbXMKIAlnZXJyaXQ+IFxxCiAJQnllCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2NtZC1pbmRleC50eHQKaW5kZXggY2NkOWZmYy4uNzgwMjMxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtaW5kZXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWluZGV4LnR4dApAQCAtODEsNiArODEsOSBAQAogbGluazpjbWQtc3RyZWFtLWV2ZW50cy5odG1sW2dlcnJpdCBzdHJlYW0tZXZlbnRzXTo6CiAJTW9uaXRvciBldmVudHMgb2NjdXJyaW5nIGluIHJlYWwgdGltZS4KIAorbGluazpjbWQtdmVyc2lvbi5odG1sW2dlcnJpdCB2ZXJzaW9uXTo6CisJU2hvdyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB2ZXJzaW9uIG9mIEdlcnJpdC4KKwogZ2l0IHVwbG9hZC1wYWNrOjoKIAlTdGFuZGFyZCBHaXQgc2VydmVyIHNpZGUgY29tbWFuZCBmb3IgY2xpZW50IHNpZGUgYGdpdCBmZXRjaGAuCiAKQEAgLTExMSwxMiArMTE0LDE4IEBACiBsaW5rOmNtZC1mbHVzaC1jYWNoZXMuaHRtbFtnZXJyaXQgZmx1c2gtY2FjaGVzXTo6CiAJRmx1c2ggc29tZS9hbGwgc2VydmVyIGNhY2hlcyBmcm9tIG1lbW9yeS4KIAorbGluazpjbWQtZ2MuaHRtbFtnZXJyaXQgZ2NdOjoKKwlSdW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uCisKIGxpbms6Y21kLWdzcWwuaHRtbFtnZXJyaXQgZ3NxbF06OgogCUFkbWluaXN0cmF0aXZlIGludGVyZmFjZSB0byBhY3RpdmUgZGF0YWJhc2UuCiAKIGxpbms6Y21kLXNldC1wcm9qZWN0LXBhcmVudC5odG1sW2dlcnJpdCBzZXQtcHJvamVjdC1wYXJlbnRdOjoKIAlDaGFuZ2UgdGhlIHByb2plY3QgcGVybWlzc2lvbnMgYXJlIGluaGVyaXRlZCBmcm9tLgogCitsaW5rOmNtZC1scy11c2VyLXJlZnMuaHRtbFtnZXJyaXQgbHMtdXNlci1yZWZzXTo6CisJTGlzdHMgcmVmcyB2aXNpYmxlIGZvciBhIHNwZWNpZmllZCB1c2VyLgorCiBsaW5rOmNtZC1zaG93LWNhY2hlcy5odG1sW2dlcnJpdCBzaG93LWNhY2hlc106OgogCURpc3BsYXkgY3VycmVudCBjYWNoZSBzdGF0aXN0aWNzLgogCkBAIC0xNDcsOSArMTU2LDEyIEBACiBsaW5rOmNtZC1wbHVnaW4tcmVtb3ZlLmh0bWxbZ2Vycml0IHBsdWdpbiBybV06OgogICAgIEFsaWFzIGZvciAnZ2Vycml0IHBsdWdpbiByZW1vdmUnLgogCi1saW5rOmNtZC10ZXN0LXN1Ym1pdC1ydWxlLmh0bWxbZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGVdOjoKK2xpbms6Y21kLXRlc3Qtc3VibWl0LXJ1bGUuaHRtbFtnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZV06OgogCVRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcy4KIAorbGluazpjbWQtdGVzdC1zdWJtaXQtdHlwZS5odG1sW2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlXTo6CisJVGVzdCBwcm9sb2cgc3VibWl0IHR5cGUuCisKIGxpbms6Y21kLWtpbGwuaHRtbFtraWxsXTo6CiAJS2lsbHMgYSBzY2hlZHVsZWQgb3IgcnVubmluZyB0YXNrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1scy1ncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtbHMtZ3JvdXBzLnR4dAppbmRleCAzMDZiYjkyLi4xN2ViYmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1scy1ncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWxzLWdyb3Vwcy50eHQKQEAgLTExLDggKzExLDEwIEBACiAnc3NoJyAtcCA8cG9ydD4gPGhvc3Q+ICdnZXJyaXQgbHMtZ3JvdXBzJwogICBbLS1wcm9qZWN0IDxOQU1FPiB8IC1wIDxOQU1FPl0KICAgWy0tdXNlciA8TkFNRT4gfCAtdSA8TkFNRT5dCisgIFstLW93bmVkXQogICBbLS12aXNpYmxlLXRvLWFsbF0KICAgWy0tdHlwZSB7aW50ZXJuYWwgfCBzeXN0ZW19XQorICBbLXEgPEdST1VQPl0KICAgWy0tdmVyYm9zZSB8IC12XQogCiBERVNDUklQVElPTgpAQCAtNjEsNiArNjMsMTEgQEAKICsKIFRoaXMgb3B0aW9uIGNhbid0IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgJy0tcHJvamVjdCcgb3B0aW9uLgogCistLW93bmVkOjoKKwlMaXN0cyBvbmx5IHRoZSBncm91cHMgdGhhdCBhcmUgb3duZWQgYnkgdGhlIHVzZXIgdGhhdCB3YXMgc3BlY2lmaWVkCisJYnkgdGhlIGAtLXVzZXJgIG9wdGlvbiBvciBpZiBubyB1c2VyIHdhcyBzcGVjaWZpZWQgdGhlIGdyb3VwcyB0aGF0CisJYXJlIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXIuCisKIC0tdmlzaWJsZS10by1hbGw6OgogCURpc3BsYXlzIG9ubHkgZ3JvdXBzIHRoYXQgYXJlIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMKIAkoZ3JvdXBzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkIGFzIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQKQEAgLTc1LDEyICs4MiwxOSBAQAogYHN5c3RlbWA6OiBBbnkgc3lzdGVtIGRlZmluZWQgYW5kIG1hbmFnZWQgZ3JvdXAuCiAtLQogCistcTo6CisJR3JvdXAgdGhhdCBzaG91bGQgYmUgaW5zcGVjdGVkLiBUaGUgYC1xYCBvcHRpb24gY2FuIGJlIHNwZWNpZmllZAorCW11bHRpcGxlIHRpbWVzIHRvIGRlZmluZSBzZXZlcmFsIGdyb3VwcyB0byBiZSBpbnNwZWN0ZWQuIElmCisJc3BlY2lmaWVkIHRoZSBsaXN0ZWQgZ3JvdXBzIHdpbGwgb25seSBjb250YWluIGdyb3VwcyB0aGF0IHdlcmUKKwlzcGVjaWZpZWQgdG8gYmUgaW5zcGVjdGVkLiBUaGlzIGlzIGUuZy4gdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGgKKwl0aGUgYC0tb3duZWRgIGFuZCBgLS11c2VyYCBvcHRpb25zIHRvIGNoZWNrIHdoZXRoZXIgYSBncm91cCBpcworCW93bmVkIGJ5IGEgdXNlci4KKwogLS12ZXJib3NlOjoKIC12OjoKIAlFbmFibGUgdmVyYm9zZSBvdXRwdXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZQotCWdyb3VwIG5hbWUsIFVVSUQsIGRlc2NyaXB0aW9uLCB0eXBlIChgU1lTVEVNYCBvciBgSU5URVJOQUxgKSwKLQlvd25lciBncm91cCBuYW1lLCBvd25lciBncm91cCBVVUlEIGFuZCB3aGV0aGVyIHRoZSBncm91cCBpcwotCXZpc2libGUgdG8gYWxsIChgdHJ1ZWAgb3IgYGZhbHNlYCkuCisJZ3JvdXAgbmFtZSwgVVVJRCwgZGVzY3JpcHRpb24sIG93bmVyIGdyb3VwIG5hbWUsIG93bmVyIGdyb3VwIFVVSUQKKwlhbmQgd2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgKGB0cnVlYCBvciBgZmFsc2VgKS4KICsKIElmIGEgZ3JvdXAgaGFzIGJlZW4gIm9ycGhhbmVkIiwgaS5lLiBpdHMgb3duZXIgZ3JvdXAgVVVJRCByZWZlcnMgdG8gYQogbm9uZXhpc3RlbnQgZ3JvdXAsIHRoZSBvd25lciBncm91cCBuYW1lIGZpZWxkIHdpbGwgcmVhZCBgbi9hYC4KQEAgLTEwNyw2ICsxMjEsMjEgQEAKIAlSZWdpc3RlcmVkIFVzZXJzCiA9PT09PQogCitMaXN0IGFsbCBncm91cHMgd2hpY2ggYXJlIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXI6Cis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgbHMtZ3JvdXBzIC0tb3duZWQKKwlNeVByb2plY3RfQ29tbWl0dGVycworCU15UHJvamVjdF9WZXJpZmllcnMKKz09PT09CisKK0NoZWNrIGlmIHRoZSBjYWxsaW5nIHVzZXIgb3ducyB0aGUgZ3JvdXAgYE15UHJvamVjdF9Db21taXR0ZXJzYC4gSWYKK2BNeVByb2plY3RfQ29tbWl0dGVyc2AgaXMgcmV0dXJuZWQgdGhlIGNhbGxpbmcgdXNlciBvd25zIHRoaXMgZ3JvdXAuCitJZiB0aGUgcmVzdWx0IGlzIGVtcHR5LCB0aGUgY2FsbGluZyB1c2VyIGRvZXNuJ3Qgb3duIHRoZSBncm91cC4KKz09PT09CisJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCBscy1ncm91cHMgLS1vd25lZCAtcSBNeVByb2plY3RfQ29tbWl0dGVycworCU15UHJvamVjdF9Db21taXR0ZXJzCis9PT09PQorCiBFeHRyYWN0IHRoZSBVVUlEIG9mIHRoZSAnQWRtaW5pc3RyYXRvcnMnIGdyb3VwOgogCiA9PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWQtbHMtcHJvamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtbHMtcHJvamVjdHMudHh0CmluZGV4IGQ3ZDVhYTUuLjI2NTMwYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWxzLXByb2plY3RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy1wcm9qZWN0cy50eHQKQEAgLTE2LDYgKzE2LDcgQEAKICAgWy0tZm9ybWF0IHt0ZXh0IHwganNvbiB8IGpzb25fY29tcGFjdH1dCiAgIFstLWFsbF0KICAgWy0tbGltaXQgPE4+XQorICBbLS1oYXMtYWNsLWZvciBHUk9VUF0KIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCkBAIC05MSw2ICs5MiwxMyBAQAogLS1saW1pdDo6CiAJQ2FwIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byB0aGUgZmlyc3QgTiBtYXRjaGVzLgogCistLWhhcy1hY2wtZm9yOjoKKwlEaXNwbGF5IG9ubHkgcHJvamVjdHMgb24gd2hpY2ggYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBncm91cCBhcmUKKwlkaXJlY3RseSBhc3NpZ25lZC4gUHJvamVjdHMgd2hpY2ggb25seSBpbmhlcml0IGFjY2VzcyByaWdodHMgZm9yCisJdGhpcyBncm91cCBhcmUgbm90IGxpc3RlZC4KKysKK1dpdGggdGhpcyBvcHRpb24geW91IGNhbiBmaW5kIG91dCBvbiB3aGljaCBwcm9qZWN0cyBhIGdyb3VwIGlzIHVzZWQuCisKIEhUVFAKIC0tLS0KIFRoaXMgY29tbWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBvdmVyIEhUVFAsIGFzIGAvcHJvamVjdHMvYCBmb3IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLWxzLXVzZXItcmVmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy11c2VyLXJlZnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTk5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy11c2VyLXJlZnMudHh0CkBAIC0wLDAgKzEsNTUgQEAKK2dlcnJpdCBscy11c2VyLXJlZnMKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2Vycml0IGxzLXVzZXItcmVmcyAtIExpc3QgcmVmcyB2aXNpYmxlIHRvIGEgc3BlY2lmaWMgdXNlcgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBscy11c2VyLXJlZnMnCisgIFstLXByb2plY3QgUFJPSkVDVD4gfCAtcCA8UFJPSkVDVD5dCisgIFstLXVzZXIgPFVTRVI+IHwgLXUgPFVTRVI+XQorICBbLS1vbmx5LXJlZnMtaGVhZHNdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgYWxsIHJlZnMgdGhhdCB0aGUgc3BlY2lmaWVkIHVzZXIgY2FuIHNlZS4KKworQWxsb3dzIGFuIGFkbWluaXN0cmF0b3IgdG8gcXVlcnkgd2hpY2ggcmVmcyBhcmUgdmlzaWJsZSBmb3IKK2EgdXNlci4gVGhlIGNvbW1hbmQgaXMgaGVscGZ1bCBmb3IgYWRtaW5zIHdoZW4gZGVidWdnaW5nIHdoeSBhCit1c2VyIGNhbm5vdCBhY2Nlc3MgY2VydGFpbiByZWZzIGFuZCBhbHNvIHRvIGhlbHAgYWRtaW5zCit2ZXJpZnkgdGhhdCBjZXJ0YWluIHNlY3JldCByZWZzIGFyZSBub3QgZXhwb3NlZCB0byB0aGUgd3JvbmcKK2dyb3Vwcy4KKworQUNDRVNTCistLS0tLS0KK0FkbWluaXN0cmF0b3JzCisKK09QVElPTlMKKy0tLS0tLS0KKy0tcHJvamVjdDo6CistcDo6CisJUmVxdWlyZWQ7IE5hbWUgb2YgdGhlIHByb2plY3QgZm9yIHdoaWNoIHRoZSByZWZzIHNob3VsZCBiZSBsaXN0ZWQuCisKKy0tdXNlcjo6CistdTo6CisJUmVxdWlyZWQ7IFVzZXIgZm9yIHdoaWNoIHRoZSB2aXNpYmxlIHJlZnMgc2hvdWxkIGJlIGxpc3RlZC4gR2Vycml0CisJd2lsbCBxdWVyeSB0aGUgZGF0YWJhc2UgdG8gZmluZCBtYXRjaGluZyB1c2Vycywgc28gdGhlCisJZnVsbCBpZGVudGl0eS9uYW1lIGRvZXMgbm90IG5lZWQgdG8gYmUgc3BlY2lmaWVkLgorCistLW9ubHktcmVmcy1oZWFkczo6CisJT25seSBsaXN0IHRoZSByZWZzIGZvdW5kIHVuZGVyIHJlZnMvaGVhZHMvKgorCitFWEFNUExFUworLS0tLS0tLS0KKworTGlzdCB2aXNpYmxlIHJlZnMgZm9yIHRoZSB1c2VyICJtci5kZXZlbG9wZXIiIGluIHByb2plY3QgImdlcnJpdCIKKz09PT09CisJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCBscy11c2VyLXJlZnMgLXAgZ2Vycml0IC11IG1yLmRldmVsb3BlcgorPT09PT0KKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXF1ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vY21kLXF1ZXJ5LnR4dAppbmRleCAyZmVlYTExLi42NmJkODQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1xdWVyeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtcXVlcnkudHh0CkBAIC0yOCw3ICsyOCw5IEBACiBRdWVyaWVzIHRoZSBjaGFuZ2UgZGF0YWJhc2UgYW5kIHJldHVybnMgcmVzdWx0cyBkZXNjcmliaW5nIGNoYW5nZXMKIHRoYXQgbWF0Y2ggdGhlIGlucHV0IHF1ZXJ5LiAgTW9yZSByZWNlbnRseSB1cGRhdGVkIGNoYW5nZXMgYXBwZWFyCiBiZWZvcmUgb2xkZXIgY2hhbmdlcywgd2hpY2ggaXMgdGhlIHNhbWUgb3JkZXIgcHJlc2VudGVkIGluIHRoZQotd2ViIGludGVyZmFjZS4KK3dlYiBpbnRlcmZhY2UuICBGb3IgZWFjaCBtYXRjaGluZyBjaGFuZ2UsIHRoZSByZXN1bHQgY29udGFpbnMgZGF0YQorZm9yIHRoZSBjaGFuZ2UncyBsYXRlc3QgcGF0Y2ggc2V0LCBldmVuIGlmIHRoZSBxdWVyeSBtYXRjaGVkIG9uIGFuCitvbGRlciBwYXRjaCBzZXQgKGZvciBleGFtcGxlIGFuIG9sZGVyIHBhdGNoIHNldCdzIHNoYTEgcmV2aXNpb24pLgogCiBBIHF1ZXJ5IG1heSBiZSBsaW1pdGVkIG9uIHRoZSBudW1iZXIgb2YgcmVzdWx0cyBpdCByZXR1cm5zIHdpdGggdGhlCiAnbGltaXQ6JyBvcGVyYXRvci4gIElmIG5vIGxpbWl0IGlzIHN1cHBsaWVkIGFuIGludGVybmFsIGRlZmF1bHQKQEAgLTM3LDE2ICszOSwyMSBAQAogdG8gcmVzdW1lIHRoZSBxdWVyeSBhdCB0aGUgY2hhbmdlIHRoYXQgZm9sbG93cyB0aGUgbGFzdCBjaGFuZ2Ugb2YKIHRoZSBwcmlvciByZXN1bHQgc2V0LgogCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyB0byB0aGlzIGNvbW1hbmQgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcyBhbmQgdGhlbgotcGFyc2VkIGFzIGEgcXVlcnkuICBUaGlzIHNpbXBsaWZpZXMgY2FsbGluZyBjb252ZW50aW9ucyBvdmVyIFNTSAotYnkgcGVybWl0dGluZyBvcGVyYXRvcnMgdG8gYXBwZWFyIGluIGRpZmZlcmVudCBhcmd1bWVudHMgd2l0aG91dAotbXVsdGlwbGUgbGV2ZWxzIG9mIHF1b3RpbmcgcmVxdWlyZWQuCitOb24tb3B0aW9uIGFyZ3VtZW50cyB0byB0aGlzIGNvbW1hbmQgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcyBhbmQKK3RoZW4gcGFyc2VkIGFzIGEgcXVlcnkuIFRoaXMgc2ltcGxpZmllcyBjYWxsaW5nIGNvbnZlbnRpb25zIG92ZXIKK1NTSCBieSBwZXJtaXR0aW5nIG9wZXJhdG9ycyB0byBhcHBlYXIgaW4gZGlmZmVyZW50IGFyZ3VtZW50cy4KKworUXVlcnkgb3BlcmF0b3JzIG1heSBxdW90ZSB2YWx1ZXMgdXNpbmcgbWF0Y2hlZCBjdXJseSBicmFjZXMKKyhlLmcuIGByZXZpZXdlcmluOntEZXZlbG9wZXIgR3JvdXB9YCkgdG8gc2lkZXN0ZXAgaXNzdWVzIHdpdGggMgorbGV2ZWxzIG9mIHNoZWxsIHF1b3RpbmcgKGNhbGxlciBzaGVsbCBpbnZva2luZyBTU0gsIGFuZCB0aGUgU1NICitjb21tYW5kIGxpbmUgcGFyc2VyIGluIHRoZSBzZXJ2ZXIpLgogCiBPUFRJT05TCiAtLS0tLS0tCiAtLWZvcm1hdDo6Ci0JRm9ybWF0dGluZyBtZXRob2QgZm9yIHRoZSByZXN1bHRzLiBURVhUIGlzIHRoZSBkZWZhdWx0LAotCXByZXNlbnRpbmcgYSBodW1hbiByZWFkYWJsZSBkaXNwbGF5LiBKU09OIGNyZWF0ZXMgb25lIGxpbmUKKwlGb3JtYXR0aW5nIG1ldGhvZCBmb3IgdGhlIHJlc3VsdHMuIGBURVhUYCBpcyB0aGUgZGVmYXVsdCwKKwlwcmVzZW50aW5nIGEgaHVtYW4gcmVhZGFibGUgZGlzcGxheS4gYEpTT05gIHJldHVybnMKKwlsaW5rOmpzb24uaHRtbCNjaGFuZ2VbY2hhbmdlIGF0dHJpYnV0ZXNdLCBvbmUgbGluZQogCXBlciBtYXRjaGluZyByZWNvcmQsIHdpdGggZW1iZWRkZWQgTEZzIGVzY2FwZWQuCiAKIC0tY3VycmVudC1wYXRjaC1zZXQ6OgpAQCAtNjUsMTMgKzcyLDE0IEBACiAKIC0tZmlsZXM6OgogCVN1cHBvcnQgZm9yIGxpc3RpbmcgZmlsZXMgd2l0aCBwYXRjaCBzZXRzIGFuZCB0aGVpcgotCWF0dHJpYnV0ZXMgKEFEREVELCBNT0RJRklFRCwgREVMRVRFRCwgUkVOQU1FRCwgQ09QSUVEKS4KKwlhdHRyaWJ1dGVzIChBRERFRCwgTU9ESUZJRUQsIERFTEVURUQsIFJFTkFNRUQsIENPUElFRCkKKwlhbmQgc2l6ZSBpbmZvcm1hdGlvbiAobnVtYmVyIG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucykuCiAJTm90ZSB0aGF0IHRoaXMgb3B0aW9uIHJlcXVpcmVzIGVpdGhlciB0aGUgLS1jdXJyZW50LXBhdGNoLXNldAogCW9yIHRoZSAtLXBhdGNoLXNldHMgb3B0aW9uIGluIG9yZGVyIHRvIGdpdmUgYW55IGZpbGUgaW5mb3JtYXRpb24uCiAKIC0tY29tbWVudHM6OgogCUluY2x1ZGUgY29tbWVudHMgZm9yIGFsbCBjaGFuZ2VzLiBJZiBjb21iaW5lZCB3aXRoIHRoZQotCS0tcGF0Y2gtc2V0cyBmbGFnIHRoZW4gYWxsIGluLWxpbmUgY29tbWVudHMgYXJlIGluY2x1ZGVkIGZvcgorCS0tcGF0Y2gtc2V0cyBmbGFnIHRoZW4gYWxsIGlubGluZS9maWxlIGNvbW1lbnRzIGFyZSBpbmNsdWRlZCBmb3IKIAllYWNoIHBhdGNoIHNldC4KIAogLS1jb21taXQtbWVzc2FnZTo6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1yZWNlaXZlLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtcmVjZWl2ZS1wYWNrLnR4dAppbmRleCA2OGY2ODZkLi45MmJiNjVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1yZWNlaXZlLXBhY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLXJlY2VpdmUtcGFjay50eHQKQEAgLTMyLDI4ICszMiwxMiBAQAogCiAtLXJldmlld2VyIDxhZGRyZXNzPjo6CiAtLXJlIDxhZGRyZXNzPjo6Ci0JQXV0b21hdGljYWxseSBhZGQgPGFkZHJlc3M+IGFzIGEgcmV2aWV3ZXIgdG8gYW55IGNoYW5nZQotCWNyZWF0ZWQgb3IgdXBkYXRlZCBieSB0aGUgcHVzaGVkIGNvbW1pdCBvYmplY3RzLiAgVGhlc2UKLQljaGFuZ2VzIHdpbGwgYXBwZWFyIGluIHRoZSByZXZpZXdlcidzIGRhc2hib2FyZCwgYW5kIHdpbGwKLQlhbHNvIGJlIGVtYWlsZWQgdG8gdGhlIHJldmlld2VyLgotKwotTWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSB0byByZXF1ZXN0IG11bHRpcGxlIHJldmlld2Vycy4KLSsKLVRoaXMgaXMgYSBHZXJyaXQgQ29kZSBSZXZpZXcgc3BlY2lmaWMgZXh0ZW5zaW9uLgorCUF1dG9tYXRpY2FsbHkgYWRkIDxhZGRyZXNzPiBhcyBhIHJldmlld2VyIHRvIGFueSBjaGFuZ2UuCisJRGVwcmVjYXRlZCwgdXNlIGByZWZzL2Zvci9icmFuY2glcj1hZGRyZXNzYCBpbnN0ZWFkLgogCiAtLWNjIDxhZGRyZXNzPjo6Ci0JQ2FyYm9uLWNvcHkgPGFkZHJlc3M+IG9uIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgY2hhbmdlcywKLQlidXQgZG9uJ3QgcmVxdWVzdCB0aGVtIHRvIHBlcmZvcm0gYSByZXZpZXcuICBMaWtlIHdpdGgKLQktLXJldmlld2VyIHRoZSBjaGFuZ2VzIHdpbGwgYXBwZWFyIGluIHRoZSBDQydkIHVzZXIncwotCWRhc2hib2FyZCwgYW5kIHdpbGwgYmUgZW1haWxlZCB0byB0aGVtLgotKwotTWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSB0byBzcGVjaWZ5IG11bHRpcGxlIENDcy4KLSsKLVRoaXMgaXMgYSBHZXJyaXQgQ29kZSBSZXZpZXcgc3BlY2lmaWMgZXh0ZW5zaW9uLgotCi1BYm92ZSA8YWRkcmVzcz4gbWF5IGJlIHRoZSBjb21wbGV0ZSBlbWFpbCBhZGRyZXNzLCBvciwgaWYgR2Vycml0IGlzCi1jb25maWd1cmVkIHdpdGggSFRUUCBhdXRoZW50aWNhdGlvbiAoZS5nLiB3aXRoaW4gYSBzaW5nbGUgZG9tYWluKSwKLWp1c3QgdGhlIGxvY2FsIHBhcnQgKHR5cGljYWxseSB1c2VybmFtZSkuCisJQ2FyYm9uLWNvcHkgPGFkZHJlc3M+IG9uIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgY2hhbmdlcy4KKwlEZXByZWNhdGVkLCB1c2UgYHJlZnMvZm9yL2JyYW5jaCVjYz1hZGRyZXNzYCBpbnN0ZWFkLgogCiBBQ0NFU1MKIC0tLS0tLQpAQCAtNjQsMzIgKzQ4LDMwIEBACiAKIFNlbmQgYSByZXZpZXcgZm9yIGEgY2hhbmdlIG9uIHRoZSBtYXN0ZXIgYnJhbmNoIHRvIGNoYXJsaWVAZXhhbXBsZS5jb206CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbScgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QgSEVBRDpyZWZzL2Zvci9tYXN0ZXIKKwlnaXQgcHVzaCBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20KID09PT09CiAKIFNlbmQgcmV2aWV3cywgYnV0IHRhZ2dpbmcgdGhlbSB3aXRoIHRoZSB0b3BpYyBuYW1lICdidWc0Mic6CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbScgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QgSEVBRDpyZWZzL2Zvci9tYXN0ZXIvYnVnNDIKKwlnaXQgcHVzaCBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20sdG9waWM9YnVnNDIKID09PT09CiAKIEFsc28gQ0MgdHdvIG90aGVyIHBhcnRpZXM6CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbSAtLWNjIGFsaWNlQGV4YW1wbGUuY29tIC0tY2MgYm9iQGV4YW1wbGUuY29tJyBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlcgorCWdpdCBwdXNoIHNzaDovL3Jldmlldy5leGFtcGxlLmNvbToyOTQxOC9wcm9qZWN0IEhFQUQ6cmVmcy9mb3IvbWFzdGVyJXI9Y2hhcmxpZUBleGFtcGxlLmNvbSxjYz1hbGljZUBleGFtcGxlLmNvbSxjYz1ib2JAZXhhbXBsZS5jb20KID09PT09CiAKIENvbmZpZ3VyZSBhIHB1c2ggbWFjcm8gdG8gcGVyZm9ybSB0aGUgbGFzdCBhY3Rpb246CiA9PT09CiAJZ2l0IGNvbmZpZyByZW1vdGUuY2hhcmxpZS51cmwgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QKLQlnaXQgY29uZmlnIHJlbW90ZS5jaGFybGllLnB1c2ggSEVBRDpyZWZzL2Zvci9tYXN0ZXIKLQlnaXQgY29uZmlnIHJlbW90ZS5jaGFybGllLnJlY2VpdmVwYWNrICdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbSAtLWNjIGFsaWNlQGV4YW1wbGUuY29tIC0tY2MgYm9iQGV4YW1wbGUuY29tJworCWdpdCBjb25maWcgcmVtb3RlLmNoYXJsaWUucHVzaCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20sY2M9YWxpY2VAZXhhbXBsZS5jb20sY2M9Ym9iQGV4YW1wbGUuY29tCiA9PT09CiAKIGFmdGVyd2FyZHMgYC5naXQvY29uZmlnYCBjb250YWlucyB0aGUgZm9sbG93aW5nOgogLS0tLQogW3JlbW90ZSAiY2hhcmxpZSJdCiAgIHVybCA9IHNzaDovL3Jldmlldy5leGFtcGxlLmNvbToyOTQxOC9wcm9qZWN0Ci0gIHB1c2ggPSBIRUFEOnJlZnMvZm9yL21hc3RlcgotICByZWNlaXZlcGFjayA9IGdpdCByZWNlaXZlLXBhY2sgLS1yZXZpZXdlciBjaGFybGllQGV4YW1wbGUuY29tIC0tY2MgYWxpY2VAZXhhbXBsZS5jb20gLS1jYyBib2JAZXhhbXBsZS5jb20KKyAgcHVzaCA9IEhFQUQ6cmVmcy9mb3IvbWFzdGVyJXI9Y2hhcmxpZUBleGFtcGxlLmNvbSxjYz1hbGljZUBleGFtcGxlLmNvbSxjYz1ib2JAZXhhbXBsZS5jb20KIC0tLS0KIAogYW5kIG5vdyBzZW5kaW5nIGEgbmV3IGNoYW5nZSBmb3IgcmV2aWV3IHRvIGNoYXJsaWUsIENDJ2luZyBib3RoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1yZXZpZXcudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtcmV2aWV3LnR4dAppbmRleCA1MTNiYzZlLi42NWMyMWRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1yZXZpZXcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLXJldmlldy50eHQKQEAgLTE3LDYgKzE3LDcgQEAKICAgWy0tcHVibGlzaF0KICAgWy0tZGVsZXRlXQogICBbLS12ZXJpZmllZCA8Tj5dIFstLWNvZGUtcmV2aWV3IDxOPl0KKyAgWy0tbGFiZWwgTGFiZWwtTmFtZT08Tj5dCiAgIHtDT01NSVQgfCBDSEFOR0VJRCxQQVRDSFNFVH0uLi4KIAogREVTQ1JJUFRJT04KQEAgLTk0LDEwICs5NSwxNCBAQAogCiAtLWNvZGUtcmV2aWV3OjoKIC0tdmVyaWZpZWQ6OgotCVNldCB0aGUgYXBwcm92YWwgY2F0ZWdvcnkgdG8gdGhlIHZhbHVlICdOJy4gIFRoZSBleGFjdAotCW9wdGlvbiBuYW1lcyBzdXBwb3J0ZWQgYW5kIHRoZSByYW5nZSBvZiB2YWx1ZXMgcGVybWl0dGVkCi0JZGlmZmVycyBwZXIgc2l0ZSwgY2hlY2sgdGhlIG91dHB1dCBvZiAtLWhlbHAsIG9yIGNvbnRhY3QKLQl5b3VyIHNpdGUgYWRtaW5pc3RyYXRvciBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICAgICBTZXQgdGhlIGxhYmVsIHRvIHRoZSB2YWx1ZSAnTicuICBUaGUgZXhhY3Qgb3B0aW9uIG5hbWVzCisgICAgICAgIHN1cHBvcnRlZCBhbmQgdGhlIHJhbmdlIG9mIHZhbHVlcyBwZXJtaXR0ZWQgZGlmZmVycyBwZXIgc2l0ZSwKKyAgICAgICAgY2hlY2sgdGhlIG91dHB1dCBvZiAtLWhlbHAsIG9yIGNvbnRhY3QgeW91ciBzaXRlIGFkbWluaXN0cmF0b3IKKyAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoZXNlIG9wdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciB0aGVzZQorICAgICAgICBidWlsdC1pbiBsYWJlbHM7IGZvciBvdGhlciBsYWJlbHMsIHNlZSAtLWxhYmVsLgorCistLWxhYmVsOjoKKyAgICAgICAgU2V0IGEgbGFiZWwgYnkgbmFtZSB0byB0aGUgdmFsdWUgJ04nLgogCiBBQ0NFU1MKIC0tLS0tLQpAQCAtMTIyLDcgKzEyNyw3IEBACiAJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCByZXZpZXcgLW0gJyJCdWlsZCBTdWNjZXNzZnVsIicgYzBmZjMzCiA9PT09PQogCi1NYXJrIHRoZSB1bm1lcmdlZCBjb21taXRzIGJvdGggIlZlcmlmaWVkICsxIiBhbmQgIkNvZGUgUmV2aWV3ICsyIiBhbmQKK01hcmsgdGhlIHVubWVyZ2VkIGNvbW1pdHMgYm90aCAiVmVyaWZpZWQgKzEiIGFuZCAiQ29kZS1SZXZpZXcgKzIiIGFuZAogc3VibWl0IHRoZW0gZm9yIG1lcmdpbmc6CiA9PT09CiAgICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgcmV2aWV3IFwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXNldC1wcm9qZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vY21kLXNldC1wcm9qZWN0LnR4dAppbmRleCAwNTlmMDYzLi5hMGFmOTEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1zZXQtcHJvamVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtc2V0LXByb2plY3QudHh0CkBAIC0xMSwxMSArMTEsMTEgQEAKICdzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBzZXQtcHJvamVjdCcKICAgWy0tZGVzY3JpcHRpb24gPERFU0M+IHwgLWQgPERFU0M+XQogICBbLS1zdWJtaXQtdHlwZSA8VFlQRT4gfCAtdCA8VFlQRT5dCi0gIFstLXVzZXxuby1jb250cmlidXRvci1hZ3JlZW1lbnRzIHwgLS1jYXxuY2FdCi0gIFstLXVzZXxuby1zaWduZWQtb2ZmLWJ5IHwgLS1zb3xuc29dCi0gIFstLXVzZXxuby1jb250ZW50LW1lcmdlXQotICBbLS1yZXF1aXJlfG5vLWNoYW5nZS1pZCB8IC0taWR8bmlkXQotICBbLS1wcm9qZWN0LXN0YXRlIHwgLS1wc10KKyAgWy0tY29udHJpYnV0b3ItYWdyZWVtZW50cyA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tc2lnbmVkLW9mZi1ieSA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tY29udGVudC1tZXJnZSA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tY2hhbmdlLWlkIDx0cnVlfGZhbHNlfGluaGVyaXQ+XQorICBbLS1wcm9qZWN0LXN0YXRlIDxTVEFURT4gfCAtLXBzIDxTVEFURT5dCiAgIDxOQU1FPgogCiBERVNDUklQVElPTgpAQCAtNjMsMjYgKzYzLDIzIEBACiBGb3IgbW9yZSBkZXRhaWxzIHNlZQogbGluazpwcm9qZWN0LXNldHVwLmh0bWwjc3VibWl0X3R5cGVbQ2hhbmdlIFN1Ym1pdCBBY3Rpb25zXS4KIAotLS11c2V8bm8tY29udGVudC1tZXJnZTo6CistLWNvbnRlbnQtbWVyZ2U6OgogICAgIElmIGVuYWJsZWQsIEdlcnJpdCB3aWxsIHRyeSB0byBwZXJmb3JtIGEgMy13YXkgbWVyZ2Ugb2YgdGV4dAogICAgIGZpbGUgY29udGVudCB3aGVuIGEgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBieSBib3RoIHRoZQogICAgIGRlc3RpbmF0aW9uIGJyYW5jaCBhbmQgdGhlIGNoYW5nZSBiZWluZyBzdWJtaXR0ZWQuICBUaGlzCiAgICAgb3B0aW9uIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHN1Ym1pdCB0eXBlIGlzIG5vdAogICAgIEZBU1RfRk9SV0FSRF9PTkxZLgogCi0tLXVzZXxuby1jb250cmlidXRvci1hZ3JlZW1lbnRzOjoKLS0tY2F8bmNhOjoKKy0tY29udHJpYnV0b3ItYWdyZWVtZW50czo6CiAgICAgSWYgZW5hYmxlZCwgYXV0aG9ycyBtdXN0IGNvbXBsZXRlIGEgY29udHJpYnV0b3IgYWdyZWVtZW50CiAgICAgb24gdGhlIHNpdGUgYmVmb3JlIHB1c2hpbmcgYW55IGNvbW1pdHMgb3IgY2hhbmdlcyB0byB0aGlzCiAgICAgcHJvamVjdC4KIAotLS11c2V8bm8tc2lnbmVkLW9mZi1ieTo6Ci0tLXNvfG5zbzoKKy0tc2lnbmVkLW9mZi1ieTo6CiAgICAgSWYgZW5hYmxlZCwgZWFjaCBjaGFuZ2UgbXVzdCBjb250YWluIGEgU2lnbmVkLW9mZi1ieSBsaW5lCiAgICAgZnJvbSBlaXRoZXIgdGhlIGF1dGhvciBvciB0aGUgdXBsb2FkZXIgaW4gdGhlIGNvbW1pdCBtZXNzYWdlLgogCi0tLXJlcXVpcmV8bm8tY2hhbmdlLWlkOjoKLS0taWR8bmlkOjoKKy0tY2hhbmdlLWlkOjoKICAgICBSZXF1aXJlIGEgdmFsaWQgbGluazp1c2VyLWNoYW5nZWlkLmh0bWxbQ2hhbmdlLUlkXSBmb290ZXIKICAgICBpbiBhbnkgY29tbWl0IHVwbG9hZGVkIGZvciByZXZpZXcuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8KICAgICBjb21taXRzIHB1c2hlZCBkaXJlY3RseSB0byBhIGJyYW5jaCBvciB0YWcuCkBAIC0xMDMsNyArMTAwLDcgQEAKIAogPT09PQogICAgICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgc2V0LXByb2plY3QgZXhhbXBsZSAtLXN1Ym1pdC10eXBlIE1FUkdFX0lGX05FQ0VTU0FSWVwKLSAgICAtLXJlcXVpcmUtY2hhbmdlLWlkIC0tbm8tY29udGVudC1tZXJnZSAtLXByb2plY3Qtc3RhdGUgSElEREVOCisgICAgLS1jaGFuZ2UtaWQgdHJ1ZSAtLWNvbnRlbnQtbWVyZ2UgZmFsc2UgLS1wcm9qZWN0LXN0YXRlIEhJRERFTgogPT09PQogCiBHRVJSSVQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXN0cmVhbS1ldmVudHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKaW5kZXggYThjZjNiMC4uY2UyM2RhNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKQEAgLTQ0LDcgKzQ0LDggQEAKICpwYXRjaFNldCosICphY2NvdW50KiBpbnZvbHZlZCwgYW5kIG90aGVyIGF0dHJpYnV0ZXMgYXMgYXBwcm9wcmlhdGUuCiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBtZXNzYWdlIHR5cGVzIGFyZSAqcGF0Y2hzZXQtY3JlYXRlZCosCiAqZHJhZnQtcHVibGlzaGVkKiwgKmNoYW5nZS1hYmFuZG9uZWQqLCAqY2hhbmdlLXJlc3RvcmVkKiwKLSpjaGFuZ2UtbWVyZ2VkKiwgKmNvbW1lbnQtYWRkZWQqIGFuZCAqcmVmLXVwZGF0ZWQqLgorKmNoYW5nZS1tZXJnZWQqLCAqbWVyZ2UtZmFpbGVkKiwgKmNvbW1lbnQtYWRkZWQqLCAqcmVmLXVwZGF0ZWQqIGFuZAorKnJldmlld2VyLWFkZGVkKi4KIAogTm90ZSB0aGF0IGFueSBmaWVsZCBtYXkgYmUgbWlzc2luZyBpbiB0aGUgSlNPTiBtZXNzYWdlcywgc28gY29uc3VtZXJzIG9mCiB0aGlzIEpTT04gc3RyZWFtIHNob3VsZCBkZWFsIHdpdGggdGhhdCBhcHByb3ByaWF0ZWx5LgpAQCAtMTA1LDYgKzEwNiwxOCBAQAogCiBzdWJtaXR0ZXI6OiBsaW5rOmpzb24uaHRtbCNhY2NvdW50W2FjY291bnQgYXR0cmlidXRlXQogCitNZXJnZSBGYWlsZWQKK15eXl5eXl5eXl5eXgordHlwZTo6ICJtZXJnZS1mYWlsZWQiCisKK2NoYW5nZTo6IGxpbms6anNvbi5odG1sI2NoYW5nZVtjaGFuZ2UgYXR0cmlidXRlXQorCitwYXRjaFNldDo6IGxpbms6anNvbi5odG1sI3BhdGNoU2V0W3BhdGNoU2V0IGF0dHJpYnV0ZV0KKworc3VibWl0dGVyOjogbGluazpqc29uLmh0bWwjYWNjb3VudFthY2NvdW50IGF0dHJpYnV0ZV0KKworcmVhc29uOjogUmVhc29uIHRoYXQgdGhlIG1lcmdlIGZhaWxlZC4KKwogQ29tbWVudCBBZGRlZAogXl5eXl5eXl5eXl5eXgogdHlwZTo6ICJjb21tZW50LWFkZGVkIgpAQCAtMTI3LDYgKzE0MCwxNiBAQAogCiByZWZVcGRhdGU6OiBsaW5rOmpzb24uaHRtbCNyZWZVcGRhdGVbcmVmVXBkYXRlIGF0dHJpYnV0ZV0KIAorUmV2aWV3ZXIgQWRkZWQKK15eXl5eXl5eXl5eXl5eCit0eXBlOjogInJldmlld2VyLWFkZGVkIgorCitjaGFuZ2U6OiBsaW5rOmpzb24uaHRtbCNjaGFuZ2VbY2hhbmdlIGF0dHJpYnV0ZV0KKworcGF0Y2hzZXQ6OiBsaW5rOmpzb24uaHRtbCNwYXRjaFNldFtwYXRjaHNldCBhdHRyaWJ1dGVdCisKK3Jldmlld2VyOjogbGluazpqc29uLmh0bWwjYWNjb3VudFthY2NvdW50IGF0dHJpYnV0ZV0KKwogCiBTRUUgQUxTTwogLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXJ1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKaW5kZXggNWI3MGJkMS4uYWU2OGI4MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKQEAgLTEsMTcgKzEsMTYgQEAKLWdlcnJpdCB0ZXN0LXN1Ym1pdC1ydWxlCitnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZQogPT09PT09PT09PT09PT09PT09PT09PT0KIAogTkFNRQogLS0tLQotZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGUgLSBUZXN0IHByb2xvZyBzdWJtaXQgcnVsZXMgd2l0aCBhIGNob3NlbiBjaGFuZ2VzZXQuCitnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSAtIFRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcyB3aXRoIGEgY2hvc2VuIGNoYW5nZXNldC4KIAogU1lOT1BTSVMKIC0tLS0tLS0tCiBbdmVyc2VdCi0nc3NoJyAtcCA8cG9ydD4gPGhvc3Q+ICdnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZScKKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCB0ZXN0LXN1Ym1pdCBydWxlJwogICBbLXNdCiAgIFstLW5vLWZpbHRlcnNdCi0gIFstLWZvcm1hdCB7VEVYVCB8IEpTT059XQogICBDSEFOR0UKIAogREVTQ1JJUFRJT04KQEAgLTI2LDE1ICsyNSw2IEBACiAtLW5vLWZpbHRlcnM6OgogCURvbid0IHJ1biB0aGUgc3VibWl0X2ZpbHRlci8yIGZyb20gdGhlIHBhcmVudCBwcm9qZWN0cyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5nZS4KIAotLS1mb3JtYXQ6OgotICBXaGF0IG91dHB1dCBmb3JtYXQgdG8gZGlzcGxheSB0aGUgcmVzdWx0cyBpbi4KLSsKLS0tCi1gdGV4dGA6OiBTaW1wbGUgdGV4dCBiYXNlZCBmb3JtYXQuCi1ganNvbmA6OiBBIEpTT04gb2JqZWN0IGRlc2NyaWJlZCBpbiBsaW5rOmpzb24uaHRtbCNzdWJtaXRSZWNvcmRbc3VibWl0IHJlY29yZF0uCi1ganNvbl9jb21wYWN0YDo6IE1pbmltaXplZCBKU09OIG91dHB1dC4KLS0tCi0KIEFDQ0VTUwogLS0tLS0tCiBDYW4gYmUgdXNlZCBieSBhbnlvbmUgdGhhdCBoYXMgcGVybWlzc2lvbiB0byByZWFkIHRoZSBzcGVjaWZpZWQgY2hhbmdlc2V0LgpAQCAtNDIsNDYgKzMyLDMxIEBACiBFWEFNUExFUwogLS0tLS0tLS0KIAotCi1UZXN0IHN1Ym1pdF9ydWxlIGZyb20gc3RkaW4uCi09PT09Ci0gJCBjYXQgbm9uLWF1dGhvci1jb2RlcmV2aWV3LnBsIHwgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZSAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQotIE5vbi1BdXRob3ItQ29kZS1SZXZpZXc6IE5PVF9SRUFEWQotIFZlcmlmaWVkOiBOT1RfUkVBRFkKLSBDb2RlLVJldmlldzogTk9UX1JFQURZIGJ5IEFub255bW91cyBDb3dhcmQgPHRlc3RAZW1haWwuY29tPgotCi0gTk9UX1JFQURZCi09PT09Ci0KIFRlc3Qgc3VibWl0X3J1bGUgZnJvbSBzdGRpbiBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGFzIEpTT04uCiA9PT09Ci0gY2F0IG5vbi1hdXRob3ItY29kZXJldmlldy5wbCB8IHNzaCAtcCAyOTQxOCByZXZpZXcuZXhhbXBsZS5jb20gZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGUgLS1mb3JtYXQ9SlNPTiAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQotIHsKLSAgImFwcHJvdmFscyI6IFsKLSAgICB7Ci0gICAgICAidHlwZSI6ICJWZXJpZmllZCIsCi0gICAgICAidmFsdWUiOiAiTkVFRCIKLSAgICB9LAotICAgIHsKLSAgICAgICJ0eXBlIjogIkNvZGUtUmV2aWV3IiwKLSAgICAgICJ2YWx1ZSI6ICJPSyIsCi0gICAgICAiYnkiOiB7Ci0gICAgICAgICJlbWFpbCI6ICJ0ZXN0QGVtYWlsLmNvbSIsCi0gICAgICAgICJ1c2VybmFtZSI6ICJ0ZXN0IgotICAgICAgfQotICAgIH0KLSAgXSwKLSAgInZhbHVlIjogIk5PVF9SRUFEWSIKLSB9CisgY2F0IHJ1bGVzLnBsIHwgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQorIFsKKyAgIHsKKyAgICAgInN0YXR1cyI6ICJOT1RfUkVBRFkiLAorICAgICAicmVqZWN0IjogeworICAgICAgICJBbnktTGFiZWwtTmFtZSI6IHt9CisgICAgIH0KKyAgIH0KKyBdCiA9PT09CiAKIFRlc3QgdGhlIGFjdGl2ZSBzdWJtaXRfcnVsZSBmcm9tIHRoZSByZWZzL21ldGEvY29uZmlnIGJyYW5jaCwgaWdub3JpbmcgZmlsdGVycyBpbiB0aGUgcHJvamVjdCBwYXJlbnRzLgogPT09PQotICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZSBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOSAtLW5vLWZpbHRlcnMKLSBWZXJpZmllZDogTk9UX1JFQURZCi0gQ29kZS1SZXZpZXc6IE5PVF9SRUFEWSBieSBBbm9ueW1vdXMgQ293YXJkIDx0ZXN0QGVtYWlsLmNvbT4KLQotIE5PVF9SRUFEWQorICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOSAtLW5vLWZpbHRlcnMKKyBbCisgICB7CisgICAgICJzdGF0dXMiOiAiTk9UX1JFQURZIiwKKyAgICAgIm5lZWQiOiB7CisgICAgICAgIkNvZGUtUmV2aWV3Ijoge30KKyAgICAgICAiVmVyaWZpZWQiOiB7fQorICAgICB9CisgICB9CisgXQogPT09PQogCiBTQ1JJUFRJTkcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXR5cGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtdHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkNWZiYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXR5cGUudHh0CkBAIC0wLDAgKzEsNTMgQEAKK2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlCis9PT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnZXJyaXQgdGVzdC1zdWJtaXQgdHlwZSAtIFRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlIHdpdGggYSBjaG9zZW4gY2hhbmdlLgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlJworICBbLXNdCisgIFstLW5vLWZpbHRlcnNdCisgIENIQU5HRQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Byb3ZpZGVzIGEgd2F5IHRvIHRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlLgorCitPUFRJT05TCistLS0tLS0tCistczo6CisJUmVhZHMgYSBydWxlcy5wbCBmaWxlIGZyb20gc3RkaW4gaW5zdGVhZCBvZiBydWxlcy5wbCBpbiByZWZzL21ldGEvY29uZmlnLgorCistLW5vLWZpbHRlcnM6OgorCURvbid0IHJ1biB0aGUgc3VibWl0X3R5cGVfZmlsdGVyLzIgZnJvbSB0aGUgcGFyZW50IHByb2plY3RzIG9mIHRoZSBzcGVjaWZpZWQgY2hhbmdlLgorCitBQ0NFU1MKKy0tLS0tLQorQ2FuIGJlIHVzZWQgYnkgYW55b25lIHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3BlY2lmaWVkIGNoYW5nZS4KKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK1Rlc3Qgc3VibWl0X3R5cGUgZnJvbSBzdGRpbiBhbmQgcmV0dXJuIHRoZSBzdWJtaXQgdHlwZS4KKz09PT0KKyBjYXQgcnVsZXMucGwgfCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlIC1zIEk3OGYyYzY2NzNkYjI0ZTRlOTJlZDMyZjYwNGM5NjBkYzk1MjQzN2Q5CisgIk1FUkdFX0lGX05FQ0VTU0FSWSIKKz09PT0KKworVGVzdCB0aGUgYWN0aXZlIHN1Ym1pdF90eXBlIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoLCBpZ25vcmluZyBmaWx0ZXJzIGluIHRoZSBwcm9qZWN0IHBhcmVudHMuCis9PT09CisgJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlIEk3OGYyYzY2NzNkYjI0ZTRlOTJlZDMyZjYwNGM5NjBkYzk1MjQzN2Q5IC0tbm8tZmlsdGVycworICJNRVJHRV9JRl9ORUNFU1NBUlkiCis9PT09CisKK1NDUklQVElORworLS0tLS0tLS0tCitDYW4gYmUgdXNlZCBlaXRoZXIgaW50ZXJhY3RpdmVseSBmb3IgdGVzdGluZyBuZXcgcHJvbG9nIHN1Ym1pdCB0eXBlLCBvciBmcm9tIGEgc2NyaXB0IHRvIGNoZWNrIHRoZSBzdWJtaXQgdHlwZSBvZiBhIGNoYW5nZS4KKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXZlcnNpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdmVyc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmOTRlYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY21kLXZlcnNpb24udHh0CkBAIC0wLDAgKzEsNDggQEAKK2dlcnJpdCB2ZXJzaW9uCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dlcnJpdCB2ZXJzaW9uIC0gU2hvdyB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBHZXJyaXQgc2VydmVyCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3NzaCcgLXAgPHBvcnQ+IDxob3N0PiAnZ2Vycml0IHZlcnNpb24nCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgYSBvbmUtbGluZSByZXNwb25zZSB3aXRoIHRoZSBzdHJpbmcgYGdlcnJpdCB2ZXJzaW9uYCBmb2xsb3dlZAorYnkgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdmVyc2lvbiBvZiBHZXJyaXQuCisKK1RoZSBgZ2l0IGRlc2NyaWJlYCBjb21tYW5kIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZlcnNpb24gc3RyaW5nIGJhc2VkCitvbiB0aGUgR2l0IGNvbW1pdCB1c2VkIHRvIGJ1aWxkIEdlcnJpdC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzIG9mIEdlcnJpdCwKK3RoZSB2ZXJzaW9uIHN0cmluZyB3aWxsIGJlIGVxdWFsIHRvIHRoZSBHaXQgdGFnIHNldCBpbiB0aGUgR2Vycml0IHNvdXJjZQorY29kZSwgd2hpY2ggaW4gdHVybiBpcyBlcXVhbCB0byB0aGUgbmFtZSBvZiB0aGUgcmVsZWFzZSAoZm9yIGV4YW1wbGUKKzIuNC4yKS4gV2hlbiBidWlsZGluZyBHZXJyaXQgZnJvbSBhbm90aGVyIGNvbW1pdCAob25lIHRoYXQgZG9lc24ndCBoYXZlCithbiBvZmZpY2lhbC1sb29raW5nIHRhZyBwb2ludGluZyB0byBpdCksIHRoZSB2ZXJzaW9uIHN0cmluZyBoYXMgdGhlIGZvcm0KK2A8dGFnbmFtZT4tPG4+LWc8c2hhMT5gLCB3aGVyZSBgPG4+YCBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlcgorb2YgY29tbWl0cyBhaGVhZCBvZiB0aGUgYDx0YWduYW1lPmAgdGFnIHRoZSBjb21taXQgaXMsIGFuZCBgPHNoYTE+YCBpcwordGhlIHNldmVuLWNoYXJhY3RlciBhYmJyZXZpYXRlZCBTSEEtMSBvZiB0aGUgY29tbWl0LiBTZWUgdGhlIGBnaXQKK2Rlc2NyaWJlYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyBgPHRhZ25hbWU+YCBpcyBjaG9zZW4gYW5kIGhvdworYDxuPmAgaXMgY29tcHV0ZWQuCisKK0FDQ0VTUworLS0tLS0tCitBbnkgdXNlciB3aG8gaGFzIGNvbmZpZ3VyZWQgYW4gU1NIIGtleS4KKworU0NSSVBUSU5HCistLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHNjcmlwdHMuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdmVyc2lvbgorCWdlcnJpdCB2ZXJzaW9uIDIuNC4yCis9PT09PQorCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctY2xhLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWNsYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNGQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWNsYS50eHQKQEAgLTAsMCArMSw4MiBAQAorR2Vycml0IENvZGUgUmV2aWV3IC0gQ29udHJpYnV0b3IgQWdyZWVtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVc2VycyBjYW4gYmUgcmVxdWlyZWQgdG8gc2lnbiBvbmUgb3IgbW9yZSBjb250cmlidXRvciBhZ3JlZW1lbnRzIGJlZm9yZQorYmVpbmcgYWJsZSB0byBzdWJtaXQgYSBjaGFuZ2UgaW4gYSBwcm9qZWN0LgorCitDb250cmlidXRvciBhZ3JlZW1lbnRzIGFyZSBnbG9iYWwgYW5kIGNhbiBiZSBjb25maWd1cmVkIGJ5IG1vZGlmeWluZwordGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSBvbiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdC4gUHVzaCBwZXJtaXNzaW9uCituZWVkcyB0byBiZSBncmFudGVkIGZvciB0aGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaCB0byBiZSBhYmxlIHRvIHB1c2gKK2JhY2sgdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZS4gQ29uc3VsdAorbGluazphY2Nlc3MtY29udHJvbC5odG1sW2FjY2VzcyBjb250cm9sc10gZm9yIGRldGFpbHMgb24gaG93IGFjY2VzcworcGVybWlzc2lvbnMgd29yay4KKworVG8gcmV0cmlldmUgdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSwgaW5pdGlhbGl6ZSBhIHRlbXBvcmFyeSBHaXQKK3JlcG9zaXRvcnkgdG8gZWRpdCB0aGUgY29uZmlndXJhdGlvbjoKKz09PT0KKyAgbWtkaXIgY2ZnX2RpcgorICBjZCBjZmdfZGlyCisgIGdpdCBpbml0Cis9PT09CisKK0Rvd25sb2FkIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uIGZyb20gR2Vycml0OgorPT09PQorICBnaXQgZmV0Y2ggc3NoOi8vbG9jYWxob3N0OjI5NDE4L0FsbC1Qcm9qZWN0cyByZWZzL21ldGEvY29uZmlnCisgIGdpdCBjaGVja291dCBGRVRDSF9IRUFECis9PT09CisKK0NvbnRyaWJ1dG9yIGFncmVlbWVudHMgYXJlIGRlZmluZWQgYXMgY29udHJpYnV0b3ItYWdyZWVtZW50IHNlY3Rpb25zIGluCitgcHJvamVjdC5jb25maWdgOgorPT09PQorICBbY29udHJpYnV0b3ItYWdyZWVtZW50ICJJbmRpdmlkdWFsIl0KKyAgICBkZXNjcmlwdGlvbiA9IElmIHlvdSBhcmUgZ29pbmcgdG8gYmUgY29udHJpYnV0aW5nIGNvZGUgb24geW91ciBvd24sIHRoaXMgaXMgdGhlIG9uZSB5b3Ugd2FudC4gWW91IGNhbiBzaWduIHRoaXMgb25lIG9ubGluZS4KKyAgICByZXF1aXJlQ29udGFjdEluZm9ybWF0aW9uID0gdHJ1ZQorICAgIGFncmVlbWVudFVybCA9IHN0YXRpYy9jbGFfaW5kaXZpZHVhbC5odG1sCisgICAgYXV0b1ZlcmlmeSA9IGdyb3VwIENMQSBBY2NlcHRlZCAtIEluZGl2aWR1YWwKKyAgICBhY2NlcHRlZCA9IGdyb3VwIENMQSBBY2NlcHRlZCAtIEluZGl2aWR1YWwKKz09PT0KKworRWFjaCBgY29udHJpYnV0b3ItYWdyZWVtZW50YCBzZWN0aW9uIHdpdGhpbiB0aGUgYHByb2plY3QuY29uZmlnYCBmaWxlIG11c3QKK2hhdmUgYSB1bmlxdWUgbmFtZS4gVGhlIHNlY3Rpb24gbmFtZSB3aWxsIGFwcGVhciBpbiB0aGUgd2ViIFVJLgorCitJZiBub3QgYWxyZWFkeSBwcmVzZW50LCBhZGQgdGhlIFVVSUQgb2YgdGhlIGdyb3VwcyB1c2VkIGluIHRoZQorYGF1dG9WZXJpZnlgIGFuZCBgYWNjZXB0ZWRgIHZhcmlhYmxlcyBpbiB0aGUgZ3JvdXBzIGZpbGUuCisKK0NvbW1pdCB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UsIGFuZCBwdXNoIGl0IGJhY2s6Cis9PT09CisgIGdpdCBjb21taXQgLWEgLW0gIkFkZCBJbmRpdmlkdWFsIGNvbnRyaWJ1dG9yIGFncmVlbWVudCIKKyAgZ2l0IHB1c2ggc3NoOi8vbG9jYWxob3N0OjI5NDE4L0FsbC1Qcm9qZWN0cyBIRUFEOnJlZnMvbWV0YS9jb25maWcKKz09PT0KKworW1tjb250cmlidXRvci1hZ3JlZW1lbnQubmFtZS5kZXNjcmlwdGlvbl1dY29udHJpYnV0b3ItYWdyZWVtZW50LjxuYW1lPi5kZXNjcmlwdGlvbjo6CisrCitTaG9ydCB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4gVGhpcyB0ZXh0IHdpbGwgYXBwZWFyCit3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gYWdyZWVtZW50LgorCitbW2NvbnRyaWJ1dG9yLWFncmVlbWVudC5uYW1lLnJlcXVpcmVDb250YWN0SW5mb3JtYXRpb25dXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4ucmVxdWlyZUNvbnRhY3RJbmZvcm1hdGlvbjo6CisrCitUcnVlIGlmIHRoZSB1c2VyIG11c3QgcHJvdmlkZSBjb250YWN0IGluZm9ybWF0aW9uIHdoZW4gc2lnbmluZyBhCitjb250cmlidXRvciBhZ3JlZW1lbnQuIERlZmF1bHQgaXMgZmFsc2UuCisKK1tbY29udHJpYnV0b3ItYWdyZWVtZW50Lm5hbWUuYWdyZWVtZW50VXJsXV1jb250cmlidXRvci1hZ3JlZW1lbnQuPG5hbWU+LmFncmVlbWVudFVybDo6CisrCitBbiBhYnNvbHV0ZSBVUkwgb3IgYSByZWxhdGl2ZSBwYXRoIHRvIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSB0ZXh0CitvZiB0aGUgY29udHJpYnV0b3IgYWdyZWVtZW50LiBUaGUgVVJMIG11c3QgdXNlIHRoZSBodHRwIG9yIGh0dHBzCitzY2hlbWUuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBgZ2Vycml0LmJhc2VQYXRoYCB2YXJpYWJsZSBpbgorYGdlcnJpdC5jb25maWdgLgorCitbW2NvbnRyaWJ1dG9yLWFncmVlbWVudC5uYW1lLmF1dG9WZXJpZnldXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4uYXV0b1ZlcmlmeTo6CisrCitJZiBwcmVzZW50LCB0aGUgdXNlciBjYW4gc2lnbiB0aGUgY29udHJpYnV0b3IgYWdyZWVtZW50IG9ubGluZS4gVGhlCit2YWx1ZSBpcyB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHVzZXIgd2lsbCBiZSBhZGRlZCBhZnRlciBzaWduaW5nIHRoZQorYWdyZWVtZW50LiBUaGUgZ3JvdXAncyBVVUlEIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlIGBncm91cHNgIGZpbGUuCisKK1tbY29udHJpYnV0b3ItYWdyZWVtZW50Lm5hbWUuYWNjZXB0ZWRdXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4uYWNjZXB0ZWQ6OgorKworTGlzdCBvZiBncm91cHMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgd2hlbiB2ZXJpZnlpbmcgdGhhdCBhCitjb250cmlidXRvciBhZ3JlZW1lbnQgaGFzIGJlZW4gYWNjZXB0ZWQuIFRoZSBncm91cHMnIFVVSUQgbXVzdCBhbHNvCithcHBlYXIgaW4gdGhlIGBncm91cHNgIGZpbGUuCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1nZXJyaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctZ2Vycml0LnR4dAppbmRleCBkZTJhYTAyLi42MjI4YTk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1nZXJyaXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWdlcnJpdC50eHQKQEAgLTE5LDkgKzE5LDYgQEAKIAogW2NhY2hlXQogICBkaXJlY3RvcnkgPSAvdmFyL2NhY2hlL2dlcnJpdDIKLQotW2NhY2hlICJkaWZmIl0KLSAgZGlza2J1ZmZlciA9IDEwIG0KIC0tLS0KIAogW1thY2NvdW50c11dU2VjdGlvbiBhY2NvdW50cwpAQCAtMTMzLDcgKzEzMCw4IEBACiBUaGUgYWN0dWFsIHVzZXJuYW1lIHVzZWQgaW4gdGhlIExEQVAgc2ltcGxlIGJpbmQgcmVxdWVzdCBpcyB0aGUKIGFjY291bnQncyBmdWxsIEROLCB3aGljaCBpcyBkaXNjb3ZlcmVkIGJ5IGZpcnN0IHF1ZXJ5aW5nIHRoZQogZGlyZWN0b3J5IHVzaW5nIGVpdGhlciBhbiBhbm9ueW1vdXMgcmVxdWVzdCwgb3IgdGhlIGNvbmZpZ3VyZWQKLTw8bGRhcC51c2VybmFtZT4+IGlkZW50aXR5LgorPDxsZGFwLnVzZXJuYW1lLGxkYXAudXNlcm5hbWU+PiBpZGVudGl0eS4gR2Vycml0IGNhbiBhbHNvIHVzZSBrZXJiZXJvcyBpZgorPDxsZGFwLmF1dGhlbnRpY2F0aW9uLGxkYXAuYXV0aGVudGljYXRpb24+PiBpcyBzZXQgdG8gYEdTU0FQSWAuCiAKICogYExEQVBfQklORGAKICsKQEAgLTE0NCw3ICsxNDIsNyBAQAogKwogVW5saWtlIExEQVAgYWJvdmUsIHRoZSB1c2VybmFtZSB1c2VkIHRvIHBlcmZvcm0gdGhlIExEQVAgc2ltcGxlIGJpbmQKIHJlcXVlc3QgaXMgdGhlIGV4YWN0IHN0cmluZyBzdXBwbGllZCBieSBpbiB0aGUgZGlhbG9nIGJ5IHRoZSB1c2VyLgotVGhlIGNvbmZpZ3VyZWQgPDxsZGFwLnVzZXJuYW1lPj4gaWRlbnRpdHkgaXMgbm90IHVzZWQgdG8gb2J0YWluCitUaGUgY29uZmlndXJlZCA8PGxkYXAudXNlcm5hbWUsbGRhcC51c2VybmFtZT4+IGlkZW50aXR5IGlzIG5vdCB1c2VkIHRvIG9idGFpbgogYWNjb3VudCBpbmZvcm1hdGlvbi4KICsKICogYERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVGAKQEAgLTE5NSw2ICsxOTMsMTYgQEAKIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGNvbnRhaW5zIHR3byB2YWx1ZXMsIGBodHRwOi8vYCBhbmQgYGh0dHBzOi8vYCwKIGFsbG93aW5nIEdlcnJpdCB0byB0cnVzdCBhbnkgT3BlbklEIGl0IHJlY2VpdmVzLgogCitbW2F1dGgub3BlbklkRG9tYWluXV1hdXRoLm9wZW5JZERvbWFpbjo6CisrCitMaXN0IG9mIGFsbG93ZWQgT3BlbklEIGVtYWlsIGFkZHJlc3MgZG9tYWlucy4gT25seSB1c2VkIGlmCitgYXV0aC50eXBlYCBpcyBzZXQgdG8gIk9QRU5JRCIgb3IgIk9QRU5JRF9TU08iLgorKworRG9tYWluIGlzIGNhc2UgaW5zZW5zaXRpdmUgYW5kIG11c3QgYmUgaW4gdGhlIHNhbWUgZm9ybSBhcyBpdAorYXBwZWFycyBpbiB0aGUgZW1haWwgYWRkcmVzcywgZm9yIGV4YW1wbGUsICJleGFtcGxlLmNvbSIuCisrCitCeSBkZWZhdWx0LCBhbnkgZG9tYWluIGlzIGFjY2VwdGVkLgorCiBbW2F1dGgubWF4T3BlbklkU2Vzc2lvbkFnZV1dYXV0aC5tYXhPcGVuSWRTZXNzaW9uQWdlOjoKICsKIFRpbWUgaW4gc2Vjb25kcyBiZWZvcmUgYW4gT3BlbklEIHByb3ZpZGVyIG11c3QgZm9yY2UgdGhlIHVzZXIKQEAgLTI2Myw2ICsyNzEsMjQgQEAKICsKIElmIG5vdCBzZXQsIG5vICJSZWdpc3RlciIgbGluayBpcyBkaXNwbGF5ZWQuCiAKK1tbYXV0aC5yZWdpc3RlclRleHRdXWF1dGgucmVnaXN0ZXJUZXh0OjoKKysKK1RleHQgZm9yIHRoZSAiUmVnaXN0ZXIiIGxpbmsgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gIFVzZWQgb25seQord2hlbiBhdXRoLnR5cGUgaXMgYExEQVBgLgorKworSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gIlJlZ2lzdGVyIi4KKworW1thdXRoLmVkaXRGdWxsTmFtZVVybF1dYXV0aC5lZGl0RnVsbE5hbWVVcmw6OgorKworVGFyZ2V0IGZvciB0aGUgIkVkaXQiIGJ1dHRvbiB3aGVuIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGVpcgorZnVsbCBuYW1lLgorCitbW2F1dGguaHR0cFBhc3N3b3JkVXJsXV1hdXRoLmh0dHBQYXNzd29yZFVybDo6CisrCitUYXJnZXQgZm9yIHRoZSAiT2J0YWluIFBhc3N3b3JkIiBsaW5rLiAgVXNlZCBvbmx5IHdoZW4gYXV0aC50eXBlIGlzCitgTERBUGAsIGBMREFQX0JJTkRgIG9yIGBDVVNUT01fRVhURU5TSU9OYC4KKysKKwogW1thdXRoLmNvb2tpZVBhdGhdXWF1dGguY29va2llUGF0aDo6CiArCiBTZXRzICJwYXRoIiBhdHRyaWJ1dGUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4KQEAgLTI5Nyw4ICszMjMsOSBAQAogZW5hYmxlZCBmb3IgdGhlIEdlcnJpdCBzaXRlLiAgSWYgZW5hYmxlZCBhIHVzZXIgbXVzdCBjb21wbGV0ZSBhCiBjb250cmlidXRvciBhZ3JlZW1lbnQgYmVmb3JlIHRoZXkgY2FuIHVwbG9hZCBjaGFuZ2VzLgogKwotSWYgZW5hYmxlZCwgdGhlIGFkbWluIG11c3QgYWxzbyBpbnNlcnQgb25lIG9yIG1vcmUgcm93cyBpbnRvCi1gY29udHJpYnV0b3JfYWdyZWVtZW50c2AgYW5kIGNyZWF0ZSBhZ3JlZW1lbnQgZmlsZXMgdW5kZXIKK0lmIGVuYWJsZWQsIHRoZSBhZG1pbiBtdXN0IGFsc28gYWRkIG9uZSBvciBtb3JlCitsaW5rOmNvbmZpZy1jbGEuaHRtbFtjb250cmlidXRvci1hZ3JlZW1lbnQgc2VjdGlvbnNdCitpbiBwcm9qZWN0LmNvbmZpZyBhbmQgY3JlYXRlIGFncmVlbWVudCBmaWxlcyB1bmRlcgogYCckc2l0ZV9wYXRoJy9zdGF0aWNgLCBzbyB1c2VycyBjYW4gYWN0dWFsbHkgY29tcGxldGUgb25lIG9yCiBtb3JlIGFncmVlbWVudHMuCiArCkBAIC0zOTIsNyArNDE5LDcgQEAKICogeSwgeWVhciwgeWVhcnMgKGAxIHllYXJgIGlzIHRyZWF0ZWQgYXMgYDM2NSBkYXlzYCkKIAogKwotSWYgYSB1bml0IHN1ZmZpeCBpcyBub3Qgc3BlY2lmaWVkLCBgbWludXRlc2AgaXMgYXNzdW1lZC4gIElmIDAgaXMKK0lmIGEgdW5pdCBzdWZmaXggaXMgbm90IHNwZWNpZmllZCwgYHNlY29uZHNgIGlzIGFzc3VtZWQuICBJZiAwIGlzCiBzdXBwbGllZCwgdGhlIG1heGltdW0gYWdlIGlzIGluZmluaXRlIGFuZCBpdGVtcyBhcmUgbmV2ZXIgcHVyZ2VkCiBleGNlcHQgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC4KICsKQEAgLTQ3NSw2ICs1MDIsMTkgQEAKIHJlcXVpcmVzIHR3byBIVFRQIHJlcXVlc3RzLCBhbmQgdGhpcyBjYWNoZSB0cmllcyB0byBjYXJyeSBzdGF0ZSBmcm9tCiB0aGUgZmlyc3QgcmVxdWVzdCBpbnRvIHRoZSBzZWNvbmQgdG8gZW5zdXJlIGl0IGNhbiBjb21wbGV0ZS4KIAorY2FjaGUgYCJjaGFuZ2VzImA6OgorKworVGhlIHNpemUgb2YgYG1lbW9yeUxpbWl0YCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcHJvamVjdHMgZm9yIHdoaWNoCithbGwgY2hhbmdlcyB3aWxsIGJlIGNhY2hlZC4gSWYgdGhlIGNhY2hlIGlzIHNldCB0byAxMDI0LCB0aGlzIG1lYW5zIGFsbAorY2hhbmdlcyBmb3IgdXAgdG8gMTAyNCBwcm9qZWN0cyBjYW4gYmUgaGVsZCBpbiB0aGUgY2FjaGUuCisrCitEZWZhdWx0IHZhbHVlIGlzIDAgKGRpc2FibGVkKS4gSXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBkdWUgdG8gdGhlIGZhY3QKK3RoYXQgY2hhbmdlIHVwZGF0ZXMgYXJlIG5vdCBjb21tdW5pY2F0ZWQgYmV0d2VlbiBHZXJyaXQgc2VydmVycy4gSGVuY2UKK3RoaXMgY2FjaGUgc2hvdWxkIGJlIGRpc2FibGVkIGluIGFuIG11bHRpLW1hc3Rlci9tdWx0aS1zbGF2ZSBzZXR1cC4KKysKK1RoZSBjYWNoZSBzaG91bGQgYmUgZmx1c2hlZCB3aGVuZXZlciB0aGUgZGF0YWJhc2UgY2hhbmdlcyB0YWJsZSBpcyBtb2RpZmllZAorb3V0c2lkZSBvZiBnZXJyaXQuCisKIGNhY2hlIGAiZGlmZiJgOjoKICsKIEVhY2ggaXRlbSBjYWNoZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbW1pdHMsIGF0IGJvdGggdGhlCkBAIC02MDgsOCArNjQ4LDExIEBACiBNYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaW50cmFsaW5lIGRpZmZlcmVuY2UgZGF0YQogYmVmb3JlIGdpdmluZyB1cCBhbmQgZGlzYWJsaW5nIGl0IGZvciBhIHBhcnRpY3VsYXIgZmlsZSBwYWlyLiAgVGhpcyBpcwogYSB3b3JrIGFyb3VuZCBmb3IgYW4gaW5maW5pdGUgbG9vcCBidWcgaW4gdGhlIGludHJhbGluZSBkaWZmZXJlbmNlCi1pbXBsZW1lbnRhdGlvbi4gIElmIGNvbXB1dGF0aW9uIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0IHRoZQotd29ya2VyIHRocmVhZCBpcyB0ZXJtaW5hdGVkIGFuZCBubyBpbnRyYWxpbmUgZGlmZmVyZW5jZSBpcyBkaXNwbGF5ZWQuCitpbXBsZW1lbnRhdGlvbi4KKysKK0lmIGNvbXB1dGF0aW9uIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0LCB0aGUgd29ya2VyIHRocmVhZCBpcwordGVybWluYXRlZCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBzaG93biwgYW5kIG5vIGludHJhbGluZSBkaWZmZXJlbmNlIGlzCitkaXNwbGF5ZWQgZm9yIHRoZSBmaWxlIHBhaXIuCiArCiBWYWx1ZXMgc2hvdWxkIHVzZSBjb21tb24gdW5pdCBzdWZmaXhlcyB0byBleHByZXNzIHRoZWlyIHNldHRpbmc6CiArCkBAIC02NDQsNiArNjg3LDcgQEAKICgnbXMnLCAnc2VjJywgJ21pbicsIGV0Yy4pLgogKwogSWYgc2V0IHRvIDAsIGNoZWNrcyBvY2N1ciBldmVyeSB0aW1lLCB3aGljaCBtYXkgc2xvdyBkb3duIG9wZXJhdGlvbnMuCitJZiBzZXQgdG8gJ2Rpc2FibGVkJyBvciAnb2ZmJywgbm8gY2hlY2sgd2lsbCBldmVyIGJlIGRvbmUuCiBBZG1pbmlzdHJhdG9ycyBtYXkgZm9yY2UgdGhlIGNhY2hlIHRvIGZsdXNoIHdpdGgKIGxpbms6Y21kLWZsdXNoLWNhY2hlcy5odG1sW2dlcnJpdCBmbHVzaC1jYWNoZXNdLgogKwpAQCAtNjUyLDIzICs2OTYsMzEgQEAKIFtbY2hhbmdlTWVyZ2VdXVNlY3Rpb24gY2hhbmdlTWVyZ2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAorY2hhbmdlTWVyZ2UuY2hlY2tGcmVxdWVuY3k6OgorKworSG93IG9mdGVuIHRoZSBkYXRhYmFzZSBzaG91bGQgYmUgcmVzY2FubmVkIGZvciBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuCitzdWJtaXR0ZWQgYnV0IG5vdCBtZXJnZWQgZHVlIHRvIHRyYW5zaWVudCBlcnJvcnMuIFZhbHVlcyBjYW4gYmUKK3NwZWNpZmllZCB1c2luZyBzdGFuZGFyZCB0aW1lIHVuaXQgYWJicmV2aWF0aW9ucyAoJ21zJywgJ3NlYycsICdtaW4nLAorZXRjLikuIFNldCB0byAwIHRvIGRpc2FibGUgcGVyaW9kaWMgcmVzY2FubmluZywgb25seSBzY2FubmluZyBvbmNlIG9uCittYXN0ZXIgbm9kZSBzdGFydHVwLgorKworRGVmYXVsdCBpcyAzMDAgc2Vjb25kcyAoNSBtaW51dGVzKS4KKworY2hhbmdlTWVyZ2UudGVzdDo6CisrCiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgbWVyZ2VhYmlsaXR5IHRlc3Qgb2YgY2hhbmdlcyBpcwogZW5hYmxlZC4gIElmIGVuYWJsZWQsIHdoZW4gdGhlIGNoYW5nZSBwYWdlIGlzIGxvYWRlZCwgdGhlIHRlc3QgaXMKIHRyaWdnZXJlZC4gVGhlIHN1Ym1pdCBidXR0b24gd2lsbCBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGFjY29yZGluZyB0bwogdGhlIHJlc3VsdC4KLQotLS0tLQotW2NoYW5nZU1lcmdlXQotICB0ZXN0ID0gdHJ1ZQotLS0tLQotCisrCiBCeSBkZWZhdWx0IHRoaXMgaXMgZmFsc2UgKHRlc3QgaXMgbm90IGVuYWJsZWQpLgogCiBbW2NvbW1lbnRsaW5rXV1TZWN0aW9uIGNvbW1lbnRsaW5rCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBDb21tZW50IGxpbmtzIGFyZSBmaW5kL3JlcGxhY2Ugc3RyaW5ncyBhcHBsaWVkIHRvIGNoYW5nZSBkZXNjcmlwdGlvbnMsCi1wYXRjaCBjb21tZW50cywgYW5kIGluLWxpbmUgY29kZSBjb21tZW50cyB0byB0dXJuIHNldCBzdHJpbmdzIGludG8KLWh5cGVybGlua3MuICBPbmUgY29tbW9uIHVzZSBpcyBmb3IgbGlua2luZyB0byBidWctdHJhY2tpbmcgc3lzdGVtcy4KK3BhdGNoIGNvbW1lbnRzLCBpbi1saW5lIGNvZGUgY29tbWVudHMgYW5kIGFwcHJvdmFsIGNhdGVnb3J5IHZhbHVlIGRlc2NyaXB0aW9ucwordG8gdHVybiBzZXQgc3RyaW5ncyBpbnRvIGh5cGVybGlua3MuICBPbmUgY29tbW9uIHVzZSBpcyBmb3IgbGlua2luZyB0bworYnVnLXRyYWNraW5nIHN5c3RlbXMuCiAKIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb25maWd1cmF0aW9uIHRoZSAnY2hhbmdlaWQnIGNvbW1lbnQgbGluawogd2lsbCBtYXRjaCB0eXBpY2FsIEdlcnJpdCBDaGFuZ2UtSWQgdmFsdWVzIGFuZCBjcmVhdGUgYSBoeXBlcmxpbmsKQEAgLTg5Miw2ICs5NDQsMTQgQEAKICsKIERlZmF1bHQgaXMgNjQgZW50cmllcy4KIAorW1tjb3JlLnVzZVJlY3Vyc2l2ZU1lcmdlXV1jb3JlLnVzZVJlY3Vyc2l2ZU1lcmdlOjoKKysKK1VzZSBKR2l0J3MgbmV3LCBleHBlcmltZW50YWwgcmVjdXJzaXZlIG1lcmdlciBmb3IgdGhyZWUtd2F5IG1lcmdlcy4KK1RoaXMgb25seSBhZmZlY3RzIHByb2plY3RzIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSByZXNvbHZlCitjb25mbGljdHMuCisrCitEZWZhdWx0IGlzIGZhbHNlLCBidXQgaW4gYSBmdXR1cmUgcmVsZWFzZSBtYXkgZGVmYXVsdCB0byB0cnVlLgorCiBbW2RhdGFiYXNlXV1TZWN0aW9uIGRhdGFiYXNlCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTk2OSw2ICsxMDI5LDEzIEBACiBpc24ndCBuZWNlc3NhcnkgYXMgaXQgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFsbCBvZiB0aGUKIGFib3ZlIHByb3BlcnRpZXMuCiAKK1tbZGF0YWJhc2UuY29ubmVjdGlvblBvb2xdXWRhdGFiYXNlLmNvbm5lY3Rpb25Qb29sOjoKKysKK0lmIHRydWUsIHVzZSBjb25uZWN0aW9uIHBvb2xpbmcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiBPdGhlcndpc2UsIGEKK25ldyBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBmb3IgZWFjaCByZXF1ZXN0LgorKworRGVmYXVsdCBpcyBmYWxzZSBmb3IgTXlTUUwsIGFuZCB0cnVlIGZvciBvdGhlciBkYXRhYmFzZSBiYWNrZW5kcy4KKwogW1tkYXRhYmFzZS5wb29sTGltaXRdXWRhdGFiYXNlLnBvb2xMaW1pdDo6CiArCiBNYXhpbXVtIG51bWJlciBvZiBvcGVuIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiAgSWYgdGhlIHNlcnZlciBuZWVkcwpAQCAtOTgwLDExICsxMDQ3LDE3IEBACiBuZWVkIG11bHRpcGxlIGNvbm5lY3Rpb25zLgogKwogRGVmYXVsdCBpcyA4LgorKworVGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyBpZgorPDxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbCxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbD4+IGlzIHRydWUuCiAKIFtbZGF0YWJhc2UucG9vbE1pbklkbGVdXWRhdGFiYXNlLnBvb2xNaW5JZGxlOjoKICsKIE1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIGtlZXAgaWRsZSBpbiB0aGUgcG9vbC4KIERlZmF1bHQgaXMgNC4KKysKK1RoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgaWYKKzw8ZGF0YWJhc2UuY29ubmVjdGlvblBvb2wsZGF0YWJhc2UuY29ubmVjdGlvblBvb2w+PiBpcyB0cnVlLgogCiBbW2RhdGFiYXNlLnBvb2xNYXhJZGxlXV1kYXRhYmFzZS5wb29sTWF4SWRsZTo6CiArCkBAIC05OTIsNiArMTA2NSw5IEBACiBhcmUgbW9yZSBpZGxlIGNvbm5lY3Rpb25zLCBjb25uZWN0aW9ucyB3aWxsIGJlIGNsb3NlZCBpbnN0ZWFkIG9mCiBiZWluZyByZXR1cm5lZCBiYWNrIHRvIHRoZSBwb29sLgogRGVmYXVsdCBpcyA0LgorKworVGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyBpZgorPDxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbCxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbD4+IGlzIHRydWUuCiAKIFtbZGF0YWJhc2UucG9vbE1heFdhaXRdXWRhdGFiYXNlLnBvb2xNYXhXYWl0OjoKICsKQEAgLTEwMTAsNiArMTA4Niw5IEBACiBJZiBhIHVuaXQgc3VmZml4IGlzIG5vdCBzcGVjaWZpZWQsIGBtaWxsaXNlY29uZHNgIGlzIGFzc3VtZWQuCiArCiBEZWZhdWx0IGlzIGAzMCBzZWNvbmRzYC4KKysKK1RoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgaWYKKzw8ZGF0YWJhc2UuY29ubmVjdGlvblBvb2wsZGF0YWJhc2UuY29ubmVjdGlvblBvb2w+PiBpcyB0cnVlLgogCiBbW2Rvd25sb2FkXV1TZWN0aW9uIGRvd25sb2FkCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xMjQzLDYgKzEzMjIsMTYgQEAKICsKIFZhbGlkIHZhbHVlcyBhcmUgdGhlIGNoYXJhY3RlcnMgJyonLCAnKCcgYW5kICcpJy4KIAorW1tncm91cHNdXVNlY3Rpb24gZ3JvdXBzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW1tncm91cHMubmV3R3JvdXBzVmlzaWJsZVRvQWxsXV1ncm91cHMubmV3R3JvdXBzVmlzaWJsZVRvQWxsOjoKKysKK0NvbnRyb2xzIHdoZXRoZXIgbmV3bHkgY3JlYXRlZCBncm91cHMgc2hvdWxkIGJlIGJ5IGRlZmF1bHQgdmlzaWJsZSB0bworYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCisrCitCeSBkZWZhdWx0LCBmYWxzZS4KKwogW1tob29rc11dU2VjdGlvbiBob29rcwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMjcyLDYgKzEzNjEsMTEgQEAKIE9wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgY2hhbmdlIG1lcmdlZCBob29rLCBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KIGBjaGFuZ2UtbWVyZ2VkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MubWVyZ2VGYWlsZWRIb29rXV1ob29rcy5tZXJnZUZhaWxlZEhvb2s6OgorKworT3B0aW9uYWwgZmlsZW5hbWUgZm9yIHRoZSBtZXJnZSBmYWlsZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgbWVyZ2UtZmFpbGVkYCB3aWxsIGJlIHVzZWQuCisKIFtbaG9va3MuY2hhbmdlQWJhbmRvbmVkSG9va11daG9va3MuY2hhbmdlQWJhbmRvbmVkSG9vazo6CiArCiBPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIGNoYW5nZSBhYmFuZG9uZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCkBAIC0xMjg3LDExICsxMzgxLDI2IEBACiBPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIHJlZiB1cGRhdGVkIGhvb2ssIGlmIG5vdCBzcGVjaWZpZWQgdGhlbgogYHJlZi11cGRhdGVkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MucmV2aWV3ZXJBZGRlZEhvb2tdXWhvb2tzLnJldmlld2VyQWRkZWRIb29rOjoKKysKK09wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgcmV2aWV3ZXIgYWRkZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgcmV2aWV3ZXItYWRkZWRgIHdpbGwgYmUgdXNlZC4KKwogW1tob29rcy5jbGFTaWduZWRIb29rXV1ob29rcy5jbGFTaWduZWRIb29rOjoKICsKIE9wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgQ0xBIHNpZ25lZCBob29rLCBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KIGBjbGEtc2lnbmVkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MucmVmVXBkYXRlSG9va11daG9va3MucmVmVXBkYXRlSG9vazo6CisrCitPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIHJlZiB1cGRhdGUgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgcmVmLXVwZGF0ZWAgd2lsbCBiZSB1c2VkLgorCitbW2hvb2tzLnN5bmNIb29rVGltZW91dF1daG9va3Muc3luY0hvb2tUaW1lb3V0OjoKKysKK09wdGlvbmFsIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3Igc3luY2hyb25vdXMgaG9va3MsIGlmIG5vdCBzcGVjaWZpZWQKK3RoZW4gMzAgc2Vjb25kcyB3aWxsIGJlIHVzZWQuCisKIFtbaHR0cF1dU2VjdGlvbiBodHRwCiB+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMzA0LDEzICsxNDEzLDEzIEBACiBbW2h0dHAucHJveHlVc2VybmFtZV1daHR0cC5wcm94eVVzZXJuYW1lOjoKICsKIE9wdGlvbmFsIHVzZXJuYW1lIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGUgSFRUUCBwcm94eSB3aXRoLgotVGhpcyBwcm9wZXJ0eSBpcyBob25vcmVkIG9ubHkgaWYgdGhlIHVzZXJuYW1lIGRvZXMgbm90IAorVGhpcyBwcm9wZXJ0eSBpcyBob25vcmVkIG9ubHkgaWYgdGhlIHVzZXJuYW1lIGRvZXMgbm90CiBhcHBlYXIgaW4gdGhlIGh0dHAucHJveHkgcHJvcGVydHkgYWJvdmUuCiAKIFtbaHR0cC5wcm94eVBhc3N3b3JkXV1odHRwLnByb3h5UGFzc3dvcmQ6OgogKwogT3B0aW9uYWwgcGFzc3dvcmQgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBIVFRQIHByb3h5IHdpdGguCi1UaGlzIHByb3BlcnR5IGlzIGhvbm9yZWQgb25seSBpZiB0aGUgcGFzc3dvcmQgZG9lcyBub3QgCitUaGlzIHByb3BlcnR5IGlzIGhvbm9yZWQgb25seSBpZiB0aGUgcGFzc3dvcmQgZG9lcyBub3QKIGFwcGVhciBpbiB0aGUgaHR0cC5wcm94eSBwcm9wZXJ0eSBhYm92ZS4KIAogCkBAIC0xNzA2LDYgKzE4MTUsMjEgQEAKIERlZmF1bHQgaXMgYChtZW1iZXJVaWQ9JHt1c2VybmFtZX0pYCBmb3IgUkZDIDIzMDcsCiBhbmQgdW5zZXQgKGRpc2FibGVkKSBmb3IgQWN0aXZlIERpcmVjdG9yeS4KIAorW1tsZGFwLmdyb3VwTmFtZV1dbGRhcC5ncm91cE5hbWU6OgorKworXyhPcHRpb25hbClfIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZ3JvdXAgb2JqZWN0IHdoaWNoIGNvbnRhaW5zCit0aGUgdmFsdWUgdG8gdXNlIGFzIHRoZSBncm91cCBuYW1lIGluIEdlcnJpdC4KKysKK1R5cGljYWxseSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYGNuYCBmb3IgUkZDIDIzMDcgYW5kIEFjdGl2ZSBEaXJlY3RvcnkKK3NlcnZlcnMuICBGb3Igb3RoZXIgc2VydmVycyB0aGUgYXR0cmlidXRlIG5hbWUgbWF5IGRpZmZlciwgZm9yIGV4YW1wbGUKK2BhcHBsZS1ncm91cC1yZWFsbmFtZWAgb24gQXBwbGUgTWFjT1MgWCBTZXJ2ZXIuCisrCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBsaXRlcmFsIHN0cmluZyBjb250YWluaW5nIGEgcGF0dGVybiBvZgorYXR0cmlidXRlIHZhbHVlcy4gIEZvciBleGFtcGxlIHRvIGNyZWF0ZSBhIEdlcnJpdCBncm91cCBuYW1lIGNvbnNpc3Rpbmcgb2YKK0xEQVAgZ3JvdXAgbmFtZSBhbmQgZ3JvdXAgSUQsIHVzZSB0aGUgcGF0dGVybiBgJHtjbn0gKCR7Z2lkTnVtYmVyfSlgLgorKworRGVmYXVsdCBpcyBgY25gLgorCiBbW2xkYXAubG9jYWxVc2VybmFtZVRvTG93ZXJDYXNlXV1sZGFwLmxvY2FsVXNlcm5hbWVUb0xvd2VyQ2FzZTo6CiArCiBDb252ZXJ0cyB0aGUgbG9jYWwgdXNlcm5hbWUsIHRoYXQgaXMgdXNlZCB0byBsb2dpbiBpbnRvIHRoZSBHZXJyaXQKQEAgLTE3MjUsNiArMTg0OSwzOCBAQAogKwogQnkgZGVmYXVsdCwgdW5zZXQvZmFsc2UuCiAKK1tbbGRhcC5hdXRoZW50aWNhdGlvbl1dbGRhcC5hdXRoZW50aWNhdGlvbjo6CisrCitEZWZpbmVzIGhvdyBHZXJyaXQgYXV0aGVudGljYXRlcyB3aXRoIHRoZSBzZXJ2ZXIuIFdoZW4gc2V0IHRvIGBHU1NBUElgCitHZXJyaXQgd2lsbCB1c2UgS2VyYmVyb3MuIFRvIHVzZSBrZXJiZXJvcyB0aGUKK2BqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnYCBzeXN0ZW0gcHJvcGVydHkgbXVzdCBwb2ludCB0byBhCitsb2dpbiB0byBhIEpBQVMgY29uZmlndXJhdGlvbiBmaWxlIGFuZCwgaWYgSmF2YSA2IGlzIHVzZWQsIHRoZSBzeXN0ZW0KK3Byb3BlcnR5IGBqYXZhLnNlY3VyaXR5LmtyYjUuY29uZmAgbXVzdCBwb2ludCB0byB0aGUgYXBwcm9wcmlhdGUKK2tyYjUuaW5pIGZpbGUgd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBLREMuCisKK1R5cGljYWwgamFhcy5jb25mLgorCistLS0tCitLZXJiZXJvc0xvZ2luIHsKKyAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZQorICAgICAgICAgICAgcmVxdWlyZWQKKyAgICAgICAgICAgIHVzZVRpY2tldENhY2hlPXRydWUKKyAgICAgICAgICAgIGRvTm90UHJvbXB0PXRydWUKKyAgICAgICAgICAgIHJlbmV3VEdUPXRydWU7Cit9OworLS0tLQorCitTZWUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBjcmVhdGUgdGhlIGtyYjUuaW5pIGZpbGUuCisKK05vdGUgdGhlIGByZW5ld1RHVGAgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoZSBUR1QgZG9lcyBub3QgZXhwaXJlLAorYW5kIGB1c2VUaWNrZXRDYWNoZWAgdG8gdXNlIHRoZSBUR1Qgc3VwcGxpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIEFzCit0aGUgd2hvbGUgcG9pbnQgb2YgdXNpbmcgR1NTQVBJIGlzIHRvIGhhdmUgcGFzc3dvcmRsZXNzIGF1dGhlbnRpY2F0aW9uCit0byB0aGUgTERBUCBzZXJ2aWNlLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhcXVpcmUgYSBuZXcgVEdUIG9uIGl0cyBvd24uCisKK09uIFdpbmRvd3Mgc2VydmVycyB0aGUgcmVnaXN0cnkga2V5IGBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcTHNhXEtlcmJlcm9zXFBhcmFtZXRlcnNgCittdXN0IGhhdmUgdGhlIERXT1JEIHZhbHVlIGBhbGxvd3RndHNlc3Npb25rZXlgIHNldCB0byAxIGFuZCB0aGUgYWNjb3VudCBtdXN0IG5vdAoraGF2ZSBsb2NhbCBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuCisKIFtbbWltZXR5cGVdXVNlY3Rpb24gbWltZXR5cGUKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtMTgxMCw2ICsxOTY2LDM0IEBACiAgIG1heE9iamVjdFNpemVMaW1pdCA9IDQwIG0KIC0tLS0KIAorW1tyZWNlaXZlLmNoZWNrTWFnaWNSZWZzXV1yZWNlaXZlLmNoZWNrTWFnaWNSZWZzOjoKKysKK0lmIHRydWUsIEdlcnJpdCB3aWxsIHZlcmlmeSB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeSBoYXMKK25vIHJlZmVyZW5jZXMgdW5kZXIgdGhlIG1hZ2ljICdyZWZzL2RyYWZ0cycsICdyZWZzL2ZvcicsIG9yCisncmVmcy9wdWJsaXNoJyBicmFuY2ggbmFtZXNwYWNlcy4gTmFtZXMgdW5kZXIgdGhlc2UgbG9jYXRpb25zCitjb25mdXNlIGNsaWVudHMgd2hlbiB0cnlpbmcgdG8gdXBsb2FkIGNvZGUgcmV2aWV3cyBzbyBHZXJyaXQKK3JlcXVpcmVzIHRoZW0gdG8gYmUgZW1wdHkuCisrCitJZiBmYWxzZSBHZXJyaXQgc2tpcHMgdGhlIHNhbml0eSBjaGVjayBhbmQgYXNzdW1lcyBhZG1pbmlzdHJhdG9ycworaGF2ZSBlbnN1cmVkIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGNvbnRhaW4gYW55IG1hZ2ljIHJlZmVyZW5jZXMuCitTZXR0aW5nIHRvIGZhbHNlIHRvIHNraXAgdGhlIGNoZWNrIGNhbiBkZWNyZWFzZSBsYXRlbmN5IGR1cmluZyBwdXNoLgorKworRGVmYXVsdCBpcyB0cnVlLgorCitbW3JlY2VpdmUuY2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZV1dcmVjZWl2ZS5jaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlOjoKKysKK0lmIHNldCB0byB0cnVlLCBHZXJyaXQgd2lsbCB2YWxpZGF0ZSB0aGF0IGFsbCByZWZlcmVuY2VkIG9iamVjdHMgdGhhdAorYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVjZWl2ZWQgcGFjayBhcmUgcmVhY2hhYmxlIGJ5IHRoZSB1c2VyLgorKworQ2Fycnlpbmcgb3V0IHRoaXMgY2hlY2sgb24gZ2l0cyB3aXRoIG1hbnkgcmVmcyBhbmQgY29tbWl0cyBjYW4gYmUgYQordmVyeSBDUFUtaGVhdnkgb3BlcmF0aW9uLiBGb3Igbm9uIHB1YmxpYyBHZXJyaXQtc2VydmVycyB0aGlzIGNoZWNrIG1heQorYmUgb3ZlcmtpbGwuCisrCitPbmx5IGRpc2FibGUgdGhpcyBjaGVjayBpZiB5b3UgdHJ1c3QgdGhlIGNsaWVudHMgbm90IHRvIGZvcmdlIFNIQTEKK3JlZmVyZW5jZXMgdG8gYWNjZXNzIGNvbW1pdHMgaW50ZW5kZWQgdG8gYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIuCisrCitEZWZhdWx0IGlzIHRydWUuCisKIFtbcmVjZWl2ZS5hbGxvd0dyb3VwXV1yZWNlaXZlLmFsbG93R3JvdXA6OgogKwogTmFtZSBvZiB0aGUgZ3JvdXBzIG9mIHVzZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhlY3V0ZQpAQCAtMTgzOSw2ICsyMDIzLDE4IEBACiArCiBEZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzIGFjY29yZGluZyB0byB0aGUgSmF2YSBydW50aW1lLgogCitbW3JlY2VpdmUuY2hhbmdlVXBkYXRlVGhyZWFkc11dcmVjZWl2ZS5jaGFuZ2VVcGRhdGVUaHJlYWRzOjoKKysKK051bWJlciBvZiB0aHJlYWRzIHRvIHBlcmZvcm0gY2hhbmdlIGNyZWF0aW9uIG9yIHBhdGNoIHNldCB1cGRhdGVzCitjb25jdXJyZW50bHkuIEVhY2ggdGhyZWFkIHVzZXMgaXRzIG93biBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20KK3RoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wsIGFuZCBpZiBhbGwgdGhyZWFkcyBhcmUgYnVzeSB0aGVuCittYWluIHJlY2VpdmUgdGhyZWFkIHdpbGwgYWxzbyBwZXJmb3JtIGEgY2hhbmdlIGNyZWF0aW9uIG9yIHBhdGNoCitzZXQgdXBkYXRlLgorKworRGVmYXVsdHMgdG8gMSwgdXNpbmcgb25seSB0aGUgbWFpbiByZWNlaXZlIHRocmVhZC4gVGhpcyBmZWF0dXJlIGlzIGZvcgorZGF0YWJhc2VzIHdpdGggdmVyeSBoaWdoIGxhdGVuY3kgdGhhdCBjYW4gYmVuZml0IGZyb20gY29uY3VycmVudAorb3BlcmF0aW9ucyB3aGVuIG11bHRpcGxlIGNoYW5nZXMgYXJlIGltcGFjdGVkIGF0IG9uY2UuCisKIFtbcmVjZWl2ZS50aW1lb3V0XV1yZWNlaXZlLnRpbWVvdXQ6OgogKwogT3ZlcmFsbCB0aW1lb3V0IG9uIHRoZSB0aW1lIHRha2VuIHRvIHByb2Nlc3MgdGhlIGNoYW5nZSBkYXRhIGluCkBAIC0xOTc4LDkgKzIxNzQsMTAgQEAKIAogW1tzZW5kZW1haWwuaW5jbHVkZURpZmZdXXNlbmRlbWFpbC5pbmNsdWRlRGlmZjo6CiArCi1JZiB0cnVlLCBuZXcgY2hhbmdlIGVtYWlscyBmcm9tIEdlcnJpdCB3aWxsIGluY2x1ZGUgdGhlIGNvbXBsZXRlCi11bmlmaWVkIGRpZmYgb2YgdGhlIGNoYW5nZS4gVmFyaWFibGUgbWF4bWltdW1EaWZmU2l6ZSBwbGFjZXMgYW4gdXBwZXIKLWxpbWl0IG9uIGhvdyBsYXJnZSB0aGUgZW1haWwgY2FuIGdldCB3aGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQuCitJZiB0cnVlLCBuZXcgY2hhbmdlIGVtYWlscyBhbmQgbWVyZ2VkIGNoYW5nZSBlbWFpbHMgZnJvbSBHZXJyaXQKK3dpbGwgaW5jbHVkZSB0aGUgY29tcGxldGUgdW5pZmllZCBkaWZmIG9mIHRoZSBjaGFuZ2UuCitWYXJpYWJsZSBtYXhtaW11bURpZmZTaXplIHBsYWNlcyBhbiB1cHBlciBsaW1pdCBvbiBob3cgbGFyZ2UgdGhlCitlbWFpbCBjYW4gZ2V0IHdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZC4KICsKIEJ5IGRlZmF1bHQsIGZhbHNlLgogCkBAIC0yMTkzLDYgKzIzOTAsMjAgQEAKICsKIEJ5IGRlZmF1bHQsIDIgbWludXRlcy4KIAorW1tzc2hkLmlkbGVUaW1lb3V0XV1zc2hkLmlkbGVUaW1lb3V0OjoKKysKK1RpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2VydmVyIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlcyBpZGxlCitjb25uZWN0aW9ucyAob3IgMCB0byBkaXNhYmxlIGNsb3Npbmcgb2YgaWRsZSBjb25uZWN0aW9ucykuICBWYWx1ZXMKK3Nob3VsZCB1c2UgY29tbW9uIHVuaXQgc3VmZml4ZXMgdG8gZXhwcmVzcyB0aGVpciBzZXR0aW5nOgorKworKiBzLCBzZWMsIHNlY29uZCwgc2Vjb25kcworKiBtLCBtaW4sIG1pbnV0ZSwgbWludXRlcworKiBoLCBociwgaG91ciwgaG91cnMKKyogZCwgZGF5LCBkYXlzCisKKysKK0J5IGRlZmF1bHQsIDAuCisKIFtbc3NoZC5tYXhDb25uZWN0aW9uc1BlclVzZXJdXXNzaGQubWF4Q29ubmVjdGlvbnNQZXJVc2VyOjoKICsKIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgU1NIIHNlc3Npb25zIHRoYXQgYSB1c2VyIGFjY291bnQKQEAgLTIyNDgsNiArMjQ1OSwxMyBAQAogTmV3IGNvbmZpZ3VyYXRpb25zIHNob3VsZCBwcmVmZXIgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoaXMgZmllbGQKIGFuZCBhbiBlbnVtIHZhbHVlIGZvciBgYWNjb3VudHMudmlzaWJpbGl0eWAuCiAKK1tbc3VnZ2VzdC5mcm9tXV1zdWdnZXN0LmZyb206OgorKworVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYSB1c2VyIG11c3QgaGF2ZSB0eXBlZCBiZWZvcmUgc3VnZ2VzdGlvbnMKK2FyZSBwcm92aWRlZC4gSWYgc2V0IHRvIDAsIHN1Z2dlc3Rpb25zIGFyZSBhbHdheXMgcHJvdmlkZWQuCisrCitCeSBkZWZhdWx0IDAuCisKIFtbdGhlbWVdXSBTZWN0aW9uIHRoZW1lCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0yMjU3LDE0ICsyNDc1LDE1IEBACiBvcGVuIGNoYW5nZXMgdGFibGUgb3IgdGhlIGFjY291bnQgZGFzaGJvYXJkLiBUaGUgdmFsdWUgbXVzdCBiZSBhCiB2YWxpZCBIVE1MIGhleCBjb2xvciBjb2RlLCBvciBzdGFuZGFyZCBjb2xvciBuYW1lLgogKwotQnkgZGVmYXVsdCBgRkNGRUVGYCAoYSBjcmVtZSBjb2xvcikgZm9yIHNpZ25lZC1vdXQgdGhlbWUgYW5kIHdoaXRlCi0oYEZGRkZGRmApIGZvciBzaWduZWQtaW4gdGhlbWUuCitCeSBkZWZhdWx0IHdoaXRlLCBgRkZGRkZGYC4KIAogW1t0aGVtZS50b3BNZW51Q29sb3JdXXRoZW1lLnRvcE1lbnVDb2xvcjo6CiArCiBUaGlzIGlzIHRoZSBjb2xvciBvZiB0aGUgbWFpbiBtZW51IGJhciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLgogVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVE1MIGhleCBjb2xvciBjb2RlLCBvciBzdGFuZGFyZCBjb2xvcgotbmFtZS4gIFRoZSB2YWx1ZSBkZWZhdWx0cyB0byA8PHRoZW1lLnRyaW1Db2xvcix0cmltQ29sb3I+Pi4KK25hbWUuCisrCitCeSBkZWZhdWx0IHdoaXRlLCBgRkZGRkZGYC4KIAogW1t0aGVtZS50ZXh0Q29sb3JdXXRoZW1lLnRleHRDb2xvcjo6CiArCkBAIC0yMjcyLDcgKzI0OTEsNyBAQAogb3BlbiBjaGFuZ2VzIHRhYmxlIG9yIHRoZSBhY2NvdW50IGRhc2hib2FyZC4gVGhlIHZhbHVlIG11c3QgYmUgYQogdmFsaWQgSFRNTCBoZXggY29sb3IgY29kZSwgb3Igc3RhbmRhcmQgY29sb3IgbmFtZS4KICsKLUJ5IGRlZmF1bHQgYmxhY2ssIGAwMDAwMDBgLgorQnkgZGVmYXVsdCBkYXJrIGdyZXksIGAzNTM1MzVgLgogCiBbW3RoZW1lLnRyaW1Db2xvcl1ddGhlbWUudHJpbUNvbG9yOjoKICsKQEAgLTIyODIsNyArMjUwMSw3IEBACiBvZiB0aGUgcGFnZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRNTCBoZXggY29sb3IgY29kZSwgb3IKIHN0YW5kYXJkIGNvbG9yIG5hbWUuCiArCi1CeSBkZWZhdWx0IGEgc2hhZGUgb2YgZ3JlZW4sIGBENEU5QTlgLgorQnkgZGVmYXVsdCBhIGxpZ2h0IGdyZXksIGBFRUVFRUVgLgogCiBbW3RoZW1lLnNlbGVjdGlvbkNvbG9yXV10aGVtZS5zZWxlY3Rpb25Db2xvcjo6CiArCkBAIC0yMjkxLDcgKzI1MTAsNyBAQAogY3VycmVudGx5IHNlbGVjdGVkIHJvdy4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRNTCBoZXggY29sb3IKIGNvZGUsIG9yIHN0YW5kYXJkIGNvbG9yIG5hbWUuCiArCi1CeSBkZWZhdWx0IGEgc2hhZGUgb2YgeWVsbG93LCBgRkZGRkNDYC4KK0J5IGRlZmF1bHQgYSBwYWxlIGJsdWUsIGBEOEVERjlgLgogCiBbW3RoZW1lLmNoYW5nZVRhYmxlT3V0ZGF0ZWRDb2xvcl1ddGhlbWUuY2hhbmdlVGFibGVPdXRkYXRlZENvbG9yOjoKICsKQEAgLTIzNzAsNyArMjU4OSw3IEBACiBleHRlcm5hbCB0cmFja2luZyBpZCBwYXJ0IG9mIHRoZSBmb290ZXIgbGluZS4gVGhlIG1hdGNoIGNhbgogcmVzdWx0IGluIHNldmVyYWwgZW50cmllcyBpbiB0aGUgREIuICBJZiBncm91cGluZyBpcyB1c2VkIGluIHRoZQogcmVnZXggdGhlIGZpcnN0IGdyb3VwIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIHRyYWNraW5nIGlkLgotVHJhY2tpbmcgaWRzIGxvbmdlciB0aGFuIDIwIGNoYXJhY3RlcnMgd2lsbCBiZSBpZ25vcmVkLgorVHJhY2tpbmcgaWRzIGxvbmdlciB0aGFuIDMyIGNoYXJhY3RlcnMgd2lsbCBiZSBpZ25vcmVkLgogKwogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIgZWF0cyBvbmUgbGV2ZWwgb2YgYmFja3NsYXNoZXMsIHNvIHRoZQogY2hhcmFjdGVyIGNsYXNzIGBcc2AgcmVxdWlyZXMgYFxcc2AgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctZ2l0d2ViLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWdpdHdlYi50eHQKaW5kZXggMzVkNWMwZC4uZTVlZGRhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25maWctZ2l0d2ViLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1naXR3ZWIudHh0CkBAIC0xLDEzICsxLDEyIEBACi1HZXJyaXQgQ29kZSBSZXZpZXcgLSBHaXR3ZWIgSW50ZWdyYXRpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorR2l0d2ViIEludGVncmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KIAogR2Vycml0IENvZGUgUmV2aWV3IGNhbiBtYW5hZ2UgYW5kIGdlbmVyYXRlIGh5cGVybGlua3MgdG8gZ2l0d2ViLAogYWxsb3dpbmcgdXNlcnMgdG8ganVtcCBmcm9tIEdlcnJpdCBjb250ZW50IHRvIHRoZSBzYW1lIGluZm9ybWF0aW9uLAogYnV0IHNob3duIGJ5IGdpdHdlYi4KIAotCiBJbnRlcm5hbC9NYW5hZ2VkIGdpdHdlYgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKIEluIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uLCBHZXJyaXQgaW5zcGVjdHMgdGhlIHJlcXVlc3QsIGVuZm9yY2VzCiBpdHMgcHJvamVjdCBsZXZlbCBhY2Nlc3MgY29udHJvbHMsIGFuZCBkaXJlY3RseSBleGVjdXRlcyBgZ2l0d2ViLmNnaWAKQEAgLTM5LDcgKzM4LDcgQEAKIGJlIHJlc3RhcnRlZCBhbmQgY2xpZW50cyBtdXN0IHJlbG9hZCB0aGUgaG9zdCBwYWdlIHRvIHNlZSB0aGUgY2hhbmdlLgogCiBDb25maWd1cmF0aW9uCi1+fn5+fn5+fn5+fn5+CiteXl5eXl5eXl5eXl5eCiAKIE1vc3Qgb2YgdGhlIGdpdHdlYiBjb25maWd1cmF0aW9uIGZpbGUgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CiBieSBHZXJyaXQgQ29kZSBSZXZpZXcuICBTaXRlIHNwZWNpZmljIG92ZXJyaWRlcyBjYW4gYmUgcGxhY2VkIGluCkBAIC00Nyw3ICs0Niw3IEBACiBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBmaWxlLgogCiBMb2dvIGFuZCBDU1MKLX5+fn5+fn5+fn5+fgorXl5eXl5eXl5eXl5eCiAKIElmIHRoZSBwYWNrYWdlLW1hbmFnZXIgaW5zdGFsbGVkIENHSSAoYC91c3IvbGliL2NnaS1iaW4vZ2l0d2ViLmNnaWApCiBpcyBiZWluZyB1c2VkLCB0aGUgc3RvY2sgQ1NTIGFuZCBsb2dvIGZpbGVzIHdpbGwgYmUgc2VydmVkIGZyb20KQEAgLTU4LDE3ICs1NywxNjUgQEAKIHRoZSBkZWZhdWx0IHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbiwgYW5kIG1vc3QgY3VzdG9tIGluc3RhbGxhdGlvbnMuCiAKIEFjY2VzcyBDb250cm9sCi1+fn5+fn5+fn5+fn5+fgorXl5eXl5eXl5eXl5eXl4KIAogQWNjZXNzIGNvbnRyb2xzIGZvciBpbnRlcm5hbGx5IG1hbmFnZWQgZ2l0d2ViIHBhZ2Ugdmlld3MgYXJlIGVuZm9yY2VkCiB1c2luZyB0aGUgc3RhbmRhcmQgcHJvamVjdCBSRUFEICsxIHBlcm1pc3Npb24uCiAKLQogRXh0ZXJuYWwvVW5tYW5hZ2VkIGdpdHdlYgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1JbiB0aGUgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiwgZ2l0d2ViIHJ1bnMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgYW4KLWV4dGVybmFsIHdlYiBzZXJ2ZXIsIGFuZCBHZXJyaXQgYWNjZXNzIGNvbnRyb2xzIGFyZSBub3QgZW5mb3JjZWQuCitGb3IgdGhlIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24sIGdpdHdlYiBydW5zIHVuZGVyIHRoZSBjb250cm9sIG9mIGFuCitleHRlcm5hbCB3ZWIgc2VydmVyLCBhbmQgR2Vycml0IGFjY2VzcyBjb250cm9scyBhcmUgbm90IGVuZm9yY2VkLiBHZXJyaXQKK3Byb3ZpZGVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgaW50ZWdyYXRpb24gd2l0aCBHaXRXZWIuCisKK1tbbGludXhHaXRXZWJdXQorTGludXggSW5zdGFsbGF0aW9uCiteXl5eXl5eXl5eXl5eXl5eXl4KKworSW5zdGFsbCBHaXRXZWIKKysrKysrKysrKysrKysrCisKK09uIFVidW50dToKKworPT09PQorICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXR3ZWIKKz09PT0KKworV2l0aCBZdW06CisKKz09PT0KKyAgJCB5dW0gaW5zdGFsbCBnaXR3ZWIKKz09PT0KKworQ29uZmlndXJlIEdpdFdlYgorKysrKysrKysrKysrKysrKworCisKK1VwZGF0ZSBgL2V0Yy9naXR3ZWIuY29uZmAsIGFkZCB0aGUgcHVibGljIEdJVCByZXBvc2l0b3JpZXM6CisKKy0tLS0KKyRwcm9qZWN0cm9vdCA9ICIvdmFyL3d3dy9yZXBvLyI7CisKKyMgZGlyZWN0b3J5IHRvIHVzZSBmb3IgdGVtcCBmaWxlcworJGdpdF90ZW1wID0gIi90bXAiOworCisjIHRhcmdldCBvZiB0aGUgaG9tZSBsaW5rIG9uIHRvcCBvZiBhbGwgcGFnZXMKKyMkaG9tZV9saW5rID0gJG15X3VyaSB8fCAiLyI7CisKKyMgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgaG9tZSBwYWdlCiskaG9tZV90ZXh0ID0gImluZGV4dGV4dC5odG1sIjsKKworIyBmaWxlIHdpdGggcHJvamVjdCBsaXN0OyBieSBkZWZhdWx0LCBzaW1wbHkgc2NhbiB0aGUgcHJvamVjdHJvb3QgZGlyLgorJHByb2plY3RzX2xpc3QgPSAkcHJvamVjdHJvb3Q7CisKKyMgc3R5bGVzaGVldCB0byB1c2UKKyMgSSB0b29rIG9mZiB0aGUgcHJlZml4IC8gb2YgdGhlIGZvbGxvd2luZyBwYXRoIHRvIHB1dCB0aGVzZSBmaWxlcyBpbnNpZGUgZ2l0d2ViIGRpcmVjdG9yeSBkaXJlY3RseQorJHN0eWxlc2hlZXQgPSAiZ2l0d2ViLmNzcyI7CisKKyMgbG9nbyB0byB1c2UKKyRsb2dvID0gImdpdC1sb2dvLnBuZyI7CisKKyMgdGhlIJFmYXZpY29ukgorJGZhdmljb24gPSAiZ2l0LWZhdmljb24ucG5nIjsKKy0tLS0KKworQ29uZmlndXJlICYgUmVzdGFydCBBcGFjaGUgV2ViIFNlcnZlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitDb25maWd1cmUgQXBhY2hlCisrKysrKysrKysrKysrKysrCisKKworTGluayBnaXR3ZWIgdG8gYC92YXIvd3d3L2dpdHdlYmAsIGNoZWNrIGAvZXRjL2dpdHdlYi5jb25mYCBpZiB1bnN1cmUgb2YgcGF0aHM6CisKKz09PT0KKyAgJCBzdWRvIGxuIC1zIC91c3Ivc2hhcmUvZ2l0d2ViIC92YXIvd3d3L2dpdHdlYgorPT09PQorCitBZGQgdGhlIGdpdHdlYiBkaXJlY3RvcnkgdG8gdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGJ5IGNyZWF0aW5nIGEgImdpdHdlYiIKK2ZpbGUgaW5zaWRlIHRoZSBBcGFjaGUgY29uZi5kIGRpcmVjdG9yeToKKworPT09PQorICAkIHRvdWNoIC9ldGMvYXBhY2hlL2NvbmYuZC9naXR3ZWIKKz09PT0KKworQWRkIHRoZSBmb2xsb3dpbmcgdG8gL2V0Yy9hcGFjaGUvY29uZi5kL2dpdHdlYjoKKworLS0tLQorQWxpYXMgL2dpdHdlYiAvdmFyL3d3dy9naXR3ZWIKKworT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bWxpbmtzIEV4ZWNDR0kKK0RpcmVjdG9yeUluZGV4IC9jZ2ktYmluL2dpdHdlYi5jZ2kKK0FsbG93T3ZlcnJpZGUgTm9uZQorLS0tLQorCisqTk9URSogVGhpcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgYnkgeXVtL2FwdC1nZXQuIElmIHRoYXQncyB0aGUgY2FzZSwgbGVhdmUgYXMKK2lzLgorCitSZXN0YXJ0IHRoZSBBcGFjaGUgV2ViIFNlcnZlcgorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKworPT09PQorJCBzdWRvIC9ldGMvaW5pdC5kL2FwYWNoZTIgcmVzdGFydAorPT09PQorCitOb3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIHZpZXcgeW91ciByZXBvc2l0b3J5IHByb2plY3RzIG9ubGluZToKKworbGluazpodHRwOi8vbG9jYWxob3N0L2dpdHdlYltodHRwOi8vbG9jYWxob3N0L2dpdHdlYl0KKworW1tXaW5kb3dzR2l0V2ViXV0KK1dpbmRvd3MgSW5zdGFsbGF0aW9uCiteXl5eXl5eXl5eXl5eXl5eXl5eXgorCitJbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGluZyB0aGUgR2l0V2ViIG1vZHVsZSBkaXN0cmlidXRlZCB3aXRoCitNc3lzR2l0OgorCitsaW5rOmh0dHBzOi8vZ2l0aHViLmNvbS9tc3lzZ2l0L21zeXNnaXQvd2lraS9HaXRXZWJbR2l0V2ViXQorCitJZiB5b3UgZG9uJ3QgaGF2ZSBBcGFjaGUgaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBhcHByb3ByaWF0ZSBidWlsZCBmb3IKK1dpbmRvd3MgZnJvbSBsaW5rOmh0dHA6Ly93d3cuYXBhY2hlbG91bmdlLmNvbS9kb3dubG9hZFthcGFjaGVsb3VuZ2Uub3JnXS4KKworQWZ0ZXIgeW91IGhhdmUgaW5zdGFsbGVkIEFwYWNoZSwgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgYSBsaW5rOmh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvMi4wL3BsYXRmb3JtL3dpbmRvd3MuaHRtbCN3aW5zdmNbbmV3IHNlcnZpY2UgdXNlcgorYWNjb3VudF0gdG8gdXNlIHdpdGggQXBhY2hlLgorCitJZiB5b3UncmUgc3RpbGwgaGF2aW5nIGRpZmZpY3VsdHkgc2V0dGluZyB1cCBwZXJtaXNzaW9ucywgeW91IG1heSBmaW5kIHRoaXMKK3RlY2ggbm90ZSB1c2VmdWwgZm9yIGNvbmZpZ3VyaW5nIEFwYWNoZSBTZXJ2aWNlIHRvIHJ1biB1bmRlciBhbm90aGVyIGFjY291bnQuCitZb3UgbXVzdCBncmFudCB0aGUgbmV3IGFjY291bnQgbGluazpodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3OTQ5NDQoV1MuMTApLmFzcHhbInJ1biBhcyBzZXJ2aWNlIl0gcGVybWlzc2lvbjoKKworVGhlIEdpdFdlYiB2ZXJzaW9uIGluIG1zeXNnaXQgaXMgbWlzc2luZyBzZXZlcmFsIGltcG9ydGFudCBhbmQgcmVxdWlyZWQKK3BlcmwgbW9kdWxlcywgaW5jbHVkaW5nIENHSS5wbS4gVGhlIHBlcmwgaW5jbHVkZWQgd2l0aCB0aGUgbXN5c2dpdCBkaXN0cm8gMS43LjgKK2lzIGJyb2tlbi4uIFRoZSBsaW5rOmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9tc3lzZ2l0L2Jyb3dzZV90aHJlYWQvdGhyZWFkL2JhMzUwMWYxZjBlZDk1YWZbdW5pY29yZSBmb2xkZXIgaXMgbWlzc2luZyBhbG9uZyB3aXRoIHV0ZjhfaGVhdnkucGwgYW5kIENHSS5wbV0uIFlvdSBjYW4KK3ZlcmlmeSBieSBjaGVja2luZyBmb3IgcGVybCBtb2R1bGVzLiBGcm9tIGFuIG1zeXMgY29uc29sZSwgZXhlY3V0ZSB0aGUKK2ZvbGxvd2luZyB0byBjaGVjazoKKworPT09PQorJCBwZXJsIC1tQ0dJIC1tRW5jb2RlIC1tRmNudGwgLW1GaWxlOjpGaW5kIC1tRmlsZTo6QmFzZW5hbWUgLWUgIiIKKz09PT0KKworWW91IG1heSBlbmNvdW50ZXIgdGhlIGZvbGxvd2luZyBleGNlcHRpb246CisKKy0tLS0KKyQgcGVybCAtbUNHSSAtbUVuY29kZSAtbUZjbnRsIC1tRmlsZTo6RmluZCAtbUZpbGU6OkJhc2VuYW1lIC1lICIiCitDYW4ndCBsb2NhdGUgQ0dJLnBtIGluIEBJTkMgKEBJTkMgY29udGFpbnM6IC91c3IvbGliL3Blcmw1LzUuOC44L21zeXMKKy91c3IvbGliL3AgZXJsNS81LjguOCAvdXNyL2xpYi9wZXJsNS9zaXRlX3BlcmwvNS44LjgvbXN5cworL3Vzci9saWIvcGVybDUvc2l0ZV9wZXJsLzUuOC44IC91IHNyL2xpYi9wZXJsNS9zaXRlX3BlcmwgLikuIEJFR0lOCitmYWlsZWQtLWNvbXBpbGF0aW9uIGFib3J0ZWQuCistLS0tCisKK0lmIHlvdSdyZSBtaXNzaW5nIENHSS5wbSwgeW91J2xsIGhhdmUgdG8gZGVwbG95IHRoZSBtb2R1bGUgdG8gdGhlIG1zeXMKK2Vudmlyb25tZW50OiBZb3Ugd2lsbCBoYXZlIHRvIHJldHJpZXZlIHRoZW0gZnJvbSB0aGUgNS44LjggZGlzdHJvIG9uIDoKKworaHR0cDovL3N0cmF3YmVycnlwZXJsLmNvbS9yZWxlYXNlcy5odG1sCisKK0ZpbGU6IHN0cmF3YmVycnktcGVybC01LjguOC4zLnppcAorCitjb250ZW50czogYGJpbi9gIGBsaWIvYCBgc2l0ZS9gCisKK2NvcHkgdGhlIGNvbnRlbnRzIG9mIGxpYiBpbnRvIGBtc3lzZ2l0L2xpYi9wZXJsNS81LjguOGAgYW5kIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy4KKworRW5hYmxlIEdpdFdlYiBJbnRlZ3JhdGlvbgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCiBUbyBlbmFibGUgdGhlIGV4dGVybmFsIGdpdHdlYiBpbnRlZ3JhdGlvbiwgc2V0CiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNnaXR3ZWIudXJsW2dpdHdlYi51cmxdIHdpdGggdGhlIFVSTCBvZiB5b3VyCkBAIC03OSwxNiArMjI2LDI3IEBACiBiZWluZyB1c2VkLCBlbnN1cmUgaXQgdXNlcyBhIGZ1bGwgbWlycm9yLCBzbyB0aGUgYHJlZnMvY2hhbmdlcy8qYAogbmFtZXNwYWNlIGlzIGF2YWlsYWJsZS4KIAotPT09PQotICBnaXQgY29uZmlnIC0tZmlsZSAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi51cmwgaHR0cDovL2V4YW1wbGUuY29tL2dpdHdlYi5jZ2kKLSAgZ2l0IGNvbmZpZyAtLWZpbGUgJHNpdGVfcGF0aC9ldGMvZ2Vycml0LmNvbmZpZyAtLXVuc2V0IGdpdHdlYi5jZ2kKLT09PT0KKy0tLS0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi5jZ2kgJFBBVEhfVE9fR0lUV0VCL2dpdHdlYi5jZ2kKKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi51cmwgaHR0cHM6Ly9naXR3ZWIuY29ycG9yYXRpb24uY29tCistLS0tCisKK0lmIHlvdSdyZSBub3QgZm9sbG93aW5nIHRoZSB0cmFkaXRpb25hbCBce3Byb2plY3ROYW1lXH0uZ2l0IHByb2plY3QgbmFtaW5nIGNvbnZlbnRpb25zLAoreW91IHdpbGwgd2FudCB0byBjdXN0b21pemUgR2Vycml0IHRvIHJlYWQgdGhlbS4gQWRkIHRoZSBmb2xsb3dpbmc6CisKKy0tLS0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi50eXBlIGN1c3RvbQorJCBnaXQgY29uZmlnIC1mICRzaXRlX3BhdGgvZXRjL2dlcnJpdC5jb25maWcgZ2l0d2ViLnByb2plY3QgP3A9XCR7cHJvamVjdH1cO2E9c3VtbWFyeQorJCBnaXQgY29uZmlnIC1mICRzaXRlX3BhdGgvZXRjL2dlcnJpdC5jb25maWcgZ2l0d2ViLnJldmlzaW9uID9wPVwke3Byb2plY3R9XDthPWNvbW1pdFw7aD1cJHtjb21taXR9CiskIGdpdCBjb25maWcgLWYgJHNpdGVfcGF0aC9ldGMvZ2Vycml0LmNvbmZpZyBnaXR3ZWIuYnJhbmNoID9wPVwke3Byb2plY3R9XDthPXNob3J0bG9nXDtoPVwke2JyYW5jaH0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi5maWxlaGlzdG9yeSA/cD1cJHtwcm9qZWN0fVw7YT1oaXN0b3J5XDtoYj1cJHticmFuY2h9XDtmPVwke2ZpbGV9CistLS0tCiAKIEFmdGVyIHVwZGF0aW5nIGAnJHNpdGVfcGF0aCcvZXRjL2dlcnJpdC5jb25maWdgLCB0aGUgR2Vycml0IHNlcnZlciBtdXN0CiBiZSByZXN0YXJ0ZWQgYW5kIGNsaWVudHMgbXVzdCByZWxvYWQgdGhlIGhvc3QgcGFnZSB0byBzZWUgdGhlIGNoYW5nZS4KIAogQWNjZXNzIENvbnRyb2wKLX5+fn5+fn5+fn5+fn5+CisrKysrKysrKysrKysrKwogCiBHaXR3ZWIgYWNjZXNzIGNvbnRyb2xzIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyBzdGFuZGFyZCB3ZWIgc2VydmVyCiBhY2Nlc3MgY29udHJvbHMuICBUaGlzIGlzbid0IHR5cGljYWxseSBpbnRlZ3JhdGVkIHdpdGggR2Vycml0J3Mgb3duCkBAIC05Niw3ICsyNTQsNyBAQAogY29uc2lzdGVudCBpZiBhY2Nlc3MgbmVlZHMgdG8gYmUgcmVzdHJpY3RlZC4KIAogQ2FjaGluZyBHaXR3ZWIKLX5+fn5+fn5+fn5+fn5+CisrKysrKysrKysrKysrKwogCiBJZiB5b3VyIHJlcG9zaXRvcnkgc2V0IGlzIGxhcmdlIGFuZCB5b3UgYXJlIGV4cGVjdGluZyBhIGxvdAogb2YgdXNlcnMsIHlvdSBtYXkgd2FudCB0byBsb29rIGF0IHRoZSBjYWNoaW5nIGZvcmtzIHVzZWQgYnkKQEAgLTExMiw3ICsyNzAsNyBAQAogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkZWZpbmUgY3VzdG9tIHBhdHRlcm5zLgogCiBTZWUgQWxzbwotLS0tLS0tLS0KK35+fn5+fn5+CiAKICogbGluazpjb25maWctZ2Vycml0Lmh0bWwjZ2l0d2ViW1NlY3Rpb24gZ2l0d2ViXQogKiBsaW5rOmh0dHA6Ly9oamVtbGkubmV0L2dpdC9jZ2l0L1tjZ2l0XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctaG9va3MudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctaG9va3MudHh0CmluZGV4IGRmZGJhNTIuLjEyMzYwNzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29uZmlnLWhvb2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1ob29rcy50eHQKQEAgLTExLDE1ICsxMSwzMyBAQAogCiBNYWtlIHN1cmUgeW91ciBob29rIHNjcmlwdHMgYXJlIGV4ZWN1dGFibGUgaWYgcnVubmluZyBvbiAqbml4LgogCi1Ib29rcyBhcmUgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIGFmdGVyIHRoZSByZWxldmFudCBjaGFuZ2UgaGFzCi10YWtlbiBwbGFjZSBzbyBhcmUgdW5hYmxlIHRvIGFmZmVjdCB0aGUgb3V0Y29tZSBvZiBhbnkgZ2l2ZW4KLWNoYW5nZS4gQmVjYXVzZSBvZiB0aGUgZmFjdCB0aGUgaG9va3MgYXJlIHJ1biBpbiB0aGUgYmFja2dyb3VuZAotYWZ0ZXIgdGhlIGFjdGl2aXR5LCBhIGhvb2sgbWlnaHQgbm90IGJlIG5vdGlmaWVkIGFib3V0IGFuIGV2ZW50IGlmCi10aGUgc2VydmVyIGlzIHNodXRkb3duIGJlZm9yZSB0aGUgaG9vayBjYW4gYmUgaW52b2tlZC4KK1dpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcmVmLXVwZGF0ZSBob29rLCBob29rcyBhcmUgcnVuIGluIHRoZSBiYWNrZ3JvdW5kCithZnRlciB0aGUgcmVsZXZhbnQgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZSBzbyBhcmUgdW5hYmxlIHRvIGFmZmVjdAordGhlIG91dGNvbWUgb2YgYW55IGdpdmVuIGNoYW5nZS4gQmVjYXVzZSBvZiB0aGUgZmFjdCB0aGUgaG9va3MgYXJlCitydW4gaW4gdGhlIGJhY2tncm91bmQgYWZ0ZXIgdGhlIGFjdGl2aXR5LCBhIGhvb2sgbWlnaHQgbm90IGJlIG5vdGlmaWVkCithYm91dCBhbiBldmVudCBpZiB0aGUgc2VydmVyIGlzIHNodXRkb3duIGJlZm9yZSB0aGUgaG9vayBjYW4gYmUgaW52b2tlZC4KIAogU3VwcG9ydGVkIEhvb2tzCiAtLS0tLS0tLS0tLS0tLS0KIAorcmVmLXVwZGF0ZQorfn5+fn5+fn5+fgorCitUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcHVzaCByZXF1ZXN0IGlzIHJlY2VpdmVkIGJ5IEdlcnJpdC4gSXQgYWxsb3dzCithIHB1c2ggdG8gYmUgcmVqZWN0ZWQgYmVmb3JlIGl0IGlzIGNvbW1pdHRlZCB0byB0aGUgR2Vycml0IHJlcG9zaXRvcnkuCitJZiB0aGUgc2NyaXB0IGV4aXRzIHdpdGggbm9uLXplcm8gcmV0dXJuIGNvZGUgdGhlIHB1c2ggd2lsbCBiZSByZWplY3RlZC4KK0FueSBvdXRwdXQgZnJvbSB0aGUgc2NyaXB0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlCityZXR1cm4gY29kZS4KKworVGhpcyBob29rIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IHNvIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQKK2l0IG5vdCBibG9jay4gIEEgZGVmYXVsdCB0aW1lb3V0IG9uIHRoZSBob29rIGlzIHNldCB0byAzMCBzZWNvbmRzIHRvIGF2b2lkCisicnVuYXdheSIgaG9va3MgdXNpbmcgdXAgc2VydmVyIHRocmVhZHMuICBTZWUgbGluazpjb25maWctZ2Vycml0Lmh0bWwjaG9va3Muc3luY0hvb2tUaW1lb3V0W2hvb2tzLnN5bmNIb29rVGltZW91dF0KK2ZvciBjb25maWd1cmF0aW9uIGRldGFpbHMuCisKKz09PT0KKyAgcmVmLXVwZGF0ZSAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1yZWZuYW1lIDxyZWZuYW1lPiAtLXVwbG9hZGVyIDx1cGxvYWRlcj4gLS1vbGRyZXYgPHNoYTE+IC0tbmV3cmV2IDxzaGExPgorPT09PQorCiBwYXRjaHNldC1jcmVhdGVkCiB+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTQ1LDcgKzYzLDcgQEAKIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgY29tbWVudCBpcyBhZGRlZCB0byBhIGNoYW5nZS4KIAogPT09PQotICBjb21tZW50LWFkZGVkIC0tY2hhbmdlIDxjaGFuZ2UgaWQ+IC0tY2hhbmdlLXVybCA8Y2hhbmdlIHVybD4gLS1wcm9qZWN0IDxwcm9qZWN0IG5hbWU+IC0tYnJhbmNoIDxicmFuY2g+IC0tdG9waWMgPHRvcGljPiAtLWF1dGhvciA8Y29tbWVudCBhdXRob3I+IC0tY29tbWl0IDxjb21taXQ+IC0tY29tbWVudCA8Y29tbWVudD4gWy0tPGFwcHJvdmFsIGNhdGVnb3J5IGlkPiA8c2NvcmU+IC0tPGFwcHJvdmFsIGNhdGVnb3J5IGlkPiA8c2NvcmU+IC4uLl0KKyAgY29tbWVudC1hZGRlZCAtLWNoYW5nZSA8Y2hhbmdlIGlkPiAtLWlzLWRyYWZ0IDxib29sZWFuPiAtLWNoYW5nZS11cmwgPGNoYW5nZSB1cmw+IC0tcHJvamVjdCA8cHJvamVjdCBuYW1lPiAtLWJyYW5jaCA8YnJhbmNoPiAtLXRvcGljIDx0b3BpYz4gLS1hdXRob3IgPGNvbW1lbnQgYXV0aG9yPiAtLWNvbW1pdCA8Y29tbWl0PiAtLWNvbW1lbnQgPGNvbW1lbnQ+IFstLTxhcHByb3ZhbCBjYXRlZ29yeSBpZD4gPHNjb3JlPiAtLTxhcHByb3ZhbCBjYXRlZ29yeSBpZD4gPHNjb3JlPiAuLi5dCiA9PT09CiAKIGNoYW5nZS1tZXJnZWQKQEAgLTU3LDYgKzc1LDE1IEBACiAgIGNoYW5nZS1tZXJnZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS10b3BpYyA8dG9waWM+IC0tc3VibWl0dGVyIDxzdWJtaXR0ZXI+IC0tY29tbWl0IDxzaGExPgogPT09PQogCittZXJnZS1mYWlsZWQKK35+fn5+fn5+fn5+fgorCitDYWxsZWQgd2hlbmV2ZXIgYSBjaGFuZ2UgaGFzIGZhaWxlZCB0byBtZXJnZS4KKworPT09PQorICBtZXJnZS1mYWlsZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS10b3BpYyA8dG9waWM+IC0tc3VibWl0dGVyIDxzdWJtaXR0ZXI+IC0tY29tbWl0IDxzaGExPiAtLXJlYXNvbiA8cmVhc29uPgorPT09PQorCiBjaGFuZ2UtYWJhbmRvbmVkCiB+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTg0LDYgKzExMSwxNSBAQAogICByZWYtdXBkYXRlZCAtLW9sZHJldiA8b2xkIHJldj4gLS1uZXdyZXYgPG5ldyByZXY+IC0tcmVmbmFtZSA8cmVmIG5hbWU+IC0tcHJvamVjdCA8cHJvamVjdCBuYW1lPiAtLXN1Ym1pdHRlciA8c3VibWl0dGVyPgogPT09PQogCityZXZpZXdlci1hZGRlZAorfn5+fn5+fn5+fn5+fn4KKworQ2FsbGVkIHdoZW5ldmVyIGEgcmV2aWV3ZXIgaXMgYWRkZWQgdG8gYSBjaGFuZ2UuCisKKz09PT0KKyAgcmV2aWV3ZXItYWRkZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS1yZXZpZXdlciA8cmV2aWV3ZXI+Cis9PT09CisKIGNsYS1zaWduZWQKIH5+fn5+fn5+fn4KIApAQCAtMTA0LDggKzE0MCw4IEBACiAKIEZvciB0aGUgaG9vayBmaWxlbmFtZXMsIEdlcnJpdCB3aWxsIHVzZSB0aGUgdmFsdWVzIG9mIGhvb2tzLnBhdGNoc2V0Q3JlYXRlZEhvb2ssCiBob29rcy5kcmFmdFB1Ymxpc2hlZEhvb2ssIGhvb2tzLmNvbW1lbnRBZGRlZEhvb2ssIGhvb2tzLmNoYW5nZU1lcmdlZEhvb2ssCi1ob29rcy5jaGFuZ2VBYmFuZG9uZWRIb29rLCBob29rcy5jaGFuZ2VSZXN0b3JlZEhvb2ssIGhvb2tzLnJlZlVwZGF0ZWRIb29rIGFuZAotaG9va3MuY2xhU2lnbmVkSG9vay4KK2hvb2tzLmNoYW5nZUFiYW5kb25lZEhvb2ssIGhvb2tzLmNoYW5nZVJlc3RvcmVkSG9vaywgaG9va3MucmVmVXBkYXRlZEhvb2ssCitob29rcy5yZWZVcGRhdGVIb29rLCBob29rcy5yZXZpZXdlckFkZGVkSG9vayBhbmQgaG9va3MuY2xhU2lnbmVkSG9vay4KIAogTWlzc2luZyBDaGFuZ2UgVVJMcwogLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctbGFiZWxzLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxhYmVscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxNDI0MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxhYmVscy50eHQKQEAgLTAsMCArMSwyNTUgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIFJldmlldyBMYWJlbHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXMgcGFydCBvZiB0aGUgY29kZSByZXZpZXcgcHJvY2VzcywgcmV2aWV3ZXJzIHNjb3JlIGVhY2ggY2hhbmdlIHdpdGgKK3ZhbHVlcyBmb3IgZWFjaCBsYWJlbCBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4gIFRoZSBsYWJlbCB2YWx1ZXMgdGhhdAorYSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gc2V0IGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV9yZXZpZXdfbGFiZWxzW2FjY2VzcyBjb250cm9sc10uICBHZXJyaXQKK2NvbWVzIHByZS1jb25maWd1cmVkIHdpdGggdGhlIENvZGUtUmV2aWV3IGxhYmVsIHRoYXQgY2FuIGJlIGdyYW50ZWQgdG8KK2dyb3VwcyB3aXRoaW4gcHJvamVjdHMsIGVuYWJsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHRoYXQgZ3JvdXAncyBtZW1iZXJzLgorCisKK1tbbGFiZWxfQ29kZS1SZXZpZXddXQorTGFiZWw6IENvZGUtUmV2aWV3CistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvZGUgcmV2aWV3IGxhYmVsIGlzIHRoZSBzZWNvbmQgb2YgdHdvIGRlZmF1bHQgbGFiZWxzIHRoYXQgaXMKK2NvbmZpZ3VyZWQgdXBvbiB0aGUgY3JlYXRpb24gb2YgYSBHZXJyaXQgaW5zdGFuY2UuICBJdCBtYXkgaGF2ZSBhbnkKK21lYW5pbmcgdGhlIHByb2plY3QgZGVzaXJlcy4gIEl0IHdhcyBvcmlnaW5hbGx5IGludmVudGVkIGJ5IHRoZSBBbmRyb2lkCitPcGVuIFNvdXJjZSBQcm9qZWN0IHRvIG1lYW4gJ0kgcmVhZCB0aGUgY29kZSBhbmQgaXQgc2VlbXMgcmVhc29uYWJseQorY29ycmVjdCcuCisKK1RoZSByYW5nZSBvZiB2YWx1ZXMgaXM6CisKKyogLTIgRG8gbm90IHN1Ym1pdAorKworVGhlIGNvZGUgaXMgc28gaG9ycmlibHkgaW5jb3JyZWN0L2J1Z2d5L2Jyb2tlbiB0aGF0IGl0IG11c3Qgbm90IGJlCitzdWJtaXR0ZWQgdG8gdGhpcyBwcm9qZWN0LCBvciB0byB0aGlzIGJyYW5jaC4gIFRoaXMgdmFsdWUgaXMgdmFsaWQKK2Fjcm9zcyBhbGwgcGF0Y2ggc2V0cyBpbiB0aGUgc2FtZSBjaGFuZ2UsIGkuZS4gdGhlIHJldmlld2VyIG11c3QKK2FjdGl2ZWx5IGNoYW5nZSBoaXMvaGVyIHJldmlldyB0byBzb21ldGhpbmcgZWxzZSBiZWZvcmUgdGhlIGNoYW5nZQoraXMgc3VibWl0dGFibGUuCisrCisqQW55IC0yIGJsb2NrcyBzdWJtaXQuKgorCisqIC0xIEkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcworKworVGhlIGNvZGUgZG9lc24ndCBsb29rIHJpZ2h0LCBvciBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5LCBidXQKK3RoZSByZXZpZXdlciBpcyB3aWxsaW5nIHRvIGxpdmUgd2l0aCBpdCBhcy1pcyBpZiBhbm90aGVyIHJldmlld2VyCithY2NlcHRzIGl0LCBwZXJoYXBzIGJlY2F1c2UgaXQgaXMgYmV0dGVyIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgaW4KK3RoZSBwcm9qZWN0LiAgT2Z0ZW4gdGhpcyBpcyBhbHNvIHVzZWQgYnkgY29udHJpYnV0b3JzIHdobyBkb24ndCBsaWtlCit0aGUgY2hhbmdlLCBidXQgYWxzbyBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm9qZWN0IGxvbmctdGVybQorYW5kIHRodXMgZG9uJ3QgaGF2ZSBmaW5hbCBzYXkgb24gY2hhbmdlIHN1Ym1pc3Npb24uCisrCitEb2VzIG5vdCBibG9jayBzdWJtaXQuCisKKyogMCBObyBzY29yZQorKworRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSBjb2RlIHJldmlldyB0YXNrLCBvciBnbGFuY2VkIG92ZXIgaXQgYnV0Citkb24ndCBoYXZlIGFuIGluZm9ybWVkIG9waW5pb24geWV0LgorCisqICsxIExvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlCisrCitUaGUgY29kZSBsb29rcyByaWdodCB0byB0aGlzIHJldmlld2VyLCBidXQgdGhlIHJldmlld2VyIGRvZXNuJ3QKK2hhdmUgYWNjZXNzIHRvIHRoZSBgKzJgIHZhbHVlIGZvciB0aGlzIGNhdGVnb3J5LiAgT2Z0ZW4gdGhpcyBpcwordXNlZCBieSBjb250cmlidXRvcnMgdG8gYSBwcm9qZWN0IHdobyB3ZXJlIGFibGUgdG8gcmV2aWV3IHRoZSBjaGFuZ2UKK2FuZCBsaWtlIHdoYXQgaXQgaXMgZG9pbmcsIGJ1dCBkb24ndCBoYXZlIGZpbmFsIGFwcHJvdmFsIG92ZXIgd2hhdAorZ2V0cyBzdWJtaXR0ZWQuCisKKyogKzIgTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQKKysKK0Jhc2ljYWxseSB0aGUgc2FtZSBhcyBgKzFgLCBidXQgZm9yIHRob3NlIHdobyBoYXZlIGZpbmFsIHNheSBvdmVyCitob3cgdGhlIHByb2plY3Qgd2lsbCBkZXZlbG9wLgorKworKkFueSArMiBlbmFibGVzIHN1Ym1pdC4qCisKK0ZvciBhIGNoYW5nZSB0byBiZSBzdWJtaXR0YWJsZSwgdGhlIGxhdGVzdCBwYXRjaCBzZXQgbXVzdCBoYXZlIGEKK2ArMiBMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZGAgaW4gdGhpcyBjYXRlZ29yeSwgYW5kIG5vCitgLTIgRG8gbm90IHN1Ym1pdGAuICBUaHVzIGAtMmAgb24gYW55IHBhdGNoIHNldCBjYW4gYmxvY2sgYSBzdWJtaXQsCit3aGlsZSBgKzJgIG9uIHRoZSBsYXRlc3QgcGF0Y2ggc2V0IGNhbiBlbmFibGUgaXQuCisKK0lmIGEgR2Vycml0IGluc3RhbGxhdGlvbiBkb2VzIG5vdCB3aXNoIHRvIHVzZSB0aGlzIGxhYmVsIGluIGFueSBwcm9qZWN0LAordGhlIGBbbGFiZWwgIkNvZGUtUmV2aWV3Il1gIHNlY3Rpb24gY2FuIGJlIGRlbGV0ZWQgZnJvbSBgcHJvamVjdC5jb25maWdgCitpbiBgQWxsLVByb2plY3RzYC4KKworSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIG9yIHByb2plY3Qgd2FudHMgdG8gbW9kaWZ5IHRoZSBkZXNjcmlwdGlvbiB0ZXh0Cithc3NvY2lhdGVkIHdpdGggdGhlc2UgbGFiZWwgdmFsdWVzLCB0aGUgdGV4dCBjYW4gYmUgdXBkYXRlZCBpbiB0aGUKK2BsYWJlbC5Db2RlLVJldmlldy52YWx1ZWAgZmllbGRzIGluIGBwcm9qZWN0LmNvbmZpZ2AuCisKK0FkZGl0aW9uYWwgZW50cmllcyBjb3VsZCBiZSBhZGRlZCB0byBgbGFiZWwuQ29kZS1SZXZpZXcudmFsdWVgIHRvCitmdXJ0aGVyIGV4dGVuZCB0aGUgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHJhbmdlLCBidXQgdGhlcmUgaXMgbGlrZWx5CitsaXR0bGUgdmFsdWUgaW4gZG9pbmcgc28gYXMgdGhpcyBvbmx5IGV4cGFuZHMgdGhlIG1pZGRsZSByZWdpb24uICBUaGlzCitsYWJlbCBpcyBhIGBNYXhXaXRoQmxvY2tgIHR5cGUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxvd2VzdCBuZWdhdGl2ZQordmFsdWUgaWYgcHJlc2VudCBibG9ja3MgYSBzdWJtaXQsIHdoaWxlIHRoZSBoaWdoZXN0IHBvc2l0aXZlIHZhbHVlIGlzCityZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgorCitbW2xhYmVsX1ZlcmlmaWVkXV0KK0xhYmVsOiBWZXJpZmllZAorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBWZXJpZmllZCBsYWJlbCB3YXMgb3JpZ2luYWxseSBpbnZlbnRlZCBieSB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZQorUHJvamVjdCB0byBtZWFuICdjb21waWxlcywgcGFzc2VzIGJhc2ljIHVuaXQgdGVzdHMnLiAgU29tZSBDSSB0b29scworZXhwZWN0IHRvIHVzZSB0aGUgVmVyaWZpZWQgbGFiZWwgdG8gdm90ZSBvbiBhIGNoYW5nZSBhZnRlciBydW5uaW5nLgorCitBZG1pbmlzdHJhdG9ycyBjYW4gaW5zdGFsbCB0aGUgVmVyaWZpZWQgbGFiZWwgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcKK3RleHQgdG8gYHByb2plY3QuY29uZmlnYDoKKworPT09PQorICBbbGFiZWwgIlZlcmlmaWVkIl0KKyAgICAgIGZ1bmN0aW9uID0gTWF4V2l0aEJsb2NrCisgICAgICB2YWx1ZSA9IC0xIEZhaWxzCisgICAgICB2YWx1ZSA9ICAwIE5vIHNjb3JlCisgICAgICB2YWx1ZSA9ICsxIFZlcmlmaWVkCis9PT09CisKK1RoZSByYW5nZSBvZiB2YWx1ZXMgaXM6CisKKyogLTEgRmFpbHMKKysKK1RyaWVkIHRvIGNvbXBpbGUsIGJ1dCBnb3QgYSBjb21waWxlIGVycm9yLCBvciB0cmllZCB0byBydW4gdGVzdHMsCitidXQgb25lIG9yIG1vcmUgdGVzdHMgZGlkIG5vdCBwYXNzLgorKworKkFueSAtMSBibG9ja3Mgc3VibWl0LioKKworKiAwIE5vIHNjb3JlCisrCitEaWRuJ3QgdHJ5IHRvIHBlcmZvcm0gdGhlIHZlcmlmaWNhdGlvbiB0YXNrcy4KKworKiArMSBWZXJpZmllZAorKworQ29tcGlsZWQgKGFuZCByYW4gdGVzdHMpIHN1Y2Nlc3NmdWxseS4KKysKKypBbnkgKzEgZW5hYmxlcyBzdWJtaXQuKgorCitGb3IgYSBjaGFuZ2UgdG8gYmUgc3VibWl0dGFibGUsIHRoZSBjaGFuZ2UgbXVzdCBoYXZlIGEgYCsxIFZlcmlmaWVkYAoraW4gdGhpcyBsYWJlbCwgYW5kIG5vIGAtMSBGYWlsc2AuICBUaHVzLCBgLTEgRmFpbHNgIGNhbiBibG9jayBhIHN1Ym1pdCwKK3doaWxlIGArMSBWZXJpZmllZGAgZW5hYmxlcyBhIHN1Ym1pdC4KKworQWRkaXRpb25hbCB2YWx1ZXMgY291bGQgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGxhYmVsLCB0byBhbGxvdyBpdCB0bworYmVoYXZlIG1vcmUgbGlrZSBgQ29kZS1SZXZpZXdgIChiZWxvdykuICBBZGQgLTIgYW5kICsyIGVudHJpZXMgdG8gdGhlCitgbGFiZWwuVmVyaWZpZWQudmFsdWVgIGZpZWxkcyBpbiBgcHJvamVjdC5jb25maWdgIHRvIGdldCB0aGUgc2FtZQorYmVoYXZpb3IuCisKKworW1tsYWJlbF9jdXN0b21dXQorWW91ciBMYWJlbCBIZXJlCistLS0tLS0tLS0tLS0tLS0KKworU2l0ZSBhZG1pbmlzdHJhdG9ycyBhbmQgcHJvamVjdCBvd25lcnMgY2FuIGFsc28gZGVmaW5lIHRoZWlyIG93biBsYWJlbHMuCisKK1NlZSBhYm92ZSBmb3IgZGVzY3JpcHRpb25zIG9mIGhvdyA8PGxhYmVsX1ZlcmlmaWVkLGBWZXJpZmllZGA+PgorYW5kIDw8bGFiZWxfQ29kZS1SZXZpZXcsYENvZGUtUmV2aWV3YD4+IHdvcmssIGFuZCBhZGQgeW91ciBvd24KK2xhYmVsIHRvIGBwcm9qZWN0LmNvbmZpZ2AgdG8gZ2V0IHRoZSBzYW1lIGJlaGF2aW9yIG92ZXIgeW91ciBvd24gcmFuZ2UKK29mIHZhbHVlcywgZm9yIGFueSBsYWJlbCB5b3UgZGVzaXJlLgorCitKdXN0IGxpa2UgdGhlIGJ1aWx0LWluIGxhYmVscywgdXNlcnMgbmVlZCB0byBiZSBnaXZlbiBwZXJtaXNzaW9ucyB0bwordm90ZSBvbiBjdXN0b20gbGFiZWxzLiBQZXJtaXNzaW9ucyBjYW4gZWl0aGVyIGJlIGFkZGVkIGJ5IG1hbnVhbGx5CitlZGl0aW5nIHByb2plY3QuY29uZmlnIHdoZW4gYWRkaW5nIHRoZSBsYWJlbHMsIG9yLCBvbmNlIHRoZSBsYWJlbHMgYXJlCithZGRlZCwgcGVybWlzc2lvbiBjYXRlZ29yaWVzIGZvciB0aG9zZSBsYWJlbHMgd2lsbCBzaG93IHVwIGluIHRoZQorcGVybWlzc2lvbiBlZGl0b3Igd2ViIFVJLgorCitMYWJlbHMgbWF5IGJlIGFkZGVkIHRvIGFueSBwcm9qZWN0J3MgYHByb2plY3QuY29uZmlnYDsgdGhlIGRlZmF1bHQKK2xhYmVscyBhcmUgZGVmaW5lZCBpbiBgQWxsLVByb2plY3RzYC4gTGFiZWxzIGFyZSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQKK3Byb2plY3RzOyBhIGNoaWxkIHByb2plY3QgbWF5IGFkZCwgb3ZlcnJpZGUsIG9yIHJlbW92ZSBsYWJlbHMgZGVmaW5lZCBpbgoraXRzIHBhcmVudHMuICBPdmVycmlkaW5nIGEgbGFiZWwgaW4gYSBjaGlsZCBwcm9qZWN0IG92ZXJyaWRlcyBhbGwgaXRzCitwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMuICBUbyByZW1vdmUgYSBsYWJlbCBpbiBhIGNoaWxkIHByb2plY3QsIGFkZCBhbgorZW1wdHkgbGFiZWwgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGluIHRoZSBwYXJlbnQuCisKK0xhYmVscyBhcmUgbGFpZCBvdXQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHNwZWNpZmllZCBpbiBwcm9qZWN0LmNvbmZpZywKK3dpdGggaW5oZXJpdGVkIGxhYmVscyBhcHBlYXJpbmcgZmlyc3QsIHByb3ZpZGluZyBzb21lIGxheW91dCBjb250cm9sIHRvCit0aGUgYWRtaW5pc3RyYXRvci4KKworW1tsYWJlbF9uYW1lXV0KK2BsYWJlbC5MYWJlbC1OYW1lYAorfn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBuYW1lIGZvciBhIGxhYmVsLCBjb25zaXN0aW5nIG9ubHkgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kCitgLWAuCisKKworW1tsYWJlbF92YWx1ZV1dCitgbGFiZWwuTGFiZWwtTmFtZS52YWx1ZWAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBIG11bHRpLXZhbHVlZCBrZXkgd2hvc2UgdmFsdWVzIGFyZSBvZiB0aGUgZm9ybSBgIjwjPiBWYWx1ZSBkZXNjcmlwdGlvbgordGV4dCJgLiBUaGUgYDwjPmAgbWF5IGJlIGFueSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBudW1iZXIgd2l0aCBhbgorb3B0aW9uYWwgbGVhZGluZyBgK2AuCisKKworW1tsYWJlbF9hYmJyZXZpYXRlZE5hbWVdXQorYGxhYmVsLkxhYmVsLU5hbWUuYWJicmV2aWF0ZWROYW1lYAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbiBhYmJyZXZpYXRlZCBuYW1lIGZvciBhIGxhYmVsIHNob3duIGFzIGEgY29tcGFjdCBjb2x1bW4gaGVhZGVyLCBmb3IKK2V4YW1wbGUgb24gcHJvamVjdCBkYXNoYm9hcmRzLiBEZWZhdWx0cyB0byBhbGwgdGhlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzCitpbiB0aGUgbGFiZWwgbmFtZSwgZS5nLiBgTGFiZWwtTmFtZWAgaXMgYWJicmV2aWF0ZWQgYnkgZGVmYXVsdCBhcyBgTE5gLgorCisKK1tbbGFiZWxfZnVuY3Rpb25dXQorYGxhYmVsLkxhYmVsLU5hbWUuZnVuY3Rpb25gCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBmb3IgZXZhbHVhdGluZyBtdWx0aXBsZSB2b3RlcyBmb3IgYSBsYWJlbC4gIFRoaXMKK2Z1bmN0aW9uIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgZGVmYXVsdCBzdWJtaXQgcnVsZSBpcyB1c2VkIGZvciBhIGxhYmVsLgorSWYgeW91IHdyaXRlIGEgbGluazpwcm9sb2ctY29va2Jvb2suaHRtbCNIb3dUb1dyaXRlU3VibWl0UnVsZXNbY3VzdG9tCitzdWJtaXQgcnVsZV0gKGFuZCBkbyBub3QgY2FsbCB0aGUgZGVmYXVsdCBydWxlKSwgdGhlIGZ1bmN0aW9uIG5hbWUgaXMKK2lnbm9yZWQgYW5kIG1heSBiZSB0cmVhdGVkIGFzIG9wdGlvbmFsLgorCitWYWxpZCB2YWx1ZXMgYXJlOgorCisqIGBNYXhXaXRoQmxvY2tgIChkZWZhdWx0KQorKworVGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSwgaWYgcHJlc2VudCwgYmxvY2tzIGEgc3VibWl0LCB3aGlsZQordGhlIGhpZ2hlc3QgcG9zc2libGUgcG9zaXRpdmUgdmFsdWUgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHN1Ym1pdC4gVGhlcmUKK211c3QgYmUgYXQgbGVhc3Qgb25lIHBvc2l0aXZlIHZhbHVlLCBvciBlbHNlIHN1Ym1pdCB3aWxsIG5ldmVyIGJlCitlbmFibGVkLiBUbyBwZXJtaXQgYmxvY2tpbmcgc3VibWl0cywgZW5zdXJlIGEgbmVnYXRpdmUgdmFsdWUgaXMgZGVmaW5lZC4KKworKiBgTWF4Tm9CbG9ja2AKKysKK1RoZSBoaWdoZXN0IHBvc3NpYmxlIHBvc2l0aXZlIHZhbHVlIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBzdWJtaXQsIGJ1dAordGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSB3aWxsIG5vdCBibG9jayB0aGUgY2hhbmdlLgorCisqIGBOb0Jsb2NrYC9gTm9PcGAKKysKK1RoZSBsYWJlbCBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbCBhbmQgdmFsdWVzIGFyZSBub3QgY29uc2lkZXJlZCB3aGVuCitkZXRlcm1pbmluZyB3aGV0aGVyIGEgY2hhbmdlIGlzIHN1Ym1pdHRhYmxlLgorCisKK1tbbGFiZWxfY29weU1pblNjb3JlXV0KK2BsYWJlbC5MYWJlbC1OYW1lLmNvcHlNaW5TY29yZWAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgdHJ1ZSwgdGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdGhlIGxhYmVsIGlzIGNvcGllZAorZm9yd2FyZCB3aGVuIGEgbmV3IHBhdGNoIHNldCBpcyB1cGxvYWRlZC4KKworCitbW2xhYmVsX2Nhbk92ZXJyaWRlXV0KK2BsYWJlbC5MYWJlbC1OYW1lLmNhbk92ZXJyaWRlYAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIGZhbHNlLCB0aGUgbGFiZWwgY2Fubm90IGJlIG92ZXJyaWRkZW4gYnkgY2hpbGQgcHJvamVjdHMuIEFueQorY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsYWJlbCBpbiBjaGlsZCBwcm9qZWN0cyB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHRzCit0byB0cnVlLgorCisKK1tbbGFiZWxfZXhhbXBsZV1dCitFeGFtcGxlCit+fn5+fn5+CisKK1RvIGRlZmluZSBhIG5ldyAzLXZhbHVlZCBjYXRlZ29yeSB0aGF0IGJlaGF2ZXMgZXhhY3RseSBsaWtlIGBWZXJpZmllZGAsCitidXQgaGFzIGRpZmZlcmVudCBuYW1lcy9sYWJlbHM6CisKKz09PT0KKyAgW2xhYmVsICJDb3B5cmlnaHQtQ2hlY2siXQorICAgICAgZnVuY3Rpb24gPSBNYXhXaXRoQmxvY2sKKyAgICAgIHZhbHVlID0gLTEgRG8gbm90IGhhdmUgY29weXJpZ2h0CisgICAgICB2YWx1ZSA9ICAwIE5vIHNjb3JlCisgICAgICB2YWx1ZSA9ICsxIENvcHlyaWdodCBjbGVhcgorPT09PQorCitUaGUgbmV3IGNvbHVtbiB3aWxsIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSwgYW5kIGAtMSBEbyBub3QgaGF2ZQorY29weXJpZ2h0YCB3aWxsIGJsb2NrIHN1Ym1pdCwgd2hpbGUgYCsxIENvcHlyaWdodCBjbGVhcmAgaXMgcmVxdWlyZWQgdG8KK2VuYWJsZSBzdWJtaXQuCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1sb2dpbi1yZWdpc3Rlci50eHQgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1sb2dpbi1yZWdpc3Rlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMGZjNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxvZ2luLXJlZ2lzdGVyLnR4dApAQCAtMCwwICsxLDEzOCBAQAorW1t1c2Vyc2V0dXBdXQorSW5pdGFsIExvZ2luCistLS0tLS0tLS0tLS0KK0l0J3MgdGltZSB0byBleGl0IHRoZSBnZXJyaXQyIGFjY291bnQgYXMgeW91IG5vdyBoYXZlIEdlcnJpdCBydW5uaW5nIG9uIHlvdXIKK2hvc3QgYW5kIHNldHVwIHlvdXIgZmlyc3Qgd29ya3NwYWNlLgorCitTdGFydCBhIHNoZWxsIHdpdGggdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBhY2NvdW50IHlvdSB3aWxsIHBlcmZvcm0KK2RldmVsb3BtZW50IHVuZGVyLgorCitDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3NoIGtleXMgYWxyZWFkeS4gWW91J3JlIGxvb2tpbmcgZm9yIHR3byBmaWxlcywKK2lkX3JzYSBhbmQgaWRfcnNhLnB1Yi4KKworLS0tLQorICB1c2VyQGhvc3Q6fiQgbHMgLnNzaAorICBhdXRob3JpemVkX2tleXMgIGNvbmZpZyAgaWRfcnNhICBpZF9yc2EucHViICBrbm93bl9ob3N0cworICB1c2VyQGhvc3Q6fiQKKy0tLS0KKworSWYgeW91IGhhdmUgdGhlIGZpbGVzLCB5b3UgbWF5IHNraXAgdGhlIGtleSBnZW5lcmF0aW5nIHN0ZXAuCisKK0lmIHlvdSBkb24ndCBzZWUgdGhlIGZpbGVzIGluIHlvdXIgbGlzdGluZywgeW91ciB3aWxsIGhhdmUgdG8gZ2VuZXJhdGUgcnNhCitrZXlzIGZvciB5b3VyIHNzaCBzZXNzaW9uczoKKworU1NIIGtleSBnZW5lcmF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn4KKworKlBsZWFzZSBkb24ndCBnZW5lcmF0ZSBuZXcga2V5cyBpZiB5b3UgYWxyZWFkeSBoYXZlIGEgdmFsaWQga2V5cGFpciEqCisqVGhleSB3aWxsIGJlIG92ZXJ3cml0dGVuISoKKworLS0tLQorICB1c2VyQGhvc3Q6fiQgc3NoLWtleWdlbiAtdCByc2EKKyAgR2VuZXJhdGluZyBwdWJsaWMvcHJpdmF0ZSByc2Ega2V5IHBhaXIuCisgIEVudGVyIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUga2V5ICgvaG9tZS91c2VyLy5zc2gvaWRfcnNhKToKKyAgQ3JlYXRlZCBkaXJlY3RvcnkgJy9ob21lL3VzZXIvLnNzaCcuCisgIEVudGVyIHBhc3NwaHJhc2UgKGVtcHR5IGZvciBubyBwYXNzcGhyYXNlKToKKyAgRW50ZXIgc2FtZSBwYXNzcGhyYXNlIGFnYWluOgorICBZb3VyIGlkZW50aWZpY2F0aW9uIGhhcyBiZWVuIHNhdmVkIGluIC9ob21lL3VzZXIvLnNzaC9pZF9yc2EuCisgIFlvdXIgcHVibGljIGtleSBoYXMgYmVlbiBzYXZlZCBpbiAvaG9tZS91c2VyLy5zc2gvaWRfcnNhLnB1Yi4KKyAgVGhlIGtleSBmaW5nZXJwcmludCBpczoKKyAgMDA6MTE6MjI6MDA6MTE6MjI6MDA6MTE6NDQ6MDA6MTE6MjI6MDA6MTE6MjI6OTkgdXNlckBob3N0CisgIFRoZSBrZXkncyByYW5kb21hcnQgaW1hZ2UgaXM6CisgICstLVsgUlNBIDIwNDhdLS0tLSsKKyAgfCAgICAgLi4rLio9K29vLipFfAorICB8ICAgICAgdS5Pb0IuLiAuICt8CisgIHwgICAgICAgLi4qLiAgICAgIHwKKyAgfCAgICAgICBvICAgICAgICAgfAorICB8ICAgICAgLiBTIC4uICAgICB8CisgIHwgICAgICAgICAgICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfAorICB8ICAgICAgICAgIC4uICAgICB8CisgIHwgICAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKworICB1c2VyQGhvc3Q6fiQKKy0tLS0KKworUmVnaXN0ZXJpbmcgeW91ciBrZXkgaW4gR2Vycml0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworT3BlbiBhIGJyb3dzZXIgYW5kIGVudGVyIHRoZSBjYW5vbmljYWwgdXJsIG9mIHlvdXIgR2Vycml0IHNlcnZlci4gIFlvdSBjYW4KK2ZpbmQgdGhlIHVybCBpbiB0aGUgc2V0dGluZ3MgZmlsZS4KKworLS0tLQorICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyBnZXJyaXQuY2Fub25pY2FsV2ViVXJsCisgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8KKyAgZ2Vycml0MkBob3N0On4kCistLS0tCisKK1JlZ2lzdGVyIGEgbmV3IGFjY291bnQgaW4gR2Vycml0IHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2Ugd2l0aCB0aGUKK2VtYWlsIGFkZHJlc3Mgb2YgeW91ciBjaG9pY2UuCisKK1RoZSBkZWZhdWx0IGF1dGhlbnRpY2F0aW9uIHR5cGUgaXMgT3BlbklELiAgSWYgeW91ciBHZXJyaXQgc2VydmVyIGlzIGJlaGluZCBhCitwcm94eSwgYW5kIHlvdSBhcmUgdXNpbmcgYW4gZXh0ZXJuYWwgT3BlbklEIHByb3ZpZGVyLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUKK3Byb3h5IHNldHRpbmdzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKy0tLS0KKyAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgLS1hZGQgaHR0cC5wcm94eSBodHRwOi8vcHJveHk6ODA4MAorICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyAtLWFkZCBodHRwLnByb3h5VXNlcm5hbWUgdXNlcm5hbWUKKyAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgLS1hZGQgaHR0cC5wcm94eVBhc3N3b3JkIHBhc3N3b3JkCistLS0tCisKK1JlZmVyIHRvIHRoZSBHZXJyaXQgY29uZmlndXJhdGlvbiBndWlkZSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dAorbGluazpjb25maWctZ2Vycml0Lmh0bWwjYXV0aFthdXRoZW50aWNhdGlvbl0gYW5kCitsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNodHRwLnByb3h5W3Byb3h5XSBzZXR0aW5ncy4KKworVGhlIGZpcnN0IHVzZXIgdG8gc2lnbi1pbiBhbmQgcmVnaXN0ZXIgYW4gYWNjb3VudCB3aWxsIGJlCithdXRvbWF0aWNhbGx5IHBsYWNlZCBpbnRvIHRoZSBmdWxseSBwcml2aWxlZ2VkIEFkbWluaXN0cmF0b3JzIGdyb3VwLAorcGVybWl0dGluZyBzZXJ2ZXIgbWFuYWdlbWVudCBvdmVyIHRoZSB3ZWIgYW5kIG92ZXIgU1NILiAgU3Vic2VxdWVudAordXNlcnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgYXMgdW5wcml2aWxlZ2VkIHVzZXJzLgorCitPbmNlIHNpZ25lZCBpbiBhcyB5b3VyIHVzZXIsIHlvdSBmaW5kIGEgbGl0dGxlIHdpemFyZCB0byBnZXQgeW91IHN0YXJ0ZWQuCitUaGUgd2l6YXJkIGhlbHBzIHlvdSBmaWxsIG91dDoKKworKiBSZWFsIG5hbWUgKHZpc2libGUgbmFtZSBpbiBHZXJyaXQpCisqIFJlZ2lzdGVyIHlvdXIgZW1haWwgKGl0IG11c3QgYmUgY29uZmlybWVkIGxhdGVyKQorKiBTZWxlY3QgYSB1c2VybmFtZSB3aXRoIHdoaWNoIHRvIGNvbW11bmljYXRlIHdpdGggR2Vycml0IG92ZXIgc3NoK2dpdAorCisqIFRoZSBzZXJ2ZXIgd2lsbCBhc2sgeW91IGZvciBhbiBSU0EgcHVibGljIGtleS4KK1RoYXQncyB0aGUga2V5IHdlIGdlbmVyYXRlZCBhYm92ZSwgYW5kIGl0J3MgdGltZSB0byBtYWtlIHN1cmUgdGhhdCBHZXJyaXQga25vd3MKK2Fib3V0IG91ciBuZXcga2V5IGFuZCBjYW4gaWRlbnRpZnkgdXMgYnkgaXQuCisKKy0tLS0KKyAgdXNlckBob3N0On4kIGNhdCAuc3NoL2lkX3JzYS5wdWIKKyAgc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBMWJpZE9kOExBcDdWcDk1TTFiOXorTEdPOTZPRVd6ZEFnQlBmWlBxMDVqVWgKKyAgancwbUlkVXV2ZzVsaHdzd25Oc3ZtbkZoR2JzVW9YWnVpNmpkWGo3eFBVV09EOGZlWDJOTkVqVEFFZVg3RFhPaG5vek5Ba2svWjk4V1VWMkIKKyAgeFVCcWhSaTh2aFZtYUNNOEUrSmtIekFjKzcvSFZZQlR1UFVTN2xZUGJ5NXc5NWdzM3pWeHJYOGQxKytJWGcvdS9GLzQ3elV4aGRhRUxNdzIKKyAgZGVEOFhMaHJOUHgyRlE4M0Z4cmpuVnZFS1FKeUQyT29xeGJDMktjVUdZSi8zZmhpdXBuL1lwblpzbDUrNm1mUXVaUkpFb1ovRkgybjRERUgKKyAgd3pnQkJCYWdCcjBaWkNFa2w3NHM0S0ZacDZKSncvWlNqTVJYc1hYWFd2d2NUcGFVRURpaTcwOEhHdz09IEpvaG4gRG9lQE1BQ0hJTkUKKyAgdXNlckBob3N0On4kCistLS0tCisKK0lNUE9SVEFOVDogUGxlYXNlIHRha2Ugbm90ZSBvZiB0aGUgZXh0cmEgbGluZS1icmVha3MgaW50cm9kdWNlZCBpbiB0aGUga2V5IGFib3ZlCitmb3IgZm9ybWF0dGluZyBwdXJwb3Nlcy4gUGxlYXNlIGJlIHN1cmUgdG8gY29weSBhbmQgcGFzdGUgeW91ciBrZXkgd2l0aG91dAorbGluZS1icmVha3MuCisKK0NvcHkgdGhlIHN0cmluZyBzdGFydGluZyB3aXRoIHNzaC1yc2EgdG8geW91ciBjbGlwYm9hcmQgYW5kIHRoZW4gcGFzdGUgaXQKK2ludG8gdGhlIGJveCBmb3IgUlNBIGtleXMuIE1ha2UgKmFic29sdXRlbHkgc3VyZSogbm8gZXh0cmEgc3BhY2VzIG9yIGxpbmUgZmVlZHMKK2FyZSBlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIFJTQSBzdHJpbmcuCisKK1ZlcmlmeSB0aGF0IHRoZSBzc2ggY29ubmVjdGlvbiB3b3JrcyBmb3IgeW91LgorCistLS0tCisgIHVzZXJAaG9zdDp+JCBzc2ggdXNlckBsb2NhbGhvc3QgLXAgMjk0MTgKKyAgVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICdbbG9jYWxob3N0XToyOTQxOCAoWzEyNy4wLjAuMV06Mjk0MTgpJyBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KKyAgUlNBIGtleSBmaW5nZXJwcmludCBpcyBkYjowNzozZDpjMjo5NDoyNTpiNTo4ZDphYzpiYzpiNTo5ZToyZjo5NTo1Zjo0YS4KKyAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/IHllcworICBXYXJuaW5nOiBQZXJtYW5lbnRseSBhZGRlZCAnW2xvY2FsaG9zdF06Mjk0MTgnIChSU0EpIHRvIHRoZSBsaXN0IG9mIGtub3duIGhvc3RzLgorCisgICoqKiogICAgV2VsY29tZSB0byBHZXJyaXQgQ29kZSBSZXZpZXcgICAgKioqKgorCisgIEhpIHVzZXIsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgb3ZlciBTU0guCisKKyAgVW5mb3J0dW5hdGVseSwgaW50ZXJhY3RpdmUgc2hlbGxzIGFyZSBkaXNhYmxlZC4KKyAgVG8gY2xvbmUgYSBob3N0ZWQgR2l0IHJlcG9zaXRvcnksIHVzZToKKworICBnaXQgY2xvbmUgc3NoOi8vdXNlckBsb2NhbGhvc3Q6Mjk0MTgvUkVQT1NJVE9SWV9OQU1FLmdpdAorCisgIHVzZXJAaG9zdDp+JAorLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLW1haWwudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKaW5kZXggYWQwNzA0Zi4uOGRlOGU1OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKQEAgLTQ5LDcgKzQ5LDIxIEBACiAKIFRoZSBgQ29tbWVudC52bWAgdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbCByZWxhdGVkIHRvCiBhIHVzZXIgc3VibWl0dGluZyBjb21tZW50cyBvbiBjaGFuZ2VzLiAgSXQgaXMgYSBgQ2hhbmdlRW1haWxgOiBzZWUKLWBDaGFuZ2VTdWJqZWN0LnZtYCBhbmQgYENoYW5nZUZvb3Rlci52bWAuCitgQ2hhbmdlU3ViamVjdC52bWAsIGBDaGFuZ2VGb290ZXIudm1gIGFuZCBgQ29tbWVudEZvb3Rlci52bWAuCisKK0NvbW1lbnRGb290ZXIudm0KK35+fn5+fn5+fn5+fn5+fn4KKworVGhlIGBDb21tZW50Rm9vdGVyLnZtYCB0ZW1wbGF0ZSB3aWxsIGRldGVybWluZSB0aGUgY29udGVudHMgb2YgdGhlIGZvb3RlcgordGV4dCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gZW1haWxzIHJlbGF0ZWQgdG8gYSB1c2VyIHN1Ym1pdHRpbmcgY29tbWVudHMgb24KK2NoYW5nZXMuICBTZWUgYENoYW5nZVN1YmplY3Qudm1gLCBgQ29tbWVudC52bWAgYW5kIGBDaGFuZ2VGb290ZXIudm1gLgorCitDb21taXRNZXNzYWdlRWRpdGVkLnZtCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBgQ29tbWl0TWVzc2FnZUVkaXRlZC52bWAgdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbAorcmVsYXRlZCB0byBhIHVzZXIgZWRpdGluZyB0aGUgY29tbWl0IG1lc3NhZ2UgdGhyb3VnaCB0aGUgR2Vycml0IFVJLiAgSXQgaXMgYQorYENoYW5nZUVtYWlsYDogc2VlIGBDaGFuZ2VTdWJqZWN0LnZtYCBhbmQgYENoYW5nZUZvb3Rlci52bWAuCiAKIE1lcmdlZC52bQogfn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1yZXZlcnNlcHJveHkudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctcmV2ZXJzZXByb3h5LnR4dAppbmRleCA3MTYxYzRhLi4wODU3NDQyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1yZXZlcnNlcHJveHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLXJldmVyc2Vwcm94eS50eHQKQEAgLTI4LDMzICsyOCwzNCBAQAogQXBhY2hlIDIgQ29uZmlndXJhdGlvbgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UbyBydW4gR2Vycml0IGJlaGluZCBhbiBBcGFjaGUgc2VydmVyIHVzaW5nICdtb2RfcHJveHknLCBlbmFibGUgdGhlCitUbyBydW4gR2Vycml0IGJlaGluZCBhbiBBcGFjaGUgc2VydmVyIHdlIGNhbm5vdCB1c2UgJ21vZF9wcm94eScKK2RpcmVjdGx5LCBhcyBHZXJyaXQgcmVsaWVzIG9uIGdldHRpbmcgdW5tb2RpZmllZCBlc2NhcGVkIGZvcndhcmQKK3NsYXNoZXMuIERlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZiAnQWxsb3dFbmNvZGVkU2xhc2hlcycsCisnbW9kX3Byb3h5JyB3b3VsZCBlaXRoZXIgZGVjb2RlIGVuY29kZWQgc2xhc2hlcywgb3IgZW5jb2RlIHRoZW0gb25jZQorYWdhaW4uIEhlbmNlLCB3ZSByZXNvcnQgdG8gdXNpbmcgJ21vZF9yZXdyaXRlJy4gVG8gZW5hYmxlIHRoZQogbmVjZXNzYXJ5IEFwYWNoZTIgbW9kdWxlczoKIAogLS0tLQotICBhMmVubW9kIHByb3h5X2h0dHAKKyAgYTJlbm1vZCByZXdyaXRlCiAgIGEyZW5tb2Qgc3NsICAgICAgICAgIDsgIyBvcHRpb25hbCwgbmVlZGVkIGZvciBIVFRQUyAvIFNTTAogLS0tLQogCi1Db25maWd1cmUgYW4gQXBhY2hlIFZpcnR1YWxIb3N0IHRvIHByb3h5IHRvIHRoZSBHZXJyaXQgZGFlbW9uLAotc2V0dGluZyB0aGUgJ1Byb3h5UGFzcycgbGluZSB0byB1c2UgdGhlICdodHRwOi8vJyBVUkwgY29uZmlndXJlZAotYWJvdmUuICBFbnN1cmUgdGhlIHBhdGggb2YgUHJveHlQYXNzIGFuZCBodHRwZC5saXN0ZW5VcmwgbWF0Y2gsCi1vciBsaW5rcyB3aWxsIHJlZGlyZWN0IHRvIGluY29ycmVjdCBsb2NhdGlvbnMuCitDb25maWd1cmUgYW4gQXBhY2hlIFZpcnR1YWxIb3N0IHRvIHByb3h5IHRvIHRoZSBHZXJyaXQgZGFlbW9uLCBzZXR0aW5nCit0aGUgJ1Jld3JpdGVSdWxlJyBsaW5lIHRvIHVzZSB0aGUgJ2h0dHA6Ly8nIFVSTCBjb25maWd1cmVkIGFib3ZlLgorRW5zdXJlIHRoZSBwYXRoIG9mICdSZXdyaXRlUnVsZScgKHRoZSBwYXJ0IGJlZm9yZSAnJDEnKSBhbmQKK2h0dHBkLmxpc3RlblVybCBtYXRjaCwgb3IgbGlua3Mgd2lsbCByZWRpcmVjdCB0byBpbmNvcnJlY3QgbG9jYXRpb25zLgorCitOb3RlIHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIGFsbG93cyB0byBwYXNzIGVuY29kZWQgY2hhcmFjdGVycyB0byB0aGUKK3ZpcnR1YWwgaG9zdCwgd2hpY2ggaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLiBCZSBzdXJlIHRvIHJlYWQgdXAgb24KK3RoaXMgdG9waWMgYW5kIHRoYXQgeW91IHVuZGVyc3RhbmQgdGhlIHJpc2tzLgogCiAtLS0tCiAJPFZpcnR1YWxIb3N0ICo+CiAJICBTZXJ2ZXJOYW1lIHJldmlldy5leGFtcGxlLmNvbQogCi0JICBQcm94eVJlcXVlc3RzIE9mZgotCSAgUHJveHlWaWEgT2ZmCi0JICBQcm94eVByZXNlcnZlSG9zdCBPbgotCi0JICA8UHJveHkgKj4KLQkJT3JkZXIgZGVueSxhbGxvdwotCQlBbGxvdyBmcm9tIGFsbAotCSAgPC9Qcm94eT4KLQotCSAgUHJveHlQYXNzIC9yLyBodHRwOi8vMTI3LjAuMC4xOjgwODEvci8KKwkgIEFsbG93RW5jb2RlZFNsYXNoZXMgTm9EZWNvZGUKKwkgIFJld3JpdGVFbmdpbmUgT24KKwkgIFJld3JpdGVSdWxlIF4vci8oLiopIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MS9yLyQxIFtORSxQXQogCTwvVmlydHVhbEhvc3Q+CiAtLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLXZhbGlkYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctdmFsaWRhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1ZDA0YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLXZhbGlkYXRpb24udHh0CkBAIC0wLDAgKzEsMjEgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIENvbW1pdCBWYWxpZGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitHZXJyaXQgc3VwcG9ydHMgbGluazpkZXYtcGx1Z2lucy5odG1sW3BsdWdpbi1iYXNlZF0gdmFsaWRhdGlvbiBvZgordXBsb2FkZWQgY29tbWl0cy4KKworVGhpcyBhbGxvd3MgcGx1Z2lucyB0byBwZXJmb3JtIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBjaGVja3MgYWdhaW5zdAordXBsb2FkZWQgY29tbWl0cywgYW5kIHNlbmQgYmFjayBhIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSB0byB0aGUgZ2l0CitjbGllbnQuCisKK1RvIG1ha2UgdXNlIG9mIHRoaXMgZmVhdHVyZSwgYSBwbHVnaW4gbXVzdCBpbXBsZW1lbnQgdGhlIGBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXJgCitpbnRlcmZhY2UuCisKK091dCBvZiB0aGUgYm94LCBHZXJyaXQgaW5jbHVkZXMgYSBwbHVnaW4gdGhhdCBjaGVja3MgdGhlIGxlbmd0aCBvZiB0aGUKK3N1YmplY3QgYW5kIGJvZHkgbGluZXMgb2YgY29tbWl0IG1lc3NhZ2VzIG9uIHVwbG9hZGVkIGNvbW1pdHMuCisKKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kYXRhYmFzZS1zZXR1cC50eHQgYi9Eb2N1bWVudGF0aW9uL2RhdGFiYXNlLXNldHVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU5YjBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kYXRhYmFzZS1zZXR1cC50eHQKQEAgLTAsMCArMSw2NSBAQAorW1tjcmVhdGVkYl1dCitEYXRhYmFzZSBTZXR1cAorLS0tLS0tLS0tLS0tLS0KKworRHVyaW5nIHRoZSBpbml0IHBoYXNlIG9mIEdlcnJpdCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hpY2ggZGF0YWJhc2UgdG8gdXNlLgorCitbW2NyZWF0ZWRiX2gyXV0KK0gyCit+fgorCitJZiB5b3UgY2hvb3NlIEgyLCBHZXJyaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB1cCB0aGUgZW1iZWRkZWQgSDIgZGF0YWJhc2UgYXMKK2JhY2tlbmQgc28gbm8gc2V0IHVwIG9yIGNvbmZpZ3VyYXRpb24gaXMgbmVjZXNzYXJ5LgorCitVc2luZyB0aGUgZW1iZWRkZWQgSDIgZGF0YWJhc2UgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGdldCBhIEdlcnJpdAorc2l0ZSB1cCBhbmQgcnVubmluZywgbWFraW5nIGl0IGlkZWFsIGZvciBwcm9vZiBvZiBjb25jZXB0cyBvciBzbWFsbCB0ZWFtCitzZXJ2ZXJzLiAgT24gdGhlIGZsaXAgc2lkZSwgSDIgaXMgbm90IHRoZSByZWNvbW1lbmRlZCBvcHRpb24gZm9yIGxhcmdlCitjb3Jwb3JhdGUgaW5zdGFsbGF0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGludGVyYWN0Cit3aXRoIHRoZSBkYXRhYmFzZSB3aGlsZSBHZXJyaXQgaXMgb2ZmbGluZSwgaXQncyBub3QgZWFzeSB0byBiYWNrdXAgdGhlIGRhdGEsCithbmQgaXQncyBub3QgcG9zc2libGUgdG8gc2V0IHVwIEgyIGluIGEgbG9hZCBiYWxhbmNlZC9ob3Rzd2FwIGNvbmZpZ3VyYXRpb24uCisKK0lmIHRoaXMgb3B0aW9uIGludGVyZXN0cyB5b3UsIHlvdSBtaWdodCB3YW50IHRvIGNvbnNpZGVyIGxpbms6aW5zdGFsbC1xdWljay5odG1sW3RoZSBxdWljayBndWlkZV0uCisKK1tbY3JlYXRlZGJfcG9zdGdyZXNdXQorUG9zdGdyZVNRTAorfn5+fn5+fn5+fgorCitUaGlzIG9wdGlvbiBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIEgyIG9wdGlvbiBidXQgaXMgcmVjb21tZW5kZWQKK2ZvciBsYXJnZXIgaW5zdGFsbGF0aW9ucy4gSXQncyB0aGUgZGF0YWJhc2UgYmFja2VuZCB3aXRoIHRoZSBsYXJnZXN0IHVzZXJiYXNlCitpbiB0aGUgR2Vycml0IGNvbW11bml0eS4KKworQ3JlYXRlIGEgdXNlciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aXRoaW4gUG9zdGdyZXMsIGFzc2lnbiBpdCBhCitwYXNzd29yZCwgY3JlYXRlIGEgZGF0YWJhc2UgdG8gc3RvcmUgdGhlIG1ldGFkYXRhLCBhbmQgZ3JhbnQgdGhlIHVzZXIKK2Z1bGwgcmlnaHRzIG9uIHRoZSBuZXdseSBjcmVhdGVkIGRhdGFiYXNlOgorCistLS0tCisgICQgY3JlYXRldXNlciAtLXVzZXJuYW1lPXBvc3RncmVzIC1SRElFbFBTIGdlcnJpdDIKKyAgJCBjcmVhdGVkYiAtLXVzZXJuYW1lPXBvc3RncmVzIC1FIFVURi04IC1PIGdlcnJpdDIgcmV2aWV3ZGIKKy0tLS0KKworVmlzaXQgUG9zdGdyZVNRTCdzIGxpbms6aHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzkuMS9pbnRlcmFjdGl2ZS9pbmRleC5odG1sW2RvY3VtZW50YXRpb25dIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZwordXNpbmcgUG9zdGdyZVNRTC4KKworW1tjcmVhdGVkYl9teXNxbF1dCitNeVNRTAorfn5+fn4KKworVGhpcyBvcHRpb24gaXMgYWxzbyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIEgyIG9wdGlvbi4gSnVzdCBhcyB3aXRoCitQb3N0Z3JlU1FMIGl0J3MgYWxzbyByZWNvbW1lbmRlZCBmb3IgbGFyZ2VyIGluc3RhbGxhdGlvbnMuCisKK0NyZWF0ZSBhIHVzZXIgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gd2l0aGluIHRoZSBkYXRhYmFzZSwgYXNzaWduIGl0IGEKK3Bhc3N3b3JkLCBjcmVhdGUgYSBkYXRhYmFzZSwgYW5kIGdpdmUgdGhlIG5ld2x5IGNyZWF0ZWQgdXNlciBmdWxsCityaWdodHMgb24gaXQ6CisKKy0tLS0KKyAgbXlzcWwKKworICBDUkVBVEUgVVNFUiAnZ2Vycml0MidAJ2xvY2FsaG9zdCcgSURFTlRJRklFRCBCWSAnc2VjcmV0JzsKKyAgQ1JFQVRFIERBVEFCQVNFIHJldmlld2RiOworICBBTFRFUiBEQVRBQkFTRSByZXZpZXdkYiBjaGFyc2V0PWxhdGluMTsKKyAgR1JBTlQgQUxMIE9OIHJldmlld2RiLiogVE8gJ2dlcnJpdDInQCdsb2NhbGhvc3QnOworICBGTFVTSCBQUklWSUxFR0VTOworLS0tLQorCitWaXNpdCBNeVNRTCdzIGxpbms6aHR0cDovL2Rldi5teXNxbC5jb20vZG9jL1tkb2N1bWVudGF0aW9uXSBmb3IgZnVydGhlcgoraW5mb3JtYXRpb24gcmVnYXJkaW5nIHVzaW5nIE15U1FMLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtY29udHJpYnV0aW5nLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LWNvbnRyaWJ1dGluZy50eHQKaW5kZXggMDY1ZTlkMS4uODRjYjFlMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXYtY29udHJpYnV0aW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1jb250cmlidXRpbmcudHh0CkBAIC0zMSw3ICszMSw3IEBACiB0aGUgYXBwcm92ZXJzLiAgRXZlbiBpZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIEdlcnJpdCdzCiBpbnRlcm5hbHMsIGl0IHdvdWxkIGJlIG9mIGdyZWF0IGhlbHAgaWYgeW91IGNhbiBkb3dubG9hZCwgdHJ5CiBvdXQsIGFuZCBjb21tZW50IG9uIG5ldyBmZWF0dXJlcy4gIElmIGl0IHdvcmtzIGFzIGFkdmVydGlzZWQsCi1zYXkgc28sIGFuZCBpZiB5b3UgaGF2ZSB0aGUgcHJpdmlsaWdlcyB0byBkbyBzbywgZ28gYWhlYWQKK3NheSBzbywgYW5kIGlmIHlvdSBoYXZlIHRoZSBwcml2aWxlZ2VzIHRvIGRvIHNvLCBnbyBhaGVhZAogYW5kIGdpdmUgaXQgYSArMSBWZXJpZmllZC4gIElmIHlvdSB3b3VsZCBmaW5kIHRoZSBmZWF0dXJlCiB1c2VmdWwsIHNheSBzbyBhbmQgZ2l2ZSBpdCBhICsxIGNvZGUgcmV2aWV3LgogCkBAIC01Nyw2ICs1Nyw3IEBACiBzcGFucywgd2UgcmVhbGx5IGRvIHdhbnQgeW91ciBjb2RlLgogCiAKK1tbY29tbWl0LW1lc3NhZ2VdXQogQ29tbWl0IE1lc3NhZ2UKIC0tLS0tLS0tLS0tLS0tCiAKQEAgLTY4LDYgKzY5LDcgQEAKICAgKiBGb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUKICAgKiBGb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBleHBsYW5hdG9yeSBwYXJhZ3JhcGhzCiAgICogVXNlIHRoZSBwcmVzZW50IHRlbnNlIChmaXggaW5zdGVhZCBvZiBmaXhlZCkKKyAgKiBVc2UgdGhlIHBhc3QgdGVuc2Ugd2hlbiBkZXNjcmliaW5nIHRoZSBzdGF0dXMgYmVmb3JlIHRoaXMgY29tbWl0CiAgICogSW5jbHVkZSBhIEJ1ZzogSXNzdWUgPCM+IGxpbmUgaWYgZml4aW5nIGEgR2Vycml0IGlzc3VlCiAgICogSW5jbHVkZSBhIENoYW5nZS1JZCBsaW5lCiAKQEAgLTkxLDYgKzkzLDI1IEBACiAgIENoYW5nZS1JZDogSWM0YTdjMDdlZWI5OGNkZWFmNDRlOWQyMzFhNjVhNTFmM2ZjZWFlNTIKID09PT0KIAorVGhlIENoYW5nZS1JZCBpcywgYXMgdXN1YWwsIGNyZWF0ZWQgYnkgYSBsb2NhbCBnaXQgaG9vay4gIFRvIGluc3RhbGwgaXQsIHNpbXBseQorY29weSBvbmUgZnJvbSB0aGUgY2hlY2tvdXQgYW5kIG1ha2UgaXQgZXhlY3V0YWJsZToKKworPT09PQorICBjcCAuL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci90b29scy9yb290L2hvb2tzL2NvbW1pdC1tc2cgLmdpdC9ob29rcy8KKyAgY2htb2QgK3ggLmdpdC9ob29rcy9jb21taXQtbXNnCis9PT09CisKK1RvIHNldCB1cCBnaXQncyByZW1vdGUgZm9yIGVhc3kgcHVzaGluZywgcnVuIHRoZSBmb2xsb3dpbmc6CisKKz09PT0KKyAgZ2l0IHJlbW90ZSBhZGQgZ2Vycml0IGh0dHBzOi8vZ2Vycml0Lmdvb2dsZXNvdXJjZS5jb20vZ2Vycml0Cis9PT09CisKK1RoZSBIVFRQUyBhY2Nlc3MgcmVxdWlyZXMgcHJvcGVyIHVzZXJuYW1lIGFuZCBwYXNzd29yZDsgdGhpcyBjYW4gYmUgb2J0YWluZWQKK2J5IGNsaWNraW5nIHRoZSAiT2J0YWluIFBhc3N3b3JkIiBsaW5rIG9uIHRoZQorbGluazpodHRwczovL2dlcnJpdC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS8jL3NldHRpbmdzL2h0dHAtcGFzc3dvcmRbSFRUUAorUGFzc3dvcmQgdGFiIG9mIHRoZSB1c2VyIHNldHRpbmdzIHBhZ2VdLgorCiAKIFN0eWxlCiAtLS0tLQpAQCAtMTQwLDcgKzE2MSw3IEBACiAgICogRGVmaW5lIG5vbiBzdGF0aWMgaW50ZXJmYWNlcyBhZnRlciBzdGF0aWMgaW50ZXJmYWNlcyBpbiB5b3VyCiAgICAgY2xhc3MuCiAgICogTmV4dCB5b3Ugc2hvdWxkIGRlZmluZSBzdGF0aWMgdHlwZXMgYW5kIG1lbWJlcnMuCi0gICogRmluYWxseSBpbnN0YW5jZSBtZW1iZXJzLCB0aGVuIGNvbnN0dWN0b3JzLCBhbmQgdGhlbiBpbnN0YW5jZQorICAqIEZpbmFsbHkgaW5zdGFuY2UgbWVtYmVycywgdGhlbiBjb25zdHJ1Y3RvcnMsIGFuZCB0aGVuIGluc3RhbmNlCiAgICAgbWV0aG9kcy4KICAgKiBTb21lIGNvbW1vbiBleGNlcHRpb25zIGFyZSBwcml2YXRlIGhlbHBlciBzdGF0aWMgbWV0aG9kcyB3aGljaAogICAgIG1pZ2h0IGFwcGVhciBuZWFyIHRoZSBpbnN0YW5jZSBtZXRob2RzIHdoaWNoIHRoZXkgaGVscC4KQEAgLTIzOCw2ICsyNTksMTggQEAKICAgICBhbmQgaXQgYWxzbyBtYWtlcyAiZ2l0IHJldmVydCIgbW9yZSB1c2VmdWwuCiAgICogVXNlIHRvcGljIGJyYW5jaGVzIHRvIGxpbmsgeW91ciBzZXBhcmF0ZSBjaGFuZ2VzIHRvZ2V0aGVyLgogCitbW3Byb2Nlc3NdXQorUHJvY2VzcworLS0tLS0tLQorCitCYWNrcG9ydGluZyB0byBzdGFibGUgYnJhbmNoZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitGcm9tIHRpbWUgdG8gdGltZSBidWcgZml4IHJlbGVhc2VzIGFyZSBtYWRlIGZvciBleGlzdGluZyBzdGFibGUgYnJhbmNoZXMuCisKK0RldmVsb3BlcnMgY29uY2VybmVkIHdpdGggc3RhYmxlIGJyYW5jaGVzIGFyZSBlbmNvdXJhZ2VkIHRvIGJhY2twb3J0IG9yIHB1c2gKK3BhdGNoc2V0cyB0byB0aGVzZSBicmFuY2hlcywgZXZlbiBpZiBubyBuZXcgcmVsZWFzZSBpcyBwbGFubmVkLgorCiAKIEdFUlJJVAogLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXYtZGVzaWduLnR4dAppbmRleCBjZTI4NjhjLi4yZTQzYjk2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi1kZXNpZ24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LWRlc2lnbi50eHQKQEAgLTgsNyArOCw3IEBACiByZXZpZXdzIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2l0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0uCiAKIEdlcnJpdCBtYWtlcyByZXZpZXdzIGVhc2llciBieSBzaG93aW5nIGNoYW5nZXMgaW4gYSBzaWRlLWJ5LXNpZGUKLWRpc3BsYXksIGFuZCBhbGxvd2luZyBpbmxpbmUgY29tbWVudHMgdG8gYmUgYWRkZWQgYnkgYW55IHJldmlld2VyLgorZGlzcGxheSwgYW5kIGFsbG93aW5nIGlubGluZS9maWxlIGNvbW1lbnRzIHRvIGJlIGFkZGVkIGJ5IGFueSByZXZpZXdlci4KIAogR2Vycml0IHNpbXBsaWZpZXMgR2l0IGJhc2VkIHByb2plY3QgbWFpbnRhaW5lcnNoaXAgYnkgcGVybWl0dGluZwogYW55IGF1dGhvcml6ZWQgdXNlciB0byBzdWJtaXQgY2hhbmdlcyB0byB0aGUgbWFzdGVyIEdpdCByZXBvc2l0b3J5LApAQCAtOTksMTEgKzk5LDExIEBACiBwZXJtaXNzaW9ucyBpbiB0aGUgcHJvamVjdC4KIAogUmV2aWV3ZXJzIHVzZSB0aGUgd2ViIGludGVyZmFjZSB0byByZWFkIHRoZSBzaWRlLWJ5LXNpZGUgb3IgdW5pZmllZAotZGlmZiBvZiBhIGNoYW5nZSwgYW5kIGluc2VydCBkcmFmdCBpbmxpbmUgY29tbWVudHMgd2hlcmUgYXBwcm9wcmlhdGUuCi1BIGRyYWZ0IGNvbW1lbnQgaXMgdmlzaWJsZSBvbmx5IHRvIHRoZSByZXZpZXdlciwgdW50aWwgdGhleSBwdWJsaXNoCi10aG9zZSBjb21tZW50cy4gIFB1Ymxpc2hlZCBjb21tZW50cyBhcmUgYXV0b21hdGljYWxseSBlbWFpbGVkIHRvCi10aGUgY2hhbmdlIGF1dGhvciBieSBHZXJyaXQsIGFuZCBhcmUgQ0MnZCB0byBhbGwgb3RoZXIgcmV2aWV3ZXJzCi13aG8gaGF2ZSBhbHJlYWR5IGNvbW1lbnRlZCBvbiB0aGUgY2hhbmdlLgorZGlmZiBvZiBhIGNoYW5nZSwgYW5kIGluc2VydCBkcmFmdCBpbmxpbmUvZmlsZSBjb21tZW50cyB3aGVyZQorYXBwcm9wcmlhdGUuIEEgZHJhZnQgY29tbWVudCBpcyB2aXNpYmxlIG9ubHkgdG8gdGhlIHJldmlld2VyLCB1bnRpbAordGhleSBwdWJsaXNoIHRob3NlIGNvbW1lbnRzLiAgUHVibGlzaGVkIGNvbW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5CitlbWFpbGVkIHRvIHRoZSBjaGFuZ2UgYXV0aG9yIGJ5IEdlcnJpdCwgYW5kIGFyZSBDQydkIHRvIGFsbCBvdGhlcgorcmV2aWV3ZXJzIHdobyBoYXZlIGFscmVhZHkgY29tbWVudGVkIG9uIHRoZSBjaGFuZ2UuCiAKIFdoZW4gcHVibGlzaGluZyBjb21tZW50cyByZXZpZXdlcnMgYXJlIGFsc28gZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5CiB0byBzY29yZSB0aGUgY2hhbmdlLCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhleSBmZWVsIHRoZSBjaGFuZ2UgaXMKQEAgLTU1Myw4ICs1NTMsOCBAQAogCiBHZXJyaXQncyB3ZWIgVUkgd291bGQgcmVxdWlyZSBvbiBhdmVyYWdlIGA0K0YrRipDYCBIVFRQIHJlcXVlc3RzIHRvCiByZXZpZXcgYSBjaGFuZ2UgYW5kIHBvc3QgY29tbWVudHMuICBIZXJlIGBGYCBpcyB0aGUgbnVtYmVyIG9mIGZpbGVzCi1tb2RpZmllZCBieSB0aGUgY2hhbmdlLCBhbmQgYENgIGlzIHRoZSBudW1iZXIgb2YgaW5saW5lIGNvbW1lbnRzIGxlZnQKLWJ5IHRoZSByZXZpZXdlciBwZXIgZmlsZS4gIFRoZSBjb25zdGFudCA0IGFjY291bnRzIGZvciB0aGUgcmVxdWVzdAorbW9kaWZpZWQgYnkgdGhlIGNoYW5nZSwgYW5kIGBDYCBpcyB0aGUgbnVtYmVyIG9mIGlubGluZS9maWxlIGNvbW1lbnRzCitsZWZ0IGJ5IHRoZSByZXZpZXdlciBwZXIgZmlsZS4gIFRoZSBjb25zdGFudCA0IGFjY291bnRzIGZvciB0aGUgcmVxdWVzdAogdG8gbG9hZCB0aGUgcmV2aWV3ZXIncyBkYXNoYm9hcmQsIHRvIGxvYWQgdGhlIGNoYW5nZSBkZXRhaWwgcGFnZSwKIHRvIHB1Ymxpc2ggdGhlIHJldmlldyBjb21tZW50cywgYW5kIHRvIHJlbG9hZCB0aGUgY2hhbmdlIGRldGFpbAogcGFnZSBhZnRlciBjb21tZW50cyBhcmUgcHVibGlzaGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtZWNsaXBzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1lY2xpcHNlLnR4dAppbmRleCBiMmJmMDExLi42NGU1OTM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi1lY2xpcHNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1lY2xpcHNlLnR4dApAQCAtOCwxMiArOCwxNyBAQAogcnVudGltZSBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQuCiAKIAorW1ttYXZlbl1dCiBNYXZlbiBQbHVnaW4KIC0tLS0tLS0tLS0tLQogCi1JbnN0YWxsIHRoZSBNYXZlbiBJbnRlZ3JhdGlvbiBwbHVnaW5zOgorSW5zdGFsbCB0aGUgTWF2ZW4gSW50ZWdyYXRpb24gcGx1Z2lucy4KIAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9tMmUvZG93bmxvYWQvW20yZWNsaXBzZV0KK0luIEVjbGlwc2UgdmVyc2lvbiAzLjcgKEluZGlnbykgYW5kIGxhdGVyLCB0aGVzZSBhcmUgYXZhaWxhYmxlIGluIHRoZQorZGVmYXVsdCB1cGRhdGUgc2l0ZSBhbmQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSAnQ29sbGFib3JhdGlvbicgY2F0ZWdvcnkuCisKK0ZvciBvbGRlciB2ZXJzaW9ucyB0aGUgdXBkYXRlIHNpdGUgbXVzdCBiZSBtYW51YWxseSBhZGRlZDsgdGhlIGxpbmsgY2FuCitiZSBmb3VuZCBvbiB0aGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9tMmUvZG93bmxvYWQvW20yZWNsaXBzZSBkb3dubG9hZCBwYWdlXS4KIAogCiBbW0Zvcm1hdHRpbmddXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtcGx1Z2lucy50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1wbHVnaW5zLnR4dAppbmRleCBkZDBjNDRjLi4xMjgzOGZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi1wbHVnaW5zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1wbHVnaW5zLnR4dApAQCAtMTc2LDYgKzE3Niw2OSBAQAogVG8gcmVsb2FkL3Jlc3RhcnQgYSBwbHVnaW4gdGhlIGxpbms6Y21kLXBsdWdpbi1yZWxvYWQuaHRtbFtwbHVnaW4gcmVsb2FkXQogY29tbWFuZCBjYW4gYmUgdXNlZC4KIAorW1tpbml0X3N0ZXBdXQorSW5pdCBzdGVwCit+fn5+fn5+fn4KKworUGx1Z2lucyBjYW4gY29udHJpYnV0ZSB0aGVpciBvd24gImluaXQgc3RlcCIgZHVyaW5nIHRoZSBHZXJyaXQgaW5pdAord2l6YXJkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZ3VpZGluZyB0aGUgR2Vycml0IGFkbWluaXN0cmF0b3IgdGhyb3VnaAordGhlIHNldHRpbmdzIG5lZWRlZCBieSB0aGUgcGx1Z2luIHRvIHdvcmsgcHJvcGVydGx5LgorCitGb3IgaW5zdGFuY2UgcGx1Z2lucyB0byBpbnRlZ3JhdGUgSmlyYSBpc3N1ZXMgdG8gR2Vycml0IGNoYW5nZXMgbWF5Citjb250cmlidXRlIHRoZWlyIG93biAiaW5pdCBzdGVwIiB0byBhbGxvdyBjb25maWd1cmluZyB0aGUgSmlyYSBVUkwsCitjcmVkZW50aWFscyBhbmQgcG9zc2libHkgdmVyaWZ5IGNvbm5lY3Rpdml0eSB0byB2YWxpZGF0ZSB0aGVtLgorCis9PT09CisgIEdlcnJpdC1Jbml0U3RlcDogdGxkLmV4YW1wbGUucHJvamVjdC5NeUluaXRTdGVwCis9PT09CisKK015SW5pdFN0ZXAgbmVlZHMgdG8gZm9sbG93IHRoZSBzdGFuZGFyZCBHZXJyaXQgSW5pdFN0ZXAgc3ludGF4CithbmQgYmVoYXZpb3VyOiB3cml0aW5nIHRvIHRoZSBjb25zb2xlIHVzaW5nIHRoZSBpbmplY3RlZCBDb25zb2xlVUkKK2FuZCBhY2Nlc3NpbmcgLyBjaGFuZ2luZyBjb25maWd1cmF0aW9uIHNldHRpbmdzIHVzaW5nIFNlY3Rpb24uRmFjdG9yeS4KKworSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIEdlcnJpdCBpbml0IGluamVjdGlvbnMsIHBsdWdpbnMgcmVjZWl2ZQordGhlIEBQbHVnaW5OYW1lIFN0cmluZyBpbmplY3Rpb24gY29udGFpbmluZyB0aGVpciBvd24gcGx1Z2luIG5hbWUuCisKK0JlYXIgaW4gbWluZCB0aGF0IHRoZSBQbHVnaW4ncyBJbml0U3RlcCBjbGFzcyB3aWxsIGJlIGxvYWRlZCBidXQKK3RoZSBzdGFuZGFyZCBHZXJyaXQgcnVudGltZSBlbnZpcm9ubWVudCBpcyBub3QgYXZhaWxhYmxlIGFuZCB0aGUgcGx1Z2luJ3MKK293biBHdWljZSBtb2R1bGVzIHdlcmUgbm90IGluaXRpYWxpemVkLgorVGhpcyBtZWFucyB0aGUgSW5pdFN0ZXAgZm9yIGEgcGx1Z2luIGlzIG5vdCBleGVjdXRlZCBpbiB0aGUgc2FtZSB3YXkgdGhhdAordGhlIHBsdWdpbiBleGVjdXRlcyB3aXRoaW4gdGhlIHNlcnZlciwgYW5kIG1heSBtZWFuIGEgcGx1Z2luIGF1dGhvciBjYW5ub3QKK3RyaXZpYWxseSByZXVzZSBydW50aW1lIGNvZGUgZHVyaW5nIGluaXQuCisKK0ZvciBpbnN0YW5jZSBhIHBsdWdpbiB0aGF0IHdhbnRzIHRvIHZlcmlmeSBjb25uZWN0aXZpdHkgbWF5IG5lZWQgdG8gc3RhdGljYWxseQorY2FsbCB0aGUgY29uc3RydWN0b3Igb2YgdGhlaXIgY29ubmVjdGlvbiBjbGFzcywgcGFzc2luZyBpbiB2YWx1ZXMgb2J0YWluZWQKK2Zyb20gdGhlIFNlY3Rpb24uRmFjdG9yeSByYXRoZXIgdGhhbiBmcm9tIGFuIGluamVjdGVkIENvbmZpZyBvYmplY3QuCisKK1BsdWdpbnMgSW5pdFN0ZXAgYXJlIGV4ZWN1dGluZyBkdXJpbmcgdGhlICJHZXJyaXQgUGx1Z2luIGluaXQiIHBoYXNlLCBhZnRlcgordGhlIGV4dHJhY3Rpb24gb2YgdGhlIHBsdWdpbnMgZW1iZWRkZWQgaW4gR2Vycml0LndhciBpbnRvICRHRVJSSVRfU0lURS9wbHVnaW5zCithbmQgYmVmb3JlIHRoZSBEQiBTY2hlbWEgaW5pdGlhbGl6YXRpb24gb3IgdXBncmFkZS4KK1BsdWdpbnMgSW5pdFN0ZXAgY2Fubm90IHJlZmVyIHRvIEdlcnJpdCBEQiBTY2hlbWEgb3IgYW55IG90aGVyIEdlcnJpdCBydW50aW1lCitvYmplY3RzIGluamVjdGVkIGF0IHN0YXJ0dXAuCisKKz09PT0KK3B1YmxpYyBjbGFzcyBNeUluaXRTdGVwIGltcGxlbWVudHMgSW5pdFN0ZXAgeworICBwcml2YXRlIGZpbmFsIENvbnNvbGVVSSB1aTsKKyAgcHJpdmF0ZSBmaW5hbCBTZWN0aW9uLkZhY3Rvcnkgc2VjdGlvbnM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBsdWdpbk5hbWU7CisKKyAgQEluamVjdAorICBwdWJsaWMgR2l0QmxpdEluaXRTdGVwKGZpbmFsIENvbnNvbGVVSSB1aSwgU2VjdGlvbi5GYWN0b3J5IHNlY3Rpb25zLCBAUGx1Z2luTmFtZSBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIHRoaXMudWkgPSB1aTsKKyAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnM7CisgICAgdGhpcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB1aS5oZWFkZXIoIlxuTXkgcGx1Z2luIik7CisKKyAgICBTZWN0aW9uIG15U2VjdGlvbiA9IGdldFNlY3Rpb24oIm15cGx1Z2luIiwgbnVsbCk7CisgICAgbXlTZWN0aW9uLnN0cmluZygiTGluayBuYW1lIiwgImxpbmtuYW1lIiwgIk15TGluayIpOworICB9Cit9Cis9PT09CisKIFtbY2xhc3NwYXRoXV0KIENsYXNzcGF0aAogLS0tLS0tLS0tCkBAIC0zMjIsMTAgKzM4NSwxMyBAQAogYXV0b21hdGljYWxseSBleHBvcnQgdGhlc2UgcmVzb3VyY2VzIG92ZXIgSFRUUCBmcm9tIHRoZSBwbHVnaW4gSkFSLgogCiBTdGF0aWMgcmVzb3VyY2VzIHVuZGVyIGBzdGF0aWMvYCBkaXJlY3RvcnkgaW4gdGhlIEpBUiB3aWxsIGJlCi1hdmFpbGFibGUgYXMgYC9wbHVnaW5zL2hlbGxvd29ybGQvc3RhdGljL3Jlc291cmNlYC4KK2F2YWlsYWJsZSBhcyBgL3BsdWdpbnMvaGVsbG93b3JsZC9zdGF0aWMvcmVzb3VyY2VgLiBUaGlzIHByZWZpeCBpcworY29uZmlndXJhYmxlIGJ5IHNldHRpbmcgdGhlIGBHZXJyaXQtSHR0cFN0YXRpY1ByZWZpeGAgYXR0cmlidXRlLgogCiBEb2N1bWVudGF0aW9uIGZpbGVzIHVuZGVyIGBEb2N1bWVudGF0aW9uL2AgZGlyZWN0b3J5IGluIHRoZSBKQVIKLXdpbGwgYmUgYXZhaWxhYmxlIGFzIGAvcGx1Z2lucy9oZWxsb3dvcmxkL0RvY3VtZW50YXRpb24vcmVzb3VyY2VgLgord2lsbCBiZSBhdmFpbGFibGUgYXMgYC9wbHVnaW5zL2hlbGxvd29ybGQvRG9jdW1lbnRhdGlvbi9yZXNvdXJjZWAuIFRoaXMKK3ByZWZpeCBpcyBjb25maWd1cmFibGUgYnkgc2V0dGluZyB0aGUgYEdlcnJpdC1IdHRwRG9jdW1lbnRhdGlvblByZWZpeGAKK2F0dHJpYnV0ZS4KIAogRG9jdW1lbnRhdGlvbiBtYXkgYmUgd3JpdHRlbiBpbgogbGluazpodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL1tNYXJrZG93bl0gc3R5bGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXJlYWRtZS50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWFkbWUudHh0CmluZGV4IDU1MmI1YTguLjY3YjRhYWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LXJlYWRtZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtcmVhZG1lLnR4dApAQCAtMTEsMTAgKzExLDEzIEBACiBDcmVhdGUgYSBuZXcgY2xpZW50IHdvcmtzcGFjZToKIAogLS0tLQotICBnaXQgY2xvbmUgaHR0cHM6Ly9nZXJyaXQuZ29vZ2xlc291cmNlLmNvbS9nZXJyaXQKKyAgZ2l0IGNsb25lIC0tcmVjdXJzaXZlIGh0dHBzOi8vZ2Vycml0Lmdvb2dsZXNvdXJjZS5jb20vZ2Vycml0CiAgIGNkIGdlcnJpdAogLS0tLQogCitUaGUgYC0tcmVjdXJzaXZlYCBvcHRpb24gaXMgbmVlZGVkIG9uIGBnaXQgY2xvbmVgIHRvIGVuc3VyZSB0aGF0Cit0aGUgY29yZSBwbHVnaW5zLCB3aGljaCBhcmUgaW5jbHVkZWQgYXMgZ2l0IHN1Ym1vZHVsZXMsIGFyZSBhbHNvCitjbG9uZWQuCiAKIENvbmZpZ3VyaW5nIEVjbGlwc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMxLDcgKzM0LDIxIEBACiBGcm9tIHRoZSBjb21tYW5kIGxpbmU6CiAKIC0tLS0KLSAgbXZuIHBhY2thZ2UKKyAgbXZuIGNsZWFuIHBhY2thZ2UKKy0tLS0KKworQnkgZGVmYXVsdCB0aGUgYnVpbGQgd2lsbCBydW4gdGVzdHMgYW5kIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uLgorCitUbyBidWlsZCB3aXRob3V0IHRlc3RzOgorCistLS0tCisgIG12biBjbGVhbiBwYWNrYWdlIC1Ec2tpcFRlc3RzCistLS0tCisKK1RvIGJ1aWxkIHdpdGhvdXQgZG9jdW1lbnRhdGlvbjoKKworLS0tLQorICBtdm4gY2xlYW4gcGFja2FnZSAtRGdlcnJpdC5kb2N1bWVudGF0aW9uLnNraXAKIC0tLS0KIAogT3V0cHV0IGV4ZWN1dGFibGUgV0FSIHdpbGwgYmUgcGxhY2VkIGluOgpAQCAtODAsNiArOTcsMjcgQEAKIFRlc3RpbmcKIC0tLS0tLS0KIAorW1tydW4tYWNjZXB0YW5jZS10ZXN0c11dCitSdW5uaW5nIHRoZSBBY2NlcHRhbmNlIFRlc3RzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0dlcnJpdCBoYXMgYSBzZXQgb2YgaW50ZWdyYXRpb24gdGVzdHMgdGhhdCB0ZXN0IHRoZSBHZXJyaXQgZGFlbW9uIHZpYQorUkVTVCwgU1NIIGFuZCB0aGUgZ2l0IHByb3RvY29sLgorCitBIG5ldyByZXZpZXcgc2l0ZSBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QgYW5kIHRoZSBHZXJyaXQgZGFlbW9uIGlzCitzdGFydGVkIG9uIHRoYXQgc2l0ZS4gV2hlbiB0aGUgdGVzdCBoYXMgZmluaXNoZWQgdGhlIEdlcnJpdCBkYWVtb24gaXMKK3NodXRkb3duLgorCitTaW5jZSB0aGUgYWNjZXB0YW5jZSB0ZXN0cyBhcmUgdG9vIGV4cGVuc2l2ZSB0byBydW4gZXZlcnkgdGltZQorR2Vycml0IGlzIGJ1aWx0LCB0aGV5IGFyZSBvbmx5IGV4ZWN1dGVkIGR1cmluZyB0aGUgTWF2ZW4gdmVyaWZ5IHBoYXNlCitpZiB0aGUgTWF2ZW4gcHJvZmlsZSBgYWNjZXB0YW5jZWAgaXMgZW5hYmxlZC4KKworVG8gZXhlY3V0ZSB0aGUgYWNjZXB0YW5jZSB0ZXN0cyBydW46CisKKy0tLS0KKyAgbXZuIGNsZWFuIHZlcmlmeSAtUGFjY2VwdGFuY2UKKy0tLS0KKwogUnVubmluZyB0aGUgRGFlbW9uCiB+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtMTA5LDEzICsxNDcsMjEgQEAKIC0tLS0KIAogCitbW2RlYnVnLWphdmFzY3JpcHRdXQogRGVidWdnaW5nIEphdmFTY3JpcHQKIH5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLVdoZW4gZGVidWdnaW5nIGJyb3dzZXIgc3BlY2lmaWMgaXNzdWVzIHVzZSBgLURnd3Quc3R5bGU9REVUQUlMRURgCi1zbyB0aGUgcmVzdWx0aW5nIEphdmFTY3JpcHQgbW9yZSBjbG9zZWx5IG1hdGNoZXMgdGhlIEphdmEgc291cmNlcy4KLVRoaXMgY2FuIGJlIHVzZWQgdG8gaGVscCBuYXJyb3cgZG93biB3aGF0IGNvZGUgbGluZSAzMCw0MDAgaW4gdGhlCi1KYXZhU2NyaXB0IGhhcHBlbnMgdG8gYmUuCitXaGVuIGRlYnVnZ2luZyBicm93c2VyIHNwZWNpZmljIGlzc3VlcyBhZGQgYD9kYmc9MWAgdG8gdGhlIFVSTCBzbyB0aGUKK3Jlc3VsdGluZyBKYXZhU2NyaXB0IG1vcmUgY2xvc2VseSBtYXRjaGVzIHRoZSBKYXZhIHNvdXJjZXMuICBUaGUgZGVidWcKK3BhZ2VzIHVzZSB0aGUgR1dUIHByZXR0eSBmb3JtYXQsIHdoZXJlIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcworbWF0Y2ggdGhlIEphdmEgc291cmNlcy4KKworLS0tLQorICBodHRwOi8vbG9jYWxob3N0OjgwODAvP2RiZz0xCistLS0tCisKK1RvIHVzZSB0aGUgR1dUIERFVEFJTEVEIHN0eWxlIHRoZSBwYWNrYWdlIG11c3QgYmUgcmVjb21waWxlZCBhbmQKK2A/ZGJnPTFgIG11c3QgYmUgb21pdHRlZCBmcm9tIHRoZSBVUkw6CiAKIC0tLS0KICAgbXZuIHBhY2thZ2UgLURnd3Quc3R5bGU9REVUQUlMRUQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UtZGVwbG95LWNvbmZpZy50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLWRlcGxveS1jb25maWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNTJkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLWRlcGxveS1jb25maWcudHh0CkBAIC0wLDAgKzEsMTM1IEBACitEZXBsb3kgR2Vycml0IEFydGlmYWN0cworPT09PT09PT09PT09PT09PT09PT09PT0KKworR2Vycml0IEFydGlmYWN0cyBhcmUgc3RvcmVkIG9uCitsaW5rOmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3N0b3JhZ2UvW0dvb2dsZSBDbG91ZCBTdG9yYWdlXS4KK1ZpYSB0aGUgbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2NvbnNvbGUvW0FQSSBDb25zb2xlXSB0aGUKK0dlcnJpdCBtYWludGFpbmVycyBoYXZlIGFjY2VzcyB0byB0aGUgYEdlcnJpdCBDb2RlIFJldmlld2AgcHJvamVjdC4KK1RoaXMgcHJvamVjdHMgaG9zdCBzZXZlcmFsIGJ1Y2tldHMgZm9yIHN0b3JpbmcgR2Vycml0IGFydGlmYWN0czoKKworKiBgZ2Vycml0LWFwaWA6CisrCitCdWNrZXQgdG8gc3RvcmUgdGhlIEdlcnJpdCBFeHRlbnNpb24gQVBJIEphciBhbmQgdGhlIEdlcnJpdCBQbHVnaW4gQVBJCitKYXIuCisKKyogYGdlcnJpdC1tYXZlbmA6CisrCitCdWNrZXQgdG8gc3RvcmUgR2Vycml0IFN1YnByb2plY3QgQXJ0aWZhY3RzIChlLmcuIGBnd3RleHB1aWAsCitgZ3d0anNvbnJwY2AgZXRjLikuCisKKyogYGdlcnJpdC1wbHVnaW5zYDoKKysKK0J1Y2tldCB0byBzdG9yZSBHZXJyaXQgQ29yZSBQbHVnaW4gQXJ0aWZhY3RzLgorCitbW2RlcGxveS1jb25maWd1cmF0aW9uLXNldHRpbmdzLXhtbF1dCitEZXBsb3kgQ29uZmlndXJhdGlvbiBpbiBNYXZlbiBgc2V0dGluZ3MueG1sYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG8gdXBsb2FkIGFydGlmYWN0cyB0byBhIGJ1Y2tldCB0aGUgdXNlciBtdXN0IGF1dGhlbnRpY2F0ZSB3aXRoIGEKK3VzZXJuYW1lIGFuZCBwYXNzd29yZC4gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkIHRvIGJlIHJldHJpZXZlZAorZnJvbSB0aGUgbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL2NvbnNvbGUvW0FQSSBDb25zb2xlXToKKworKiBHbyB0byB0aGUgYEdlcnJpdCBDb2RlIFJldmlld2AgcHJvamVjdAorKiBJbiB0aGUgbWVudSBvbiB0aGUgbGVmdCBzZWxlY3QgYEdvb2dsZSBDbG91ZCBTdG9yYWdlYCA+CitgSW50ZXJvcGVyYWJsZSBBY2Nlc3NgCisqIFVzZSB0aGUgYEFjY2VzcyBLZXlgIGFzIHVzZXJuYW1lCisqIENsaWNrIHVuZGVyIGBTZWNyZXRgIG9uIHRoZSBgU2hvd2AgYnV0dG9uIHRvIGZpbmQgdGhlIHBhc3N3b3JkCisKK1RvIG1ha2UgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBrbm93biB0byBNYXZlbiwgdGhleSBtdXN0IGJlCitjb25maWd1cmVkIGluIHRoZSBgfi8ubTIvc2V0dGluZ3MueG1sYCBmaWxlLgorCistLS0tCisgIDxzZXR0aW5ncyB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvU0VUVElOR1MvMS4wLjAiCisgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9TRVRUSU5HUy8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2Qvc2V0dGluZ3MtMS4wLjAueHNkIj4KKyAgICA8c2VydmVycz4KKyAgICAgIDxzZXJ2ZXI+CisgICAgICAgIDxpZD5nZXJyaXQtYXBpLXJlcG9zaXRvcnk8L2lkPgorICAgICAgICA8dXNlcm5hbWU+R09PRy4uRVhBTVBMRS4uLi4uRVhBTVBMRTwvdXNlcm5hbWU+CisgICAgICAgIDxwYXNzd29yZD5FWEFNUExFLi5FWEFNUExFLi5FWEFNUExFPC9wYXNzd29yZD4KKyAgICAgIDwvc2VydmVyPgorICAgICAgPHNlcnZlcj4KKyAgICAgICAgPGlkPmdlcnJpdC1tYXZlbi1yZXBvc2l0b3J5PC9pZD4KKyAgICAgICAgPHVzZXJuYW1lPkdPT0cuLkVYQU1QTEUuLi4uLkVYQU1QTEU8L3VzZXJuYW1lPgorICAgICAgICA8cGFzc3dvcmQ+RVhBTVBMRS4uRVhBTVBMRS4uRVhBTVBMRTwvcGFzc3dvcmQ+CisgICAgICA8L3NlcnZlcj4KKyAgICAgIDxzZXJ2ZXI+CisgICAgICAgIDxpZD5nZXJyaXQtcGx1Z2lucy1yZXBvc2l0b3J5PC9pZD4KKyAgICAgICAgPHVzZXJuYW1lPkdPT0cuLkVYQU1QTEUuLi4uLkVYQU1QTEU8L3VzZXJuYW1lPgorICAgICAgICA8cGFzc3dvcmQ+RVhBTVBMRS4uRVhBTVBMRS4uRVhBTVBMRTwvcGFzc3dvcmQ+CisgICAgICA8L3NlcnZlcj4KKyAgICA8L3NlcnZlcnM+CisgIDwvc2V0dGluZ3M+CistLS0tCisKK1tbZGVwbG95LWNvbmZpZ3VyYXRpb24tc3VicHJvamVjdHNdXQorR2Vycml0IFN1YnByb2plY3RzCit+fn5+fn5+fn5+fn5+fn5+fn4KKworKiBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgYHBvbS54bWxgIHRvIG1ha2UgaXQKK2RlcGxveWFibGUgdG8gdGhlIGBnZXJyaXQtbWF2ZW5gIHN0b3JhZ2UgYnVja2V0OgorCistLS0tCisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmdlcnJpdC1tYXZlbi1yZXBvc2l0b3J5PC9pZD4KKyAgICAgIDxuYW1lPkdlcnJpdCBNYXZlbiBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPHVybD5zMzovL2dlcnJpdC1tYXZlbkBjb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbTwvdXJsPgorICAgICAgPHVuaXF1ZVZlcnNpb24+dHJ1ZTwvdW5pcXVlVmVyc2lvbj4KKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKy0tLS0KKworCisqIEFkZCB0aGlzIHRvIHRoZSBgcG9tLnhtbGAgdG8gZW5hYmxlIHRoZSB3YWdvbiBwcm92aWRlcjoKKworLS0tLQorICA8YnVpbGQ+CisgICAgPGV4dGVuc2lvbnM+CisgICAgICA8ZXh0ZW5zaW9uPgorICAgICAgICA8Z3JvdXBJZD5uZXQuYW56aXguYXdzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zMy1tYXZlbi13YWdvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4yPC92ZXJzaW9uPgorICAgICAgPC9leHRlbnNpb24+CisgICAgPC9leHRlbnNpb25zPgorICA8L2J1aWxkPgorLS0tLQorCisKK1tbZGVwbG95LWNvbmZpZ3VyYXRpb24tY29yZS1wbHVnaW5zXV0KK0dlcnJpdCBDb3JlIFBsdWdpbnMKK35+fn5+fn5+fn5+fn5+fn5+fn4KKworKiBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgYHBvbS54bWxgIHRvIG1ha2UgaXQKK2RlcGxveWFibGUgdG8gdGhlIGBnZXJyaXQtcGx1Z2luc2Agc3RvcmFnZSBidWNrZXQ6CisKKy0tLS0KKyAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+Z2Vycml0LXBsdWdpbnMtcmVwb3NpdG9yeTwvaWQ+CisgICAgICA8bmFtZT5HZXJyaXQgUGx1Z2lucyBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPHVybD5zMzovL2dlcnJpdC1wbHVnaW5zQGNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tPC91cmw+CisgICAgICA8dW5pcXVlVmVyc2lvbj50cnVlPC91bmlxdWVWZXJzaW9uPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorLS0tLQorCisKKyogQWRkIHRoaXMgdG8gdGhlIGBwb20ueG1sYCB0byBlbmFibGUgdGhlIHdhZ29uIHByb3ZpZGVyOgorCistLS0tCisgIDxidWlsZD4KKyAgICA8ZXh0ZW5zaW9ucz4KKyAgICAgIDxleHRlbnNpb24+CisgICAgICAgIDxncm91cElkPm5ldC5hbnppeC5hd3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnMzLW1hdmVuLXdhZ29uPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2V4dGVuc2lvbnM+CisgIDwvYnVpbGQ+CistLS0tCisKKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2Utc3VicHJvamVjdC50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLXN1YnByb2plY3QudHh0CmluZGV4IDc5OWZmMmQuLjVlMzc3MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2Utc3VicHJvamVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtcmVsZWFzZS1zdWJwcm9qZWN0LnR4dApAQCAtMSw5NiArMSwxMDYgQEAKIE1ha2luZyBhIFJlbGVhc2Ugb2YgYSBHZXJyaXQgU3VicHJvamVjdCAvIENvcmUgUGx1Z2luCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1QcmVwYXJpbmcgYSBOZXcgU25hcHNob3QgZm9yIFB1Ymxpc2hpbmcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW1ttYWtlLXNuYXBzaG90XV0KK01ha2UgYSBTbmFwc2hvdAorLS0tLS0tLS0tLS0tLS0tCiAKLSogWW91IHdpbGwgbmVlZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGBwb20ueG1sYCB0byBtYWtlIGl0Ci0gIGRlcGxveWFibGUgdG8gdGhlIGBnZXJyaXQtbWF2ZW5gIHN0b3JhZ2UgYnVja2V0OgorKiBPbmx5IGZvciBwbHVnaW5zOgorKiogSW4gdGhlIGBwb20ueG1sYCB1cGRhdGUgdGhlIEdlcnJpdCB2ZXJzaW9uIHVuZGVyIGBwcm9wZXJ0aWVzYCA+CitgR2Vycml0LUFwaVZlcnNpb25gIHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBuZXcgR2Vycml0CityZWxlYXNlLgorKiogTWFrZSBzdXJlIHRoYXQgdGhlIFVSTCBmb3IgdGhlIE1hdmVuIHJlcG9zaXRvcnkgd2l0aCB0aGUgaWQKK2BnZXJyaXQtYXBpLXJlcG9zaXRvcnlgIGluIHRoZSBgcG9tLnhtbGAgaXMgY29ycmVjdC4KKysKK0lmIGBHZXJyaXQtQXBpVmVyc2lvbmAgcmVmZXJlbmNlcyBhIHJlbGVhc2VkIEdlcnJpdCB2ZXJzaW9uIGl0IG11c3QgYmUKK2BodHRwczovL2dlcnJpdC1hcGkuY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmVsZWFzZS9gLCBpZgorYEdlcnJpdC1BcGlWZXJzaW9uYCByZWZlcmVuY2VzIGEgc25hcHNob3QgR2Vycml0IHZlcnNpb24gaXQgbXVzdCBiZQorYGh0dHBzOi8vZ2Vycml0LWFwaS5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9zbmFwc2hvdC9gLgogCi0tLS0tCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPGlkPmdlcnJpdC1tYXZlbjwvaWQ+Ci0gICAgICA8bmFtZT5nZXJyaXQgTWF2ZW4gUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgIDx1cmw+czM6Ly9nZXJyaXQtbWF2ZW5AY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb208L3VybD4KLSAgICAgIDx1bmlxdWVWZXJzaW9uPnRydWU8L3VuaXF1ZVZlcnNpb24+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0tLS0tCisqIEJ1aWxkIHRoZSBsYXRlc3Qgc25hcHNob3QgYW5kIGluc3RhbGwgaXQgaW50byB0aGUgbG9jYWwgTWF2ZW4KK3JlcG9zaXRvcnk6CisrCis9PT09CisgIG12biBjbGVhbiBpbnN0YWxsCis9PT09CisKKyogVGVzdCBHZXJyaXQgd2l0aCB0aGlzIHNuYXBzaG90IGxvY2FsbHkKIAogCi0qIEFkZCB0aGlzIHRvIHRoZSBgcG9tLnhtbGAgdG8gZW5hYmxlIHRoZSB3YWdvbiBwcm92aWRlcjoKK1B1Ymxpc2ggU25hcHNob3QKKy0tLS0tLS0tLS0tLS0tLS0KIAotLS0tLQotICA8YnVpbGQ+Ci0gICAgPGV4dGVuc2lvbnM+Ci0gICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICA8Z3JvdXBJZD5uZXQuYW56aXguYXdzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5zMy1tYXZlbi13YWdvbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My4yPC92ZXJzaW9uPgotICAgICAgPC9leHRlbnNpb24+Ci0gICAgPC9leHRlbnNpb25zPgotICA8L2J1aWxkPgotLS0tLQorSWYgYSBTbmFwc2hvdCBmb3IgYSBTdWJwcm9qZWN0IHdhcyBjcmVhdGVkIHRoYXQgc2hvdWxkIGJlIHJlZmVyZW5jZWQgYnkKK0dlcnJpdCB3aGlsZSBjdXJyZW50IEdlcnJpdCBkZXZlbG9wbWVudCBpcyBvbmdvaW5nLCB0aGlzIFNuYXBzaG90IG5lZWRzCit0byBiZSBwdWJsaXNoZWQuCiAKKyogTWFrZSBzdXJlIHlvdSBoYXZlIGRvbmUgdGhlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBkZXBsb3ltZW50OgorKiogbGluazpkZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLmh0bWwjZGVwbG95LWNvbmZpZ3VyYXRpb24tc2V0dGluZ3MteG1sWworQ29uZmlndXJhdGlvbiBpbiBNYXZlbiBgc2V0dGluZ3MueG1sYF0KKyoqIGxpbms6ZGV2LXJlbGVhc2UtZGVwbG95LWNvbmZpZy5odG1sI2RlcGxveS1jb25maWd1cmF0aW9uLXN1YnByb2plY3RzWworQ29uZmlndXJhdGlvbiBmb3IgU3VicHJvamVjdHMgaW4gYHBvbS54bWxgXQogCi0qIEFkZCB5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byB5b3VyIGB+Ly5tMi9zZXR0aW5ncy54bWxgIGZpbGUuCi0gIFRoZXNlIG5lZWQgdG8gY29tZSBmcm9tIHRoZSBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FwaXMvY29uc29sZS9bQVBJIENvbnNvbGVdLgotCi0tLS0tCi0gIDxzZXR0aW5ncyB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvU0VUVElOR1MvMS4wLjAiCi0gICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9TRVRUSU5HUy8xLjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2Qvc2V0dGluZ3MtMS4wLjAueHNkIj4KLSAgICA8c2VydmVycz4KLSAgICAgIDxzZXJ2ZXI+Ci0gICAgICAgIDxpZD5nZXJyaXQtbWF2ZW48L2lkPgotICAgICAgICA8dXNlcm5hbWU+R09PRy4uRVhBTVBMRS4uLi4uRVhBTVBMRTwvdXNlcm5hbWU+Ci0gICAgICAgIDxwYXNzd29yZD5FWEFNUExFLi5FWEFNUExFLi5FWEFNUExFPC9wYXNzd29yZD4KLSAgICAgIDwvc2VydmVyPgotICAgIDwvc2VydmVycz4KLSAgPC9zZXR0aW5ncz4KLS0tLS0KLQotCi1NYWtpbmcgYSBTbmFwc2hvdAotLS0tLS0tLS0tLS0tLS0tLS0KLQotKiBPbmx5IGZvciBwbHVnaW5zOiBpbiB0aGUgYHBvbS54bWxgIHVwZGF0ZSB0aGUgR2Vycml0IHZlcnNpb24gdW5kZXIKLWBwcm9wZXJ0aWVzYCA+IGBHZXJyaXQtQXBpVmVyc2lvbmAgdG8gdGhlIHZlcnNpb24gb2YgdGhlIG5ldyBHZXJyaXQKLXJlbGVhc2UKLSogRmlyc3QgYnVpbGQgYW5kIGRlcGxveSB0aGUgbGF0ZXN0IHNuYXBzaG90IGFuZCBlbnN1cmUgdGhhdCBHZXJyaXQKLWJ1aWxkcy9ydW5zIHdpdGggdGhpcyBzbmFwc2hvdAotCi0qIERlcGxveSB0aGUgc25hcHNob3Q6Ci0KKyogRGVwbG95IHRoZSBuZXcgc25hcHNob3Q6CisrCiA9PT09CiAgIG12biBkZXBsb3kKID09PT0KIAorKiBDaGFuZ2UgdGhlIHZlcnNpb24gaW4gdGhlIEdlcnJpdCBwYXJlbnQgYHBvbS54bWxgIGZvciB0aGUgU3VicHJvamVjdAordG8gdGhlIGBTTkFQU0hPVGAgdmVyc2lvbgorKworV2hlbiBHZXJyaXQgZ2V0cyByZWxlYXNlZCwgYSByZWxlYXNlIG9mIHRoZSBTdWJwcm9qZWN0IGhhcyB0byBiZSBkb25lCithbmQgR2Vycml0IGhhcyB0byByZWZlcmVuY2UgdGhlIHJlbGVhc2VkIFN1YnByb2plY3QgdmVyc2lvbi4KIAotTWFraW5nIGEgUmVsZWFzZQotLS0tLS0tLS0tLS0tLS0tLQogCi0qIEZpcnN0IGRlcGxveSAoYW5kIHRlc3QpIHRoZSBsYXRlc3Qgc25hcHNob3QgZm9yIHRoZSBzdWJwcm9qZWN0L3BsdWdpbgorW1twcmVwYXJlLXJlbGVhc2VdXQorUHJlcGFyZSB0aGUgUmVsZWFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIGxpbms6I21ha2Utc25hcHNob3RbRmlyc3QgY3JlYXRlIChhbmQgdGVzdCkgdGhlIGxhdGVzdCBzbmFwc2hvdCBmb3IKK3RoZSBzdWJwcm9qZWN0L3BsdWdpbl0KIAogKiBVcGRhdGUgdGhlIHRvcCBsZXZlbCBgcG9tLnhtbGAgaW4gdGhlIHN1YnByb2plY3QvcGx1Z2luIHRvIHJlZmxlY3QKIHRoZSBuZXcgcHJvamVjdCB2ZXJzaW9uICh0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIHRhZyB5b3Ugd2lsbCBjcmVhdGUKIGJlbG93KQogCi0qIENvbW1pdCB0aGUgcG9tIGNoYW5nZSBhbmQgcHVzaCB0byB0aGUgcHJvamVjdCdzIHJlcG8KLWByZWZzL2Zvci88bWFzdGVyL3N0YWJsZT5gCi0KLSogVGFnIHRoZSB2ZXJzaW9uIHlvdSBqdXN0IHB1c2hlZCAoYW5kIHB1c2ggdGhlIHRhZykKLQorKiBDcmVhdGUgdGhlIFJlbGVhc2UgVGFnCisrCiA9PT09CiAgZ2l0IHRhZyAtYSAtbSAicHJvbG9nLWNhZmUgMS4zIiB2MS4zCi0gZ2l0IHB1c2ggZ2Vycml0LXJldmlldyByZWZzL3RhZ3MvdjEuMzpyZWZzL3RhZ3MvdjEuMwogPT09PQogCisqIEJ1aWxkIGFuZCBpbnN0YWxsIGludG8gbG9jYWwgTWF2ZW4gcmVwb3NpdG9yeToKKysKKz09PT0KKyAgbXZuIGNsZWFuIGluc3RhbGwKKz09PT0KKworCitbW3B1Ymxpc2gtcmVsZWFzZV1dCitQdWJsaXNoIHRoZSBSZWxlYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogTWFrZSBzdXJlIHlvdSBoYXZlIGRvbmUgdGhlIGNvbmZpZ3VyYXRpb24gbmVlZGVkIGZvciBkZXBsb3ltZW50OgorKiogbGluazpkZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLmh0bWwjZGVwbG95LWNvbmZpZ3VyYXRpb24tc2V0dGluZ3MteG1sWworQ29uZmlndXJhdGlvbiBpbiBNYXZlbiBgc2V0dGluZ3MueG1sYF0KKyoqIENvbmZpZ3VyYXRpb24gaW4gYHBvbS54bWxgIGZvcgorbGluazpkZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLmh0bWwjZGVwbG95LWNvbmZpZ3VyYXRpb24tc3VicHJvamVjdHNbU3VicHJvamVjdHNdIG9yCitsaW5rOmRldi1yZWxlYXNlLWRlcGxveS1jb25maWcuaHRtbCNkZXBsb3ktY29uZmlndXJhdGlvbi1jb3JlLXBsdWdpbnNbQ29yZSBQbHVnaW5zXQorCiAqIERlcGxveSB0aGUgbmV3IHJlbGVhc2U6Ci0KKysKID09PT0KLSBtdm4gZGVwbG95CisgIG12biBkZXBsb3kKKz09PT0KKworKiBQdXNoIHRoZSBwb20gY2hhbmdlKHMpIHRvIHRoZSBwcm9qZWN0J3MgcmVwb3NpdG9yeQorYHJlZnMvZm9yLzxtYXN0ZXJ8c3RhYmxlPmAKKworKiBQdXNoIHRoZSBSZWxlYXNlIFRhZworKworPT09PQorICBnaXQgcHVzaCBnZXJyaXQtcmV2aWV3IHJlZnMvdGFncy92MS4zOnJlZnMvdGFncy92MS4zCiA9PT09CiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVsZWFzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLnR4dAppbmRleCA1ZWEzMDQyLi5hZTJhZWQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLnR4dApAQCAtMTEsNyArMTEsNyBAQAogCiBUbyBtYWtlIGEgR2Vycml0IHJlbGVhc2UgaW52b2x2ZXMgYSBncmVhdCBkZWFsIG9mIGNvbXBsZXgKIHRhc2tzIGFuZCBpdCBpcyBlYXN5IHRvIG1pc3MgYSBzdGVwIHNvIHRoaXMgZG9jdW1lbnQgc2hvdWxkCi1ob3BlZnVseSBzZXJ2ZSBhcyBib3RoIGEgaG93IHRvIGZvciB0aG9zZSBuZXcgdG8gdGhlIHByb2Nlc3MKK2hvcGVmdWxseSBzZXJ2ZSBhcyBib3RoIGEgaG93IHRvIGZvciB0aG9zZSBuZXcgdG8gdGhlIHByb2Nlc3MKIGFuZCBhcyBhIGNoZWNrbGlzdCBmb3IgdGhvc2UgYWxyZWFkeSBmYW1pbGlhciB3aXRoIHRoZXNlCiB0YXNrcy4KIApAQCAtMjAsMTQyICsyMCwyMTUgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSGVyZSBhcmUgc29tZSBndWlkZWxpbmVzIG9uIHJlbGVhc2UgYXBwcm9hY2hlcyBkZXBlbmRpbmcgb24gdGhlCi10eXBlIG9mIHJlbGVhc2UgeW91IHdhbnQgdG8gbWFrZSAoc3RhYmxlLWZpeCwgc3RhYmxlLCBSQzAsIFJDMS4uLikuCit0eXBlIG9mIHJlbGVhc2UgeW91IHdhbnQgdG8gbWFrZSAoYHN0YWJsZS1maXhgLCBgc3RhYmxlYCwgYFJDMGAsCitgUkMxYC4uLikuCiAKK1tbc3RhYmxlXV0KIFN0YWJsZQogfn5+fn5+CiAKLUEgc3RhYmxlIHJlbGVhc2UgaXMgZ2VuZXJhbGx5IGJ1aWx0IGZyb20gdGhlIG1hc3RlciBicmFuY2ggYW5kIG1heSBuZWVkIHRvCi11bmRlcmdvIHNvbWUgc3RhYmlsaXphdGlvbiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBmaW5hbCByZWxlYXNlLgorQSBgc3RhYmxlYCByZWxlYXNlIGlzIGdlbmVyYWxseSBidWlsdCBmcm9tIHRoZSBgbWFzdGVyYCBicmFuY2ggYW5kIG1heQorbmVlZCB0byB1bmRlcmdvIHNvbWUgc3RhYmlsaXphdGlvbiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBmaW5hbCByZWxlYXNlLgogCiAqIFByb3Bvc2UgdGhlIHJlbGVhc2Ugd2l0aCBhbnkgcGxhbnMvb2JqZWN0aXZlcyB0byB0aGUgbWFpbGluZyBsaXN0CiAKLSogQ3JlYXRlIGEgR2Vycml0IFJDMAorKiBDcmVhdGUgYSBHZXJyaXQgYFJDMGAKIAotKiBJZiBuZWVkZWQgY3JlYXRlIGEgR2Vycml0IFJDMQorKiBJZiBuZWVkZWQgY3JlYXRlIGEgR2Vycml0IGBSQzFgCiAKIFtOT1RFXQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBZb3UgbWF5IGxldCBpbiBhIGZldyBmZWF0dXJlcyB0byB0aGlzIHJlbGVhc2UKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0qIElmIG5lZWRlZCBjcmVhdGUgYSBHZXJyaXQgUkMyCisqIElmIG5lZWRlZCBjcmVhdGUgYSBHZXJyaXQgYFJDMmAKIAogW05PVEVdCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFRoZXJlIHNob3VsZCBiZSBubyBuZXcgZmVhdHVyZXMgaW4gdGhpcyByZWxlYXNlLCBvbmx5IGJ1ZyBmaXhlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSogRmluYWxseSBjcmVhdGUgdGhlIHN0YWJsZSByZWxlYXNlIChubyBSQykKKyogRmluYWxseSBjcmVhdGUgdGhlIGBzdGFibGVgIHJlbGVhc2UgKG5vIGBSQ2ApCiAKIAogU3RhYmxlLUZpeAogfn5+fn5+fn5+fgogCi1TdGFibGUtZml4IHJlbGVhc2VzIHNob3VsZCBsaWtlbHkgb25seSBjb250YWluIGJ1ZyBmaXhlcyBhbmQgZG9jIHVwZGF0ZXMuCitgc3RhYmxlLWZpeGAgcmVsZWFzZXMgc2hvdWxkIGxpa2VseSBvbmx5IGNvbnRhaW4gYnVnIGZpeGVzIGFuZCBkb2MKK3VwZGF0ZXMuCiAKICogUHJvcG9zZSB0aGUgcmVsZWFzZSB3aXRoIGFueSBwbGFucy9vYmplY3RpdmVzIHRvIHRoZSBtYWlsaW5nIGxpc3QKIAotKiBUaGlzIHR5cGUgb2YgcmVsZWFzZSBkb2VzIG5vdCBuZWVkIGFueSBSQ3MsIHJlbGVhc2Ugd2hlbiB0aGUgb2JqZWN0aXZlcwotICBhcmUgbWV0CisqIFRoaXMgdHlwZSBvZiByZWxlYXNlIGRvZXMgbm90IG5lZWQgYW55IFJDcywgcmVsZWFzZSB3aGVuIHRoZQorb2JqZWN0aXZlcyBhcmUgbWV0CiAKIAorW1tzZWN1cml0eV1dCitTZWN1cml0eS1GaXgKK35+fn5+fn5+fn5+fgorCitgc2VjdXJpdHktZml4YCByZWxlYXNlcyBzaG91bGQgb25seSBjb250YWluIGJ1ZyBmaXhlcyBmb3Igc2VjdXJpdHkKK2lzc3Vlcy4KKworRm9yIHNlY3VyaXR5IGlzc3VlcyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGV5IGFyZSBvbmx5IGFubm91bmNlZAorKmFmdGVyKiBmaXhlZCB2ZXJzaW9ucyBmb3IgYWxsIHJlbGV2YW50IHJlbGVhc2VzIGhhdmUgYmVlbiBwdWJsaXNoZWQuCitCZWNhdXNlIG9mIHRoaXMsIGBzZWN1cml0eS1maXhgIHJlbGVhc2VzIGNhbid0IGJlIHByZXBhcmVkIGluIHRoZSBwdWJsaWMKK2BnZXJyaXRgIHByb2plY3QuCisKK2BzZWN1cml0eS1maXhgIHJlbGVhc2VzIGFyZSBwcmVwYXJlZCBpbiB0aGUgYGdlcnJpdC1zZWN1cml0eS1maXhlc2AKK3Byb2plY3Qgd2hpY2ggaXMgb25seSByZWFkYWJsZSBieSB0aGUgR2Vycml0IE1haW50YWluZXJzLiBPbmx5IGFmdGVyCithIGBzZWN1cml0eS1maXhgIHJlbGVhc2UgaGFzIGJlZW4gcHVibGlzaGVkIHdpbGwgdGhlIGNvbW1pdHMvdGFncyBtYWRlIGluCit0aGUgYGdlcnJpdC1zZWN1cml0eS1maXhlc2AgcHJvamVjdCBiZSB0YWtlbiBvdmVyIGludG8gdGhlIHB1YmxpYworYGdlcnJpdGAgcHJvamVjdC4KKwogCiBDcmVhdGUgdGhlIEFjdHVhbCBSZWxlYXNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSW4gdGhlIGV4YW1wbGUgY29tbWFuZHMgYmVsb3cgd2UgYXNzdW1lIHRoYXQgdGhlIGxhc3QgcmVsZWFzZSB3YXMgJzIuNCcgYW5kIHRoYXQKLXdlIGFyZSBwcmVwYXJpbmcgJzIuNScgcmVsZWFzZS4KK1RvIGNyZWF0ZSBhIEdlcnJpdCByZWxlYXNlIHRoZSBmb2xsb3dpbmcgc3RlcHMgaGF2ZSB0byBiZSBkb25lOgogCi1QcmVwYXJlIHRoZSBTdWJwcm9qZWN0cwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotKiBQdWJsaXNoIHRoZSBsYXRlc3Qgc25hcHNob3QgZm9yIGFsbCBzdWJwcm9qZWN0cwotKiBGcmVlemUgYWxsIHN1YnByb2plY3RzIGFuZCBsaW5rOmRldi1yZWxlYXNlLXN1YnByb2plY3QuaHRtbFtwdWJsaXNoXQotICB0aGVtIQorLiBsaW5rOiNzdWJwcm9qZWN0W1JlbGVhc2UgU3VicHJvamVjdHNdCisuIGxpbms6I3ByZXBhcmUtZ2Vycml0W1ByZXBhcmUgdGhlIEdlcnJpdCBSZWxlYXNlXQorLi4gbGluazojcHJlcGFyZS13YXItYW5kLXBsdWdpbi1hcGlbUHJlcGFyZSB0aGUgR2Vycml0IFdBUiBhbmQgdGhlIFBsdWdpbiBBUEkgSmFyXQorLi4gbGluazojcHJlcGFyZS1jb3JlLXBsdWdpbnNbUHJlcGFyZSB0aGUgQ29yZSBQbHVnaW5zXQorLi4gbGluazojcHJlcGFyZS13YXItd2l0aC1wbHVnaW5zW1ByZXBhcmUgR2Vycml0IFdBUiB3aXRoIENvcmUgUGx1Z2luc10KKy4gbGluazojcHVibGlzaC1nZXJyaXRbUHVibGlzaCB0aGUgR2Vycml0IFJlbGVhc2VdCisuLiBsaW5rOiNleHRlbnNpb24tYW5kLXBsdWdpbi1hcGlbUHVibGlzaCB0aGUgRXh0ZW5zaW9uIGFuZCBQbHVnaW4gQVBJIEphcnNdCisuLiBsaW5rOiNwdWJsaXNoLWNvcmUtcGx1Z2luc1tQdWJsaXNoIHRoZSBDb3JlIFBsdWdpbnNdCisuLiBsaW5rOiNwdWJsaXNoLWdlcnJpdC13YXJbUHVibGlzaCB0aGUgR2Vycml0IFdBUiAod2l0aCBDb3JlIFBsdWdpbnMpXQorLi4gbGluazojcHVzaC1zdGFibGVbUHVzaCB0aGUgU3RhYmxlIEJyYW5jaF0KKy4uIGxpbms6I3B1c2gtdGFnW1B1c2ggdGhlIFJlbGVhc2UgVGFnXQorLi4gbGluazojdXBsb2FkLWRvY3VtZW50YXRpb25bVXBsb2FkIHRoZSBEb2N1bWVudGF0aW9uXQorLi4gbGluazojdXBkYXRlLWlzc3Vlc1tVcGRhdGUgdGhlIElzc3Vlc10KKy4uIGxpbms6I2Fubm91bmNlW0Fubm91bmNlIG9uIE1haWxpbmcgTGlzdF0KKy4gbGluazojaW5jcmVhc2UtdmVyc2lvbltJbmNyZWFzZSBHZXJyaXQgVmVyc2lvbiBmb3IgQ3VycmVudCBEZXZlbG9wbWVudF0KKy4gbGluazojbWVyZ2Utc3RhYmxlW01lcmdlIGBzdGFibGVgIGludG8gYG1hc3RlcmBdCiAKIAotUHJlcGFyZSBHZXJyaXQKLX5+fn5+fn5+fn5+fn5+CitbW3N1YnByb2plY3RdXQorUmVsZWFzZSBTdWJwcm9qZWN0cworfn5+fn5+fn5+fn5+fn5+fn5+fgogCi0qIENyZWF0ZSBhIGBzdGFibGUtMi41YCBicmFuY2ggZm9yIG1ha2luZyB0aGUgbmV3IHJlbGVhc2UKK1RoZSBzdWJwcm9qZWN0cyB0byBiZSByZWxlYXNlZCBhcmU6CiAKLSogSW4gdGhlIGBtYXN0ZXJgIGJyYW5jaDogVXBkYXRlIHRoZSBwb21zIGZvciB0aGUgR2Vycml0IHZlcnNpb24sIHB1c2ggZm9yCi1yZXZpZXcsIGdldCBtZXJnZWQKKyogYGd3dGV4cHVpYAorKiBgZ3d0anNvbnJwY2AKKyogYGd3dG9ybWAKKyogYHByb2xvZy1jYWZlYAogCitGb3IgZWFjaCBzdWJwcm9qZWN0IGRvOgorCisqIENoZWNrIHRoZSBkZXBlbmRlbmN5IHRvIHRoZSBTdWJwcm9qZWN0IGluIHRoZSBHZXJyaXQgcGFyZW50IGBwb20ueG1sYDoKKysKK0lmIGEgYFNOQVBTSE9UYCB2ZXJzaW9uIG9mIHRoZSBzdWJwcm9qZWN0IGlzIHJlZmVyZW5jZWQgdGhlIHN1YnByb2plY3QKK25lZWRzIHRvIGJlIHJlbGVhc2VkIHNvIHRoYXQgR2Vycml0IGNhbiByZWZlcmVuY2UgYSByZWxlYXNlZCB2ZXJzaW9uIG9mCit0aGUgc3VicHJvamVjdC4KKworKiBsaW5rOmRldi1yZWxlYXNlLXN1YnByb2plY3QuaHRtbCNtYWtlLXNuYXBzaG90W01ha2UgYSBzbmFwc2hvdCBhbmQgdGVzdCBpdF0KKyogbGluazpkZXYtcmVsZWFzZS1zdWJwcm9qZWN0Lmh0bWwjcHJlcGFyZS1yZWxlYXNlW1ByZXBhcmUgdGhlIFJlbGVhc2VdCisqIGxpbms6ZGV2LXJlbGVhc2Utc3VicHJvamVjdC5odG1sI3B1Ymxpc2gtcmVsZWFzZVtQdWJsaXNoIHRoZSBSZWxlYXNlXQorCisqIFVwZGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgU3VicHJvamVjdCBpbiB0aGUgR2Vycml0IHBhcmVudCBgcG9tLnhtbGAKK3RvIHRoZSByZWxlYXNlZCB2ZXJzaW9uCisKKworW1tidWlsZC1nZXJyaXRdXQorQnVpbGQgR2Vycml0Cit+fn5+fn5+fn5+fn4KKworKiBCdWlsZCB0aGUgR2Vycml0IFdBUgorKwogPT09PQotIHRvb2xzL3ZlcnNpb24uc2ggLS1zbmFwc2hvdD0yLjUKLT09PT0KLQotKiBDaGVja291dCB0aGUgYHN0YWJsZS0yLjVgIGJyYW5jaAotKiBVcGRhdGUgdGhlIHRvcCBsZXZlbCBgcG9tLnhtbGAgaW4gR2Vycml0IHRvIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlCi1TdWJwcm9qZWN0cyBwb2ludCB0byBzbmFwc2hvdCByZWxlYXNlcwotCi0qIFRhZwotCi09PT09Ci0gZ2l0IHRhZyAtYSAtbSAiZ2Vycml0IDIuNS1yYzAiIHYyLjUtcmMwCi0gZ2l0IHRhZyAtYSAtbSAiZ2Vycml0IDIuNSIgdjIuNQotPT09PQotCi0qIEJ1aWxkICh3aXRob3V0IHBsdWdpbnMpCi0KLT09PT0KKyBybSAtZiB+Ly5tMi9zZXR0aW5ncy54bWwKICAuL3Rvb2xzL3JlbGVhc2Uuc2gKID09PT0KKysKK1tXQVJOSU5HXQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitNYWtlIHN1cmUgeW91IGFyZSBjb21waWxpbmcgdGhlIHJlbGVhc2UgZm9yIGFsbCBicm93c2Vycy4gQ2hlY2sgaW4geW91cgorTWF2ZW4gYH4vLm0yL3NldHRpbmdzLnhtbGAgZmlsZSB0aGF0IG5vIE1hdmVuIHByb2ZpbGUgaXMgYWN0aXZlIHRoYXQKK2xpbWl0cyB0aGUgY29tcGlsYXRpb24gdG8gYSBjZXJ0YWluIGJyb3dzZXIuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotW1twbHVnaW4tYXBpXV0KLVB1Ymxpc2ggdGhlIFBsdWdpbiBBUEkgSkFSIEZpbGUKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotKiBQdXNoIEpBUiB0byBgY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb21gCi0qKiBSdW4gYHRvb2xzL2RlcGxveV9hcGkuc2hgCi0KLVByZXBhcmUgdGhlIENvcmUgUGx1Z2lucwotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0qIGxpbms6ZGV2LXJlbGVhc2Utc3VicHJvamVjdC5odG1sW1JlbGVhc2UgYW5kIHB1Ymxpc2hdIHRoZSBjb3JlIHBsdWdpbnMKLQotUGFja2FnZSBHZXJyaXQgd2l0aCBQbHVnaW5zCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSogRW5zdXJlIHRoYXQgdGhlIGNvcmUgcGx1Z2lucyBsaXN0ZWQgaW4gYGdlcnJpdC1wYWNrYWdlLXBsdWdpbnMvcG9tLnhtbGAKLXBvaW50IHRvIHRoZSBsYXRlc3QgcmVsZWFzZSB2ZXJzaW9uIChubyBkZXBlbmRlbmN5IHRvIHNuYXBzaG90IHZlcnNpb25zKQotKiBJbmNsdWRlIGNvcmUgcGx1Z2lucyBpbnRvIFdBUgotPT09PQotICQgLi90b29scy92ZXJzaW9uLnNoIC0tcmVsZWFzZSAmJiBtdm4gY2xlYW4gcGFja2FnZSAtZiBnZXJyaXQtcGFja2FnZS1wbHVnaW5zL3BvbS54bWwKLSAkIC4vdG9vbHMvdmVyc2lvbi5zaCAtLXJlc2V0Ci09PT09Ci0KLSogRmluZCBXQVIgdGhhdCBpbmNsdWRlcyB0aGUgY29yZSBwbHVnaW5zIGF0Ci1gZ2Vycml0LXBhY2thZ2UtcGx1Z2luc1x0YXJnZXRcZ2Vycml0LWZ1bGwtdjIuNS53YXJgCiAqIFNhbml0eSBjaGVjayBXQVIKKyogVGVzdCB0aGUgbmV3IEdlcnJpdCB2ZXJzaW9uCiAKLVB1Ymxpc2ggdG8gdGhlIFByb2plY3QgTG9jYXRpb25zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorW1twdWJsaXNoLWdlcnJpdF1dCitQdWJsaXNoIHRoZSBHZXJyaXQgUmVsZWFzZQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotV0FSIEZpbGUKLX5+fn5+fn5+CiAKLSogVXBsb2FkIFdBUiB0byBjb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQgKG1hbnVhbCB3ZWIgYnJvd3NlcikKK1tbZXh0ZW5zaW9uLWFuZC1wbHVnaW4tYXBpXV0KK1B1Ymxpc2ggdGhlIEV4dGVuc2lvbiBhbmQgUGx1Z2luIEFQSSBKYXJzCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCisqIE1ha2Ugc3VyZSB5b3UgaGF2ZSBkb25lIHRoZQorbGluazpkZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLmh0bWwjZGVwbG95LWNvbmZpZ3VyYXRpb24tc2V0dGluZ3MteG1sWworY29uZmlndXJhdGlvbiBuZWVkZWQgZm9yIGRlcGxveW1lbnRdCisKKyogUHVzaCB0aGUgSmFycyB0byBgY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb21gOgorKworLS0tLQorICAuL3Rvb2xzL2RlcGxveV9hcGkuc2gKKy0tLS0KKworCitbW3B1Ymxpc2gtY29yZS1wbHVnaW5zXV0KK1B1Ymxpc2ggdGhlIENvcmUgUGx1Z2lucworXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKKyogbGluazpkZXYtcmVsZWFzZS1zdWJwcm9qZWN0Lmh0bWwjcHVibGlzaC1yZWxlYXNlW1B1Ymxpc2ggdGhlIFJlbGVhc2VdCisKKworW1twdWJsaXNoLWdlcnJpdC13YXJdXQorUHVibGlzaCB0aGUgR2Vycml0IFdBUiAod2l0aCBDb3JlIFBsdWdpbnMpCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworKiBUaGUgV0FSIGZpbGUgdG8gdXBsb2FkIGlzIGBnZXJyaXQtcGFja2FnZS1wbHVnaW5zXHRhcmdldFxnZXJyaXQtZnVsbC12Mi41LndhcmAKKyogVXBsb2FkIFdBUiB0byBgY29kZS5nb29nbGUuY29tL3AvZ2Vycml0YCAobWFudWFsIHZpYSB3ZWIgYnJvd3NlcikKICoqIEdvIHRvIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvZG93bmxvYWRzL2xpc3QKLSoqIFVzZSB0aGUgIk5ldyBEb3dubG9hZCIgYnV0dG9uCisqKiBVc2UgdGhlIGBOZXcgRG93bmxvYWRgIGJ1dHRvbgogCiAqIFVwZGF0ZSBsYWJlbHM6Ci0qKiBuZXcgd2FyOiBbcmVsZWFzZS1jYW5kaWRhdGVdLCBmZWF0dXJlZC4uLgotKiogb2xkIHdhcjogZGVwcmVjYXRlZAorKiogbmV3IHdhcjogW2ByZWxlYXNlLWNhbmRpZGF0ZWBdLCBgZmVhdHVyZWRgLi4uCisqKiBvbGQgd2FyOiBgZGVwcmVjYXRlZGAKIAotVGFnCi1+fn4KIAotKiBQdXNoIHRoZSBOZXcgVGFnCitbW3B1c2gtc3RhYmxlXV0KK1B1c2ggdGhlIFN0YWJsZSBCcmFuY2gKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAorKiBjcmVhdGUgdGhlIHN0YWJsZSBicmFuY2ggYHN0YWJsZS0yLjVgIGluIHRoZSBgZ2Vycml0YCBwcm9qZWN0CisrCitWaWEgdGhlIGxpbms6aHR0cHM6Ly9nZXJyaXQtcmV2aWV3Lmdvb2dsZXNvdXJjZS5jb20vIy9hZG1pbi9wcm9qZWN0cy9nZXJyaXQsYnJhbmNoZXNbCitHZXJyaXQgV2ViVUldIG9yIGJ5IHB1c2guCisKKyogUHVzaCB0aGUgY29tbWl0cyBkb25lIG9uIGBzdGFibGUtMi41YCB0byBgcmVmcy9mb3Ivc3RhYmxlLTIuNWAgYW5kCitnZXQgdGhlbSBtZXJnZWQKKworCitbW3B1c2gtdGFnXV0KK1B1c2ggdGhlIFJlbGVhc2UgVGFnCiteXl5eXl5eXl5eXl5eXl5eXl5eXgorCisqIFB1c2ggdGhlIG5ldyBSZWxlYXNlIFRhZworKworRm9yIGFuIGBSQ2A6CisrCiA9PT09CiAgZ2l0IHB1c2ggZ2Vycml0LXJldmlldyByZWZzL3RhZ3MvdjIuNS1yYzA6cmVmcy90YWdzL3YyLjUtcmMwCis9PT09CisrCitGb3IgYSBmaW5hbCBgc3RhYmxlYCByZWxlYXNlOgorKworPT09PQogIGdpdCBwdXNoIGdlcnJpdC1yZXZpZXcgcmVmcy90YWdzL3YyLjU6cmVmcy90YWdzL3YyLjUKID09PT0KIAogCi1Eb2NzCi1+fn5+CitbW3VwbG9hZC1kb2N1bWVudGF0aW9uXV0KK1VwbG9hZCB0aGUgRG9jdW1lbnRhdGlvbgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKID09PT0KICBtYWtlIC1DIERvY3VtZW50YXRpb24gUFJJT1I9Mi40IHVwZGF0ZQpAQCAtMTY3LDE0ICsyNDAsMTQgQEAKICogVXBkYXRlIEdvb2dsZSBDb2RlIHByb2plY3QgbGlua3MKICoqIEdvIHRvIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvYWRtaW4KICoqIFBvaW50IHRoZSBtYWluIHBhZ2UgdG8gdGhlIG5ldyBkb2NzLiBUaGUgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbiBoYXMgdG8gYmUKLXVwZGF0ZWQgYXQgdHdvIHBsYWNlczogaW4gdGhlIHByb2plY3QgZGVzY3JpcHRpb24gYW5kIGFsc28gaW4gdGhlIExpbmtzCit1cGRhdGVkIGF0IHR3byBwbGFjZXM6IGluIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIGFuZCBhbHNvIGluIHRoZSBgTGlua3NgCiBzZWN0aW9uLgogKiogUG9pbnQgdGhlIG1haW4gcGFnZSB0byB0aGUgbmV3IHJlbGVhc2Ugbm90ZXMKIAogW05PVEVdCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVRoZSBkb2NzIG1ha2VmaWxlIGRvZXMgYW4gc3ZuIGNwIG9mIHRoZSBwcmlvciByZXZpc2lvbiBvZiB0aGUgZG9jcyB0byBicmFuY2gKLXRoZSBkb2NzIHNvIHlvdSBoYXZlIGxlc3MgdG8gdXBsb2FkIG9uIHRoZSBuZXcgZG9jcy4KK1RoZSBkb2NzIG1ha2VmaWxlIGRvZXMgYW4gYHN2biBjcGAgb2YgdGhlIHByaW9yIHJldmlzaW9uIG9mIHRoZSBkb2NzIHRvCiticmFuY2ggdGhlIGRvY3Mgc28geW91IGhhdmUgbGVzcyB0byB1cGxvYWQgb24gdGhlIG5ldyBkb2NzLgogCiBVc2VyIGFuZCBwYXNzd29yZCBmcm9tIGhlcmU6CiAKQEAgLTE4OCwzMCArMjYxLDMzIEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogCi1Jc3N1ZXMKLX5+fn5+fgorW1t1cGRhdGUtaXNzdWVzXV0KK1VwZGF0ZSB0aGUgSXNzdWVzCiteXl5eXl5eXl5eXl5eXl5eXgogCiA9PT09CiAgSG93IGRvIHRoZSBpc3N1ZXMgZ2V0IHVwZGF0ZWQ/ICBEbyB5b3UgcnVuIGEgc2NyaXB0IHRvIGRvCi0gdGhpcz8gIFdoZW4gZG8geW91IGRvIGl0LCBhZnRlciB0aGUgZmluYWwgMi4yLjIgaXMgcmVsZWFzZWQ/CisgdGhpcz8gIFdoZW4gZG8geW91IGRvIGl0LCBhZnRlciB0aGUgZmluYWwgMi41IGlzIHJlbGVhc2VkPwogPT09PQogCiBCeSBoYW5kLgogCi1PdXIgY3VycmVudCBwcm9jZXNzIGlzIGFuIGlzc3VlIHNob3VsZCBiZSB1cGRhdGVkIHRvIHNheSBTdGF0dXMgPQotU3VibWl0dGVkLCBGaXhlZEluLTIuMi4yIG9uY2UgdGhlIGNoYW5nZSBpcyBzdWJtaXR0ZWQsIGJ1dCBiZWZvcmUgdGhlCitPdXIgY3VycmVudCBwcm9jZXNzIGlzIGFuIGlzc3VlIHNob3VsZCBiZSB1cGRhdGVkIHRvIHNheSBgU3RhdHVzID0KK1N1Ym1pdHRlZCwgRml4ZWRJbi0yLjVgIG9uY2UgdGhlIGNoYW5nZSBpcyBzdWJtaXR0ZWQsIGJ1dCBiZWZvcmUgdGhlCiByZWxlYXNlLgogCiBBZnRlciB0aGUgcmVsZWFzZSBpcyBhY3R1YWxseSBtYWRlLCB5b3UgY2FuIHNlYXJjaCBpbiBHb29nbGUgQ29kZSBmb3IKLWBgU3RhdHVzPVN1Ym1pdHRlZCBGaXhlZEluPTIuMi4yJycgYW5kIHRoZW4gYmF0Y2ggdXBkYXRlIHRoZXNlIGNoYW5nZXMKLXRvIHNheSBTdGF0dXM9UmVsZWFzZWQuIE1ha2Ugc3VyZSB0aGUgcHVsbGRvd24gc2F5cyBgYEFsbCBJc3N1ZXMnJwotYmVjYXVzZSBTdGF0dXM9U3VibWl0dGVkIGlzIGNvbnNpZGVyZWQgYSBjbG9zZWQgaXNzdWUuCitgYFN0YXR1cz1TdWJtaXR0ZWQgRml4ZWRJbj0yLjUnJyBhbmQgdGhlbiBiYXRjaCB1cGRhdGUgdGhlc2UgY2hhbmdlcwordG8gc2F5IGBTdGF0dXM9UmVsZWFzZWRgLiBNYWtlIHN1cmUgdGhlIHB1bGxkb3duIHNheXMgYGBBbGwgSXNzdWVzJycKK2JlY2F1c2UgYFN0YXR1cz1TdWJtaXR0ZWRgIGlzIGNvbnNpZGVyZWQgYSBjbG9zZWQgaXNzdWUuCiAKIAotTWFpbGluZyBMaXN0Ci1+fn5+fn5+fn5+fn4KK1tbYW5ub3VuY2VdXQorQW5ub3VuY2Ugb24gTWFpbGluZyBMaXN0CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotKiBTZW5kIGFuIGVtYWlsIHRvIHRoZSBtYWlsaW5nIGxpc3QgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2UsIGNvbnNpZGVyIGluY2x1ZGluZyBzb21lIG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nIGluIHRoZSBlbWFpbDoKKyogU2VuZCBhbiBlbWFpbCB0byB0aGUgbWFpbGluZyBsaXN0IHRvIGFubm91bmNlIHRoZSByZWxlYXNlLCBjb25zaWRlcgoraW5jbHVkaW5nIHNvbWUgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGVtYWlsOgogKiogQSBsaW5rIHRvIHRoZSByZWxlYXNlIGFuZCB0aGUgcmVsZWFzZSBub3RlcyAoaWYgYSBmaW5hbCByZWxlYXNlKQogKiogQSBsaW5rIHRvIHRoZSBkb2NzCiAqKiBEZXNjcmliZSB0aGUgdHlwZSBvZiByZWxlYXNlIChzdGFibGUsIGJ1ZyBmaXgsIFJDKQpAQCAtMjQxLDcgKzMxNyw3IEBACiAtTWFydGluCiAtLS0tCiAKLSogQWRkIGFuIGVudHJ5IHRvIHRoZSBORVdTIHNlY3Rpb24gb2YgdGhlIG1haW4gR2Vycml0IHByb2plY3Qgd2ViIHBhZ2UKKyogQWRkIGFuIGVudHJ5IHRvIHRoZSBgTkVXU2Agc2VjdGlvbiBvZiB0aGUgbWFpbiBHZXJyaXQgcHJvamVjdCB3ZWIgcGFnZQogKiogR28gdG86IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvYWRtaW4KICoqIEFkZCBlbnRyeSBsaWtlOgogLS0tLQpAQCAtMjUyLDE4ICszMjgsMzMgQEAKICoqIEdvIHRvOiBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcmVwby1kaXNjdXNzL3RvcGljcwogKiogQ2xpY2sgb24gdGhlIGFubm91bmNlbWVudCB0aHJlYWQKICoqIE5lYXIgdGhlIHRvcCByaWdodCwgY2xpY2sgb24gb3B0aW9ucwotKiogVW5kZXIgb3B0aW9ucywgY2ljayB0aGUgIkRpc3BsYXkgdGhpcyB0b3AgZmlyc3QiIGNoZWNrYm94CisqKiBVbmRlciBvcHRpb25zLCBjbGljayB0aGUgIkRpc3BsYXkgdGhpcyB0b3AgZmlyc3QiIGNoZWNrYm94CiAqKiBhbmQgU2F2ZQogCiAqIFVwZGF0ZSB0aGUgcHJldmlvdXMgZGlzY3Vzc2lvbiBncm91cCBhbm5vdW5jZW1lbnQgdG8gbm8gbG9uZ2VyIGJlIHN0aWNreQogKiogU2VlIGFib3ZlICh1bmNsaWNrIGNoZWNrYm94KQogCiAKLU1lcmdpbmcgU3RhYmxlIEZpeGVzIHRvIG1hc3RlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbW2luY3JlYXNlLXZlcnNpb25dXQorSW5jcmVhc2UgR2Vycml0IFZlcnNpb24gZm9yIEN1cnJlbnQgRGV2ZWxvcG1lbnQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLUFmdGVyIGV2ZXJ5IHN0YWJsZS1maXggcmVsZWFzZSwgc3RhYmxlIHNob3VsZCBiZSBtZXJnZWQgdG8gbWFzdGVyIHRvCi1lbnN1cmUgdGhhdCBub25lIG9mIHRoZSBmaXhlcyBldmVyIGdldCBsb3N0LgorQWxsIG5ldyBkZXZlbG9wbWVudCB0aGF0IGlzIGRvbmUgaW4gdGhlIGBtYXN0ZXJgIGJyYW5jaCB3aWxsIGJlCitpbmNsdWRlZCBpbiB0aGUgbmV4dCBHZXJyaXQgcmVsZWFzZS4gVXBkYXRlIHRoZSBHZXJyaXQgdmVyc2lvbiBpbiBlYWNoCitgcG9tLnhtbGAgZmlsZSB0byB0aGUgbmV4dCBgU05BUFNIT1RgdmVyc2lvbi4gUHVzaCB0aGUgY2hhbmdlIGZvcgorcmV2aWV3IGFuZCBnZXQgaXQgbWVyZ2VkLgorCis9PT09CisgdG9vbHMvdmVyc2lvbi5zaCAtLXNuYXBzaG90PTIuNgorPT09PQorCisKK1tbbWVyZ2Utc3RhYmxlXV0KK01lcmdlIGBzdGFibGVgIGludG8gYG1hc3RlcmAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQWZ0ZXIgZXZlcnkgcmVsZWFzZSwgc3RhYmxlIHNob3VsZCBiZSBtZXJnZWQgdG8gbWFzdGVyIHRvIGVuc3VyZSB0aGF0Citub25lIG9mIHRoZSBjaGFuZ2VzL2ZpeGVzIGV2ZXIgZ2V0IGxvc3QuCiAKID09PT0KICBnaXQgY29uZmlnIG1lcmdlLnN1bW1hcnkgdHJ1ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lcnJvci1icmFuY2gtbm90LWZvdW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3ItYnJhbmNoLW5vdC1mb3VuZC50eHQKaW5kZXggMmFhZDBlMS4uYmQ4ZDA5MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1icmFuY2gtbm90LWZvdW5kLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLWJyYW5jaC1ub3QtZm91bmQudHh0CkBAIC0xNSwxNCArMTUsMTQgQEAKICogdGhhdCB0aGUgYnJhbmNoIG5hbWUgaW4gdGhlIHB1c2ggc3BlY2lmaWNhdGlvbiBpcyB0eXBlZCBjb3JyZWN0bHkKICAgKGNhc2Ugc2Vuc2l0aXZlKSBhbmQKICogdGhhdCB0aGUgYnJhbmNoIHJlYWxseSBleGlzdHMgZm9yIHRoaXMgcHJvamVjdCAoaW4gdGhlIEdlcnJpdCBXZWJVSQotICBnbyB0byAnQWRtaW4nIC0+ICdQcm9qZWN0cycgYW5kIGJyb3dzZSB5b3VyIHByb2plY3QsIHRoZW4gY2xpY2sgb24KKyAgZ28gdG8gJ1Byb2plY3RzJyA+ICdMaXN0JyBhbmQgYnJvd3NlIHlvdXIgcHJvamVjdCwgdGhlbiBjbGljayBvbgogICAnQnJhbmNoZXMnIHRvIHNlZSBhbGwgZXhpc3RpbmcgYnJhbmNoZXMpLgogCiBJZiBpdCB3YXMgeW91ciBpbnRlbnRpb24gdG8gY3JlYXRlIGEgbmV3IGJyYW5jaCB5b3UgY2FuIGVpdGhlcgogCiAqIGJ5cGFzcyBjb2RlIHJldmlldyBvbiBwdXNoIGFzIGV4cGxhaW5lZCBsaW5rOnVzZXItdXBsb2FkLmh0bWwjYnlwYXNzX3Jldmlld1toZXJlXSBvcgogKiBjcmVhdGUgdGhlIG5ldyBicmFuY2ggaW4gdGhlIEdlcnJpdCBXZWJVSSBiZWZvcmUgcHVzaGluZyAoZ28gdG8KLSAgJ0FkbWluJyAtPiAnUHJvamVjdHMnIGFuZCBicm93c2UgeW91ciBwcm9qZWN0LCBpbiB0aGUgJ0JyYW5jaGVzJworICAnUHJvamVjdHMnID4gJ0xpc3QnIGFuZCBicm93c2UgeW91ciBwcm9qZWN0LCBpbiB0aGUgJ0JyYW5jaGVzJwogICB0YWIgeW91IGNhbiB0aGVuIGNyZWF0ZSBhIG5ldyBicmFuY2gpLgogCiBQbGVhc2Ugbm90ZSB0aGF0IHlvdSBuZWVkIHRvIGJlIGdyYW50ZWQgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLWNvbW1pdC1hbHJlYWR5LWV4aXN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLWNvbW1pdC1hbHJlYWR5LWV4aXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzMmM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLWNvbW1pdC1hbHJlYWR5LWV4aXN0cy50eHQKQEAgLTAsMCArMSwxNCBAQAorY29tbWl0IGFscmVhZHkgZXhpc3RzCis9PT09PT09PT09PT09PT09PT09PT0KKworV2l0aCB0aGlzIGVycm9yIG1lc3NhZ2UgR2Vycml0IHJlamVjdHMgdG8gcHVzaCBhIGNvbW1pdCB0byBhbgorZXhpc3RpbmcgY2hhbmdlIHZpYSBgcmVmcy9jaGFuZ2VzL25gIGlmIHRoZSBjb21taXQgd2FzIGFscmVhZHkKK3N1Y2Nlc3NmdWxseSBwdXNoZWQgdG8gdGhlIGNoYW5nZS4gIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBubworbmV3IGNvbW1pdCBhbmQgY29uc2VxdWVudGx5IHRoZXJlIGlzIG5vdGhpbmcgZm9yIEdlcnJpdCB0byBkby4KKworRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHJlc29sdmUgdGhpcyBlcnJvciwgcGxlYXNlCityZWZlciB0byBsaW5rOmVycm9yLW5vLW5ldy1jaGFuZ2VzLmh0bWxbbm8gbmV3IGNoYW5nZXNdLgorCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmVycm9yLW1lc3NhZ2VzLmh0bWxbR2Vycml0IEVycm9yIE1lc3NhZ2VzXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lcnJvci1pbnZhbGlkLWNoYW5nZWlkLWxpbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1pbnZhbGlkLWNoYW5nZWlkLWxpbmUudHh0CmluZGV4IDJmNTc1NDIuLjkyMzUyNjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZXJyb3ItaW52YWxpZC1jaGFuZ2VpZC1saW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLWludmFsaWQtY2hhbmdlaWQtbGluZS50eHQKQEAgLTEsOCArMSw4IEBACi1pbnZhbGlkIENoYW5nZS1JZCBsaW5lIGZvcm1hdCBpbiBjb21taXQgbWVzc2FnZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2ludmFsaWQgQ2hhbmdlLUlkIGxpbmUgZm9ybWF0IGluIGNvbW1pdCBtZXNzYWdlIGZvb3RlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFdpdGggdGhpcyBlcnJvciBtZXNzYWdlIEdlcnJpdCByZWplY3RzIHRvIHB1c2ggYSBjb21taXQgaWYgaXRzIGNvbW1pdAotbWVzc2FnZSBjb250YWlucyBhbiBpbnZhbGlkIENoYW5nZS1JZCBsaW5lLgorbWVzc2FnZSBmb290ZXIgY29udGFpbnMgYW4gaW52YWxpZCBDaGFuZ2UtSWQgbGluZS4KIAogWW91IGNhbiBzZWUgdGhlIGNvbW1pdCBtZXNzYWdlcyBmb3IgZXhpc3RpbmcgY29tbWl0cyBpbiB0aGUgaGlzdG9yeQogYnkgZG9pbmcgYSBsaW5rOmh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdC1sb2cuaHRtbFtnaXQgbG9nXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3ItbWVzc2FnZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1tZXNzYWdlcy50eHQKaW5kZXggYzlkZjg4My4uNThlOWUwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1tZXNzYWdlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9lcnJvci1tZXNzYWdlcy50eHQKQEAgLTEzLDI1ICsxMywyNiBAQAogKiBsaW5rOmVycm9yLWNoYW5nZS1jbG9zZWQuaHRtbFtjaGFuZ2UgLi4uIGNsb3NlZF0KICogbGluazplcnJvci1jaGFuZ2UtZG9lcy1ub3QtYmVsb25nLXRvLXByb2plY3QuaHRtbFtjaGFuZ2UgLi4uIGRvZXMgbm90IGJlbG9uZyB0byBwcm9qZWN0IC4uLl0KICogbGluazplcnJvci1jaGFuZ2Utbm90LWZvdW5kLmh0bWxbY2hhbmdlIC4uLiBub3QgZm91bmRdCisqIGxpbms6ZXJyb3ItY29tbWl0LWFscmVhZHktZXhpc3RzLmh0bWxbY29tbWl0IGFscmVhZHkgZXhpc3RzXQogKiBsaW5rOmVycm9yLWNvbnRhaW5zLWJhbm5lZC1jb21taXQuaHRtbFtjb250YWlucyBiYW5uZWQgY29tbWl0IC4uLl0KICogbGluazplcnJvci1oYXMtZHVwbGljYXRlcy5odG1sWy4uLiBoYXMgZHVwbGljYXRlc10KICogbGluazplcnJvci1pbnZhbGlkLWF1dGhvci5odG1sW2ludmFsaWQgYXV0aG9yXQotKiBsaW5rOmVycm9yLWludmFsaWQtY2hhbmdlaWQtbGluZS5odG1sW2ludmFsaWQgQ2hhbmdlLUlkIGxpbmUgZm9ybWF0IGluIGNvbW1pdCBtZXNzYWdlXQorKiBsaW5rOmVycm9yLWludmFsaWQtY2hhbmdlaWQtbGluZS5odG1sW2ludmFsaWQgQ2hhbmdlLUlkIGxpbmUgZm9ybWF0IGluIGNvbW1pdCBtZXNzYWdlIGZvb3Rlcl0KICogbGluazplcnJvci1pbnZhbGlkLWNvbW1pdHRlci5odG1sW2ludmFsaWQgY29tbWl0dGVyXQotKiBsaW5rOmVycm9yLW1pc3NpbmctY2hhbmdlaWQuaHRtbFttaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZV0KLSogbGluazplcnJvci1tdWx0aXBsZS1jaGFuZ2VpZC1saW5lcy5odG1sW211bHRpcGxlIENoYW5nZS1JZCBsaW5lcyBpbiBjb21taXQgbWVzc2FnZV0KKyogbGluazplcnJvci1taXNzaW5nLWNoYW5nZWlkLmh0bWxbbWlzc2luZyBDaGFuZ2UtSWQgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyXQorKiBsaW5rOmVycm9yLW11bHRpcGxlLWNoYW5nZWlkLWxpbmVzLmh0bWxbbXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlIGZvb3Rlcl0KICogbGluazplcnJvci1uby1jaGFuZ2VzLW1hZGUuaHRtbFtubyBjaGFuZ2VzIG1hZGVdCiAqIGxpbms6ZXJyb3Itbm8tY29tbW9uLWFuY2VzdHJ5Lmh0bWxbbm8gY29tbW9uIGFuY2VzdHJ5XQogKiBsaW5rOmVycm9yLW5vLW5ldy1jaGFuZ2VzLmh0bWxbbm8gbmV3IGNoYW5nZXNdCiAqIGxpbms6ZXJyb3Itbm9uLWZhc3QtZm9yd2FyZC5odG1sW25vbi1mYXN0IGZvcndhcmRdCiAqIGxpbms6ZXJyb3Itbm90LWEtZ2Vycml0LWFkbWluaXN0cmF0b3IuaHRtbFtOb3QgYSBHZXJyaXQgYWRtaW5pc3RyYXRvcl0KLSogbGluazplcnJvci1ub3QtYS1nZXJyaXQtcHJvamVjdC5odG1sW25vdCBhIEdlcnJpdCBwcm9qZWN0XQogKiBsaW5rOmVycm9yLW5vdC1wZXJtaXR0ZWQtdG8tY3JlYXRlLmh0bWxbTm90IHBlcm1pdHRlZCB0byBjcmVhdGUgLi4uXQotKiBsaW5rOmVycm9yLW5vdC1zaWduZWQtb2ZmLWJ5Lmh0bWxbbm90IFNpZ25lZC1vZmYtYnkgYXV0aG9yL2NvbW1pdHRlci91cGxvYWRlcl0KKyogbGluazplcnJvci1ub3Qtc2lnbmVkLW9mZi1ieS5odG1sW25vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyXQogKiBsaW5rOmVycm9yLW5vdC12YWxpZC1yZWYuaHRtbFtub3QgdmFsaWQgcmVmXQogKiBsaW5rOmVycm9yLWNoYW5nZS11cGxvYWQtYmxvY2tlZC5odG1sW09uZSBvciBtb3JlIHJlZnMvZm9yLyBuYW1lcyBibG9ja3MgY2hhbmdlIHVwbG9hZF0KICogbGluazplcnJvci1wZXJtaXNzaW9uLWRlbmllZC5odG1sW1Blcm1pc3Npb24gZGVuaWVkIChwdWJsaWNrZXkpXQogKiBsaW5rOmVycm9yLXByb2hpYml0ZWQtYnktZ2Vycml0Lmh0bWxbcHJvaGliaXRlZCBieSBHZXJyaXRdCisqIGxpbms6ZXJyb3ItcHJvamVjdC1ub3QtZm91bmQuaHRtbFtQcm9qZWN0IG5vdCBmb3VuZDogLi4uXQogKiBsaW5rOmVycm9yLXNxdWFzaC1jb21taXRzLWZpcnN0Lmh0bWxbc3F1YXNoIGNvbW1pdHMgZmlyc3RdCiAqIGxpbms6ZXJyb3ItdXBsb2FkLWRlbmllZC5odG1sW1VwbG9hZCBkZW5pZWQgZm9yIHByb2plY3QgXCcuLi4nXQogKiBsaW5rOmVycm9yLW5vdC1hbGxvd2VkLXRvLXVwbG9hZC1tZXJnZXMuaHRtbFt5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIHVwbG9hZCBtZXJnZXNdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW1pc3NpbmctY2hhbmdlaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1taXNzaW5nLWNoYW5nZWlkLnR4dAppbmRleCBkYWExZDQ2Li5iMTNmM2I0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW1pc3NpbmctY2hhbmdlaWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3ItbWlzc2luZy1jaGFuZ2VpZC50eHQKQEAgLTEsMTAgKzEsMTAgQEAKLW1pc3NpbmcgQ2hhbmdlLUlkIGluIGNvbW1pdCBtZXNzYWdlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorbWlzc2luZyBDaGFuZ2UtSWQgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogV2l0aCB0aGlzIGVycm9yIG1lc3NhZ2UgR2Vycml0IHJlamVjdHMgdG8gcHVzaCBhIGNvbW1pdCB0byBhIHByb2plY3QKIHdoaWNoIGlzIGNvbmZpZ3VyZWQgdG8gYWx3YXlzIHJlcXVpcmUgYSBDaGFuZ2UtSWQgaW4gdGhlIGNvbW1pdAogbWVzc2FnZSBpZiB0aGUgY29tbWl0IG1lc3NhZ2Ugb2YgdGhlIHB1c2hlZCBjb21taXQgZG9lcyBub3QgY29udGFpbgotYSBDaGFuZ2UtSWQuCithIENoYW5nZS1JZCBpbiB0aGUgZm9vdGVyICh0aGUgbGFzdCBwYXJhZ3JhcGgpLgogCiBUaGlzIGVycm9yIG1heSBoYXBwZW4gZm9yIHR3byByZWFzb25zOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW11bHRpcGxlLWNoYW5nZWlkLWxpbmVzLnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3ItbXVsdGlwbGUtY2hhbmdlaWQtbGluZXMudHh0CmluZGV4IGU2MDQ5NzQuLjlmYTJiOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZXJyb3ItbXVsdGlwbGUtY2hhbmdlaWQtbGluZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3ItbXVsdGlwbGUtY2hhbmdlaWQtbGluZXMudHh0CkBAIC0xLDggKzEsOCBAQAotbXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK211bHRpcGxlIENoYW5nZS1JZCBsaW5lcyBpbiBjb21taXQgbWVzc2FnZSBmb290ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogV2l0aCB0aGlzIGVycm9yIG1lc3NhZ2UgR2Vycml0IHJlamVjdHMgdG8gcHVzaCBhIGNvbW1pdCBpZiB0aGUgY29tbWl0Ci1tZXNzYWdlIG9mIHRoZSBwdXNoZWQgY29tbWl0IGNvbnRhaW5zIHNldmVyYWwgQ2hhbmdlLUlkIGxpbmVzLgorbWVzc2FnZSBmb290ZXIgb2YgdGhlIHB1c2hlZCBjb21taXQgY29udGFpbnMgc2V2ZXJhbCBDaGFuZ2UtSWQgbGluZXMuCiAKIFlvdSBjYW4gc2VlIHRoZSBjb21taXQgbWVzc2FnZXMgZm9yIGV4aXN0aW5nIGNvbW1pdHMgaW4gdGhlIGhpc3RvcnkKIGJ5IGRvaW5nIGEgbGluazpodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy9naXQtbG9nLmh0bWxbZ2l0IGxvZ10uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW5vdC1hLWdlcnJpdC1wcm9qZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LWEtZ2Vycml0LXByb2plY3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM5OGFlLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LWEtZ2Vycml0LXByb2plY3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotbm90IGEgR2Vycml0IHByb2plY3QKLT09PT09PT09PT09PT09PT09PT09Ci0KLVdpdGggdGhpcyBlcnJvciBtZXNzYWdlIEdlcnJpdCByZWplY3RzIHRvIHB1c2ggYSBjb21taXQgaWYgdGhlIGdpdAotcmVwb3NpdG9yeSB0byB3aGljaCB0aGUgcHVzaCBpcyBkb25lIGRvZXMgbm90IGV4aXN0IGFzIGEgcHJvamVjdCBpbgotdGhlIEdlcnJpdCBzZXJ2ZXIgb3IgaWYgdGhlIHB1c2hpbmcgdXNlciBoYXMgbm8gcmVhZCBhY2Nlc3MgZm9yIHRoaXMKLXByb2plY3QuCi0KLVRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIEdlcnJpdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcGF0aCBvZgotaXRzIGdpdCByZXBvc2l0b3J5IChleGNsdWRpbmcgdGhlICcuZ2l0JyBleHRlbnNpb24pLgotCi1JZiB5b3UgYXJlIGZhY2luZyB0aGlzIHByb2JsZW0sIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLS4gVmVyaWZ5IHRoYXQgdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgYXMgZ2l0IHJlcG9zaXRvcnkgaW4gdGhlCi0gIHB1c2ggY29tbWFuZCBpcyB0eXBlZCBjb3JyZWN0bHkgKGNhc2Ugc2Vuc2l0aXZlKS4KLS4gVmVyaWZ5IHRoYXQgeW91IGFyZSBwdXNoaW5nIHRvIHRoZSBjb3JyZWN0IEdlcnJpdCBzZXJ2ZXIuCi0uIEdvIGluIHRoZSBHZXJyaXQgV2ViVUkgdG8gJ0FkbWluJyAtPiAnUHJvamVjdHMnIGFuZCBjaGVjayB0aGF0IHRoZQotICBwcm9qZWN0IGlzIGxpc3RlZC4gSWYgdGhlIHByb2plY3QgaXMgbm90IGxpc3RlZCB0aGUgcHJvamVjdCBlaXRoZXIKLSAgZG9lcyBub3QgZXhpc3Qgb3IgeW91IGRvbid0IGhhdmUKLSAgbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X3JlYWRbJ1JlYWQnXSBhY2Nlc3MgZm9yIGl0LiBUaGlzCi0gIG1lYW5zIGlmIHlvdSBhcmUgY2VydGFpbiB0aGF0IHRoZSBwcm9qZWN0IG5hbWUgaXMgcmlnaHQgeW91IHNob3VsZAotICBjb250YWN0IHRoZSBHZXJyaXQgQWRtaW5pc3RyYXRvciBvciBwcm9qZWN0IG93bmVyIHRvIHJlcXVlc3QgYWNjZXNzCi0gIHRvIHRoZSBwcm9qZWN0LgotCi1UaGlzIGVycm9yIG1lc3NhZ2UgbWlnaHQgYmUgbWlzbGVhZGluZyBpZiB0aGUgcHJvamVjdCBhY3R1YWxseSBleGlzdHMKLWJ1dCB0aGUgcHVzaCBpcyBmYWlsaW5nIGJlY2F1c2UgdGhlIHB1c2hpbmcgdXNlciBoYXMgbm8gcmVhZCBhY2Nlc3MKLWZvciB0aGUgcHJvamVjdC4gVGhlIHJlYXNvbiB0aGF0IEdlcnJpdCBpbiB0aGlzIGNhc2UgZGVuaWVzIHRoZQotZXhpc3RlbmNlIG9mIHRoZSBwcm9qZWN0IGlzIHRvIHByZXZlbnQgdXNlcnMgZnJvbSBwcm9iaW5nIHRoZSBHZXJyaXQKLXNlcnZlciB0byBzZWUgaWYgYSBwYXJ0aWN1bGFyIHByb2plY3QgZXhpc3RzLgotCi0KLUdFUlJJVAotLS0tLS0tCi1QYXJ0IG9mIGxpbms6ZXJyb3ItbWVzc2FnZXMuaHRtbFtHZXJyaXQgRXJyb3IgTWVzc2FnZXNdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW5vdC1zaWduZWQtb2ZmLWJ5LnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LXNpZ25lZC1vZmYtYnkudHh0CmluZGV4IDAwZjE3OWIuLmJkMWY0MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LXNpZ25lZC1vZmYtYnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LXNpZ25lZC1vZmYtYnkudHh0CkBAIC0xLDEwICsxLDEwIEBACi1ub3QgU2lnbmVkLW9mZi1ieSBhdXRob3IvY29tbWl0dGVyL3VwbG9hZGVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citub3QgU2lnbmVkLW9mZi1ieSBhdXRob3IvY29tbWl0dGVyL3VwbG9hZGVyIGluIGNvbW1pdCBtZXNzYWdlIGZvb3RlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogUHJvamVjdHMgaW4gR2Vycml0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJlcXVpcmUgYSBsaW5rOnVzZXItc2lnbmVkb2ZmYnkuaHRtbCNTaWduZWQtb2ZmLWJ5W1NpZ25lZC1vZmYtYnldIGluCi10aGUgY29tbWl0IG1lc3NhZ2UgdG8gZW5mb3JjZSB0aGF0IGV2ZXJ5IGNoYW5nZSBpcyBzaWduZWQgYnkgdGhlCit0aGUgZm9vdGVyIG9mIHRoZSBjb21taXQgbWVzc2FnZSB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2hhbmdlIGlzIHNpZ25lZCBieSB0aGUKIGF1dGhvciwgY29tbWl0dGVyIG9yIHVwbG9hZGVyLiBJZiBmb3IgYSBwcm9qZWN0IGEgU2lnbmVkLW9mZi1ieSBpcwotcmVxdWlyZWQgYW5kIHRoZSBjb21taXQgbWVzc2FnZSBkb2VzIG5vdCBjb250YWluIGl0LCBHZXJyaXQgcmVqZWN0cworcmVxdWlyZWQgYW5kIHRoZSBjb21taXQgbWVzc2FnZSBmb290ZXIgZG9lcyBub3QgY29udGFpbiBpdCwgR2Vycml0IHJlamVjdHMKIHRvIHB1c2ggdGhlIGNvbW1pdCB3aXRoIHRoaXMgZXJyb3IgbWVzc2FnZS4KIAogVGhpcyBwb2xpY3kgY2FuIGJlIGJ5cGFzc2VkIGJ5IGhhdmluZyB0aGUgYWNjZXNzIHJpZ2h0CkBAIC0xMywxMSArMTMsMTEgQEAKIFRoaXMgZXJyb3IgbWF5IGhhcHBlbiBmb3IgZGlmZmVyZW50IHJlYXNvbnMgaWYgeW91IGRvIG5vdCBoYXZlIHRoZQogYWNjZXNzIHJpZ2h0IHRvIGZvcmdlIHRoZSBjb21taXR0ZXIgaWRlbnRpdHk6CiAKLS4gbWlzc2luZyBTaWduZWQtb2ZmLWJ5IGluIHRoZSBjb21taXQgbWVzc2FnZQotLiBTaWduZWQtb2ZmLWJ5IGlzIGNvbnRhaW5lZCBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYnV0IGl0J3MgbmVpdGhlcgorLiBtaXNzaW5nIFNpZ25lZC1vZmYtYnkgaW4gdGhlIGNvbW1pdCBtZXNzYWdlIGZvb3RlcgorLiBTaWduZWQtb2ZmLWJ5IGlzIGNvbnRhaW5lZCBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgZm9vdGVyIGJ1dCBpdCdzIG5laXRoZXIKICAgZnJvbSB0aGUgYXV0aG9yLCBjb21taXR0ZXIgbm9yIHVwbG9hZGVyCiAuIFNpZ25lZC1vZmYtYnkgZnJvbSB0aGUgYXV0aG9yLCBjb21taXR0ZXIgb3IgdXBsb2FkZXIgaXMgY29udGFpbmVkCi0gIGluIHRoZSBjb21taXQgbWVzc2FnZSBidXQgbm90IGluIHRoZSBsYXN0IHBhcmFncmFwaAorICBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYnV0IG5vdCBpbiB0aGUgZm9vdGVyIChsYXN0IHBhcmFncmFwaCkKIAogVG8gYmUgYWJsZSB0byBwdXNoIHlvdXIgY29tbWl0cyB5b3UgaGF2ZSB0byB1cGRhdGUgdGhlIGNvbW1pdAogbWVzc2FnZXMgYXMgZXhwbGFpbmVkIGxpbms6ZXJyb3ItcHVzaC1mYWlscy1kdWUtdG8tY29tbWl0LW1lc3NhZ2UuaHRtbFtoZXJlXSBzbyB0aGF0IHRoZXkgY29udGFpbiBhIFNpZ25lZC1vZmYtYnkgZnJvbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lcnJvci1wcm9qZWN0LW5vdC1mb3VuZC50eHQgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLXByb2plY3Qtbm90LWZvdW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmMwMTQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9lcnJvci1wcm9qZWN0LW5vdC1mb3VuZC50eHQKQEAgLTAsMCArMSwzNCBAQAorUHJvamVjdCBub3QgZm91bmQ6IC4uLgorPT09PT09PT09PT09PT09PT09PT09PQorCitXaXRoIHRoaXMgZXJyb3IgbWVzc2FnZSBHZXJyaXQgcmVqZWN0cyB0byBwdXNoIGEgY29tbWl0IGlmIHRoZSBnaXQKK3JlcG9zaXRvcnkgdG8gd2hpY2ggdGhlIHB1c2ggaXMgZG9uZSBkb2VzIG5vdCBleGlzdCBhcyBhIHByb2plY3QgaW4KK3RoZSBHZXJyaXQgc2VydmVyIG9yIGlmIHRoZSBwdXNoaW5nIHVzZXIgaGFzIG5vIHJlYWQgYWNjZXNzIGZvciB0aGlzCitwcm9qZWN0LgorCitUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiBHZXJyaXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHBhdGggb2YKK2l0cyBnaXQgcmVwb3NpdG9yeSAoZXhjbHVkaW5nIHRoZSAnLmdpdCcgZXh0ZW5zaW9uKS4KKworSWYgeW91IGFyZSBmYWNpbmcgdGhpcyBwcm9ibGVtLCBkbyB0aGUgZm9sbG93aW5nOgorCisuIFZlcmlmeSB0aGF0IHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGFzIGdpdCByZXBvc2l0b3J5IGluIHRoZQorICBwdXNoIGNvbW1hbmQgaXMgdHlwZWQgY29ycmVjdGx5IChjYXNlIHNlbnNpdGl2ZSkuCisuIFZlcmlmeSB0aGF0IHlvdSBhcmUgcHVzaGluZyB0byB0aGUgY29ycmVjdCBHZXJyaXQgc2VydmVyLgorLiBHbyBpbiB0aGUgR2Vycml0IFdlYlVJIHRvICdQcm9qZWN0cycgPiAnTGlzdCcgYW5kIGNoZWNrIHRoYXQgdGhlCisgIHByb2plY3QgaXMgbGlzdGVkLiBJZiB0aGUgcHJvamVjdCBpcyBub3QgbGlzdGVkIHRoZSBwcm9qZWN0IGVpdGhlcgorICBkb2VzIG5vdCBleGlzdCBvciB5b3UgZG9uJ3QgaGF2ZQorICBsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfcmVhZFsnUmVhZCddIGFjY2VzcyBmb3IgaXQuIFRoaXMKKyAgbWVhbnMgaWYgeW91IGFyZSBjZXJ0YWluIHRoYXQgdGhlIHByb2plY3QgbmFtZSBpcyByaWdodCB5b3Ugc2hvdWxkCisgIGNvbnRhY3QgdGhlIEdlcnJpdCBBZG1pbmlzdHJhdG9yIG9yIHByb2plY3Qgb3duZXIgdG8gcmVxdWVzdCBhY2Nlc3MKKyAgdG8gdGhlIHByb2plY3QuCisKK1RoaXMgZXJyb3IgbWVzc2FnZSBtaWdodCBiZSBtaXNsZWFkaW5nIGlmIHRoZSBwcm9qZWN0IGFjdHVhbGx5IGV4aXN0cworYnV0IHRoZSBwdXNoIGlzIGZhaWxpbmcgYmVjYXVzZSB0aGUgcHVzaGluZyB1c2VyIGhhcyBubyByZWFkIGFjY2VzcworZm9yIHRoZSBwcm9qZWN0LiBUaGUgcmVhc29uIHRoYXQgR2Vycml0IGluIHRoaXMgY2FzZSBkZW5pZXMgdGhlCitleGlzdGVuY2Ugb2YgdGhlIHByb2plY3QgaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHByb2JpbmcgdGhlIEdlcnJpdAorc2VydmVyIHRvIHNlZSBpZiBhIHBhcnRpY3VsYXIgcHJvamVjdCBleGlzdHMuCisKKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazplcnJvci1tZXNzYWdlcy5odG1sW0dlcnJpdCBFcnJvciBNZXNzYWdlc10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTE4bi1yZWFkbWUudHh0IGIvRG9jdW1lbnRhdGlvbi9pMThuLXJlYWRtZS50eHQKaW5kZXggYTg0YzNkYy4uMjEzNTU5OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMThuLXJlYWRtZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pMThuLXJlYWRtZS50eHQKQEAgLTUsMjIgKzUsMTIgQEAKIHRoZSB3YXkgdGhlIGNvZGUgcHJvZHVjZXMgb3V0cHV0LiAgTW9zdCBvZiB0aGUgVUkgc2hvdWxkIHN1cHBvcnQKIHJpZ2h0LXRvLWxlZnQgKFJUTCkgbGFuZ3VhZ2VzLgogCitMYWJlbHMKKy0tLS0tLQogCi1BcHByb3ZhbENhdGVnb3J5Ci0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBnZXROYW1lKCkgZnVuY3Rpb24gcHJvZHVjZXMgb25seSBhIHNpbmdsZSB0cmFuc2xhdGlvbiBvZiB0aGUKLWRlc2NyaXB0aW9uIHN0cmluZy4gIFRoaXMgbmFtZSBpcyBzZXQgYnkgdGhlIEdlcnJpdCBhZG1pbmlzdHJhdG9yLAotd2hpY2ggbWF5IGNhdXNlIHByb2JsZW1zIGlmIHRoZSBzaXRlIGlzIHRyYW5zbGF0ZWQgaW50byBtdWx0aXBsZQotbGFuZ3VhZ2VzIGFuZCBkaWZmZXJlbnQgdXNlcnMgd2FudCBkaWZmZXJlbnQgdHJhbnNsYXRpb25zLgotCi1BcHByb3ZhbENhdGVnb3J5VmFsdWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgZ2V0TmFtZSgpIGZ1bmN0aW9uIHByb2R1Y2VzIG9ubHkgYSBzaW5nbGUgdHJhbnNsYXRpb24gb2YgdGhlCi1kZXNjcmlwdGlvbiBzdHJpbmcuICBUaGlzIG5hbWUgaXMgc2V0IGJ5IHRoZSBHZXJyaXQgYWRtaW5pc3RyYXRvciwKLXdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBpZiB0aGUgc2l0ZSBpcyB0cmFuc2xhdGVkIGludG8gbXVsdGlwbGUKLWxhbmd1YWdlcyBhbmQgZGlmZmVyZW50IHVzZXJzIHdhbnQgZGlmZmVyZW50IHRyYW5zbGF0aW9ucy4KK0xhYmVscyBhbmQgdGhlaXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHByb2plY3QuY29uZmlnIGJ5IHRoZSBHZXJyaXQKK2FkbWluaXN0cmF0b3Igb3IgcHJvamVjdCBvd25lcnMuICBPbmx5IGEgc2luZ2xlIHRyYW5zbGF0aW9uIG9mIHRoZXNlCitzdHJpbmdzIGlzIHN1cHBvcnRlZC4KIAogL0dlcnJpdCBHZXJyaXQuaHRtbAogLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnR4dAppbmRleCA0YzIzMzVmLi45YjJkOGViIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luZGV4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnR4dApAQCAtNiwyOCArNiwzNiBAQAogCiAqIGxpbms6aW50cm8tcXVpY2suaHRtbFtBIFF1aWNrIEludHJvZHVjdGlvbiBUbyBHZXJyaXRdCiAKLVVzZXIgR3VpZGUKLS0tLS0tLS0tLS0KK0VuZCBVc2VyIEd1aWRlCistLS0tLS0tLS0tLS0tLQogCi0qIGxpbms6aHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9zdWJtaXQtcGF0Y2hlcy93b3JrZmxvd1tEZWZhdWx0IFdvcmtmbG93XQorKiBFeHRlcm5hbCBsaW5rOiBsaW5rOmh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc3VibWl0LXBhdGNoZXMvd29ya2Zsb3dbRGVmYXVsdCBBbmRyb2lkIFdvcmtmbG93XQogKiBsaW5rOnVzZXItc2VhcmNoLmh0bWxbU2VhcmNoaW5nIENoYW5nZXNdCiAqIGxpbms6Y21kLWluZGV4Lmh0bWxbQ29tbWFuZCBMaW5lIFRvb2xzXQotKiBsaW5rOnBnbS1pbmRleC5odG1sW1NlcnZlciBQcm9ncmFtc10KICogbGluazp1c2VyLXVwbG9hZC5odG1sW1VwbG9hZGluZyBDaGFuZ2VzXQogKiBsaW5rOnVzZXItY2hhbmdlaWQuaHRtbFtDaGFuZ2UtSWQgTGluZXNdCiAqIGxpbms6dXNlci1zaWduZWRvZmZieS5odG1sW1NpZ25lZC1vZmYtYnkgTGluZXNdCi0qIGxpbms6YWNjZXNzLWNvbnRyb2wuaHRtbFtBY2Nlc3MgQ29udHJvbHNdCiAqIGxpbms6ZXJyb3ItbWVzc2FnZXMuaHRtbFtFcnJvciBNZXNzYWdlc10KLSogbGluazpyZXN0LWFwaS5odG1sW1JFU1QgQVBJXQotKiBsaW5rOnVzZXItY3VzdG9tLWRhc2hib2FyZHMuaHRtbFtDdXN0b20gRGFzaGJvYXJkc10KICogbGluazp1c2VyLW5vdGlmeS5odG1sW1N1YnNjcmliaW5nIHRvIEVtYWlsIE5vdGlmaWNhdGlvbnNdCisKK1Byb2plY3QgT3duZXIgYW5kIFBvd2VyIFVzZXIgR3VpZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWxbQWNjZXNzIENvbnRyb2xzXQorKiBsaW5rOnJlc3QtYXBpLmh0bWxbUkVTVCBBUEldCisqIGxpbms6dXNlci1kYXNoYm9hcmRzLmh0bWxbRGFzaGJvYXJkc10KICogbGluazp1c2VyLXN1Ym1vZHVsZXMuaHRtbFtTdWJzY3JpYmluZyB0byBHaXQgU3VibW9kdWxlc10KLSogbGluazpyZWZzLW5vdGVzLXJldmlldy5odG1sW1RoZSBgcmVmcy9ub3Rlcy9yZXZpZXdgIG5hbWVzcGFjZV0KICogbGluazpwcm9sb2ctY29va2Jvb2suaHRtbFtQcm9sb2cgQ29va2Jvb2tdCiAqIGxpbms6cHJvbG9nLWNoYW5nZS1mYWN0cy5odG1sW1Byb2xvZyBGYWN0cyBmb3IgR2Vycml0IENoYW5nZXNdCisqIGxpbms6Y29uZmlnLWxhYmVscy5odG1sW1JldmlldyBMYWJlbHNdCisKK0FkbWluIFVzZXIgR3VpZGUKKy0tLS0tLS0tLS0tLS0tLS0KKworKiBsaW5rOnBnbS1pbmRleC5odG1sW1NlcnZlciBTaWRlIEFkbWluaXN0cmF0aXZlIFRvb2xzXQogCiBJbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLQorfn5+fn5+fn5+fn5+CiAKICogbGluazpsaWNlbnNlcy5odG1sW0xpY2Vuc2VzIGFuZCBOb3RpY2VzXQogKiBsaW5rOmluc3RhbGwuaHRtbFtJbnN0YWxsYXRpb24gR3VpZGVdCkBAIC0zNSw3ICs0Myw3IEBACiAqIGxpbms6cHJvamVjdC1zZXR1cC5odG1sW1Byb2plY3QgU2V0dXBdCiAKIENvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0KK35+fn5+fn5+fn5+fn4KIAogKiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbFtTeXN0ZW0gU2V0dGluZ3NdCiAqIGxpbms6Y29uZmlnLWNvbnRhY3QuaHRtbFtVc2VyIENvbnRhY3QgSW5mb3JtYXRpb25dCkBAIC00NSwxNCArNTMsMTYgQEAKICogbGluazpjb25maWctcmV2ZXJzZXByb3h5Lmh0bWxbUmV2ZXJzZSBQcm94eV0KICogbGluazpjb25maWctaG9va3MuaHRtbFtIb29rc10KICogbGluazpjb25maWctbWFpbC5odG1sW01haWwgVGVtcGxhdGVzXQorKiBsaW5rOmNvbmZpZy1jbGEuaHRtbFtDb250cmlidXRvciBBZ3JlZW1lbnRzXQogCi1EZXZlbG9wZXIgRG9jdW1lbnRhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dlcnJpdCBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICogbGluazpkZXYtcmVhZG1lLmh0bWxbRGV2ZWxvcGVyIFNldHVwXQogKiBsaW5rOmRldi1lY2xpcHNlLmh0bWxbRWNsaXBzZSBTZXR1cF0KICogbGluazpkZXYtY29udHJpYnV0aW5nLmh0bWxbQ29udHJpYnV0aW5nIHRvIEdlcnJpdF0KICogbGluazpkZXYtcGx1Z2lucy5odG1sW0RldmVsb3BpbmcgUGx1Z2luc10KKyogbGluazpjb25maWctdmFsaWRhdGlvbi5odG1sW0NvbW1pdCBWYWxpZGF0aW9uXQogKiBsaW5rOmRldi1kZXNpZ24uaHRtbFtTeXN0ZW0gRGVzaWduXQogKiBsaW5rOmkxOG4tcmVhZG1lLmh0bWxbaTE4biBTdXBwb3J0XQogKiBsaW5rOmRldi1yZWxlYXNlLmh0bWxbRGV2ZWxvcGVyIFJlbGVhc2VdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtajJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtajJlZS50eHQKaW5kZXggOTY4MTRhMC4uNDkyNzA0MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLWoyZWUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC1qMmVlLnR4dApAQCAtMjcsMTIgKzI3LDYgQEAKICAgcmV2aWV3X3NpdGUvYmluL2dlcnJpdC5zaCBzdG9wCiAtLS0tCiAKLSogRGVwbG95IHRoZSAnZ2Vycml0LndhcicgZmlsZSB0byB5b3VyIGFwcGxpY2F0aW9uIHNlcnZlci4KLSsKLVRoZSBkZXBsb3ltZW50IHByb2Nlc3MgZGlmZmVycyBiZXR3ZWVuIHNlcnZlcnMsIGJ1dCB0eXBpY2FsbHkgdGhpcwotY2FuIGJlIGFjY29tcGxpc2hlZCBieSBjb3B5aW5nICdnZXJyaXQud2FyJyBpbnRvIHRoZSAnd2ViYXBwcy8nCi1zdWJkaXJlY3Rvcnkgb2YgdGhlIGNvbnRhaW5lcidzIGluc3RhbGxhdGlvbi4KLQogKiBDb25maWd1cmUgSk5ESSBEYXRhU291cmNlICdqZGJjL1Jldmlld0RiJy4KICsKIFRoaXMgRGF0YVNvdXJjZSBtdXN0IHBvaW50IHRvIHRoZSBkYXRhYmFzZSB5b3UgY3JlYXRlZCBhYm92ZS4KQEAgLTQwLDYgKzM0LDEyIEBACiBuZWNlc3NhcnkgSkRCQyBkcml2ZXJzLiAgWW91IG1heSB3aXNoIHRvIGVuc3VyZSBjb25uZWN0aW9uIHBvb2xpbmcKIGlzIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQgd2l0aGluIHRoZSBEYXRhU291cmNlLgogCisqIERlcGxveSB0aGUgJ2dlcnJpdC53YXInIGZpbGUgdG8geW91ciBhcHBsaWNhdGlvbiBzZXJ2ZXIuCisrCitUaGUgZGVwbG95bWVudCBwcm9jZXNzIGRpZmZlcnMgYmV0d2VlbiBzZXJ2ZXJzLCBidXQgdHlwaWNhbGx5IHRoaXMKK2NhbiBiZSBhY2NvbXBsaXNoZWQgYnkgY29weWluZyAnZ2Vycml0LndhcicgaW50byB0aGUgJ3dlYmFwcHMvJworc3ViZGlyZWN0b3J5IG9mIHRoZSBjb250YWluZXIncyBpbnN0YWxsYXRpb24uCisKICogKCdPcHRpb25hbCcpIEluc3RhbGwgQm91bmN5IENhc3RsZSBDcnlwdG8gQVBJCiArCiBJZiB5b3UgZW5hYmxlZCBCb3VuY3kgQ2FzdGxlIENyeXB0byBkdXJpbmcgJ2luaXQnLCBjb3B5IHRoZSBKQVIKQEAgLTEwMSw4ICsxMDEsOCBAQAogc2NyaXB0IGFuZCBtb2RpZnkgaXQgZm9yIHlvdXIgY29uZmlndXJhdGlvbjoKIAogLS0tLQotICBqYXZhIC1qYXIgd2ViYXBwcy9nZXJyaXQud2FyIC0tY2F0IGV4dHJhL2pldHR5Ny9nZXJyaXQtamV0dHkuc2ggPi9ldGMvaW5pdC5kL2dlcnJpdC1qZXR0eS5zaAotICB2aSAvZXRjL2luaXQuZC9nZXJyaXQtamV0dHkuc2gKKyAgamF2YSAtamFyIHdlYmFwcHMvZ2Vycml0LndhciAtLWNhdCBleHRyYS9qZXR0eTcvZ2Vycml0LWpldHR5LnNoID4vZXRjL2luaXQuZC9nZXJyaXQtamV0dHkKKyAgdmkgL2V0Yy9pbml0LmQvZ2Vycml0LWpldHR5CiAtLS0tCiAKIFtUSVBdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtcXVpY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXF1aWNrLnR4dAppbmRleCBjMDljMTk3Li5mMWJkMjVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtcXVpY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC1xdWljay50eHQKQEAgLTEwOSwxMzcgKzEwOSw3IEBACiAgIGdlcnJpdDJAaG9zdDp+JAogLS0tLQogCi1bW3VzZXJzZXR1cF1dCi1UaGUgZmlyc3QgdXNlcgotLS0tLS0tLS0tLS0tLS0KLQotSXQncyB0aW1lIHRvIGV4aXQgdGhlIGdlcnJpdDIgYWNjb3VudCBhcyB5b3Ugbm93IGhhdmUgR2Vycml0IHJ1bm5pbmcgb24geW91cgotaG9zdCBhbmQgc2V0dXAgeW91ciBmaXJzdCB3b3Jrc3BhY2UuCi0KLVN0YXJ0IGEgc2hlbGwgd2l0aCB0aGUgY3JlZGVudGlhbHMgb2YgdGhlIGFjY291bnQgeW91IHdpbGwgcGVyZm9ybQotZGV2ZWxvcG1lbnQgdW5kZXIuCi0KLUNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzc2gga2V5cyBhbHJlYWR5LiBZb3UncmUgbG9va2luZyBmb3IgdHdvIGZpbGVzLAotaWRfcnNhIGFuZCBpZF9yc2EucHViLgotCi0tLS0tCi0gIHVzZXJAaG9zdDp+JCBscyAuc3NoCi0gIGF1dGhvcml6ZWRfa2V5cyAgY29uZmlnICBpZF9yc2EgIGlkX3JzYS5wdWIgIGtub3duX2hvc3RzCi0gIHVzZXJAaG9zdDp+JAotLS0tLQotCi1JZiB5b3UgaGF2ZSB0aGUgZmlsZXMsIHlvdSBtYXkgc2tpcCB0aGUga2V5IGdlbmVyYXRpbmcgc3RlcC4KLQotSWYgeW91IGRvbid0IHNlZSB0aGUgZmlsZXMgaW4geW91ciBsaXN0aW5nLCB5b3VyIHdpbGwgaGF2ZSB0byBnZW5lcmF0ZSByc2EKLWtleXMgZm9yIHlvdXIgc3NoIHNlc3Npb25zOgotCi1TU0gga2V5IGdlbmVyYXRpb24KLX5+fn5+fn5+fn5+fn5+fn5+fgotCi0qUGxlYXNlIGRvbid0IGdlbmVyYXRlIG5ldyBrZXlzIGlmIHlvdSBhbHJlYWR5IGhhdmUgYSB2YWxpZCBrZXlwYWlyISoKLSpUaGV5IHdpbGwgYmUgb3ZlcndyaXR0ZW4hKgotCi0tLS0tCi0gIHVzZXJAaG9zdDp+JCBzc2gta2V5Z2VuIC10IHJzYQotICBHZW5lcmF0aW5nIHB1YmxpYy9wcml2YXRlIHJzYSBrZXkgcGFpci4KLSAgRW50ZXIgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBrZXkgKC9ob21lL3VzZXIvLnNzaC9pZF9yc2EpOgotICBDcmVhdGVkIGRpcmVjdG9yeSAnL2hvbWUvdXNlci8uc3NoJy4KLSAgRW50ZXIgcGFzc3BocmFzZSAoZW1wdHkgZm9yIG5vIHBhc3NwaHJhc2UpOgotICBFbnRlciBzYW1lIHBhc3NwaHJhc2UgYWdhaW46Ci0gIFlvdXIgaWRlbnRpZmljYXRpb24gaGFzIGJlZW4gc2F2ZWQgaW4gL2hvbWUvdXNlci8uc3NoL2lkX3JzYS4KLSAgWW91ciBwdWJsaWMga2V5IGhhcyBiZWVuIHNhdmVkIGluIC9ob21lL3VzZXIvLnNzaC9pZF9yc2EucHViLgotICBUaGUga2V5IGZpbmdlcnByaW50IGlzOgotICAwMDoxMToyMjowMDoxMToyMjowMDoxMTo0NDowMDoxMToyMjowMDoxMToyMjo5OSB1c2VyQGhvc3QKLSAgVGhlIGtleSdzIHJhbmRvbWFydCBpbWFnZSBpczoKLSAgKy0tWyBSU0EgMjA0OF0tLS0tKwotICB8ICAgICAuLisuKj0rb28uKkV8Ci0gIHwgICAgICB1Lk9vQi4uIC4gK3wKLSAgfCAgICAgICAuLiouICAgICAgfAotICB8ICAgICAgIG8gICAgICAgICB8Ci0gIHwgICAgICAuIFMgLi4gICAgIHwKLSAgfCAgICAgICAgICAgICAgICAgfAotICB8ICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgLi4gICAgIHwKLSAgfCAgICAgICAgICAgICAgICAgfAotICArLS0tLS0tLS0tLS0tLS0tLS0rCi0gIHVzZXJAaG9zdDp+JAotLS0tLQotCi1SZWdpc3RlcmluZyB5b3VyIGtleSBpbiBHZXJyaXQKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1PcGVuIGEgYnJvd3NlciBhbmQgZW50ZXIgdGhlIGNhbm9uaWNhbCB1cmwgb2YgeW91ciBHZXJyaXQgc2VydmVyLiAgWW91IGNhbgotZmluZCB0aGUgdXJsIGluIHRoZSBzZXR0aW5ncyBmaWxlLgotCi0tLS0tCi0gIGdlcnJpdDJAaG9zdDp+JCBnaXQgY29uZmlnIC1mIH4vZ2Vycml0X3Rlc3RzaXRlL2V0Yy9nZXJyaXQuY29uZmlnIGdlcnJpdC5jYW5vbmljYWxXZWJVcmwKLSAgaHR0cDovL2xvY2FsaG9zdDo4MDgwLwotICBnZXJyaXQyQGhvc3Q6fiQKLS0tLS0KLQotUmVnaXN0ZXIgYSBuZXcgYWNjb3VudCBpbiBHZXJyaXQgdGhyb3VnaCB0aGUgd2ViIGludGVyZmFjZSB3aXRoIHRoZQotZW1haWwgYWRkcmVzcyBvZiB5b3VyIGNob2ljZS4KLQotVGhlIGRlZmF1bHQgYXV0aGVudGljYXRpb24gdHlwZSBpcyBPcGVuSUQuICBJZiB5b3VyIEdlcnJpdCBzZXJ2ZXIgaXMgYmVoaW5kIGEKLXByb3h5LCBhbmQgeW91IGFyZSB1c2luZyBhbiBleHRlcm5hbCBPcGVuSUQgcHJvdmlkZXIsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZQotcHJveHkgc2V0dGluZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotLS0tLQotICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyAtLWFkZCBodHRwLnByb3h5IGh0dHA6Ly9wcm94eTo4MDgwCi0gIGdlcnJpdDJAaG9zdDp+JCBnaXQgY29uZmlnIC1mIH4vZ2Vycml0X3Rlc3RzaXRlL2V0Yy9nZXJyaXQuY29uZmlnIC0tYWRkIGh0dHAucHJveHlVc2VybmFtZSB1c2VybmFtZQotICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyAtLWFkZCBodHRwLnByb3h5UGFzc3dvcmQgcGFzc3dvcmQKLS0tLS0KLQotUmVmZXIgdG8gdGhlIEdlcnJpdCBjb25maWd1cmF0aW9uIGd1aWRlIGZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci1saW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNhdXRoW2F1dGhlbnRpY2F0aW9uXSBhbmQKLWxpbms6Y29uZmlnLWdlcnJpdC5odG1sI2h0dHAucHJveHlbcHJveHldIHNldHRpbmdzLgotCi1UaGUgZmlyc3QgdXNlciB0byBzaWduLWluIGFuZCByZWdpc3RlciBhbiBhY2NvdW50IHdpbGwgYmUKLWF1dG9tYXRpY2FsbHkgcGxhY2VkIGludG8gdGhlIGZ1bGx5IHByaXZpbGVnZWQgQWRtaW5pc3RyYXRvcnMgZ3JvdXAsCi1wZXJtaXR0aW5nIHNlcnZlciBtYW5hZ2VtZW50IG92ZXIgdGhlIHdlYiBhbmQgb3ZlciBTU0guICBTdWJzZXF1ZW50Ci11c2VycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCBhcyB1bnByaXZpbGVnZWQgdXNlcnMuCi0KLU9uY2Ugc2lnbmVkIGluIGFzIHlvdXIgdXNlciwgeW91IGZpbmQgYSBsaXR0bGUgd2l6YXJkIHRvIGdldCB5b3Ugc3RhcnRlZC4KLVRoZSB3aXphcmQgaGVscHMgeW91IGZpbGwgb3V0OgotCi0qIFJlYWwgbmFtZSAodmlzaWJsZSBuYW1lIGluIEdlcnJpdCkKLSogUmVnaXN0ZXIgeW91ciBlbWFpbCAoaXQgbXVzdCBiZSBjb25maXJtZWQgbGF0ZXIpCi0qIFNlbGVjdCBhIHVzZXJuYW1lIHdpdGggd2hpY2ggdG8gY29tbXVuaWNhdGUgd2l0aCBHZXJyaXQgb3ZlciBzc2grZ2l0Ci0KLSogVGhlIHNlcnZlciB3aWxsIGFzayB5b3UgZm9yIGFuIFJTQSBwdWJsaWMga2V5LgotVGhhdCdzIHRoZSBrZXkgd2UgZ2VuZXJhdGVkIGFib3ZlLCBhbmQgaXQncyB0aW1lIHRvIG1ha2Ugc3VyZSB0aGF0IEdlcnJpdCBrbm93cwotYWJvdXQgb3VyIG5ldyBrZXkgYW5kIGNhbiBpZGVudGlmeSB1cyBieSBpdC4KLQotLS0tLQotICB1c2VyQGhvc3Q6fiQgY2F0IC5zc2gvaWRfcnNhLnB1YgotICBzc2gtcnNhIEFBQUFCM056YUMxeWMyRUFBQUFCSXdBQUFRRUE1RTc4NW1XdE1ja29yUDV2NDBQeUZldWk5VDUwZEtwYUdZdzY3TWx2MkozYUdCRzN0UzBxQlF4S0VwaVYwSjQrVzBSZ1FIYldmTnFkVVllbjliQzVWVkgvR2F0WVdrcEw5VGpqVWNIekYxclgzRXl2N1BIdUhMQXlkLzhaZHY2UjNzYUYraE5wcDFKVzBCU2E3SFh6SzdpTkNWQTNrQnVCdGh4ZUdoM09vRmJhWEhuMXp3d1ZRdzhJNStMcDlPT0lZN3NKRXNNL2tXNjk5WERWNnoyemxrQnlOVkVwNDVqK2cyNng1ckNuR1M4R0pNN0EwdUhzYVdKZGRPNlRpeVI2LzJTT0JGMVZ0S3c0OVhMVFFjbURJbkZBWnpVc0FaU0RLbGZZbG9Qa3BBNllkcWVHMGVKcWF1K2p0enVpZ3lkb1ZqNGo5eGlkY0o5SHR4WmNKTnVyYXc9PSB1c2VyQGhvc3QKLSAgdXNlckBob3N0On4kCi0tLS0tCi0KLUNvcHkgdGhlIHN0cmluZyBzdGFydGluZyB3aXRoIHNzaC1yc2EgdG8geW91ciBjbGlwYm9hcmQgYW5kIHRoZW4gcGFzdGUgaXQKLWludG8gdGhlIGJveCBmb3IgUlNBIGtleXMuIE1ha2UgKmFic29sdXRlbHkgc3VyZSogbm8gZXh0cmEgc3BhY2VzIG9yIGxpbmUgZmVlZHMKLWFyZSBlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIFJTQSBzdHJpbmcuCi0KLVZlcmlmeSB0aGF0IHRoZSBzc2ggY29ubmVjdGlvbiB3b3JrcyBmb3IgeW91LgotCi0tLS0tCi0gIHVzZXJAaG9zdDp+JCBzc2ggdXNlckBsb2NhbGhvc3QgLXAgMjk0MTgKLSAgVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICdbbG9jYWxob3N0XToyOTQxOCAoWzEyNy4wLjAuMV06Mjk0MTgpJyBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KLSAgUlNBIGtleSBmaW5nZXJwcmludCBpcyBkYjowNzozZDpjMjo5NDoyNTpiNTo4ZDphYzpiYzpiNTo5ZToyZjo5NTo1Zjo0YS4KLSAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/IHllcwotICBXYXJuaW5nOiBQZXJtYW5lbnRseSBhZGRlZCAnW2xvY2FsaG9zdF06Mjk0MTgnIChSU0EpIHRvIHRoZSBsaXN0IG9mIGtub3duIGhvc3RzLgotCi0gICoqKiogICAgV2VsY29tZSB0byBHZXJyaXQgQ29kZSBSZXZpZXcgICAgKioqKgotCi0gIEhpIHVzZXIsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgb3ZlciBTU0guCi0KLSAgVW5mb3J0dW5hdGVseSwgaW50ZXJhY3RpdmUgc2hlbGxzIGFyZSBkaXNhYmxlZC4KLSAgVG8gY2xvbmUgYSBob3N0ZWQgR2l0IHJlcG9zaXRvcnksIHVzZToKLQotICBnaXQgY2xvbmUgc3NoOi8vdXNlckBsb2NhbGhvc3Q6Mjk0MTgvUkVQT1NJVE9SWV9OQU1FLmdpdAotCi0gIHVzZXJAaG9zdDp+JAotLS0tLQoraW5jbHVkZTo6Y29uZmlnLWxvZ2luLXJlZ2lzdGVyLnR4dFtdCiAKIFByb2plY3QgY3JlYXRpb24KIC0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwudHh0CmluZGV4IDk5MjZiOGYuLjRiMTRmZjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLnR4dApAQCAtMSw1ICsxLDUgQEAKLUdlcnJpdCBDb2RlIFJldmlldyAtIEluc3RhbGxhdGlvbiBHdWlkZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitHZXJyaXQgQ29kZSBSZXZpZXcgLSBTdGFuZGFsb25lIERhZW1vbiBJbnN0YWxsYXRpb24gR3VpZGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBbW3JlcXVpcmVtZW50c11dCiBSZXF1aXJlbWVudHMKQEAgLTI5LDY3ICsyOSw3IEBACiBJZiB5b3Ugd291bGQgcHJlZmVyIHRvIGJ1aWxkIEdlcnJpdCBkaXJlY3RseSBmcm9tIHNvdXJjZSwgcmV2aWV3CiB0aGUgbm90ZXMgdW5kZXIgbGluazpkZXYtcmVhZG1lLmh0bWxbZGV2ZWxvcGVyIHNldHVwXS4KIAotCi1bW2NyZWF0ZWRiXV0KLURhdGFiYXNlIFNldHVwCi0tLS0tLS0tLS0tLS0tLQotCi1bW2NyZWF0ZWRiX2gyXV0KLUgyCi1+fgotCi1EdXJpbmcgdGhlIGluaXQgcGhhc2Ugb2YgR2Vycml0IHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGljaCBkYXRhYmFzZSB0byB1c2UuCi1JZiB5b3UgY2hvb3NlIEgyLCBHZXJyaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB1cCB0aGUgZW1iZWRkZWQgSDIgZGF0YWJhc2UgYXMKLWJhY2tlbmQgc28gbm8gc2V0IHVwIGluIGFkdmFuY2UgaXMgbmVjZXNzYXJ5LiAgQWxzbywgbm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGlzCi1uZWNlc3NhcnkuICBVc2luZyB0aGUgZW1iZWRkZWQgSDIgZGF0YWJhc2UgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGdldCBhIEdlcnJpdAotc2l0ZSB1cCBhbmQgcnVubmluZywgbWFraW5nIGl0IGlkZWFsIGZvciBwcm9vZiBvZiBjb25jZXB0cyBvciBzbWFsbCB0ZWFtCi1zZXJ2ZXJzLiAgT24gdGhlIGZsaXAgc2lkZSwgSDIgaXMgbm90IHRoZSByZWNvbW1lbmRlZCBvcHRpb24gZm9yIGxhcmdlCi1jb3Jwb3JhdGUgaW5zdGFsbGF0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGludGVyYWN0Ci13aXRoIHRoZSBkYXRhYmFzZSB3aGlsZSBHZXJyaXQgaXMgb2ZmbGluZSwgaXQncyBub3QgZWFzeSB0byBiYWNrdXAgdGhlIGRhdGEsCi1hbmQgaXQncyBub3QgcG9zc2libGUgdG8gc2V0IHVwIEgyIGluIGEgbG9hZCBiYWxhbmNlZC9ob3Rzd2FwIGNvbmZpZ3VyYXRpb24uCi0KLQotSWYgdGhpcyBvcHRpb24gaW50ZXJlc3RzIHlvdSwgeW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgbGluazppbnN0YWxsLXF1aWNrLmh0bWxbdGhlIHF1aWNrIGd1aWRlXS4KLQotW1tjcmVhdGVkYl9wb3N0Z3Jlc11dCi1Qb3N0Z3JlU1FMCi1+fn5+fn5+fn5+Ci0KLVRoaXMgb3B0aW9uIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgSDIgb3B0aW9uIGJ1dCBpcyByZWNvbW1lbmRlZAotZm9yIGxhcmdlciBpbnN0YWxsYXRpb25zLiBJdCdzIHRoZSBkYXRhYmFzZSBiYWNrZW5kIHdpdGggdGhlIGxhcmdlc3QgdXNlcmJhc2UKLWluIHRoZSBHZXJyaXQgY29tbXVuaXR5LgotCi1DcmVhdGUgYSB1c2VyIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHdpdGhpbiBQb3N0Z3JlcywgYXNzaWduIGl0IGEKLXBhc3N3b3JkLCBjcmVhdGUgYSBkYXRhYmFzZSB0byBzdG9yZSB0aGUgbWV0YWRhdGEsIGFuZCBncmFudCB0aGUgdXNlcgotZnVsbCByaWdodHMgb24gdGhlIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2U6Ci0KLS0tLS0KLSAgY3JlYXRldXNlciAtQSAtRCAtUCAtRSBnZXJyaXQyCi0gIGNyZWF0ZWRiIC1FIFVURi04IC1PIGdlcnJpdDIgcmV2aWV3ZGIKLS0tLS0KLQotCi1bW2NyZWF0ZWRiX215c3FsXV0KLU15U1FMCi1+fn5+fgotCi1UaGlzIG9wdGlvbiBpcyBhbHNvIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgSDIgb3B0aW9uLiBKdXN0IGFzIHdpdGgKLVBvc3RncmVTUUwgaXQncyBhbHNvIHJlY29tbWVuZGVkIGZvciBsYXJnZXIgaW5zdGFsbGF0aW9ucy4KLQotQ3JlYXRlIGEgdXNlciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlIGRhdGFiYXNlLCBhc3NpZ24gaXQgYQotcGFzc3dvcmQsIGNyZWF0ZSBhIGRhdGFiYXNlLCBhbmQgZ2l2ZSB0aGUgbmV3bHkgY3JlYXRlZCB1c2VyIGZ1bGwKLXJpZ2h0cyBvbiBpdDoKLQotLS0tLQotICBteXNxbAotCi0gIENSRUFURSBVU0VSICdnZXJyaXQyJ0AnbG9jYWxob3N0JyBJREVOVElGSUVEIEJZICdzZWNyZXQnOwotICBDUkVBVEUgREFUQUJBU0UgcmV2aWV3ZGI7Ci0gIEFMVEVSIERBVEFCQVNFIHJldmlld2RiIGNoYXJzZXQ9bGF0aW4xOwotICBHUkFOVCBBTEwgT04gcmV2aWV3ZGIuKiBUTyAnZ2Vycml0MidAJ2xvY2FsaG9zdCc7Ci0gIEZMVVNIIFBSSVZJTEVHRVM7Ci0tLS0tCi0KK2luY2x1ZGU6OmRhdGFiYXNlLXNldHVwLnR4dFtdCiAKIFtbaW5pdF1dCiBJbml0aWFsaXplIHRoZSBTaXRlCkBAIC0xODUsOCArMTI1LDggQEAKIGF1dG9tYXRpY2FsbHkgc3RhcnRzIGFuZCBzdG9wcyB3aXRoIHRoZSBvcGVyYXRpbmcgc3lzdGVtOgogCiA9PT09Ci0gIHN1ZG8gbG4gLXNuZiBgcHdkYC9yZXZpZXdfc2l0ZS9iaW4vZ2Vycml0LnNoIC9ldGMvaW5pdC5kL2dlcnJpdC5zaAotICBzdWRvIGxuIC1zbmYgLi4vaW5pdC5kL2dlcnJpdC5zaCAvZXRjL3JjMy5kL1M5MGdlcnJpdAorICBzdWRvIGxuIC1zbmYgYHB3ZGAvcmV2aWV3X3NpdGUvYmluL2dlcnJpdC5zaCAvZXRjL2luaXQuZC9nZXJyaXQKKyAgc3VkbyBsbiAtc25mIC9ldGMvaW5pdC5kL2dlcnJpdCAvZXRjL3JjMy5kL1M5MGdlcnJpdAogPT09PQogCiBUbyBpbnN0YWxsIEdlcnJpdCBpbnRvIGFuIGV4aXN0aW5nIHNlcnZsZXQgY29udGFpbmVyIGluc3RlYWQgb2YgdXNpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW50cm8tcXVpY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9pbnRyby1xdWljay50eHQKaW5kZXggMjVmNWQ1ZS4uYWUyZTdlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnRyby1xdWljay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnRyby1xdWljay50eHQKQEAgLTEzOCwxMCArMTM4LDEwIEBACiBDb21wcmVzc2luZyBvYmplY3RzOiAxMDAlICgyLzIpLCBkb25lLgogV3JpdGluZyBvYmplY3RzOiAxMDAlICgzLzMpLCA1NDIgYnl0ZXMsIGRvbmUuCiBUb3RhbCAzIChkZWx0YSAwKSwgcmV1c2VkIDAgKGRlbHRhIDApCi1yZW1vdGU6IAorcmVtb3RlOgogcmVtb3RlOiBOZXcgQ2hhbmdlczoKIHJlbW90ZTogICBodHRwOi8vZ2Vycml0aG9zdDo4MDgwLzY4Ci1yZW1vdGU6IAorcmVtb3RlOgogVG8gc3NoOi8vZ2Vycml0aG9zdDoyOTQxOC9SZWNpcGVCb29rLmdpdAogICogW25ldyBicmFuY2hdICAgICAgSEVBRCAtPiByZWZzL2Zvci9tYXN0ZXIKIC0tLS0KQEAgLTIwOSwxMCArMjA5LDEyIEBACiB0aGlzIHdlIGNhbiB2aWV3IGl0IHdpdGhpbiB0aGUgR2Vycml0IHdlYiBpbnRlcmZhY2UgYXMgZWl0aGVyIGEKIHVuaWZpZWQgb3Igc2lkZS1ieS1zaWRlIGRpZmYgYnkgc2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24uIEluCiB0aGUgZXhhbXBsZSBiZWxvdyB3ZSd2ZSBzZWxlY3RlZCB0aGUgc2lkZS1ieS1zaWRlIHZpZXcuIEluIGVpdGhlciBvZgotdGhlc2Ugdmlld3MgeW91IGNhbiBhZGQgY29tbWVudHMgYnkgZG91YmxlIGNsaWNraW5nIG9uIHRoZSBsaW5lIChvcgotc2luZ2xlIGNsaWNrIHRoZSBsaW5lIG51bWJlcikgdGhhdCB5b3Ugd2FudCB0byBjb21tZW50IG9uLiBPbmNlCi1wdWJsaXNoZWQgdGhlc2UgY29tbWVudHMgYXJlIHZpZXdhYmxlIHRvIGFsbCwgYWxsb3dpbmcgZGlzY3Vzc2lvbgotb2YgdGhlIGNoYW5nZSB0byB0YWtlIHBsYWNlLgordGhlc2Ugdmlld3MgeW91IGNhbiBhZGQgaW5saW5lIGNvbW1lbnRzIGJ5IGRvdWJsZSBjbGlja2luZyBvbiB0aGUgbGluZQorKG9yIHNpbmdsZSBjbGljayB0aGUgbGluZSBudW1iZXIpIHRoYXQgeW91IHdhbnQgdG8gY29tbWVudCBvbi4gQWxzbyB5b3UKK2NhbiBhZGQgZmlsZSBjb21tZW50IGJ5IGRvdWJsZSBjbGlja2luZyBhbnl3aGVyZSAobm90IGp1c3Qgb24gdGhlCisiUGF0Y2ggU2V0IiB3b3JkcykgaW4gdGhlIHRhYmxlIGhlYWRlciBvciBzaW5nbGUgY2xpY2tpbmcgb24gdGhlIGljb24KK2luIHRoZSBsaW5lLW51bWJlciBjb2x1bW4gaGVhZGVyLiBPbmNlIHB1Ymxpc2hlZCB0aGVzZSBjb21tZW50cyBhcmUKK3ZpZXdhYmxlIHRvIGFsbCwgYWxsb3dpbmcgZGlzY3Vzc2lvbiBvZiB0aGUgY2hhbmdlIHRvIHRha2UgcGxhY2UuCiAKIC5TaWRlIEJ5IFNpZGUgUGF0Y2ggVmlldwogaW1hZ2U6OmltYWdlcy9pbnRyby1xdWljay1yZXZpZXctbGluZS1jb21tZW50LmpwZ1tBZGRpbmcgYSBDb21tZW50XQpAQCAtMzc1LDcgKzM3Nyw3IEBACiBhIHNpbmdsZSBidXR0b24uIElmIHlvdSBjaG9vc2UganVzdCB0byBwdWJsaXNoIGNvbW1lbnRzIGF0IHRoaXMgcG9pbnQgdGhlbgogdGhlIHNjb3JlIHdpbGwgYmUgc3RvcmVkIGJ1dCB0aGUgY2hhbmdlIHdvbid0IHlldCBiZSBhY2NlcHRlZCBpbnRvIHRoZSBjb2RlCiBiYXNlLiBJbiB0aGlzIGNhc2UgdGhlcmUgd2lsbCBiZSBhIF9TdWJtaXQgUGF0Y2ggU2V0IFhfIGJ1dHRvbiBvbiB0aGUKLW1haW4gc2NyZWVuLiBKdXN0IGFzIENvZGUgUmV2aWV3IGFuZCBWZXJpZnkgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zCittYWluIHNjcmVlbi4gSnVzdCBhcyBDb2RlLVJldmlldyBhbmQgVmVyaWZ5IGFyZSBkaWZmZXJlbnQgb3BlcmF0aW9ucwogdGhhdCBjYW4gYmUgZG9uZSBieSBkaWZmZXJlbnQgdXNlcnMsIFN1Ym1pc3Npb24gaXMgYSB0aGlyZCBvcGVyYXRpb24KIHRoYXQgY2FuIGJlIGxpbWl0ZWQgZG93biB0byBhbm90aGVyIGdyb3VwIG9mIHVzZXJzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2pzb24udHh0IGIvRG9jdW1lbnRhdGlvbi9qc29uLnR4dAppbmRleCBmMDU4OGNlLi4zODkzZTNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2pzb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vanNvbi50eHQKQEAgLTI4LDcgKzI4LDExIEBACiAKIHVybDo6IENhbm9uaWNhbCBVUkwgdG8gcmVhY2ggdGhpcyBjaGFuZ2UuCiAKLWNvbW1pdE1lc3NhZ2U6OiBUaGUgZnVsbCBjb21taXQgbWVzc2FnZSBmb3IgdGhlIGNoYW5nZS4KK2NvbW1pdE1lc3NhZ2U6OiBUaGUgZnVsbCBjb21taXQgbWVzc2FnZSBmb3IgdGhlIGNoYW5nZSdzIGN1cnJlbnQgcGF0Y2gKK3NldC4KKworY3JlYXRlZE9uOjogVGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIHdoZW4gdGhpcyBjaGFuZ2UKK3dhcyBjcmVhdGVkLgogCiBsYXN0VXBkYXRlZDo6IFRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB3aGVuIHRoaXMgY2hhbmdlCiB3YXMgbGFzdCB1cGRhdGVkLgpAQCAtNDEsNiArNDUsOCBAQAogCiAgIE5FVzs7IENoYW5nZSBpcyBzdGlsbCBiZWluZyByZXZpZXdlZC4KIAorICBEUkFGVDs7IENoYW5nZSBpcyBhIGRyYWZ0IGNoYW5nZSB0aGF0IG9ubHkgY29uc2lzdHMgb2YgZHJhZnQgcGF0Y2hzZXRzLgorCiAgIFNVQk1JVFRFRDs7IENoYW5nZSBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIGlzIGluIHRoZSBtZXJnZSBxdWV1ZS4KICAgSXQgbWF5IGJlIHdhaXRpbmcgZm9yIG9uZSBvciBtb3JlIGRlcGVuZGVuY2llcy4KIApAQCAtNDgsMTQgKzU0LDIwIEBACiAKICAgQUJBTkRPTkVEOzsgQ2hhbmdlIHdhcyBhYmFuZG9uZWQgYnkgaXRzIG93bmVyIG9yIGFkbWluaXN0cmF0b3IuCiAKK2NvbW1lbnRzOjogQWxsIGlubGluZS9maWxlIGNvbW1lbnRzIGZvciB0aGlzIGNoYW5nZSBpbiA8PG1lc3NhZ2UsbWVzc2FnZSBhdHRyaWJ1dGVzPj4uCisKIHRyYWNraW5nSWRzOjogSXNzdWUgdHJhY2tpbmcgc3lzdGVtIGxpbmtzIGluCi08PHRyYWNraW5naWQsdHJhY2tpbmdpZCBhdHRyaWJ1dGU+Piwgc2NyYXBlZCBvdXQgb2YgdGhlIGNvbW1pdAorPDx0cmFja2luZ2lkLHRyYWNraW5naWQgYXR0cmlidXRlcz4+LCBzY3JhcGVkIG91dCBvZiB0aGUgY29tbWl0CiBtZXNzYWdlIGJhc2VkIG9uIHRoZSBzZXJ2ZXIncwogbGluazpjb25maWctZ2Vycml0Lmh0bWwjdHJhY2tpbmdpZFt0cmFja2luZ2lkXSBzZWN0aW9ucy4KIAogY3VycmVudFBhdGNoU2V0OjogQ3VycmVudCA8PHBhdGNoU2V0LHBhdGNoU2V0IGF0dHJpYnV0ZT4+LgogCi1wYXRjaFNldHM6OiBBbGwgPDxwYXRjaFNldCxwYXRjaFNldCBhdHRyaWJ1dGU+PiBmb3IgdGhpcyBjaGFuZ2UuCitwYXRjaFNldHM6OiBBbGwgPDxwYXRjaFNldCxwYXRjaFNldCBhdHRyaWJ1dGVzPj4gZm9yIHRoaXMgY2hhbmdlLgorCitkZXBlbmRzT246OiBMaXN0IG9mIGNoYW5nZXMgdGhhdCB0aGlzIGNoYW5nZSBkZXBlbmRzIG9uIGluIDw8ZGVwZW5kZW5jeSxkZXBlbmRlbmN5IGF0dHJpYnV0ZXM+Pi4KKworbmVlZGVkQnk6OiBMaXN0IG9mIGNoYW5nZXMgdGhhdCBkZXBlbmQgb24gdGhpcyBjaGFuZ2UgaW4gPDxkZXBlbmRlbmN5LGRlcGVuZGVuY3kgYXR0cmlidXRlcz4+LgogCiBzdWJtaXRSZWNvcmRzOjogVGhlIDw8c3VibWl0UmVjb3JkLHN1Ym1pdFJlY29yZCBhdHRyaWJ1dGU+PiBjb250YWlucwogaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0aGlzIGNoYW5nZSBoYXMgYmVlbiBvciBjYW4gYmUgc3VibWl0dGVkLgpAQCAtOTAsMTQgKzEwMiwyOSBAQAogCiByZXZpc2lvbjo6IEdpdCBjb21taXQgZm9yIHRoaXMgcGF0Y2hzZXQuCiAKK3BhcmVudHM6OiBMaXN0IG9mIHBhcmVudCByZXZpc2lvbnMuCisKIHJlZjo6IEdpdCByZWZlcmVuY2UgcG9pbnRpbmcgYXQgdGhlIHJldmlzaW9uLiAgVGhpcyByZWZlcmVuY2UgaXMKIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBHZXJyaXQgQ29kZSBSZXZpZXcgc2VydmVyJ3MgR2l0IGludGVyZmFjZQogZm9yIHRoZSBjb250YWluaW5nIGNoYW5nZS4KIAogdXBsb2FkZXI6OiBVcGxvYWRlciBvZiB0aGUgcGF0Y2ggc2V0IGluIDw8YWNjb3VudCxhY2NvdW50IGF0dHJpYnV0ZT4+LgogCithdXRob3I6OiBBdXRob3Igb2YgdGhpcyBwYXRjaHNldCBpbiA8PGFjY291bnQsYWNjb3VudCBhdHRyaWJ1dGU+Pi4KKworY3JlYXRlZE9uOjogVGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIHdoZW4gdGhpcyBwYXRjaHNldAord2FzIGNyZWF0ZWQuCisKIGFwcHJvdmFsczo6IFRoZSA8PGFwcHJvdmFsLGFwcHJvdmFsIGF0dHJpYnV0ZT4+IGdyYW50ZWQuCiAKK2NvbW1lbnRzOjogQWxsIGNvbW1lbnRzIGZvciB0aGlzIHBhdGNoc2V0IGluIDw8cGF0Y2hzZXRjb21tZW50LHBhdGNoc2V0Q29tbWVudCBhdHRyaWJ1dGVzPj4uCisKK2ZpbGVzOjogQWxsIGNoYW5nZWQgZmlsZXMgaW4gdGhpcyBwYXRjaHNldCBpbiA8PHBhdGNoLHBhdGNoIGF0dHJpYnV0ZXM+Pi4KKworc2l6ZUluc2VydGlvbnM6OiBTaXplIGluZm9ybWF0aW9uIG9mIGluc2VydGlvbnMgb2YgdGhpcyBwYXRjaHNldC4KKworc2l6ZURlbGV0aW9uczo6IFNpemUgaW5mb3JtYXRpb24gb2YgZGVsZXRpb25zIG9mIHRoaXMgcGF0Y2hzZXQuCisKIFtbYXBwcm92YWxdXQogYXBwcm92YWwKIC0tLS0tLS0tCkBAIC0xMjMsMTkgKzE1MCw5IEBACiAKIG5ld1Jldjo6IFRoZSBuZXcgdmFsdWUgdGhlIHJlZiB3YXMgdXBkYXRlZCB0by4KIAotcHJvamVjdDo6IFByb2plY3QgcGF0aCBpbiBHZXJyaXQuCi0KIHJlZk5hbWU6OiBSZWYgbmFtZSB3aXRoaW4gcHJvamVjdC4KIAotW1txdWVyeUxpbWl0XV0KLXF1ZXJ5TGltaXQKLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9xdWVyeUxpbWl0W3F1ZXJ5TGltaXRdCi1vZiBhIHVzZXIuCi0KLW1pbjo6IGxvd2VyIGxpbWl0Ci0KLW1heDo6IHVwcGVyIGxpbWl0Citwcm9qZWN0OjogUHJvamVjdCBwYXRoIGluIEdlcnJpdC4KIAogW1tzdWJtaXRSZWNvcmRdXQogc3VibWl0UmVjb3JkCkBAIC0xNzgsNiArMTk1LDczIEBACiAKIGJ5OjogVGhlIDw8YWNjb3VudCxhY2NvdW50Pj4gdGhhdCBhcHBsaWVkIHRoZSBsYWJlbC4KIAorW1tkZXBlbmRlbmN5XV0KK2RlcGVuZGVuY3kKKy0tLS0tLS0tLS0KK0luZm9ybWF0aW9uIGFib3V0IGEgY2hhbmdlIG9yIHBhdGNoc2V0IGRlcGVuZGVuY3kuCisKK2lkOjogQ2hhbmdlIGlkZW50aWZpZXIuCisKK251bWJlcjo6IENoYW5nZSBudW1iZXIuCisKK3JldmlzaW9uOjogUGF0Y2hzZXQgcmV2aXNpb24uCisKK3JlZjo6IFJlZiBuYW1lLgorCitpc0N1cnJlbnRQYXRjaFNldDo6IElmIHRoZSByZXZpc2lvbiBpcyB0aGUgY3VycmVudCBwYXRjaHNldCBvZiB0aGUgY2hhbmdlLgorCitbW21lc3NhZ2VdXQorbWVzc2FnZQorLS0tLS0tLQorQ29tbWVudCBhZGRlZCBvbiBhIGNoYW5nZSBieSBhIHJldmlld2VyLgorCit0aW1lc3RhbXA6OiBUaW1lIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2ggd2hlbiB0aGlzIGNvbW1lbnQKK3dhcyBhZGRlZC4KKworcmV2aWV3ZXI6OiBUaGUgPDxhY2NvdW50LGFjY291bnQ+PiB0aGF0IGFkZGVkIHRoZSBjb21tZW50LgorCittZXNzYWdlOjogVGhlIGNvbW1lbnQgdGV4dC4KKworW1twYXRjaHNldGNvbW1lbnRdXQorcGF0Y2hzZXRDb21tZW50CistLS0tLS0tLS0tLS0tLS0KK0NvbW1lbnQgYWRkZWQgb24gYSBwYXRjaHNldCBieSBhIHJldmlld2VyLgorCitmaWxlOjogVGhlIG5hbWUgb2YgdGhlIGZpbGUgb24gd2hpY2ggdGhlIGNvbW1lbnQgd2FzIGFkZGVkLgorCitsaW5lOjogVGhlIGxpbmUgbnVtYmVyIGF0IHdoaWNoIHRoZSBjb21tZW50IHdhcyBhZGRlZC4KKworcmV2aWV3ZXI6OiBUaGUgPDxhY2NvdW50LGFjY291bnQ+PiB0aGF0IGFkZGVkIHRoZSBjb21tZW50LgorCittZXNzYWdlOjogVGhlIGNvbW1lbnQgdGV4dC4KKworW1twYXRjaF1dCitwYXRjaAorLS0tLS0KK0luZm9ybWF0aW9uIGFib3V0IGEgcGF0Y2ggb24gYSBmaWxlLgorCitmaWxlOjogVGhlIG5hbWUgb2YgdGhlIGZpbGUuICBJZiB0aGUgZmlsZSBpcyByZW5hbWVkLCB0aGUgbmV3IG5hbWUuCisKK2ZpbGVPbGQ6OiBUaGUgb2xkIG5hbWUgb2YgdGhlIGZpbGUsIGlmIHRoZSBmaWxlIGlzIHJlbmFtZWQuCisKK3R5cGU6OiBUaGUgdHlwZSBvZiBjaGFuZ2UuCisKKyAgQURERUQ7OyBUaGUgZmlsZSBpcyBiZWluZyBjcmVhdGVkL2ludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4KKworICBNT0RJRklFRDs7IFRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBhbmQgaGFzIHVwZGF0ZWQgY29udGVudC4KKworICBERUxFVEVEOzsgVGhlIGZpbGUgZXhpc3RlZCwgYnV0IGlzIGJlaW5nIHJlbW92ZWQgYnkgdGhpcyBwYXRjaC4KKworICBSRU5BTUVEOzsgVGhlIGZpbGUgaXMgcmVuYW1lZC4KKworICBDT1BJRUQ7OyBUaGUgZmlsZSBpcyBjb3BpZWQgZnJvbSBhbm90aGVyIGZpbGUuCisKKyAgUkVXUklURTs7IFN1ZmZpY2llbnQgYW1vdW50IG9mIGNvbnRlbnQgY2hhbmdlZCB0byBjbGFpbSB0aGUgZmlsZSB3YXMgcmV3cml0dGVuLgorCitpbnNlcnRpb25zOjogbnVtYmVyIG9mIGluc2VydGlvbnMgb2YgdGhpcyBwYXRjaC4KKworZGVsZXRpb25zOjogIG51bWJlciBvZiBkZWxldGlvbnMgb2YgdGhpcyBwYXRjaC4KKwogU0VFIEFMU08KIC0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGljZW5zZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9saWNlbnNlcy50eHQKaW5kZXggNzc4N2ZlOC4uNjlhMTJjMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9saWNlbnNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9saWNlbnNlcy50eHQKQEAgLTM4LDYgKzM4LDcgQEAKIHxKZXR0eSAgICAgICAgICAgICAgICAgICAgICB8IDw8YXBhY2hlMixBcGFjaGUgTGljZW5zZSAyLjA+Piwgb3IgbGluazpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFtFUExdCiB8UHJvbG9nIENhZmUgICAgICAgICAgICAgICAgfCA8PHByb2xvZ19jYWZlLEVQTCBvciBHUEw+PgogfEdvb2dsZSBDb2RlIFByZXR0aWZ5ICAgICAgIHwgPDxhcGFjaGUyLEFwYWNoZSBMaWNlbnNlIDIuMD4+Cit8SmF2YUVXQUggICAgICAgICAgICAgICAgICAgfCA8PGFwYWNoZTIsQXBhY2hlIExpY2Vuc2UgMi4wPj4KIHxKR2l0ICAgICAgICAgICAgICAgICAgICAgICB8IDw8amdpdCxOZXctU3R5bGUgQlNEPj4KIHxKU2NoICAgICAgICAgICAgICAgICAgICAgICB8IDw8c3NoZCxOZXctU3R5bGUgQlNEPj4KIHxQb3N0Z3JlU1FMIEpEQkMgRHJpdmVyICAgICB8IDw8cG9zdGdyZXNxbCxOZXctU3R5bGUgQlNEPj4KQEAgLTQwNyw3ICs0MDgsOCBAQAogCiBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBNdXRzdW5vcmkgQkFOQkFSQSBhbmQgTmFveXVraSBUQU1VUkEgYXQgdGhlCiBLb2JlIFVuaXZlcnNpdHksIEpBUEFOLiBHZXJyaXQgQ29kZSBSZXZpZXcgdXNlcyBhIGZvcmsgZGVyaXZlZCBmcm9tCi10aGUgMS4yLjUgcmVsZWFzZS4KK3RoZSAxLjIuNSByZWxlYXNlLCBhbmQgb2ZmZXJzIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIGF0CitsaW5rOmh0dHBzOi8vZ2Vycml0Lmdvb2dsZXNvdXJjZS5jb20vcHJvbG9nLWNhZmVbXS4KIAogUHJvbG9nIENhZmUgaXMgZHVhbCBsaWNlbnNlZCBhbmQgYXZhaWxhYmxlIHVuZGVyIGVpdGhlciB0aGUKIGxpbms6aHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2VjbGlwc2UtMS4wLnBocFtFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXSwKQEAgLTQxNSw4ICs0MTcsNyBAQAogbGluazpodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sW0dQTCB2ZXJzaW9uIDIuMCAob3IgbGF0ZXIpXS4KIAogSW4gdGhlIGNvbnRleHQgb2YgR2Vycml0IENvZGUgUmV2aWV3LCBQcm9sb2cgQ2FmZSBpcyBjb25zdW1lZAotdW5kZXIgZWl0aGVyIHRoZSBFUEwgb3IgR1BMIHZlcnNpb24gMy4wIGFzIEdQTCB2ZXJzaW9uIDIuMCBpcwotbm90IGNvbXBhdGlibGUgd2l0aCBBcGFjaGUgTGljZW5zZSAyLjAuCit1bmRlciB0aGUgRVBMLgogCiBbW2gyXV0KIEgyIERhdGFiYXNlIC0gRVBMIG9yIG1vZGlmaWVkIE1QTApAQCAtNjQzLDEwICs2NDQsMTAgQEAKICBkaXN0cmlidXRlLCAgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgIGNvcGllcyBvZiAgdGhlIFNvZnR3YXJlLCAgYW5kIHRvCiAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKKwogIFRoZSAgYWJvdmUgIGNvcHlyaWdodCAgbm90aWNlICBhbmQgIHRoaXMgcGVybWlzc2lvbiAgbm90aWNlICBzaGFsbCAgYmUKICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAKKwogIFRIRSAgU09GVFdBUkUgSVMgIFBST1ZJREVEICAiQVMgIElTIiwgV0lUSE9VVCAgV0FSUkFOVFkgIE9GIEFOWSAgS0lORCwKICBFWFBSRVNTIE9SICBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCAgVE8gVEhFICBXQVJSQU5USUVTIE9GCiAgTUVSQ0hBTlRBQklMSVRZLCAgICBGSVRORVNTICAgIEZPUiAgICBBICAgUEFSVElDVUxBUiAgICBQVVJQT1NFICAgIEFORApAQCAtNjY0LDkgKzY2NSw5IEBACiAKIC0tLS0KIChUaGUgTUlUIExpY2Vuc2UpCi0gCisKIENvcHlyaWdodCAoYykgMjAwOCBUb20gUHJlc3Rvbi1XZXJuZXIKLSAKKwogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFuLy5naXRpZ25vcmUgYi9Eb2N1bWVudGF0aW9uL21hbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTNhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21hbi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK2dlcnJpdCoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWFuL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9tYW4vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlNjUzMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWFuL01ha2VmaWxlCkBAIC0wLDAgKzEsNjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitBMlggPz0gYTJ4CisKK2FsbDogbWFuCisKK2NsZWFuOgorCUBybSAtZiBnZXJyaXQtKgorCitDTURfQ09SRV9TU0hfQ01EIDo9IFwKK2NtZC1iYW4tY29tbWl0LnR4dCAgICAgXAorY21kLWNyZWF0ZS1hY2NvdW50LnR4dCBcCitjbWQtY3JlYXRlLWdyb3VwLnR4dCAgIFwKK2NtZC1jcmVhdGUtcHJvamVjdC50eHQgXAorY21kLWZsdXNoLWNhY2hlcy50eHQgICBcCitjbWQtZ2MudHh0ICAgICAgICAgICAgIFwKK2NtZC1nc3FsLnR4dCAgICAgICAgICAgXAorY21kLWxzLWdyb3Vwcy50eHQgICAgICBcCitjbWQtbHMtcHJvamVjdHMudHh0ICAgIFwKK2NtZC1scy11c2VyLXJlZnMudHh0ICAgXAorY21kLXF1ZXJ5LnR4dCAgICAgICAgICBcCitjbWQtcmVuYW1lLWdyb3VwLnR4dCAgIFwKK2NtZC1yZXZpZXcudHh0ICAgICAgICAgXAorY21kLXNldC1hY2NvdW50LnR4dCAgICBcCitjbWQtc2V0LXByb2plY3QtcGFyZW50LnR4dCBcCitjbWQtc2V0LXByb2plY3QudHh0ICAgIFwKK2NtZC1zZXQtcmV2aWV3ZXJzLnR4dCAgXAorY21kLXNob3ctY2FjaGVzLnR4dCAgICBcCitjbWQtc2hvdy1jb25uZWN0aW9ucy50eHQgICBcCitjbWQtc2hvdy1xdWV1ZS50eHQgICAgIFwKK2NtZC1zdHJlYW0tZXZlbnRzLnR4dCAgXAorY21kLXRlc3Qtc3VibWl0LXJ1bGUudHh0ICAgXAorY21kLXZlcnNpb24udHh0CisKK0dFUlJJVF9DT1JFX1NTSF9DTUQgOj0gJChwYXRzdWJzdCBjbWQtJSxnZXJyaXQtJSwkKENNRF9DT1JFX1NTSF9DTUQpKQorRE9DX01BTiA6PSAkKHBhdHN1YnN0ICUudHh0LCUuMSwkKEdFUlJJVF9DT1JFX1NTSF9DTUQpKQorCittYW46ICQoR0VSUklUX0NPUkVfU1NIX0NNRCkgJChET0NfTUFOKQorCiskKEdFUlJJVF9DT1JFX1NTSF9DTUQpIDogZ2Vycml0LSUudHh0IDogLi4vY21kLSUudHh0CisJQGNwICQ8ICRACisKKyQoRE9DX01BTikgOiAlLjEgOiAlLnR4dAorCUBlY2hvICJjcmVhdGluZyBtYW4gcGFnZSBmb3IgJEAgLi4uIgorCUBybSAtZiAkQAorCUAkKGV2YWwgVElUTEUgOj0gJChqb2luICQoYmFzZW5hbWUgJDwpLFwoMVwpKSkKKwlAJChldmFsIFNFUEVSQVRPUiA6PSAkKHNoZWxsIGVjaG8gJChUSVRMRSkgfCBzZWQgJ3MvLi89L2cnKSkKKwlAc2VkIC1pIC1yZSAnMXMvXi4qJC8vJChUSVRMRSkvJyAkPAorCUBzZWQgLWkgLXJlICcycy9ePS4qLyQoU0VQRVJBVE9SKS8nICQ8CisJQHNlZCAtaSAtcmUgJzZzL15nZXJyaXRccysoXHcpL2dlcnJpdC1cMS8nICQ8CisJQCQoQTJYKSAtLWRvY3R5cGUgbWFucGFnZSAtLWZvcm1hdCBtYW5wYWdlICQ8CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BnbS1FeHBvcnRSZXZpZXdOb3Rlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3BnbS1FeHBvcnRSZXZpZXdOb3Rlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMDAyMTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9wZ20tRXhwb3J0UmV2aWV3Tm90ZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotRXhwb3J0UmV2aWV3Tm90ZXMKLT09PT09PT09PT09PT09PT09Ci0KLU5BTUUKLS0tLS0KLUV4cG9ydFJldmlld05vdGVzIC0gRXhwb3J0IHN1Y2Nlc3NmdWwgcmV2aWV3cyB0byBsaW5rOnJlZnMtbm90ZXMtcmV2aWV3Lmh0bWxbcmVmcy9ub3Rlcy9yZXZpZXddCi0KLVNZTk9QU0lTCi0tLS0tLS0tLQotW3ZlcnNlXQotJ2phdmEnIC1qYXIgZ2Vycml0LndhciAnRXhwb3J0UmV2aWV3Tm90ZXMnIC1kIDxTSVRFX1BBVEg+Ci0KLURFU0NSSVBUSU9OCi0tLS0tLS0tLS0tLQotU2NhbnMgZXZlcnkgc3VibWl0dGVkIGNoYW5nZSBhbmQgY3JlYXRlcyBhbiBpbml0aWFsIG5vdGVzCi1icmFuY2ggZGV0YWlsaW5nIHRoZSBwcmV2aW91cyBzdWJtaXNzaW9uIGluZm9ybWF0aW9uIGZvcgotZWFjaCBtZXJnZWQgY2hhbmdlLgotCi1UaGlzIHRhc2sgY2FuIHRha2UgcXVpdGUgc29tZSB0aW1lLCBidXQgY2FuIHJ1biBpbiB0aGUgYmFja2dyb3VuZAotY29uY3VycmVudGx5IHRvIHRoZSBzZXJ2ZXIgaWYgdGhlIGRhdGFiYXNlIGlzIE15U1FMIG9yIFBvc3RncmVTUUwuCi1JZiB0aGUgZGF0YWJhc2UgaXMgSDIsIHRoaXMgdGFzayBtdXN0IGJlIHJ1biBieSBpdHNlbGYuCi0KLU9QVElPTlMKLS0tLS0tLS0KLQotLWQ6OgotXC0tc2l0ZS1wYXRoOjoKLQlMb2NhdGlvbiBvZiB0aGUgZ2Vycml0LmNvbmZpZyBmaWxlLCBhbmQgYWxsIG90aGVyIHBlci1zaXRlCi0JY29uZmlndXJhdGlvbiBkYXRhLCBzdXBwb3J0aW5nIGxpYnJhcmllcyBhbmQgbG9nIGZpbGVzLgotCi1cLS10aHJlYWRzOjoKLQlOdW1iZXIgb2YgdGhyZWFkcyB0byBwZXJmb3JtIHRoZSBzY2FuIHdvcmsgd2l0aC4gIERlZmF1bHQ6IDIuCi0KLUNPTlRFWFQKLS0tLS0tLS0KLVRoaXMgY29tbWFuZCBjYW4gb25seSBiZSBydW4gb24gYSBzZXJ2ZXIgd2hpY2ggaGFzIGRpcmVjdAotY29ubmVjdGl2aXR5IHRvIHRoZSBtZXRhZGF0YSBkYXRhYmFzZSwgYW5kIGxvY2FsIGFjY2VzcyB0byB0aGUKLW1hbmFnZWQgR2l0IHJlcG9zaXRvcmllcy4KLQotRVhBTVBMRVMKLS0tLS0tLS0tCi1UbyBnZW5lcmF0ZSBhbGwgcmV2aWV3IGluZm9ybWF0aW9uOgotCi09PT09Ci0JJCBqYXZhIC1qYXIgZ2Vycml0LndhciBFeHBvcnRSZXZpZXdOb3RlcyAtZCBzaXRlX3BhdGggLS10aHJlYWRzIDE2Ci09PT09Ci0KLUdFUlJJVAotLS0tLS0tCi1QYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BnbS1kYWVtb24udHh0IGIvRG9jdW1lbnRhdGlvbi9wZ20tZGFlbW9uLnR4dAppbmRleCAxYzFkMzQzLi4zZmZjYjQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3BnbS1kYWVtb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGdtLWRhZW1vbi50eHQKQEAgLTE0LDYgKzE0LDcgQEAKIAlbXC0tZW5hYmxlLXNzaGQgfCBcLS1kaXNhYmxlLXNzaGRdCiAJW1wtLWNvbnNvbGUtbG9nXQogCVtcLS1zbGF2ZV0KKwlbXC0taGVhZGxlc3NdCiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQpAQCAtNTgsNiArNTksMTAgQEAKIAlTZW5kIGxvZyBtZXNzYWdlcyB0byB0aGUgY29uc29sZSwgaW5zdGVhZCBvZiB0byB0aGUgc3RhbmRhcmQKIAlsb2cgZmlsZSAnJHNpdGVfcGF0aC9sb2dzL2Vycm9yX2xvZycuCiAKK1wtLWhlYWRsZXNzOjoKKwlEb24ndCBzdGFydCB0aGUgZGVmYXVsdCBHZXJyaXQgVUkuIE1heSBiZSB1c2VmdWwgd2hlbiBHZXJyaXQgaXMKKwlydW4gd2l0aCBhbiBhbHRlcm5hdGl2ZSBVSS4KKwogQ09OVEVYVAogLS0tLS0tLQogVGhpcyBjb21tYW5kIGNhbiBvbmx5IGJlIHJ1biBvbiBhIHNlcnZlciB3aGljaCBoYXMgZGlyZWN0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BnbS1nc3FsLnR4dCBiL0RvY3VtZW50YXRpb24vcGdtLWdzcWwudHh0CmluZGV4IGMzYTQ5MmEuLjM3ZmJiNzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcGdtLWdzcWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGdtLWdzcWwudHh0CkBAIC00NSw3ICs0NSw3IEBACiAKIAlUeXBlICdcaCcgZm9yIGhlbHAuICBUeXBlICdccicgdG8gY2xlYXIgdGhlIGJ1ZmZlci4KIAotCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7ICAgICAgIAorCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7CiAJVVBEQVRFIDE7IDEgbXMKIAlnZXJyaXQ+IFxxCiAJQnllCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BnbS1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL3BnbS1pbmRleC50eHQKaW5kZXggNWNiZTZiYTAuLjdhMWVkY2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcGdtLWluZGV4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3BnbS1pbmRleC50eHQKQEAgLTEsMTMgKzEsMTUgQEAKLUdlcnJpdCBDb2RlIFJldmlldyAtIFNlcnZlciBQcm9ncmFtcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitHZXJyaXQgQ29kZSBSZXZpZXcgLSBTZXJ2ZXIgU2lkZSBBZG1pbmlzdHJhdGl2ZSBUb29scworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotU2VydmVyIHNpZGUgcHJvZ3JhbXMgY2FuIGJlIHN0YXJ0ZWQgYnkgZXhlY3V0aW5nIHRoZSBXQVIgZmlsZQorU2VydmVyIHNpZGUgdG9vbHMgY2FuIGJlIHN0YXJ0ZWQgYnkgZXhlY3V0aW5nIHRoZSBXQVIgZmlsZQogdGhyb3VnaCB0aGUgSmF2YSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKIAotICAkIGphdmEgLWphciBnZXJyaXQud2FyIHByb2dyYW0gW29wdGlvbnNdCisgICQgamF2YSAtamFyIGdlcnJpdC53YXIgPHRvb2w+IFs8b3B0aW9ucz5dCiAKLVtbcHJvZ3JhbXNdXVByb2dyYW1zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVG9vbCBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgbmFtZXM6CisKK1Rvb2xzCistLS0tLQogCiBsaW5rOnBnbS1pbml0Lmh0bWxbaW5pdF06OgogCUluaXRpYWxpemUgYSBuZXcgR2Vycml0IHNlcnZlciBpbnN0YWxsYXRpb24uCkBAIC0yOCwxMCArMzAsNyBAQAogCURpc3BsYXkgdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiBHZXJyaXQgQ29kZSBSZXZpZXcuCiAKIFRyYW5zaXRpb24gVXRpbGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1saW5rOnBnbS1FeHBvcnRSZXZpZXdOb3Rlcy5odG1sW0V4cG9ydFJldmlld05vdGVzXTo6Ci0JRXhwb3J0IHN1Ym1pdHRlZCByZXZpZXcgaW5mb3JtYXRpb24gdG8gcmVmcy9ub3Rlcy9yZXZpZXcuCit+fn5+fn5+fn5+fn5+fn5+fn5+fgogCiBsaW5rOnBnbS1TY2FuVHJhY2tpbmdJZHMuaHRtbFtTY2FuVHJhY2tpbmdJZHNdOjoKIAlSZXNjYW4gYWxsIGNoYW5nZXMgYWZ0ZXIgY29uZmlndXJpbmcgdHJhY2tpbmdpZHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Byb2plY3Qtc2V0dXAudHh0IGIvRG9jdW1lbnRhdGlvbi9wcm9qZWN0LXNldHVwLnR4dAppbmRleCAzZDk3OWQzLi4zNmQzYzYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Byb2plY3Qtc2V0dXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJvamVjdC1zZXR1cC50eHQKQEAgLTU0LDggKzU0LDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBtZXRob2QgR2Vycml0IHVzZXMgdG8gc3VibWl0IGEgY2hhbmdlIHRvIGEgcHJvamVjdCBjYW4gYmUKLW1vZGlmaWVkIGJ5IGFueSBwcm9qZWN0IG93bmVyIHRocm91Z2ggdGhlIHByb2plY3QgY29uc29sZSwgYEFkbWluYCA+Ci1gUHJvamVjdHNgLiAgVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQ6Cittb2RpZmllZCBieSBhbnkgcHJvamVjdCBvd25lciB0aHJvdWdoIHRoZSBwcm9qZWN0IGNvbnNvbGUsIGBQcm9qZWN0c2AgPgorYExpc3RgID4gbXkvcHJvamVjdC4gIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkOgogCiAqIEZhc3QgRm9yd2FyZCBPbmx5CiArCkBAIC05OSwxMCArOTksMjAgQEAKIHRoZSByaWdodCBvcmRlciBzaW5jZSBpbnRlci1jaGFuZ2UgZGVwZW5kZW5jaWVzIHdpbGwgbm90IGJlCiBlbmZvcmNlZCBmb3IgdGhlbS4KIAorW1tyZWJhc2VfaWZfbmVjZXNzYXJ5XV0KKyogUmViYXNlIElmIE5lY2Vzc2FyeQorKworSWYgdGhlIGNoYW5nZSBiZWluZyBzdWJtaXR0ZWQgaXMgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGRlc3RpbmF0aW9uCiticmFuY2gsIHRoZW4gdGhlIGJyYW5jaCBpcyBmYXN0LWZvcndhcmRlZCB0byB0aGUgY2hhbmdlLiAgSWYgbm90LAordGhlbiB0aGUgY2hhbmdlIGlzIGF1dG9tYXRpY2FsbHkgcmViYXNlZCBhbmQgdGhlbiB0aGUgYnJhbmNoIGlzCitmYXN0LWZvcndhcmRlZCB0byB0aGUgY2hhbmdlLgorCiBXaGVuIEdlcnJpdCB0cmllcyB0byBkbyBhIG1lcmdlLCBieSBkZWZhdWx0IHRoZSBtZXJnZSB3aWxsIG9ubHkKLXN1Y2NlZWQgaWYgdGhlcmUgaXMgbm8gcGF0aCBjb25mbGljdC4gQnkgc2VsZWN0aW5nIHRoZSBjaGVja2JveAotYEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBjb25mbGljdHNgIEdlcnJpdCB3aWxsIHRyeSBkbyBhIGNvbnRlbnQgbWVyZ2UKLWlmIGEgcGF0aCBjb25mbGljdCBvY2N1cnMuCitzdWNjZWVkIGlmIHRoZXJlIGlzIG5vIHBhdGggY29uZmxpY3QuICBBIHBhdGggY29uZmxpY3Qgb2NjdXJzIHdoZW4KK3RoZSBzYW1lIGZpbGUgaGFzIGFsc28gYmVlbiBjaGFuZ2VkIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBtZXJnZS4KKworSWYgYEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBjb25mbGljdHNgIGlzIGVuYWJsZWQsIEdlcnJpdCB3aWxsIHRyeQordG8gZG8gYSBjb250ZW50IG1lcmdlIHdoZW4gYSBwYXRoIGNvbmZsaWN0IG9jY3Vycy4KIAogCiBSZWdpc3RlcmluZyBBZGRpdGlvbmFsIEJyYW5jaGVzCkBAIC0xMTMsOCArMTIzLDggQEAKIAogQWRkaXRpb25hbCBicmFuY2hlcyBjYW4gYWxzbyBiZSBjcmVhdGVkIHRocm91Z2ggdGhlIHdlYiBVSSwgYXNzdW1pbmcKIGF0IGxlYXN0IG9uZSBjb21taXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHByb2plY3QgcmVwb3NpdG9yeS4KLUEgcHJvamVjdCBvd25lciBjYW4gY3JlYXRlIGFkZGl0aW9uYWwgYnJhbmNoZXMgdW5kZXIgYEFkbWluYCA+Ci1gUHJvamVjdHNgID4gYEJyYW5jaGVzYC4gIEVudGVyIHRoZSBuZXcgYnJhbmNoIG5hbWUsIGFuZCB0aGUKK0EgcHJvamVjdCBvd25lciBjYW4gY3JlYXRlIGFkZGl0aW9uYWwgYnJhbmNoZXMgdW5kZXIgYFByb2plY3RzYCA+CitgTGlzdGAgPiBteS9wcm9qZWN0ID4gYEJyYW5jaGVzYC4gIEVudGVyIHRoZSBuZXcgYnJhbmNoIG5hbWUsIGFuZCB0aGUKIHN0YXJ0aW5nIEdpdCByZXZpc2lvbi4gIEJyYW5jaCBuYW1lcyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggYHJlZnMvYAogd2lsbCBhdXRvbWF0aWNhbGx5IGhhdmUgYHJlZnMvaGVhZHMvYCBwcmVmaXhlZCB0byBlbnN1cmUgdGhleSBhcmUKIGEgc3RhbmRhcmQgR2l0IGJyYW5jaCBuYW1lLiAgQWxtb3N0IGFueSB2YWxpZCBTSEEtMSBleHByZXNzaW9uIGNhbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wcm9sb2ctY2hhbmdlLWZhY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vcHJvbG9nLWNoYW5nZS1mYWN0cy50eHQKaW5kZXggZDVmNjE3NC4uZTIxZGEwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wcm9sb2ctY2hhbmdlLWZhY3RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jaGFuZ2UtZmFjdHMudHh0CkBAIC00OCw2ICs0OCw5IEBACiB8YGNvbW1pdF9tZXNzYWdlLzFgICAgfGBjb21taXRfbWVzc2FnZSgnRml4IGJ1ZyBYJykuYAogICAgIHxDb21taXQgbWVzc2FnZSBhcyBzdHJpbmcgYXRvbQogCit8YGNvbW1pdF9zdGF0cy8zYCAgIHxgY29tbWl0X3N0YXRzKDUsMjAsNTApLmAKKyAgICB8TnVtYmVyIG9mIGZpbGVzIG1vZGlmaWVkLCBudW1iZXIgb2YgaW5zZXJ0aW9ucyBhbmQgdGhlIG51bWJlciBvZiBkZWxldGlvbnMuCisKIC40K3xgY3VycmVudF91c2VyLzFgICB8YGN1cnJlbnRfdXNlcih1c2VyKDEwMDAwMDApKS5gCiAgICAgLjQrfEN1cnJlbnQgdXNlciBhcyBvbmUgb2YgdGhlIGZvdXIgZ2l2ZW4gcG9zc2liaWxpdGllcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jb29rYm9vay50eHQgYi9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jb29rYm9vay50eHQKaW5kZXggZTY2MDA2Ny4uNzkxMmNmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wcm9sb2ctY29va2Jvb2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJvbG9nLWNvb2tib29rLnR4dApAQCAtMjgsNiArMjgsMjcgQEAKIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMi4yLmh0bWxbR2Vycml0CiAyLjIuMiBSZWxlYXNlTm90ZXNdIGludHJvZHVjZXMgUHJvbG9nIHN1cHBvcnQgaW4gR2Vycml0LgogCitTdWJtaXQgVHlwZQorLS0tLS0tLS0tLS0KK0EgJ1N1Ym1pdCBUeXBlJyBpcyBhIHN0cmF0ZWd5IHRoYXQgaXMgdXNlZCBvbiBzdWJtaXQgdG8gaW50ZWdyYXRlIHRoZQorY2hhbmdlIGludG8gdGhlIGRlc3RpbmF0aW9uIGJyYW5jaC4gU3VwcG9ydGVkIHN1Ym1pdCB0eXBlcyBhcmU6CisKKyogYEZhc3QgRm9yd2FyZCBPbmx5YAorKiBgTWVyZ2UgSWYgTmVjZXNzYXJ5YAorKiBgTWVyZ2UgQWx3YXlzYAorKiBgQ2hlcnJ5IFBpY2tgCisqIGBSZWJhc2UgSWYgTmVjZXNzYXJ5YAorCisnU3VibWl0IFR5cGUnIGlzIGEgcHJvamVjdCBnbG9iYWwgc2V0dGluZy4gVGhpcyBtZWFucyB0aGF0IHRoZSBzYW1lIHN1Ym1pdCB0eXBlCitpcyB1c2VkIGZvciBhbGwgY2hhbmdlcyBvZiBvbmUgcHJvamVjdC4KKworUHJvamVjdHMgd2hpY2ggbmVlZCBtb3JlIGZsZXhpYmlsaXR5IGluIGNob29zaW5nLCBvciBlbmZvcmNpbmcsIGEgc3VibWl0IHR5cGUKK2NhbiB1c2UgUHJvbG9nIGJhc2VkIHN1Ym1pdCB0eXBlIHdoaWNoIHJlcGxhY2VzIHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBzdWJtaXQKK3R5cGUuCisKK1Byb2xvZyBiYXNlZCBzdWJtaXQgdHlwZSBjb21wdXRlcyBhIHN1Ym1pdCB0eXBlIGZvciBlYWNoIGNoYW5nZS4gVGhlIGNvbXB1dGVkCitzdWJtaXQgdHlwZSBpcyBzaG93biBvbiB0aGUgY2hhbmdlIHNjcmVlbiBmb3IgZWFjaCBjaGFuZ2UuCisKIFByb2xvZyBMYW5ndWFnZQogLS0tLS0tLS0tLS0tLS0tCiBUaGlzIGRvY3VtZW50IGlzIG5vdCBhIGNvbXBsZXRlIFByb2xvZyB0dXRvcmlhbC4KQEAgLTc2LDYgKzk3LDcgQEAKICAgJCBnaXQgcHVzaCBvcmlnaW4gSEVBRDpyZWZzL21ldGEvY29uZmlnCiA9PT09CiAKK1tbSG93VG9Xcml0ZVN1Ym1pdFJ1bGVzXV0KIEhvdyB0byB3cml0ZSBzdWJtaXQgcnVsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFdoZW5ldmVyIEdlcnJpdCBuZWVkcyB0byBldmFsdWF0ZSBzdWJtaXQgcnVsZXMgZm9yIGEgY2hhbmdlIGBDYCBmcm9tIHByb2plY3QgYFBgIGl0CkBAIC0xNzEsMTMgKzE5MywxNCBAQAogQW5vdGhlciBhc3BlY3Qgb2YgdGhlIHJldHVybiByZXN1bHQgZnJvbSB0aGUgYHN1Ym1pdF9ydWxlYCBwcmVkaWNhdGUgaXMgdGhhdAogR2Vycml0IHVzZXMgaXQgdG8gZGVjaWRlIHdoaWNoIHNldCBvZiBsYWJlbHMgdG8gZGlzcGxheSBvbiB0aGUgY2hhbmdlIHJldmlldwogc2NyZWVuIGZvciB2b3RpbmcuIElmIHRoZSByZXR1cm4gcmVzdWx0IGNvbnRhaW5zIGxhYmVsIGAnQUJDJ2AgYW5kIGlmIHRoZSBsYWJlbAotYCdBQkMnYCBpcyBvbmUgb2YgdGhlIChnbG9iYWwpIHZvdGluZyBjYXRlZ29yaWVzIHRoZW4gdm90aW5nIGZvciB0aGUgbGFiZWwKLWAnQUJDJ2Agd2lsbCBiZSBkaXNwbGF5ZWQuIE90aGVyd2lzZSwgaXQgaXMgbm90IGRpc3BsYXllZC4gTm90ZSB0aGF0IHdlIGRvbid0Ci1uZWVkIGEgKGdsb2JhbCkgdm90aW5nIGNhdGVnb3J5IGZvciBlYWNoIGxhYmVsIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0IG9mCitgJ0FCQydgIGlzIGxpbms6Y29uZmlnLWxhYmVscy5odG1sW2RlZmluZWQgZm9yIHRoZSBwcm9qZWN0XSB0aGVuIHZvdGluZyBmb3IgdGhlCitsYWJlbCBgJ0FCQydgIHdpbGwgYmUgZGlzcGxheWVkLiBPdGhlcndpc2UsIGl0IGlzIG5vdCBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB0aGUKK3Byb2plY3QgZG9lc24ndCBuZWVkIGEgZGVmaW5lZCBsYWJlbCBmb3IgZWFjaCBsYWJlbCBjb250YWluZWQgaW4gdGhlIHJlc3VsdCBvZgogYHN1Ym1pdF9ydWxlYCBwcmVkaWNhdGUuICBGb3IgZXhhbXBsZSwgdGhlIGRlY2lzaW9uIHdoZXRoZXIgYCdBdXRob3ItaXMtSm9obi1Eb2UnYAogbGFiZWwgaXMgbWV0IHdpbGwgcHJvYmFibHkgbm90IGJlIG1hZGUgYnkgZXhwbGljaXQgdm90aW5nIGJ1dCwgaW5zdGVhZCwgYnkKIGluc3BlY3RpbmcgdGhlIGZhY3RzIGFib3V0IHRoZSBjaGFuZ2UuCiAKK1tbU3VibWl0RmlsdGVyXV0KIFN1Ym1pdCBGaWx0ZXIKIC0tLS0tLS0tLS0tLS0KIEFub3RoZXIgbWVjaGFuaXNtIG9mIGNoYW5naW5nIHRoZSBkZWZhdWx0IHN1Ym1pdCBydWxlcyBpcyB0byBpbXBsZW1lbnQgdGhlCkBAIC0yMTUsNyArMjM4LDYgQEAKIAogVGhlIGZvbGxvd2luZyAiZHJhd2luZyIgaWxsdXN0cmF0ZXMgdGhlIG9yZGVyIG9mIHRoZSBpbnZvY2F0aW9uIGFuZCB0aGUgY2hhaW5pbmcKIG9mIHRoZSByZXN1bHRzIG9mIHRoZSBgc3VibWl0X3J1bGVgIGFuZCBgc3VibWl0X2ZpbHRlcmAgcHJlZGljYXRlcy4KLQogPT09PQogICBBbGwtUHJvamVjdHMKICAgXiAgIHN1Ym1pdF9maWx0ZXIoQiwgUykgOi0gLi4uICA8ND4KQEAgLTI0Nyw2ICsyNjksMzQgQEAKIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc3VibWl0IHJ1bGUgdGhhdCBpcyBuYW1lZCBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YCBhbmQKIGl0cyByZXN1bHQgd2lsbCBiZSBmaWx0ZXJlZCBhcyBkZXNjcmliZWQgYWJvdmUuCiAKK1tbSG93VG9Xcml0ZVN1Ym1pdFR5cGVdXQorSG93IHRvIHdyaXRlIHN1Ym1pdCB0eXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dyaXRpbmcgY3VzdG9tIHN1Ym1pdCB0eXBlIGxvZ2ljIGluIFByb2xvZyBpcyB0aGUgc2ltaWxhciB0b3AKK3hyZWY6SG93VG9Xcml0ZVN1Ym1pdFJ1bGVzW3dyaXRpbmcgc3VibWl0IHJ1bGVzXS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0CitvbmUgaGFzIHRvIGltcGxlbWVudCBhIGBzdWJtaXRfdHlwZWAgcHJlZGljYXRlIChpbnN0ZWFkIG9mIHRoZSBgc3VibWl0X3J1bGVgKQorYW5kIHRoYXQgdGhlIHJldHVybiByZXN1bHQgb2YgdGhlIGBzdWJtaXRfdHlwZWAgaGFzIHRvIGJlIGFuIGF0b20gdGhhdAorcmVwcmVzZW50cyBvbmUgb2YgdGhlIHN1cHBvcnRlZCBzdWJtaXQgdHlwZXM6CisKKyogYGZhc3RfZm9yd2FyZF9vbmx5YAorKiBgbWVyZ2VfaWZfbmVjZXNzYXJ5YAorKiBgbWVyZ2VfYWx3YXlzYAorKiBgY2hlcnJ5X3BpY2tgCisqIGByZWJhc2VfaWZfbmVjZXNzYXJ5YAorCitTdWJtaXQgVHlwZSBGaWx0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLQorU3VibWl0IHR5cGUgZmlsdGVyIHdvcmtzIHRoZSBzYW1lIHdheSBhcyB0aGUgeHJlZjpTdWJtaXRGaWx0ZXJbU3VibWl0IEZpbHRlcl0KK3doZXJlIHRoZSBuYW1lIG9mIHRoZSBmaWx0ZXIgcHJlZGljYXRlIGlzIGBzdWJtaXRfdHlwZV9maWx0ZXJgLgorCis9PT09CisgIHN1Ym1pdF90eXBlX2ZpbHRlcihJbiwgT3V0KS4KKz09PT0KKworR2Vycml0IHdpbGwgaW52b2tlIGBzdWJtaXRfdHlwZV9maWx0ZXJgIHdpdGggdGhlIGBJbmAgcGFyYW1ldGVyIGNvbnRhaW5pbmcgYQorcmVzdWx0IG9mIHRoZSBgc3VibWl0X3R5cGVgIGFuZCB3aWxsIHRha2UgdGhlIHZhbHVlIG9mIHRoZSBgT3V0YCBwYXJhbWV0ZXIgYXMKK3RoZSByZXN1bHQuCisKIFtbVGVzdGluZ1N1Ym1pdFJ1bGVzXV0KIFRlc3Rpbmcgc3VibWl0IHJ1bGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjc1LDggKzMyNSwxMSBAQAogdGhlIGNoYW5nZSBleHBvc2VkIHRvIHRoZW0uIEdlcnJpdCBwbHVnaW5zIGdldCBmdWxsIGFjY2VzcyB0byBHZXJyaXQgaW50ZXJuYWxzCiBhbmQgY2FuIHBvdGVudGlhbGx5IGNoZWNrIG1vcmUgdGhpbmdzIHRoYW4gUHJvbG9nIGJhc2VkIHJ1bGVzLgogCi1FeGFtcGxlcwotLS0tLS0tLS0KK0Zyb20gdmVyc2lvbiAyLjYgR2Vycml0IHBsdWdpbnMgY2FuIGNvbnRyaWJ1dGUgUHJvbG9nIHByZWRpY2F0ZXMuIFRoaXMgd2F5LCB3ZQorY2FuIG1ha2UgdXNlIG9mIHRoZSBwbHVnaW4gcHJvdmlkZWQgcHJlZGljYXRlcyB3aGVuIHdyaXRpbmcgUHJvbG9nIGJhc2VkIHJ1bGVzLgorCitFeGFtcGxlcyAtIFN1Ym1pdCBSdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3VsZCBzZXJ2ZSBhcyBhIGNvb2tib29rIGZvciBkZXZlbG9waW5nIG93biBzdWJtaXQgcnVsZXMuCiBTb21lIG9mIHRoZW0gYXJlIHRvbyB0cml2aWFsIHRvIGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBhbmQgdGhlaXIgb25seSBwdXJwb3NlIGlzCiB0byBwcm92aWRlIHN0ZXAgYnkgc3RlcCBpbnRyb2R1Y3Rpb24gYW5kIHVuZGVyc3RhbmRpbmcuCkBAIC0yOTUsNyArMzQ4LDggQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQW55LUxhYmVsLU5hbWUnLCBvayhfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KFcpKSA6LQorICAgIFcgPSBsYWJlbCgnQW55LUxhYmVsLU5hbWUnLCBvayhfKSkuCiA9PT09CiAKIEluIHRoaXMgY2FzZSB3ZSBtYWtlIG5vIHVzZSBvZiBmYWN0cyBhYm91dCB0aGUgY2hhbmdlLiBXZSBkb24ndCBuZWVkIGl0IGFzIHdlIGFyZSBzaW1wbHkKQEAgLTMxMyw3ICszNjcsOSBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdDb2RlLVJldmlldycsIG9rKF8pKSwgbGFiZWwoJ1ZlcmlmaWVkJywgb2soXykpKSkuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChDUiwgVikpIDotCisgICAgQ1IgPSBsYWJlbCgnQ29kZS1SZXZpZXcnLCBvayhfKSksCisgICAgViA9IGxhYmVsKCdWZXJpZmllZCcsIG9rKF8pKS4KID09PT0KIAogU2luY2UgZm9yIGV2ZXJ5IGNoYW5nZSBhbGwgbGFiZWwgc3RhdHVzZXMgYXJlIGAnb2snYCBldmVyeSBjaGFuZ2Ugd2lsbCBiZSBzdWJtaXR0YWJsZS4KQEAgLTMyOCw3ICszODQsOCBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIHJlamVjdChfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KFIpKSA6LQorICAgIFIgPSBsYWJlbCgnQW55LUxhYmVsLU5hbWUnLCByZWplY3QoXykpLgogPT09PQogCiBTaW5jZSBmb3IgYW55IGNoYW5nZSB3ZSByZXR1cm4gb25seSBvbmUgbGFiZWwgd2l0aCBzdGF0dXMgYHJlamVjdGAsIG5vIGNoYW5nZQpAQCAtMzQ0LDEzICs0MDEsMTcgQEAKIFtjYXB0aW9uPSIiXQogPT09PQogICAlIEluIHRoZSBVSSB0aGlzIHdpbGwgc2hvdzogTmVlZCBBbnktTGFiZWwtTmFtZQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0FueS1MYWJlbC1OYW1lJywgbmVlZChfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KE4pKSA6LQorICAgIE4gPSBsYWJlbCgnQW55LUxhYmVsLU5hbWUnLCBuZWVkKF8pKS4KIAogICAlIFdlIGNvdWxkIGRlZmluZSBtb3JlICJuZWVkIiBsYWJlbHMgYnkgYWRkaW5nIG1vcmUgcnVsZXMKLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBbm90aGVyLUxhYmVsLU5hbWUnLCBuZWVkKF8pKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoTikpIDotCisgICAgTiA9IGxhYmVsKCdBbm90aGVyLUxhYmVsLU5hbWUnLCBuZWVkKF8pKS4KIAogICAlIG9yIGJ5IHByb3ZpZGluZyBtb3JlIHRoYW4gb25lIG5lZWQgbGFiZWwgaW4gdGhlIHNhbWUgcnVsZQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ1gtTGFiZWwtTmFtZScsIG5lZWQoXykpLCBsYWJlbCgnWS1MYWJlbC1OYW1lJywgbmVlZChfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KE5YLCBOWSkpIDotCisgICAgTlggPSBsYWJlbCgnWC1MYWJlbC1OYW1lJywgbmVlZChfKSksCisgICAgTlkgPSBsYWJlbCgnWS1MYWJlbC1OYW1lJywgbmVlZChfKSkuCiA9PT09CiAKIEluIHRoZSBVSSB0aGlzIHdpbGwgc2hvdzoKQEAgLTM3Nyw4ICs0MzgsMTEgQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKGxhYmVsKCdTb21lLUNvbmRpdGlvbicsIG5lZWQoXykpKS4KLSAgc3VibWl0X3J1bGUobGFiZWwoJ0Fub3RoZXItQ29uZGl0aW9uJywgb2soXykpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KE4pKSA6LQorICAgIE4gPSBsYWJlbCgnU29tZS1Db25kaXRpb24nLCBuZWVkKF8pKS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoT0spKSA6LQorICAgIE9LID0gbGFiZWwoJ0Fub3RoZXItQ29uZGl0aW9uJywgb2soXykpLgogPT09PQogCiBUaGUgJ05lZWQgU29tZS1Db25kaXRpb24nIHdpbGwgbm90IGJlIHNob3cgaW4gdGhlIFVJIGJlY2F1c2Ugb2YgdGhlIHJlc3VsdCBvZgpAQCAtMzg5LDggKzQ1MywxMSBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUobGFiZWwoJ0Fub3RoZXItQ29uZGl0aW9uJywgb2soXykpKS4KLSAgc3VibWl0X3J1bGUobGFiZWwoJ1NvbWUtQ29uZGl0aW9uJywgbmVlZChfKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoT0spKSA6LQorICAgIE9LID0gbGFiZWwoJ0Fub3RoZXItQ29uZGl0aW9uJywgb2soXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChOKSkgOi0KKyAgICBOID0gbGFiZWwoJ1NvbWUtQ29uZGl0aW9uJywgbmVlZChfKSkuCiA9PT09CiAKIFRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IHJ1bGUgd2lsbCBzdG9wIHNlYXJjaCBmb3IgYW55IGZ1cnRoZXIgc29sdXRpb25zLgpAQCAtNDA3LDcgKzQ3NCw4IEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpKSkuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBuZWVkKF8pKS4KID09PT0KIAogVGhpcyB3aWxsIHNob3c6CkBAIC00MjAsOSArNDg4LDEyIEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgb2soXykpKSkKLSAgICA6LSBnZXJyaXQ6Y29tbWl0X2F1dGhvcihfLCAnSm9obiBEb2UnLCBfKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sICdKb2huIERvZScsIF8pLAorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkuCiA9PT09CiAKIEluIHRoZSBzZWNvbmQgcnVsZSB3ZSByZXR1cm4gYG9rYCBzdGF0dXMgZm9yIHRoZSBgJ0F1dGhvci1pcy1Kb2huLURvZSdgIGxhYmVsCkBAIC00MzgsOSArNTA5LDEyIEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgb2soXykpKSkKLSAgICA6LSBnZXJyaXQ6Y29tbWl0X2F1dGhvcihfLCBfLCAnam9obi5kb2VAZXhhbXBsZS5jb20nKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sIF8sICdqb2huLmRvZUBleGFtcGxlLmNvbScpLAorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkuCiA9PT09CiAKIG9yIGJ5IHVzZXIgaWQgKGFzc3VtaW5nIGl0IGlzIDEwMDAwMDApOgpAQCAtNDQ4LDkgKzUyMiwxMiBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBuZWVkKF8pKSkpLgotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG9rKF8pKSkpCi0gICAgOi0gZ2Vycml0OmNvbW1pdF9hdXRob3IodXNlcigxMDAwMDAwKSwgXywgXykuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBuZWVkKF8pKS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoQXV0aG9yKSkgOi0KKyAgICBnZXJyaXQ6Y29tbWl0X2F1dGhvcih1c2VyKDEwMDAwMDApLCBfLCBfKSwKKyAgICBBdXRob3IgPSBsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgb2soXykpLgogPT09PQogCiBvciBieSBhIGNvbWJpbmF0aW9uIG9mIHRoZXNlIDMgYXR0cmlidXRlczoKQEAgLTQ1OCwxMyArNTM1LDE2IEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgb2soXykpKSkKLSAgICA6LSBnZXJyaXQ6Y29tbWl0X2F1dGhvcihfLCAnSm9obiBEb2UnLCAnam9obi5kb2VAZXhhbXBsZS5jb20nKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sICdKb2huIERvZScsICdqb2huLmRvZUBleGFtcGxlLmNvbScpLAorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkuCiA9PT09CiAKLUV4YW1wbGUgNzogTWFrZSBjaGFuZ2Ugc3VibWl0dGFibGUgaWYgY29tbWl0IG1lc3NhZ2Ugc3RhcnRzIHdpdGggIlRyaXZpYWwgZml4Igotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitFeGFtcGxlIDc6IE1ha2UgY2hhbmdlIHN1Ym1pdHRhYmxlIGlmIGNvbW1pdCBtZXNzYWdlIHN0YXJ0cyB3aXRoICJGaXggIgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEJlc2lkZXMgc2hvd2luZyBob3cgdG8gbWFrZSB1c2Ugb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHRleHQgdGhlIHB1cnBvc2Ugb2YgdGhpcwogZXhhbXBsZSBpcyBhbHNvIHRvIHNob3cgaG93IHRvIG1hdGNoIG9ubHkgYSBwYXJ0IG9mIGEgc3RyaW5nIHN5bWJvbC4gU2ltaWxhcmx5CiBsaWtlIGNvbW1pdCBhdXRob3IgdGhlIGNvbW1pdCBtZXNzYWdlIGlzIHByb3ZpZGVkIGFzIGEgc3RyaW5nIHN5bWJvbCB3aGljaCBpcwpAQCAtNDgyLDkgKzU2MiwxMiBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1Ucml2aWFsLUZpeCcsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtVHJpdmlhbC1GaXgnLCBvayhfKSkpKQotICAgIDotIGdlcnJpdDpjb21taXRfbWVzc2FnZShNKSwgbmFtZShNLCBMKSwgc3RhcnRzX3dpdGgoTCwgIlRyaXZpYWwgRml4IikuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChGaXgpKSA6LQorICAgIEZpeCA9IGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1GaXgnLCBuZWVkKF8pKS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoRml4KSkgOi0KKyAgICBnZXJyaXQ6Y29tbWl0X21lc3NhZ2UoTSksIG5hbWUoTSwgTCksIHN0YXJ0c193aXRoKEwsICJGaXggIiksCisgICAgRml4ID0gbGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLUZpeCcsIG9rKF8pKS4KIAogICBzdGFydHNfd2l0aChMLCBbXSkuCiAgIHN0YXJ0c193aXRoKFtIfFQxXSwgW0h8VDJdKSA6LSBzdGFydHNfd2l0aChUMSwgVDIpLgpAQCAtNTAzLDMwICs1ODYsNzQgQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtVHJpdmlhbC1GaXgnLCBuZWVkKF8pKSkpLgotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLVRyaXZpYWwtRml4Jywgb2soXykpKSkKLSAgICA6LSBnZXJyaXQ6Y29tbWl0X21lc3NhZ2VfbWF0Y2hlcygnXlRyaXZpYWwgRml4JykuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChGaXgpKSA6LQorICAgIEZpeCA9IGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1GaXgnLCBuZWVkKF8pKS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoRml4KSkgOi0KKyAgICBnZXJyaXQ6Y29tbWl0X21lc3NhZ2VfbWF0Y2hlcygnXkZpeCAnKSwKKyAgICBGaXggPSBsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtRml4Jywgb2soXykpLgogPT09PQogCi1SZXVzaW5nIHRoZSBkZWZhdWx0IHN1Ym1pdCBwb2xpY3kKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHByZXZpb3VzIGV4YW1wbGUgY291bGQgYWxzbyBiZSB3cml0dGVuIHNvIHRoYXQgaXQgZmlyc3QgY2hlY2tzIGlmIHRoZSBjb21taXQKK21lc3NhZ2Ugc3RhcnRzIHdpdGggJ0ZpeCAnLiBJZiB0cnVlIHRoZW4gaXQgc2V0cyBPSyBmb3IgdGhhdCBjYXRlZ29yeSBhbmQgc3RvcHMKK2Z1cnRoZXIgYmFja3RyYWNraW5nIGJ5IHVzaW5nIHRoZSBjdXQgYCFgIG9wZXJhdG9yOgorLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3J1bGUoc3VibWl0KEZpeCkpIDotCisgICAgZ2Vycml0OmNvbW1pdF9tZXNzYWdlX21hdGNoZXMoJ15GaXggJyksCisgICAgRml4ID0gbGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLUZpeCcsIG9rKF8pKSwKKyAgICAhLgorCisgICUgTWVzc2FnZSBkb2VzIG5vdCBzdGFydCB3aXRoICdGaXggJyBzbyBGaXggaXMgbmVlZGVkIHRvIHN1Ym1pdAorICBzdWJtaXRfcnVsZShzdWJtaXQoRml4KSkgOi0KKyAgICBGaXggPSBsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtRml4JywgbmVlZChfKSkuCis9PT09CisKK1RoZSBkZWZhdWx0IHN1Ym1pdCBwb2xpY3kKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFsbCBleGFtcGxlcyB1bnRpbCBub3cgY29uY2VudHJhdGUgb24gb25lIHBhcnRpY3VsYXIgYXNwZWN0IG9mIGNoYW5nZSBkYXRhLgogSG93ZXZlciwgaW4gcmVhbC1saWZlIHNjZW5hcmlvcyB3ZSB3b3VsZCByYXRoZXIgd2FudCB0byByZXVzZSBHZXJyaXQncyBkZWZhdWx0Ci1zdWJtaXQgcG9saWN5IGFuZCBleHRlbmQvY2hhbmdlIGl0IGZvciBvdXIgc3BlY2lmaWMgcHVycG9zZS4gSW4gb3RoZXIgd29yZHMsIHdlCi13b3VsZCBsaWtlIHRvIGtlZXAgYWxsIHRoZSBkZWZhdWx0IHBvbGljaWVzIChsaWtlIHRoZSBgVmVyaWZpZWRgIGNhdGVnb3J5LAotdmV0b2luZyBjaGFuZ2UsIGV0Yy4uLikgYW5kIG9ubHkgZXh0ZW5kL2NoYW5nZSBhbiBhc3BlY3Qgb2YgaXQuIEZvciBleGFtcGxlLCB3ZQotbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgYWJpbGl0eSBmb3IgY2hhbmdlIGF1dGhvcnMgdG8gYXBwcm92ZSB0aGVpciBvd24gY2hhbmdlcwotYnV0IGtlZXAgYWxsIG90aGVyIHBvbGljaWVzIHRoZSBzYW1lLgorc3VibWl0IHBvbGljeSBhbmQgZXh0ZW5kL2NoYW5nZSBpdCBmb3Igb3VyIHNwZWNpZmljIHB1cnBvc2UuICBUaGlzIGNvdWxkIGJlCitkb25lIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHdheXM6CiAKKyogdW5kZXJzdGFuZCBob3cgdGhlIGRlZmF1bHQgc3VibWl0IHBvbGljeSBpcyBpbXBsZW1lbnRlZCBhbmQgdXNlIHRoYXQgYXMgYQorICB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIGN1c3RvbSBzdWJtaXQgcnVsZXMsCisqIGludm9rZSB0aGUgZGVmYXVsdCBzdWJtaXQgcnVsZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlbiBwZXJmb3JtIGZ1cnRoZXIKKyAgYWN0aW9ucyBvbiBpdHMgcmV0dXJuIHJlc3VsdC4KKworRGVmYXVsdCBzdWJtaXQgcnVsZSBpbXBsZW1lbnRhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIGRlZmF1bHQgc3VibWl0IHJ1bGUgd2l0aCB0aGUgdHdvIGRlZmF1bHQgY2F0ZWdvcmllcywgYENvZGUtUmV2aWV3YCBhbmQKK2BWZXJpZmllZGAsIGNhbiBiZSBpbXBsZW1lbnRlZCBhczoKKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3J1bGUoc3VibWl0KFYsIENSKSkgOi0KKyAgICBnZXJyaXQ6bWF4X3dpdGhfYmxvY2soLTIsIDIsICdDb2RlLVJldmlldycsIENSKSwKKyAgICBnZXJyaXQ6bWF4X3dpdGhfYmxvY2soLTEsIDEsICdWZXJpZmllZCcsIFYpLgorPT09PQorCitPbmNlIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdW5kZXJzdG9vZCBpdCBjYW4gYmUgY3VzdG9taXplZCB0byBpbXBsZW1lbnQKK3Byb2plY3Qgc3BlY2lmaWMgc3VibWl0IHJ1bGVzLiBOb3RlLCB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaGFyZGNvZGVzCit0aGUgdHdvIGRlZmF1bHQgY2F0ZWdvcmllcy4gSW50cm9kdWNpbmcgYSBuZXcgY2F0ZWdvcnkgaW4gdGhlIGRhdGFiYXNlIHdvdWxkCityZXF1aXJlIGludHJvZHVjaW5nIHRoZSBzYW1lIGNhdGVnb3J5IGhlcmUgb3IgYSBgc3VibWl0X2ZpbHRlcmAgaW4gYSBwYXJlbnQKK3Byb2plY3Qgd291bGQgaGF2ZSB0byBjYXJlIGFib3V0IGluY2x1ZGluZyB0aGUgbmV3IGNhdGVnb3J5IGluIHRoZSByZXN1bHQgb2YKK3RoaXMgYHN1Ym1pdF9ydWxlYC4gIE9uIHRoZSBvdGhlciBzaWRlLCB0aGlzIGV4YW1wbGUgaXMgZWFzeSB0byByZWFkIGFuZAordW5kZXJzdGFuZC4KKworUmV1c2luZyB0aGUgZGVmYXVsdCBzdWJtaXQgcG9saWN5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRvIGdldCByZXN1bHRzIG9mIEdlcnJpdHMgZGVmYXVsdCBzdWJtaXQgcG9saWN5IHdlIHVzZSB0aGUKLWBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgIHByZWRpY2F0ZS4gVGhpcyBtZWFucyB0aGF0IGlmIHdlIHdyaXRlIGEgc3VibWl0IHJ1bGUgbGlrZToKK2BnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgIHByZWRpY2F0ZS4gIFRoZSBgZ2Vycml0OmRlZmF1bHRfc3VibWl0KFgpYCBpbmNsdWRlcyBhbGwKK2NhdGVnb3JpZXMgZnJvbSB0aGUgZGF0YWJhc2UuICBUaGlzIG1lYW5zIHRoYXQgaWYgd2Ugd3JpdGUgYSBzdWJtaXQgcnVsZSBsaWtlOgogCiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQogICBzdWJtaXRfcnVsZShYKSA6LSBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXQoWCkuCiA9PT09Ci0KIHRoZW4gdGhpcyBpcyBlcXVpdmFsZW50IHRvIG5vdCB1c2luZyBgcnVsZXMucGxgIGF0IGFsbC4gV2UganVzdCBkZWxlZ2F0ZSB0bwogZGVmYXVsdCBsb2dpYy4gSG93ZXZlciwgb25jZSB3ZSBpbnZva2UgdGhlIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXQoWClgIHdlIGNhbgogcGVyZm9ybSBmdXJ0aGVyIGFjdGlvbnMgb24gdGhlIHJldHVybiByZXN1bHQgYFhgIGFuZCBhcHBseSBvdXIgc3BlY2lmaWMKQEAgLTU0MCw3ICs2NjcsNyBAQAogICBwcm9qZWN0X3NwZWNpZmljX3BvbGljeShSLCBTKSA6LSAuLi4KID09PT0KIAotVGhlIGZvbGxvd2luZyBleGFtcGxlcyBidWlsZCBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgc3VibWl0IHBvbGljeS4KK0luIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYm90aCBzdHlsZXMgd2lsbCBiZSBzaG93bi4KIAogRXhhbXBsZSA4OiBNYWtlIGNoYW5nZSBzdWJtaXR0YWJsZSBvbmx5IGlmIGBDb2RlLVJldmlldysyYCBpcyBnaXZlbiBieSBhIG5vbiBhdXRob3IKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC01NDgsNiArNjc1LDggQEAKIHNhdGlzZmllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYENvZGUtUmV2aWV3KzJgIGZyb20gYSBub24gYXV0aG9yLiBBbGwgb3RoZXIKIGRlZmF1bHQgcG9saWNpZXMgbGlrZSB0aGUgYFZlcmlmaWVkYCBjYXRlZ29yeSBhbmQgdmV0b2luZyBjaGFuZ2VzIHN0aWxsIGFwcGx5LgogCitSZXVzaW5nIHRoZSBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIEZpcnN0LCB3ZSBpbnZva2UgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgdG8gY29tcHV0ZSB0aGUgcmVzdWx0IGZvciB0aGUgZGVmYXVsdAogc3VibWl0IHBvbGljeSBhbmQgdGhlbiBhZGQgdGhlIGBOb24tQXV0aG9yLUNvZGUtUmV2aWV3YCBsYWJlbCB0byBpdC4gIFRoZQogYE5vbi1BdXRob3ItQ29kZS1SZXZpZXdgIGxhYmVsIGlzIGFkZGVkIHdpdGggc3RhdHVzIGBva2AgaWYgc3VjaCBhbiBhcHByb3ZhbApAQCAtNTYzLDcgKzY5Miw4IEBACiAgICAgUyA9Li4gW3N1Ym1pdCB8IFJdLgogCiAgIGFkZF9ub25fYXV0aG9yX2FwcHJvdmFsKFMxLCBTMikgOi0KLSAgICBnZXJyaXQ6Y29tbWl0X2F1dGhvcihBKSwgZ2Vycml0OmNvbW1pdF9sYWJlbChsYWJlbCgnQ29kZS1SZXZpZXcnLCAyKSwgUiksCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoQSksCisgICAgZ2Vycml0OmNvbW1pdF9sYWJlbChsYWJlbCgnQ29kZS1SZXZpZXcnLCAyKSwgUiksCiAgICAgUiBcPSBBLCAhLAogICAgIFMyID0gW2xhYmVsKCdOb24tQXV0aG9yLUNvZGUtUmV2aWV3Jywgb2soUikpIHwgUzFdLgogICBhZGRfbm9uX2F1dGhvcl9hcHByb3ZhbChTMSwgW2xhYmVsKCdOb24tQXV0aG9yLUNvZGUtUmV2aWV3JywgbmVlZChfKSkgfCBTMV0pLgpAQCAtNTg2LDYgKzcxNiw0NCBAQAogaWYgdGhlIGBjdXRgIGluIHRoZSBmaXJzdCBydWxlIGlzIG5vdCByZWFjaGVkIGFuZCBpdCBvbmx5IGhhcHBlbnMgaWYgYQogcHJlZGljYXRlIGJlZm9yZSB0aGUgYGN1dGAgZmFpbHMuCiAKK0Rvbid0IHVzZSBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitMZXQncyBpbXBsZW1lbnQgdGhlIHNhbWUgc3VibWl0IHJ1bGUgdGhlIG90aGVyIHdheSwgd2l0aG91dCByZXVzaW5nIHRoZQorYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGA6CisKKy5ydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChDUiwgVikpIDotCisgICAgYmFzZShDUiwgViksCisgICAgQ1IgPSBsYWJlbChfLCBvayhSZXZpZXdlcikpLAorICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKEF1dGhvciksCisgICAgQXV0aG9yIFw9IFJldmlld2VyLAorICAgICEuCisKKyAgc3VibWl0X3J1bGUoc3VibWl0KENSLCBWLCBOKSkgOi0KKyAgICBiYXNlKENSLCBWKSwKKyAgICBOID0gbGFiZWwoJ05vbi1BdXRob3ItQ29kZS1SZXZpZXcnLCBuZWVkKF8pKS4KKworICBiYXNlKENSLCBWKSA6LQorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMiwgMiwgJ0NvZGUtUmV2aWV3JywgQ1IpLAorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMSwgMSwgJ1ZlcmlmaWVkJywgVikuCis9PT09CisKK1RoZSBsYXR0ZXIgaW1wbGVtZW50YXRpb24gaXMgcHJvYmFibHkgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kIHRoZSBjb2RlIGxvb2tzCitjbGVhbmVyLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBsYXR0ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBhbHdheXMgcmV0dXJuIHRoZQordHdvIHN0YW5kYXJkIGNhdGVnb3JpZXMgb25seSAoYENvZGUtUmV2aWV3YCBhbmQgYFZlcmlmaWVkYCkgZXZlbiBpZiBhIG5ldworY2F0ZWdvcnkgaGFzIGJlZWVuIGluc2VydGVkIGludG8gdGhlIGRhdGFiYXNlLiBUbyBpbmNsdWRlIHRoZSBuZXcgY2F0ZWdvcnkKK3RoZSBgcnVsZXMucGxgIHdvdWxkIG5lZWQgdG8gYmUgbW9kaWZpZWQgb3IgYSBgc3VibWl0X2ZpbHRlcmAgaW4gYSBwYXJlbnQKK3Byb2plY3Qgd291bGQgaGF2ZSB0byBjYXJlIGFib3V0IGluY2x1ZGluZyB0aGUgbmV3IGNhdGVnb3J5IGluIHRoZSByZXN1bHQKK29mIHRoaXMgYHN1Ym1pdF9ydWxlYC4KKworVGhlIGZvcm1lciBleGFtcGxlLCBob3dldmVyLCB3b3VsZCBpbmNsdWRlIGFueSBuZXdseSBhZGRlZCBjYXRlZ29yeSBhcyBpdAoraW52b2tlcyB0aGUgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgYW5kIHRoZW4gbW9kaWZpZXMgaXRzIHJlc3VsdC4KKworV2hpY2ggb2YgdGhlc2UgdHdvIGJlaGF2aW9ycyBpcyBkZXNpcmVkIHdpbGwgYWx3YXlzIGRlcGVuZCBvbiBob3cgYSBwYXJ0aWN1bGFyCitHZXJyaXQgc2VydmVyIGlzIG1hbmFnZWQuCisKIEV4YW1wbGUgOTogUmVtb3ZlIHRoZSBgVmVyaWZpZWRgIGNhdGVnb3J5CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEEgcHJvamVjdCBoYXMgbm8gYnVpbGQgYW5kIHRlc3QuIEl0IGNvbnNpc3RzIG9mIG9ubHkgdGV4dCBmaWxlcyBhbmQgbmVlZHMgb25seQpAQCAtNTk0LDYgKzc2MiwxNyBAQAogV2UgYWxzbyB3YW50IHRoZSBVSSB0byBub3Qgc2hvdyB0aGUgYFZlcmlmaWVkYCBjYXRlZ29yeSBpbiB0aGUgdGFibGUgd2l0aAogdm90ZXMgYW5kIG9uIHRoZSB2b3Rpbmcgc2NyZWVuLgogCitUaGlzIGlzIHF1aXRlIHNpbXBsZSB3aXRob3V0IHJldXNpbmcgdGhlICdnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgOgorCisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfcnVsZShzdWJtaXQoQ1IpKSA6LQorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMiwgMiwgJ0NvZGUtUmV2aWV3JywgQ1IpLgorPT09PQorCitJbXBsZW1lbnRpbmcgdGhlIHNhbWUgcnVsZSBieSByZXVzaW5nIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgIGlzIGEgYml0IG1vcmUgY29tcGxleDoKKwogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KQEAgLTYyNyw2ICs4MDYsMjcgQEAKIFRoZSBgcmVtb3ZlX3ZlcmlmaWVkX2NhdGVnb3J5YCBhbmQgYGFkZF9ub25fYXV0aG9yX2FwcHJvdmFsYCBwcmVkaWNhdGVzIGFyZSB0aGUKIHNhbWUgYXMgZGVmaW5lZCBpbiB0aGUgcHJldmlvdXMgdHdvIGV4YW1wbGVzLgogCitXaXRob3V0IHJldXNpbmcgdGhlIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgIHRoZSBzYW1lIGV4YW1wbGUgbWF5IGJlIGltcGxlbWVudGVkCithczoKKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3J1bGUoc3VibWl0KENSKSkgOi0KKyAgICBiYXNlKENSKSwKKyAgICBDUiA9IGxhYmVsKF8sIG9rKFJldmlld2VyKSksCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoQXV0aG9yKSwKKyAgICBBdXRob3IgXD0gUmV2aWV3ZXIsCisgICAgIS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoQ1IsIE4pKSA6LQorICAgIGJhc2UoQ1IpLAorICAgIE4gPSBsYWJlbCgnTm9uLUF1dGhvci1Db2RlLVJldmlldycsIG5lZWQoXykpLgorCisgIGJhc2UoQ1IpIDotCisgICAgZ2Vycml0Om1heF93aXRoX2Jsb2NrKC0yLCAyLCAnQ29kZS1SZXZpZXcnLCBDUiksCis9PT09CisKIEV4YW1wbGUgMTE6IFJlbW92ZSB0aGUgYFZlcmlmaWVkYCBjYXRlZ29yeSBmcm9tIGFsbCBwcm9qZWN0cwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBFeGFtcGxlIDksIGltcGxlbWVudHMgYHN1Ym1pdF9ydWxlYCB0aGF0IHJlbW92ZXMgdGhlIGBWZXJpZmllZGAgY2F0ZWdvcnkgZnJvbQpAQCAtNjQ4LDcgKzg0OCwzMiBAQAogICByZW1vdmVfdmVyaWZpZWRfY2F0ZWdvcnkoW0h8VF0sIFtIfFJdKSA6LSByZW1vdmVfdmVyaWZpZWRfY2F0ZWdvcnkoVCwgUikuCiA9PT09CiAKLUV4YW1wbGUgMTI6IDErMT0yIENvZGUtUmV2aWV3CitFeGFtcGxlIDEyOiBPbiByZWxlYXNlIGJyYW5jaGVzIHJlcXVpcmUgRHJObyBpbiBhZGRpdGlvbiB0byBwcm9qZWN0IHJ1bGVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitBIG5ldyBjYXRlZ29yeSAnRHJObycgaXMgYWRkZWQgdG8gdGhlIGRhdGFiYXNlIGFuZCBpcyByZXF1aXJlZCBmb3IgcmVsZWFzZQorYnJhbmNoZXMuIFRvIG1hcmsgYSBicmFuY2ggYXMgYSByZWxlYXNlIGJyYW5jaCB3ZSB1c2UgYGRybm8oJ3JlZnMvaGVhZHMvYnJhbmNoJylgLgorCisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBkcm5vKCdyZWZzL2hlYWRzL21hc3RlcicpLgorICBkcm5vKCdyZWZzL2hlYWRzL3N0YWJsZS0yLjMnKS4KKyAgZHJubygncmVmcy9oZWFkcy9zdGFibGUtMi40JykuCisgIGRybm8oJ3JlZnMvaGVhZHMvc3RhYmxlLTIuNScpLgorICBkcm5vKCdyZWZzL2hlYWRzL3N0YWJsZS0yLjUnKS4KKworICBzdWJtaXRfZmlsdGVyKEluLCBPdXQpIDotCisgICAgZ2Vycml0OmNoYW5nZV9icmFuY2goQnJhbmNoKSwKKyAgICBkcm5vKEJyYW5jaCksCisgICAgISwKKyAgICBJbiA9Li4gW3N1Ym1pdCB8IEldLAorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMSwgMSwgJ0RyTm8nLCBEck5vKSwKKyAgICBPdXQgPS4uIFtzdWJtaXQsIERyTm8gfCBJXS4KKworICBzdWJtaXRfZmlsdGVyKEluLCBPdXQpIDotIEluID0gT3V0LgorPT09PQorCitFeGFtcGxlIDEzOiAxKzE9MiBDb2RlLVJldmlldwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEluIHRoaXMgZXhhbXBsZSB3ZSBpbnRyb2R1Y2UgYWNjdW11bGF0aXZlIHZvdGluZyB0byBkZXRlcm1pbmUgaWYgYSBjaGFuZ2UgaXMKIHN1Ym1pdHRhYmxlIG9yIG5vdC4gV2UgbW9kaWZ5IHRoZSBzdGFuZGFyZCBDb2RlLVJldmlldyB0byBiZSBhY2N1bXVsYXRpdmUsIGFuZCBtYWtlIHRoZQpAQCAtNjg0LDcgKzkwOSwzNCBAQAogICAgIFMgPS4uIFtzdWJtaXQgfCBMYWJlbHNdLgogPT09PQogCi1FeGFtcGxlIDEzOiBNYXN0ZXIgYW5kIGFwcHJlbnRpY2UKK0ltcGxlbWVudGluZyB0aGUgc2FtZSBleGFtcGxlIHdpdGhvdXQgdXNpbmcgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGA6CisKKy5ydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChDUiwgVikpIDotCisgICAgc3VtKDIsICdDb2RlLVJldmlldycsIENSKSwKKyAgICBnZXJyaXQ6bWF4X3dpdGhfYmxvY2soLTEsIDEsICdWZXJpZmllZCcsIFYpLgorCisgICUgU3VtIHRoZSB2b3RlcyBpbiBhIGNhdGVnb3J5LiBVc2VzIGEgaGVscGVyIGZ1bmN0aW9uIHNjb3JlLzIKKyAgJSB0byBzZWxlY3Qgb3V0IG9ubHkgdGhlIHNjb3JlIHZhbHVlcyB0aGUgZ2l2ZW4gY2F0ZWdvcnkuCisgIHN1bShWb3Rlc05lZWRlZCwgQ2F0ZWdvcnksIGxhYmVsKENhdGVnb3J5LCBvayhfKSkpIDotCisgICAgZmluZGFsbChTY29yZSwgc2NvcmUoQ2F0ZWdvcnksIFNjb3JlKSwgQWxsKSwKKyAgICBzdW1fbGlzdChBbGwsIFN1bSksCisgICAgU3VtID49IFZvdGVzTmVlZGVkLAorICAgICEuCisgIHN1bShWb3Rlc05lZWRlZCwgQ2F0ZWdvcnksIGxhYmVsKENhdGVnb3J5LCBuZWVkKFZvdGVzTmVlZGVkKSkpLgorCisgIHNjb3JlKENhdGVnb3J5LCBTY29yZSkgOi0KKyAgICBnZXJyaXQ6Y29tbWl0X2xhYmVsKGxhYmVsKENhdGVnb3J5LCBTY29yZSksIFVzZXIpLgorCisgICUgU2ltcGxlIFByb2xvZyByb3V0aW5lIHRvIHN1bSBhIGxpc3Qgb2YgaW50ZWdlcnMuCisgIHN1bV9saXN0KExpc3QsIFN1bSkgICA6LSBzdW1fbGlzdChMaXN0LCAwLCBTdW0pLgorICBzdW1fbGlzdChbWHxUXSwgWSwgUykgOi0gWiBpcyBYICsgWSwgc3VtX2xpc3QoVCwgWiwgUykuCisgIHN1bV9saXN0KFtdLCBTLCBTKS4KKz09PT0KKworRXhhbXBsZSAxNDogTWFzdGVyIGFuZCBhcHByZW50aWNlCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRoZSBtYXN0ZXIgYW5kIGFwcHJlbnRpY2UgZXhhbXBsZSBhbGxvdyB5b3UgdG8gc3BlY2lmeSBhIHVzZXIgKHRoZSBgbWFzdGVyYCkKIHRoYXQgbXVzdCBhcHByb3ZlIGFsbCBjaGFuZ2VzIGRvbmUgYnkgYW5vdGhlciB1c2VyICh0aGUgYGFwcHJlbnRpY2VgKS4KQEAgLTcyMSw3ICs5NzMsNyBAQAogICBhZGRfYXBwcmVudGljZV9tYXN0ZXIoUywgUykuCiA9PT09CiAKLUV4YW1wbGUgMTQ6IE9ubHkgYWxsb3cgQXV0aG9yIHRvIHN1Ym1pdCBjaGFuZ2UKK0V4YW1wbGUgMTU6IE9ubHkgYWxsb3cgQXV0aG9yIHRvIHN1Ym1pdCBjaGFuZ2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRoaXMgZXhhbXBsZSBhZGRzIGEgbmV3IG5lZWRlZCBjYXRlZ29yeSBgUGF0Y2hzZXQtQXV0aG9yYCBmb3IgYW55IHVzZXIgdGhhdCBpcwogbm90IHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiBUaGlzIGVmZmVjdGl2ZWx5IGJsb2NrcyBhbGwgdXNlcnMgZXhjZXB0IHRoZSBhdXRob3IKQEAgLTc0NSw2ICs5OTcsNjggQEAKICAgb25seV9hbGxvd19hdXRob3JfdG9fc3VibWl0KFMxLCBbbGFiZWwoJ1BhdGNoc2V0LUF1dGhvcicsIG5lZWQoXykpIHwgUzFdKS4KID09PT0KIAorRXhhbXBsZXMgLSBTdWJtaXQgVHlwZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IGhvdyB0byBpbXBsZW1lbnQgb3duIHN1Ym1pdCB0eXBlIHJ1bGVzLgorCitFeGFtcGxlIDE6IFNldCBhIGBDaGVycnkgUGlja2Agc3VibWl0IHR5cGUgZm9yIGFsbCBjaGFuZ2VzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUaGlzIGV4YW1wbGUgc2V0cyB0aGUgYENoZXJyeSBQaWNrYCBzdWJtaXQgdHlwZSBmb3IgYWxsIGNoYW5nZXMuIEl0IG92ZXJyaWRlcword2hhdGV2ZXIgaXMgc2V0IGFzIHByb2plY3QgZGVmYXVsdCBzdWJtaXQgdHlwZS4KKworcnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfdHlwZShjaGVycnlfcGljaykuCis9PT09CisKKworRXhhbXBsZSAyOiBgRmFzdCBGb3J3YXJkIE9ubHlgIGZvciBhbGwgYHJlZnMvaGVhZHMvc3RhYmxlKmAgYnJhbmNoZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitGb3IgYWxsIGByZWZzL2hlYWRzL3N0YWJsZS4qYCBicmFuY2hlcyB3ZSB3b3VsZCBsaWtlIHRvIGVuZm9yY2UgdGhlIGBGYXN0CitGb3J3YXJkIE9ubHlgIHN1Ym1pdCB0eXBlLiBBIHJlYXNvbiBmb3IgdGhpcyBkZWNpc2lvbiBtYXkgYmUgYSBuZWVkIHRvIG5ldmVyCiticmVhayB0aGUgYnVpbGQgaW4gdGhlIHN0YWJsZSBicmFuY2hlcy4gIEZvciBhbGwgb3RoZXIgYnJhbmNoZXMsIHRob3NlIG5vdAorbWF0Y2hpbmcgdGhlIGByZWZzL2hlYWRzL3N0YWJsZS4qYCBwYXR0ZXJuLCB3ZSB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgcHJvamVjdCdzCitkZWZhdWx0IHN1Ym1pdCB0eXBlIGFzIGRlZmluZWQgb24gdGhlIHByb2plY3Qgc2V0dGluZ3MgcGFnZS4KKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3R5cGUoZmFzdF9mb3J3YXJkX29ubHkpIDotCisgICAgZ2Vycml0OmNoYW5nZV9icmFuY2goQiksIHJlZ2V4X21hdGNoZXMoJ3JlZnMvaGVhZHMvc3RhYmxlLionLCBCKSwKKyAgICAhLgorICBzdWJtaXRfdHlwZShUKSA6LSBnZXJyaXQ6cHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlKFQpCis9PT09CisKK1RoZSBmaXJzdCBgc3VibWl0X3R5cGVgIHByZWRpY2F0ZSBkZWZpbmVzIHRoZSBgRmFzdCBGb3J3YXJkIE9ubHlgIHN1Ym1pdCB0eXBlCitmb3IgYHJlZnMvaGVhZHMvc3RhYmxlLipgIGJyYW5jaGVzLiBUaGUgc2Vjb25kIGBzdWJtaXRfdHlwZWAgcHJlZGljYXRlIHJldHVybnMKK3RoZSBwcm9qZWN0J3MgZGVmYXVsdCBzdWJtaXQgdHlwZS4KKworRXhhbXBsZSAzOiBEb24ndCByZXF1aXJlIGBGYXN0IEZvcndhcmQgT25seWAgaWYgb25seSBkb2N1bWVudGF0aW9uIHdhcyBjaGFuZ2VkCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0xpa2UgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUgd2Ugd2FudCB0aGUgYEZhc3QgRm9yd2FyZCBPbmx5YCBzdWJtaXQgdHlwZSBmb3IKK3RoZSBgcmVmcy9oZWFkcy9zdGFibGUqYCBicmFuY2hlcy4gIEhvd2V2ZXIsIGlmIG9ubHkgZG9jdW1lbnRhdGlvbiB3YXMgY2hhbmdlZAorKG9ubHkgYCoudHh0YCBmaWxlcyksIHRoZW4gd2UgYWxsb3cgcHJvamVjdCdzIGRlZmF1bHQgc3VibWl0IHR5cGUgZm9yIHN1Y2gKK2NoYW5nZXMuCisKKy5ydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIHN1Ym1pdF90eXBlKGZhc3RfZm9yd2FyZF9vbmx5KSA6LQorICAgIGdlcnJpdDpjb21taXRfZGVsdGEoJyg/PCFcLnR4dCkkJyksCisgICAgZ2Vycml0OmNoYW5nZV9icmFuY2goQiksIHJlZ2V4X21hdGNoZXMoJ3JlZnMvaGVhZHMvc3RhYmxlLionLCBCKSwKKyAgICAhLgorICBzdWJtaXRfdHlwZShUKSA6LSBnZXJyaXQ6cHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlKFQpCis9PT09CisKK1RoZSBgZ2Vycml0OmNvbW1pdF9kZWx0YSgnKD88IVwudHh0KSQnKWAgc3VjY2VlZHMgaWYgdGhlIGNoYW5nZSBjb250YWlucyBhIGZpbGUKK3dob3NlIG5hbWUgZG9lc24ndCBlbmQgd2l0aCBgLnR4dGAgVGhlIHJlc3Qgb2YgdGhpcyBydWxlIGlzIHNhbWUgbGlrZSBpbiB0aGUKK3ByZXZpb3VzIGV4YW1wbGUuCisKK0lmIGFsbCBmaWxlIG5hbWVzIGluIHRoZSBjaGFuZ2UgZW5kIHdpdGggYC50eHRgLCB0aGVuIHRoZQorYGdlcnJpdDpjb21taXRfZGVsdGEoJyg/PCFcLnR4dCkkJylgIHdpbGwgZmFpbCBhcyBubyBmaWxlIG5hbWUgd2lsbCBtYXRjaCB0aGlzCityZWd1bGFyIGV4cHJlc3Npb24uCisKIEdFUlJJVAogLS0tLS0tCiBQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JlZnMtbm90ZXMtcmV2aWV3LnR4dCBiL0RvY3VtZW50YXRpb24vcmVmcy1ub3Rlcy1yZXZpZXcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJmNTY3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vcmVmcy1ub3Rlcy1yZXZpZXcudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVRoZSByZWZzL25vdGVzL3JldmlldyBuYW1lc3BhY2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU3VtbWFyeQotLS0tLS0tLQotCi1gcmVmcy9ub3Rlcy9yZXZpZXdgIGlzIGEgc3BlY2lhbCByZWZlcmVuY2UgdGhhdCBHZXJyaXQgY3JlYXRlcyBvbiByZXBvc2l0b3JpZXMKLXRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGNvZGUgcmV2aWV3cy4KLQotV2hlbiBhIHJlcG9zaXRvcnkgaXMgY2xvbmVkIGZyb20gR2Vycml0LCB0aGUgYHJlZnMvbm90ZXMvcmV2aWV3YCByZWZlcmVuY2UgaXMKLW5vdCBpbmNsdWRlZCBieSBkZWZhdWx0LiAgSXQgaGFzIHRvIGJlIG1hbnVhbGx5IGZldGNoZWQ6Ci0KLT09PT0KLSAgJCBnaXQgZmV0Y2ggb3JpZ2luIHJlZnMvbm90ZXMvcmV2aWV3OnJlZnMvbm90ZXMvcmV2aWV3Ci09PT09Ci0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8KLWxpbms6aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvZ2l0LWNvbmZpZy5odG1sW2NvbmZpZ3VyZSBnaXRdCi10byBhbHdheXMgZmV0Y2ggYHJlZnMvbm90ZXMvcmV2aWV3YDoKLQotPT09PQotICAkIGdpdCBjb25maWcgLS1hZGQgcmVtb3RlLm9yaWdpbi5mZXRjaCByZWZzL25vdGVzL3JldmlldzpyZWZzL25vdGVzL3JldmlldwotICAkIGdpdCBmZXRjaAotPT09PQotCi1XaGVuIGByZWZzL25vdGVzL3Jldmlld2AgaXMgZmV0Y2hlZCBvbiBhIHJlcG9zaXRvcnksIHRoZSBHZXJyaXQgcmV2aWV3Ci1pbmZvcm1hdGlvbiBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIGdpdCBsb2cgb3V0cHV0OgotCi09PT09Ci0gICAkIGdpdCBsb2cgLS1zaG93LW5vdGVzPXJldmlldwotPT09PQotCi1Db250ZW50IG9mIHJlZnMvbm90ZXMvcmV2aWV3Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZvciBlYWNoIGNvbW1pdCwgR2Vycml0IHN0b3JlcyB0aGUgZm9sbG93aW5nIHJldmlldyBpbmZvcm1hdGlvbiBpbgotYHJlZnMvbm90ZXMvcmV2aWV3YDoKLQotW1tzdWJtaXR0ZWRfYnldXQotU3VibWl0dGVkLWJ5Ci1+fn5+fn5+fn5+fn4KLQotVGhlIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIEdlcnJpdCB1c2VyIHRoYXQgc3VibWl0dGVkIHRoZSBjaGFuZ2UgaW4KLWxpbms6aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjgyMi50eHRbUkZDIDI4MjJdIGZvcm1hdC4KLQotPT09PQotICBTdWJtaXR0ZWQtYnk6IFJhbmRvbSBKIERldmVsb3BlciA8cmFuZG9tQGRldmVsb3Blci5leGFtcGxlLm9yZz4KLT09PT0KLQotW1tzdWJtaXR0ZWRfYXRdXQotU3VibWl0dGVkLWF0Ci1+fn5+fn5+fn5+fn4KLQotVGhlIHRpbWUgdGhlIGNvbW1pdCB3YXMgc3VibWl0dGVkIGluIFJGQyAyODIyIHRpbWUgc3RhbXAgZm9ybWF0LgotCi09PT09Ci0gIFN1Ym1pdHRlZC1hdDogTW9uLCAyNSBKdW4gMjAxMiAxNjoxNTo1NyArMDIwMAotPT09PQotCi1bW3Jldmlld2VkX29uXV0KLVJldmlld2VkLW9uCi1+fn5+fn5+fn5+fgotCi1UaGUgVVJMIHRvIHRoZSBjaGFuZ2Ugb24gdGhlIEdlcnJpdCBzZXJ2ZXIuCi0KLT09PT0KLSAgUmV2aWV3ZWQtb246IGh0dHA6Ly9wYXRoLnRvLmdlcnJpdC8xMjM0NQotPT09PQotCi1bW3Jldmlld19zY29yZXNdXQotUmV2aWV3IExhYmVscyBhbmQgU2NvcmVzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotUmV2aWV3IGxhYmVsIGFuZCBzY29yZSwgYW5kIHRoZSBuYW1lIGFuZCBlbWFpbCBhZGRyZXNzIG9mIHRoZSBHZXJyaXQgdXNlciB0aGF0Ci1nYXZlIGl0IGluIFJGQyAyODIyIGZvcm1hdDoKLQotPT09PQotICBDb2RlLVJldmlldysyOiBBLiBOLiBPdGhlciA8YW5vdGhlckBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+Ci0gIFZlcmlmaWVkKzE6IEEuIE4uIE90aGVyIDxhbm90aGVyQGRldmVsb3Blci5leGFtcGxlLm9yZz4KLT09PT0KLQotQ29tbW9ubHkgdXNlZCByZXZpZXcgbGFiZWxzIGFyZSAiQ29kZS1SZXZpZXciIGFuZCAiVmVyaWZpZWQiLCBidXQgYW55IGxhYmVsCi1jb25maWd1cmVkIGluIEdlcnJpdCBjYW4gYmUgaW5jbHVkZWQuCi0KLUFsbCByZXZpZXcgbGFiZWxzIGFuZCBzY29yZXMgcHJlc2VudCBvbiB0aGUgY2hhbmdlIGF0IHRoZSB0aW1lIG9mIHN1Ym1pdCBhcmUKLWluY2x1ZGVkLgotCi1bW3Byb2plY3RdXQotUHJvamVjdAotfn5+fn5+fgotCi1UaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB3aGljaCB0aGUgY29tbWl0IHdhcyBtYWRlLgotCi09PT09Ci0gIFByb2plY3Q6IGtlcm5lbC9jb21tb24KLT09PT0KLQotW1ticmFuY2hdXQotQnJhbmNoCi1+fn5+fn4KLQotVGhlIG5hbWUgb2YgdGhlIGJyYW5jaCBvbiB3aGljaCB0aGUgY29tbWl0IHdhcyBtYWRlLgotCi09PT09Ci0gIEJyYW5jaDogcmVmcy9oZWFkcy9tYXN0ZXIKLT09PT0KLQotCi1HRVJSSVQKLS0tLS0tLQotUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1hY2NvdW50cy50eHQgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWFjY291bnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2NkMzlhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1hY2NvdW50cy50eHQKQEAgLTAsMCArMSwzNjggQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIC9hY2NvdW50cy8gUkVTVCBBUEkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBwYWdlIGRlc2NyaWJlcyB0aGUgYWNjb3VudCByZWxhdGVkIFJFU1QgZW5kcG9pbnRzLgorUGxlYXNlIGFsc28gdGFrZSBub3RlIG9mIHRoZSBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIHRoZQorbGluazpyZXN0LWFwaS5odG1sW1JFU1QgQVBJXS4KKworRW5kcG9pbnRzCistLS0tLS0tLS0KKworW1tnZXQtYWNjb3VudF1dCitHZXQgQWNjb3VudAorfn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2FjY291bnRzL2xpbms6I2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dJworCitSZXR1cm5zIGFuIGFjY291bnQgYXMgYW4gbGluazojYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvYWNjb3VudHMvc2VsZiBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgIH0KKy0tLS0KKworW1tsaXN0LWFjY291bnQtY2FwYWJpbGl0aWVzXV0KK0xpc3QgQWNjb3VudCBDYXBhYmlsaXRpZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2FjY291bnRzL2xpbms6I2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dL2NhcGFiaWxpdGllcycKKworUmV0dXJucyB0aGUgZ2xvYmFsIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkCit1c2VyLgorCitJZiB0aGUgZ2xvYmFsIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNhbGxpbmcgdXNlciBzaG91bGQgYmUgbGlzdGVkLAorYHNlbGZgIGNhbiBiZSB1c2VkIGFzIGFjY291bnQtaWQuIFRoaXMgY2FuIGJlIHVzZWQgYnkgVUkgdG9vbHMgdG8KK2Rpc2NvdmVyIGlmIGFkbWluaXN0cmF0aXZlIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciwgc28KK3RoZXkgY2FuIGhpZGUgKG9yIHNob3cpIHJlbGV2YW50IFVJIGFjdGlvbnMuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIGdsb2JhbCBjYXBhYmlsaXRpZXMgb2YgdGhlIHVzZXIgYXJlIHJldHVybmVkIGFzIGEKK2xpbms6I2NhcGFiaWxpdHktaW5mb1tDYXBhYmlsaXR5SW5mb10gZW50aXR5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAicXVlcnlMaW1pdCI6IHsKKyAgICAgICJtaW4iOiAwLAorICAgICAgIm1heCI6IDUwMAorICAgIH0sCisgICAgImVtYWlsUmV2aWV3ZXJzIjogdHJ1ZQorICB9CistLS0tCisKK0FkbWluaXN0cmF0b3IgdGhhdCBoYXMgYXV0aGVudGljYXRlZCB3aXRoIGRpZ2VzdCBhdXRoZW50aWNhdGlvbjoKKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9hL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzIEhUVFAvMS4wCisgIEF1dGhvcml6YXRpb246IERpZ2VzdCB1c2VybmFtZT0iYWRtaW4iLCByZWFsbT0iR2Vycml0IENvZGUgUmV2aWV3Iiwgbm9uY2U9Ii4uLgorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiYWRtaW5pc3RyYXRlU2VydmVyIjogdHJ1ZSwKKyAgICAicXVlcnlMaW1pdCI6IHsKKyAgICAgICJtaW4iOiAwLAorICAgICAgIm1heCI6IDUwMAorICAgIH0sCisgICAgImNyZWF0ZUFjY291bnQiOiB0cnVlLAorICAgICJjcmVhdGVHcm91cCI6IHRydWUsCisgICAgImNyZWF0ZVByb2plY3QiOiB0cnVlLAorICAgICJlbWFpbFJldmlld2VycyI6IHRydWUsCisgICAgImtpbGxUYXNrIjogdHJ1ZSwKKyAgICAidmlld0NhY2hlcyI6IHRydWUsCisgICAgImZsdXNoQ2FjaGVzIjogdHJ1ZSwKKyAgICAidmlld0Nvbm5lY3Rpb25zIjogdHJ1ZSwKKyAgICAidmlld1F1ZXVlIjogdHJ1ZSwKKyAgICAicnVuR0MiOiB0cnVlLAorICAgICJzdGFydFJlcGxpY2F0aW9uIjogdHJ1ZQorICB9CistLS0tCisKKy5HZXQgeW91ciBvd24gY2FwYWJpbGl0aWVzCisqKioqCitnZXQ6Oi9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcworKioqKgorCitUbyBmaWx0ZXIgdGhlIHNldCBvZiBnbG9iYWwgY2FwYWJpbGl0aWVzIHRoZSBgcWAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkLgorRmlsdGVyaW5nIG1heSBkZWNyZWFzZSB0aGUgcmVzcG9uc2UgdGltZSBieSBhdm9pZGluZyBsb29raW5nIGF0IGV2ZXJ5Citwb3NzaWJsZSBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNhbGxlci4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9hL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzP3E9Y3JlYXRlQWNjb3VudCZxPWNyZWF0ZUdyb3VwIEhUVFAvMS4wCisgIEF1dGhvcml6YXRpb246IERpZ2VzdCB1c2VybmFtZT0iYWRtaW4iLCByZWFsbT0iR2Vycml0IENvZGUgUmV2aWV3Iiwgbm9uY2U9Ii4uLgorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiY3JlYXRlQWNjb3VudCI6IHRydWUsCisgICAgImNyZWF0ZUdyb3VwIjogdHJ1ZQorICB9CistLS0tCisKKy5DaGVjayBpZiB5b3UgY2FuIGNyZWF0ZSBncm91cHMKKyoqKioKK2dldDo6L2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzP3E9Y3JlYXRlR3JvdXAKKyoqKioKKworW1tjaGVjay1hY2NvdW50LWNhcGFiaWxpdHldXQorQ2hlY2sgQWNjb3VudCBDYXBhYmlsaXR5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2FjY291bnRzL2xpbms6I2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dL2NhcGFiaWxpdGllcy9saW5rOiNjYXBhYmlsaXR5LWlkW1x7Y2FwYWJpbGl0eS1pZFx9XScKKworQ2hlY2tzIGlmIGEgdXNlciBoYXMgYSBjZXJ0YWluIGdsb2JhbCBjYXBhYmlsaXR5LgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2EvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMvY3JlYXRlR3JvdXAgSFRUUC8xLjAKKy0tLS0KKworSWYgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgY2FwYWJpbGl0eSB0aGUgc3RyaW5nIGBva2AgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKworICBvaworLS0tLQorCitJZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgdGhlIGdsb2JhbCBjYXBhYmlsaXR5IHRoZSByZXNwb25zZSBpcworYDQwNCBOb3QgRm91bmRgLgorCisuQ2hlY2sgaWYgeW91IGNhbiBjcmVhdGUgZ3JvdXBzCisqKioqCitnZXQ6Oi9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcy9jcmVhdGVHcm91cAorKioqKgorCitbW2xpc3QtZ3JvdXBzXV0KK0xpc3QgR3JvdXBzCit+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvYWNjb3VudHMvbGluazojYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0vZ3JvdXBzLycKKworTGlzdHMgYWxsIGdyb3VwcyB0aGF0IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB1c2VyIGFzIGEgbWVtYmVyLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2EvYWNjb3VudHMvc2VsZi9ncm91cHMvIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3VsdCBhIGxpc3Qgb2YgbGluazpyZXN0LWFwaS1ncm91cHMuaHRtbCNncm91cC1pbmZvW0dyb3VwSW5mb10KK2VudHJpZXMgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogImdsb2JhbCUzQUFub255bW91cy1Vc2VycyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtZ2xvYmFsJTNBQW5vbnltb3VzLVVzZXJzIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJBbnkgdXNlciwgc2lnbmVkLWluIG9yIG5vdCIsCisgICAgICAiZ3JvdXBfaWQiOiAyLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfSwKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICI4MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC04MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlLAorICAgICAgfSwKKyAgICAgICJncm91cF9pZCI6IDYsCisgICAgICAib3duZXJfaWQiOiAiODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNyIKKyAgICB9LAorICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogImdsb2JhbCUzQVJlZ2lzdGVyZWQtVXNlcnMiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLWdsb2JhbCUzQVJlZ2lzdGVyZWQtVXNlcnMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkFueSBzaWduZWQtaW4gdXNlciIsCisgICAgICAiZ3JvdXBfaWQiOiAzLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfQorICBdCistLS0tCisKKy5MaXN0IGFsbCBncm91cHMgdGhhdCBjb250YWluIHlvdSBhcyBhIG1lbWJlcgorKioqKgorZ2V0OjovYWNjb3VudHMvc2VsZi9ncm91cHMvCisqKioqCisKK1tbZ2V0LWF2YXRhcl1dCitHZXQgQXZhdGFyCit+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9hY2NvdW50cy9saW5rOiNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XS9hdmF0YXInCisKK1JldHJpZXZlcyB0aGUgYXZhdGFyIGltYWdlIG9mIHRoZSB1c2VyLgorCitXaXRoIHRoZSBgc2l6ZWAgb3B0aW9uIChhbGlhcyBgc2ApIHlvdSBjYW4gc3BlY2lmeSB0aGUgcHJlZmVycmVkIHNpemUKK2luIHBpeGVscyAoaGVpZ2h0IGFuZCB3aWR0aCkuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvYS9hY2NvdW50cy9qb2huLmRvZUBleGFtcGxlLmNvbS9hdmF0YXI/cz0yMCBIVFRQLzEuMAorLS0tLQorCitUaGUgcmVzcG9uc2UgcmVkaXJlY3RzIHRvIHRoZSBVUkwgb2YgdGhlIGF2YXRhciBpbWFnZS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDMwMiBGb3VuZAorICBMb2NhdGlvbjogaHR0cHM6Ly9wcm9maWxlcy9hdmF0YXIvam9obl9kb2UuanBlZz9zPTIweDIwCistLS0tCisKKworW1tpZHNdXQorSURzCistLS0KKworW1thY2NvdW50LWlkXV0KK1x7YWNjb3VudC1pZFx9Cit+fn5+fn5+fn5+fn5+fgorSWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgb25lIGFjY291bnQuCisKK1RoaXMgY2FuIGJlOgorCisqIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQgIkZ1bGwgTmFtZSA8ZW1haWxAZXhhbXBsZS5jb20+IgorKiBqdXN0IHRoZSBlbWFpbCBhZGRyZXNzICgiZW1haWxAZXhhbXBsZSIpCisqIGEgZnVsbCBuYW1lIGlmIGl0IGlzIHVuaXF1ZSAoIkZ1bGwgTmFtZSIpCisqIGFuIGFjY291bnQgSUQgKCIxODQxOSIpCisqIGEgdXNlciBuYW1lICgidXNlcm5hbWUiKQorKiBgc2VsZmAgZm9yIHRoZSBjYWxsaW5nIHVzZXIKKworW1tjYXBhYmlsaXR5LWlkXV0KK1x7Y2FwYWJpbGl0eS1pZFx9Cit+fn5+fn5+fn5+fn5+fn5+fgorSWRlbnRpZmllciBvZiBhIGdsb2JhbCBjYXBhYmlsaXR5LiBWYWxpZCB2YWx1ZXMgYXJlIGFsbCBmaWVsZCBuYW1lcyBvZgordGhlIGxpbms6I2NhcGFiaWxpdHktaW5mb1tDYXBhYmlsaXR5SW5mb10gZW50aXR5LgorCisKK1tbanNvbi1lbnRpdGllc11dCitKU09OIEVudGl0aWVzCistLS0tLS0tLS0tLS0tCisKK1tbYWNjb3VudC1pbmZvXV0KK0FjY291bnRJbmZvCit+fn5+fn5+fn5+fgorVGhlIGBBY2NvdW50SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YF9hY2NvdW50X2lkYCB8fFRoZSBudW1lcmljIElEIG9mIHRoZSBhY2NvdW50LgorfGBuYW1lYCAgICAgICAgfG9wdGlvbmFsfFRoZSBmdWxsIG5hbWUgb2YgdGhlIHVzZXIuICsKK09ubHkgc2V0IGlmIGRldGFpbGVkIGFjY291bnQgaW5mb3JtYXRpb24gaXMgcmVxdWVzdGVkLgorfGBlbWFpbGAgICAgICAgfG9wdGlvbmFsfAorVGhlIGVtYWlsIGFkZHJlc3MgdGhlIHVzZXIgcHJlZmVycyB0byBiZSBjb250YWN0ZWQgdGhyb3VnaC4gKworT25seSBzZXQgaWYgZGV0YWlsZWQgYWNjb3VudCBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbY2FwYWJpbGl0eS1pbmZvXV0KK0NhcGFiaWxpdHlJbmZvCit+fn5+fn5+fn5+fn5+fgorVGhlIGBDYXBhYmlsaXR5SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBnbG9iYWwKK2NhcGFiaWxpdGllcyBvZiBhIHVzZXIuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgICB8fERlc2NyaXB0aW9uCit8YGFkbWluaXN0cmF0ZVNlcnZlcmB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfYWRtaW5pc3RyYXRlU2VydmVyW0FkbWluaXN0cmF0ZQorU2VydmVyXSBjYXBhYmlsaXR5LgorfGBxdWVyeUxpbWl0YHx8VGhlIGxpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X3F1ZXJ5TGltaXRbUXVlcnkKK0xpbWl0XSBvZiB0aGUgdXNlciBhcyBsaW5rOiNxdWVyeS1saW1pdC1pbmZvW1F1ZXJ5TGltaXRJbmZvXS4KK3xgY3JlYXRlQWNjb3VudGAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9jcmVhdGVBY2NvdW50W0NyZWF0ZSBBY2NvdW50XQorY2FwYWJpbGl0eS4KK3xgY3JlYXRlR3JvdXBgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9jcmVhdGVHcm91cFtDcmVhdGUgR3JvdXBdCitjYXBhYmlsaXR5LgorfGBjcmVhdGVQcm9qZWN0YCAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2NyZWF0ZVByb2plY3RbQ3JlYXRlIFByb2plY3RdCitjYXBhYmlsaXR5LgorfGBlbWFpbFJldmlld2Vyc2AgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2VtYWlsUmV2aWV3ZXJzW0VtYWlsIFJldmlld2Vyc10KK2NhcGFiaWxpdHkuCit8YGtpbGxUYXNrYCAgICAgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfa2lsbFtLaWxsIFRhc2tdIGNhcGFiaWxpdHkuCit8YHZpZXdDYWNoZXNgICAgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfdmlld0NhY2hlc1tWaWV3IENhY2hlc10gY2FwYWJpbGl0eS4KK3xgZmx1c2hDYWNoZXNgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9mbHVzaENhY2hlc1tGbHVzaCBDYWNoZXNdCitjYXBhYmlsaXR5LgorfGB2aWV3Q29ubmVjdGlvbnNgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X3ZpZXdDb25uZWN0aW9uc1tWaWV3IENvbm5lY3Rpb25zXQorY2FwYWJpbGl0eS4KK3xgdmlld1F1ZXVlYCAgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV92aWV3UXVldWVbVmlldyBRdWV1ZV0gY2FwYWJpbGl0eS4KK3xgcnVuR0NgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfcnVuR0NbUnVuIEdhcmJhZ2UgQ29sbGVjdGlvbl0KK2NhcGFiaWxpdHkuCit8YHN0YXJ0UmVwbGljYXRpb25gICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfc3RhcnRSZXBsaWNhdGlvbltTdGFydCBSZXBsaWNhdGlvbl0KK2NhcGFiaWxpdHkuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcXVlcnktbGltaXQtaW5mb11dCitRdWVyeUxpbWl0SW5mbworfn5+fn5+fn5+fn5+fn4KK1RoZSBgUXVlcnlMaW1pdEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X3F1ZXJ5TGltaXRbUXVlcnkgTGltaXRdIG9mIGEgdXNlci4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICAgICAgfERlc2NyaXB0aW9uCit8YG1pbmAgICAgICAgICAgICAgICB8TG93ZXIgbGltaXQuCit8YG1heGAgICAgICAgICAgICAgICB8VXBwZXIgbGltaXQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1jaGFuZ2VzLnR4dCBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktY2hhbmdlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2YTE3NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktY2hhbmdlcy50eHQKQEAgLTAsMCArMSwyMTUzIEBACitHZXJyaXQgQ29kZSBSZXZpZXcgLSAvY2hhbmdlcy8gUkVTVCBBUEkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHBhZ2UgZGVzY3JpYmVzIHRoZSBjaGFuZ2UgcmVsYXRlZCBSRVNUIGVuZHBvaW50cy4KK1BsZWFzZSBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiB0aGUKK2xpbms6cmVzdC1hcGkuaHRtbFtSRVNUIEFQSV0uCisKK1tbY2hhbmdlLWVuZHBvaW50c11dCitDaGFuZ2UgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tCisKK1tbbGlzdC1jaGFuZ2VzXV0KK1F1ZXJ5IENoYW5nZXMKK35+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvJworCitRdWVyaWVzIGNoYW5nZXMgdmlzaWJsZSB0byB0aGUgY2FsbGVyLiBUaGUgcXVlcnkgc3RyaW5nIG11c3QgYmUKK3Byb3ZpZGVkIGJ5IHRoZSBgcWAgcGFyYW1ldGVyLiBUaGUgYG5gIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBsaW1pdAordGhlIHJldHVybmVkIHJlc3VsdHMuCisKK0FzIHJlc3VsdCBhIGxpc3Qgb2YgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50cmllcyBpcyByZXR1cm5lZC4KK1RoZSBjaGFuZ2Ugb3V0cHV0IGlzIHNvcnRlZCBieSB0aGUgbGFzdCB1cGRhdGUgdGltZSwgbW9zdCByZWNlbnRseQordXBkYXRlZCB0byBvbGRlc3QgdXBkYXRlZC4KKworUXVlcnkgZm9yIG9wZW4gY2hhbmdlcyBvZiB3YXRjaGVkIHByb2plY3RzOgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvP3E9c3RhdHVzOm9wZW4raXM6d2F0Y2hlZCZuPTIgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjaGFuZ2UiLAorICAgICAgImlkIjogImRlbW9+bWFzdGVyfklkYWY1ZTA5OGQ3MDg5OGI3MTE5ZjZmNGFmNWE2YzEzMzQzZDY0YjU3IiwKKyAgICAgICJwcm9qZWN0IjogImRlbW8iLAorICAgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICAgImNoYW5nZV9pZCI6ICJJZGFmNWUwOThkNzA4OThiNzExOWY2ZjRhZjVhNmMxMzM0M2Q2NGI1NyIsCisgICAgICAic3ViamVjdCI6ICJPbmUgY2hhbmdlIiwKKyAgICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODU0MDAwMDAwIiwKKyAgICAgICJ1cGRhdGVkIjogIjIwMTItMDctMTcgMDc6MTk6MjcuNzY2MDAwMDAwIiwKKyAgICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAgICJfc29ydGtleSI6ICIwMDFlNzA1NzAwMDAwNmRjIiwKKyAgICAgICJfbnVtYmVyIjogMTc1NiwKKyAgICAgICJvd25lciI6IHsKKyAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiCisgICAgICB9LAorICAgIH0sCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjaGFuZ2UiLAorICAgICAgImlkIjogImRlbW9+bWFzdGVyfkkwOWM4MDQxYjU4NjdkNWIzMzE3MDMxNmUyYWJjMzRiNzliYmI4NTAxIiwKKyAgICAgICJwcm9qZWN0IjogImRlbW8iLAorICAgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICAgImNoYW5nZV9pZCI6ICJJMDljODA0MWI1ODY3ZDViMzMxNzAzMTZlMmFiYzM0Yjc5YmJiODUwMSIsCisgICAgICAic3ViamVjdCI6ICJBbm90aGVyIGNoYW5nZSIsCisgICAgICAic3RhdHVzIjogIk5FVyIsCisgICAgICAiY3JlYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg4NDAwMDAwMCIsCisgICAgICAidXBkYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg4NTAwMDAwMCIsCisgICAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAgICJfc29ydGtleSI6ICIwMDFlNzA1NjAwMDAwNmRkIiwKKyAgICAgICJfbnVtYmVyIjogMTc1NywKKyAgICAgICJvd25lciI6IHsKKyAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiCisgICAgICB9LAorICAgICAgIl9tb3JlX2NoYW5nZXMiOiB0cnVlCisgICAgfQorICBdCistLS0tCisKK0lmIHRoZSBgbmAgcXVlcnkgcGFyYW1ldGVyIGlzIHN1cHBsaWVkIGFuZCBhZGRpdGlvbmFsIGNoYW5nZXMgZXhpc3QKK3RoYXQgbWF0Y2ggdGhlIHF1ZXJ5IGJleW9uZCB0aGUgZW5kLCB0aGUgbGFzdCBjaGFuZ2Ugb2JqZWN0IGhhcyBhCitgX21vcmVfY2hhbmdlczogdHJ1ZWAgSlNPTiBmaWVsZCBzZXQuIENhbGxlcnMgY2FuIHJlc3VtZSBhIHF1ZXJ5IHdpdGgKK3RoZSBgTmAgcXVlcnkgcGFyYW1ldGVyLCBzdXBwbHlpbmcgdGhlIGxhc3QgY2hhbmdlJ3MgYF9zb3J0a2V5YCBmaWVsZAorYXMgdGhlIHZhbHVlLiBXaGVuIGdvaW5nIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbiB3aXRoIHRoZSBgUGAgcXVlcnkKK3BhcmFtZXRlciBhIGBfbW9yZV9jaGFuZ2VzOiB0cnVlYCBpcyBwdXQgaW4gdGhlIGZpcnN0IGNoYW5nZSBvYmplY3QgaWYKK3RoZXJlIGFyZSByZXN1bHRzICpiZWZvcmUqIHRoZSBmaXJzdCBjaGFuZ2UgcmV0dXJuZWQuCisKK0NsaWVudHMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSBtb3JlIHRoYW4gb25lIHF1ZXJ5IGJ5IHNldHRpbmcgdGhlIGBxYAorcGFyYW1ldGVyIG11bHRpcGxlIHRpbWVzLiBJbiB0aGlzIGNhc2UgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZgorYXJyYXlzLCBvbmUgcGVyIHF1ZXJ5IGluIHRoZSBzYW1lIG9yZGVyIHRoZSBxdWVyaWVzIHdlcmUgZ2l2ZW4gaW4uCisKKy5RdWVyeSBmb3IgdGhlIDI1IG1vc3QgcmVjZW50IG9wZW4gY2hhbmdlcyBvZiB0aGUgcHJvamVjdHMgdGhhdCB5b3Ugd2F0Y2gKKyoqKioKK2dldDo6L2NoYW5nZXMvP3E9c3RhdHVzOm9wZW4raXM6d2F0Y2hlZCZuPTI1CisqKioqCisKK1F1ZXJ5IHRoYXQgcmV0cmlldmVzIGNoYW5nZXMgZm9yIGEgdXNlcidzIGRhc2hib2FyZDoKKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzLz9xPWlzOm9wZW4rb3duZXI6c2VsZiZxPWlzOm9wZW4rcmV2aWV3ZXI6c2VsZistb3duZXI6c2VsZiZxPWlzOmNsb3NlZCtvd25lcjpzZWxmK2xpbWl0OjUmbz1MQUJFTFMgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgWworICAgICAgeworICAgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgICAgICJpZCI6ICJkZW1vfm1hc3Rlcn5JZGFmNWUwOThkNzA4OThiNzExOWY2ZjRhZjVhNmMxMzM0M2Q2NGI1NyIsCisgICAgICAgICJwcm9qZWN0IjogImRlbW8iLAorICAgICAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgICAgICJjaGFuZ2VfaWQiOiAiSWRhZjVlMDk4ZDcwODk4YjcxMTlmNmY0YWY1YTZjMTMzNDNkNjRiNTciLAorICAgICAgICAic3ViamVjdCI6ICJPbmUgY2hhbmdlIiwKKyAgICAgICAgInN0YXR1cyI6ICJORVciLAorICAgICAgICAiY3JlYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg1NDAwMDAwMCIsCisgICAgICAgICJ1cGRhdGVkIjogIjIwMTItMDctMTcgMDc6MTk6MjcuNzY2MDAwMDAwIiwKKyAgICAgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgICAgICJfc29ydGtleSI6ICIwMDFlNzA1NzAwMDAwNmRjIiwKKyAgICAgICAgIl9udW1iZXIiOiAxNzU2LAorICAgICAgICAib3duZXIiOiB7CisgICAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiCisgICAgICAgIH0sCisgICAgICAgICJsYWJlbHMiOiB7CisgICAgICAgICAgIlZlcmlmaWVkIjoge30sCisgICAgICAgICAgIkNvZGUtUmV2aWV3Ijoge30KKyAgICAgICAgfQorICAgICAgfQorICAgIF0sCisgICAgW10sCisgICAgW10KKyAgXQorLS0tLQorCisuUXVlcnkgdGhlIGNoYW5nZXMgZm9yIHlvdXIgdXNlciBkYXNoYm9hcmQKKyoqKioKK2dldDo6L2NoYW5nZXMvP3E9aXM6b3Blbitvd25lcjpzZWxmJnE9aXM6b3BlbityZXZpZXdlcjpzZWxmKy1vd25lcjpzZWxmJnE9aXM6Y2xvc2VkK293bmVyOnNlbGYrbGltaXQ6NSZvPUxBQkVMUworKioqKgorCitBZGRpdGlvbmFsIGZpZWxkcyBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIGBvYCBwYXJhbWV0ZXJzLCBlYWNoCitvcHRpb24gcmVxdWlyZXMgbW9yZSBkYXRhYmFzZSBsb29rdXBzIGFuZCBzbG93cyBkb3duIHRoZSBxdWVyeQorcmVzcG9uc2UgdGltZSB0byB0aGUgY2xpZW50IHNvIHRoZXkgYXJlIGdlbmVyYWxseSBkaXNhYmxlZCBieQorZGVmYXVsdC4gT3B0aW9uYWwgZmllbGRzIGFyZToKKworW1tsYWJlbHNdXQorLS0KKyogYExBQkVMU2A6IGEgc3VtbWFyeSBvZiBlYWNoIGxhYmVsIHJlcXVpcmVkIGZvciBzdWJtaXQsIGFuZAorICBhcHByb3ZlcnMgdGhhdCBoYXZlIGdyYW50ZWQgKG9yIHJlamVjdGVkKSB3aXRoIHRoYXQgbGFiZWwuCistLQorCitbW2RldGFpbGVkLWxhYmVsc11dCistLQorKiBgREVUQUlMRURfTEFCRUxTYDogZGV0YWlsZWQgbGFiZWwgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBudW1lcmljCisgIHZhbHVlcyBvZiBhbGwgZXhpc3RpbmcgYXBwcm92YWxzLCByZWNvZ25pemVkIGxhYmVsIHZhbHVlcywgdmFsdWVzCisgIHBlcm1pdHRlZCB0byBiZSBzZXQgYnkgdGhlIGN1cnJlbnQgdXNlciwgYW5kIHJldmlld2VycyB0aGF0IG1heSBiZQorICByZW1vdmVkIGJ5IHRoZSBjdXJyZW50IHVzZXIuCistLQorCitbW2N1cnJlbnQtcmV2aXNpb25dXQorLS0KKyogYENVUlJFTlRfUkVWSVNJT05gOiBkZXNjcmliZSB0aGUgY3VycmVudCByZXZpc2lvbiAocGF0Y2ggc2V0KQorICBvZiB0aGUgY2hhbmdlLCBpbmNsdWRpbmcgdGhlIGNvbW1pdCBTSEEtMSBhbmQgVVJMcyB0byBmZXRjaCBmcm9tLgorLS0KKworW1thbGwtcmV2aXNpb25zXV0KKy0tCisqIGBBTExfUkVWSVNJT05TYDogZGVzY3JpYmUgYWxsIHJldmlzaW9ucywgbm90IGp1c3QgY3VycmVudC4KKy0tCisKK1tbY3VycmVudC1jb21taXRdXQorLS0KKyogYENVUlJFTlRfQ09NTUlUYDogcGFyc2UgYW5kIG91dHB1dCBhbGwgaGVhZGVyIGZpZWxkcyBmcm9tIHRoZQorICBjb21taXQgb2JqZWN0LCBpbmNsdWRpbmcgbWVzc2FnZS4gT25seSB2YWxpZCB3aGVuIHRoZSBjdXJyZW50CisgIHJldmlzaW9uIG9yIGFsbCByZXZpc2lvbnMgYXJlIHNlbGVjdGVkLgorLS0KKworW1thbGwtY29tbWl0c11dCistLQorKiBgQUxMX0NPTU1JVFNgOiBwYXJzZSBhbmQgb3V0cHV0IGFsbCBoZWFkZXIgZmllbGRzIGZyb20gdGhlCisgIG91dHB1dCByZXZpc2lvbnMuIElmIG9ubHkgYENVUlJFTlRfUkVWSVNJT05gIHdhcyByZXF1ZXN0ZWQKKyAgdGhlbiBvbmx5IHRoZSBjdXJyZW50IHJldmlzaW9uJ3MgY29tbWl0IGRhdGEgd2lsbCBiZSBvdXRwdXQuCistLQorCitbW2N1cnJlbnQtZmlsZXNdXQorLS0KKyogYENVUlJFTlRfRklMRVNgOiBsaXN0IGZpbGVzIG1vZGlmaWVkIGJ5IHRoZSBjb21taXQsIGluY2x1ZGluZworICBiYXNpYyBsaW5lIGNvdW50cyBpbnNlcnRlZC9kZWxldGVkIHBlciBmaWxlLiBPbmx5IHZhbGlkIHdoZW4KKyAgdGhlIGN1cnJlbnQgcmV2aXNpb24gb3IgYWxsIHJldmlzaW9ucyBhcmUgc2VsZWN0ZWQuCistLQorCitbW2FsbC1maWxlc11dCistLQorKiBgQUxMX0ZJTEVTYDogbGlzdCBmaWxlcyBtb2RpZmllZCBieSB0aGUgY29tbWl0LCBpbmNsdWRpbmcKKyAgYmFzaWMgbGluZSBjb3VudHMgaW5zZXJ0ZWQvZGVsZXRlZCBwZXIgZmlsZS4gSWYgb25seSB0aGUKKyAgYENVUlJFTlRfUkVWSVNJT05gIHdhcyByZXF1ZXN0ZWQgdGhlIG9ubHkgdGhhdCBjb21taXQncworICBtb2RpZmllZCBmaWxlcyB3aWxsIGJlIG91dHB1dC4KKy0tCisKK1tbZGV0YWlsZWQtYWNjb3VudHNdXQorLS0KKyogYERFVEFJTEVEX0FDQ09VTlRTYDogaW5jbHVkZSBgX2FjY291bnRfaWRgIGFuZCBgZW1haWxgIGZpZWxkcyB3aGVuCisgIHJlZmVyZW5jaW5nIGFjY291bnRzLgorLS0KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzLz9xPTk3Jm89Q1VSUkVOVF9SRVZJU0lPTiZvPUNVUlJFTlRfQ09NTUlUJm89Q1VSUkVOVF9GSUxFUyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgICAiaWQiOiAiZGVtb35tYXN0ZXJ+STdlYTQ2ZDJlMmVlNWM2NGMwZDgwNzY3Nzg1OWNmYjdkOTBiODk2NmEiLAorICAgICAgInByb2plY3QiOiAiZ2Vycml0IiwKKyAgICAgICJicmFuY2giOiAibWFzdGVyIiwKKyAgICAgICJjaGFuZ2VfaWQiOiAiSTdlYTQ2ZDJlMmVlNWM2NGMwZDgwNzY3Nzg1OWNmYjdkOTBiODk2NmEiLAorICAgICAgInN1YmplY3QiOiAiVXNlIGFuIEV2ZW50QnVzIHRvIG1hbmFnZSBzdGFyIGljb25zIiwKKyAgICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAgICJjcmVhdGVkIjogIjIwMTItMDQtMjUgMDA6NTI6MjUuNTgwMDAwMDAwIiwKKyAgICAgICJ1cGRhdGVkIjogIjIwMTItMDQtMjUgMDA6NTI6MjUuNTg2MDAwMDAwIiwKKyAgICAgICJtZXJnZWFibGUiOiB0cnVlLAorICAgICAgIl9zb3J0a2V5IjogIjAwMWM5YmY0MDAwMDAwNjEiLAorICAgICAgIl9udW1iZXIiOiA5NywKKyAgICAgICJvd25lciI6IHsKKyAgICAgICAgIm5hbWUiOiAiU2hhd24gUGVhcmNlIgorICAgICAgfSwKKyAgICAgICJjdXJyZW50X3JldmlzaW9uIjogIjE4NGViZTUzODA1ZTEwMjYwNWQxMWY2YjE0MzQ4NmQxNWMyM2EwOWMiLAorICAgICAgInJldmlzaW9ucyI6IHsKKyAgICAgICAgIjE4NGViZTUzODA1ZTEwMjYwNWQxMWY2YjE0MzQ4NmQxNWMyM2EwOWMiOiB7CisgICAgICAgICAgIl9udW1iZXIiOiAxLAorICAgICAgICAgICJmZXRjaCI6IHsKKyAgICAgICAgICAgICJnaXQiOiB7CisgICAgICAgICAgICAgICJ1cmwiOiAiZ2l0Oi8vbG9jYWxob3N0L2dlcnJpdCIsCisgICAgICAgICAgICAgICJyZWYiOiAicmVmcy9jaGFuZ2VzLzk3Lzk3LzEiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImh0dHAiOiB7CisgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cDovLzEyNy4wLjAuMTo4MDgwL2dlcnJpdCIsCisgICAgICAgICAgICAgICJyZWYiOiAicmVmcy9jaGFuZ2VzLzk3Lzk3LzEiCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAiY29tbWl0IjogeworICAgICAgICAgICAgInBhcmVudHMiOiBbCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiY29tbWl0IjogIjFlZWUyYzlkOGYzNTI0ODM3ODFlNzcyZjM1ZGM1ODZhNjlmZjU2NDYiLAorICAgICAgICAgICAgICAgICJzdWJqZWN0IjogIk1pZ3JhdGUgY29udHJpYnV0b3IgYWdyZWVtZW50cyB0byBBbGwtUHJvamVjdHMuIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICAgICAgImF1dGhvciI6IHsKKyAgICAgICAgICAgICAgIm5hbWUiOiAiU2hhd24gTy4gUGVhcmNlIiwKKyAgICAgICAgICAgICAgImVtYWlsIjogInNvcEBnb29nbGUuY29tIiwKKyAgICAgICAgICAgICAgImRhdGUiOiAiMjAxMi0wNC0yNCAxODowODowOC4wMDAwMDAwMDAiLAorICAgICAgICAgICAgICAidHoiOiAtNDIwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImNvbW1pdHRlciI6IHsKKyAgICAgICAgICAgICAgIm5hbWUiOiAiU2hhd24gTy4gUGVhcmNlIiwKKyAgICAgICAgICAgICAgImVtYWlsIjogInNvcEBnb29nbGUuY29tIiwKKyAgICAgICAgICAgICAgImRhdGUiOiAiMjAxMi0wNC0yNCAxODowODowOC4wMDAwMDAwMDAiLAorICAgICAgICAgICAgICAidHoiOiAtNDIwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInN1YmplY3QiOiAiVXNlIGFuIEV2ZW50QnVzIHRvIG1hbmFnZSBzdGFyIGljb25zIiwKKyAgICAgICAgICAgICJtZXNzYWdlIjogIlVzZSBhbiBFdmVudEJ1cyB0byBtYW5hZ2Ugc3RhciBpY29uc1xuXG5JbWFnZSB3aWRnZXRzIHRoYXQgbmVlZCB0byAuLi4iCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZmlsZXMiOiB7CisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlQ2FjaGUuamF2YSI6IHsKKyAgICAgICAgICAgICAgImxpbmVzX2RlbGV0ZWQiOiA4CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZURldGFpbENhY2hlLmphdmEiOiB7CisgICAgICAgICAgICAgICJsaW5lc19pbnNlcnRlZCI6IDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlU2NyZWVuLmphdmEiOiB7CisgICAgICAgICAgICAgICJsaW5lc19pbnNlcnRlZCI6IDExLAorICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDE5CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlLmphdmEiOiB7CisgICAgICAgICAgICAgICJsaW5lc19pbnNlcnRlZCI6IDIzLAorICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDIwCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N0YXJDYWNoZS5qYXZhIjogeworICAgICAgICAgICAgICAic3RhdHVzIjogIkQiLAorICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDEzOQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdGFycmVkQ2hhbmdlcy5qYXZhIjogeworICAgICAgICAgICAgICAic3RhdHVzIjogIkEiLAorICAgICAgICAgICAgICAibGluZXNfaW5zZXJ0ZWQiOiAyMDQKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbi5qYXZhIjogeworICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIF0KKy0tLS0KKworW1tnZXQtY2hhbmdlXV0KK0dldCBDaGFuZ2UKK35+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dJworCitSZXRyaWV2ZXMgYSBjaGFuZ2UuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgImlkIjogIm15UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJwcm9qZWN0IjogIm15UHJvamVjdCIsCisgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICJjaGFuZ2VfaWQiOiAiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJzdWJqZWN0IjogIkltcGxlbWVudGluZyBGZWF0dXJlIFgiLAorICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAiY3JlYXRlZCI6ICIyMDEzLTAyLTAxIDA5OjU5OjMyLjEyNjAwMDAwMCIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yMSAxMToxNjozNi43NzUwMDAwMDAiLAorICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgIl9zb3J0a2V5IjogIjAwMjM0MTI0MDAwMDBmN2QiLAorICAgICJfbnVtYmVyIjogMzk2NSwKKyAgICAib3duZXIiOiB7CisgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICB9CisgIH0KKy0tLS0KKworW1tnZXQtY2hhbmdlLWRldGFpbF1dCitHZXQgQ2hhbmdlIERldGFpbAorfn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL2RldGFpbCcKKworUmV0cmlldmVzIGEgY2hhbmdlIHdpdGggbGluazojbGFiZWxzW2xhYmVsc10sIGxpbms6I2RldGFpbGVkLWxhYmVsc1sKK2RldGFpbGVkIGxhYmVsc10gYW5kIGxpbms6I2RldGFpbGVkLWFjY291bnRzW2RldGFpbGVkIGFjY291bnRzXS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvZGV0YWlsIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgImlkIjogIm15UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJwcm9qZWN0IjogIm15UHJvamVjdCIsCisgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICJjaGFuZ2VfaWQiOiAiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJzdWJqZWN0IjogIkltcGxlbWVudGluZyBGZWF0dXJlIFgiLAorICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAiY3JlYXRlZCI6ICIyMDEzLTAyLTAxIDA5OjU5OjMyLjEyNjAwMDAwMCIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yMSAxMToxNjozNi43NzUwMDAwMDAiLAorICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgIl9zb3J0a2V5IjogIjAwMjM0MTI0MDAwMDBmN2QiLAorICAgICJfbnVtYmVyIjogMzk2NSwKKyAgICAib3duZXIiOiB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgImxhYmVscyI6IHsKKyAgICAgICJWZXJpZmllZCI6IHsKKyAgICAgICAgImFsbCI6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICAidmFsdWUiOiAwLAorICAgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IDAsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0KKyAgICAgICAgXSwKKyAgICAgICAgInZhbHVlcyI6IHsKKyAgICAgICAgICAiLTEiOiAiRmFpbHMiLAorICAgICAgICAgICIgMCI6ICJObyBzY29yZSIsCisgICAgICAgICAgIisxIjogIlZlcmlmaWVkIgorICAgICAgICB9CisgICAgICB9LAorICAgICAgIkNvZGUtUmV2aWV3IjogeworICAgICAgICAicmVjb21tZW5kZWQiOiB7CisgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgICAgICB9LAorICAgICAgICAiZGlzbGlrZWQiOiB7CisgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgICB9LAorICAgICAgICAiYWxsIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IC0xLAorICAgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IDEsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0KKyAgICAgICAgXQorICAgICAgICAidmFsdWVzIjogeworICAgICAgICAgICItMiI6ICJEbyBub3Qgc3VibWl0IiwKKyAgICAgICAgICAiLTEiOiAiSSB3b3VsZCBwcmVmZXIgdGhhdCB5b3UgZGlkblx1MDAyN3Qgc3VibWl0IHRoaXMiLAorICAgICAgICAgICIgMCI6ICJObyBzY29yZSIsCisgICAgICAgICAgIisxIjogIkxvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlIiwKKyAgICAgICAgICAiKzIiOiAiTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJwZXJtaXR0ZWRfbGFiZWxzIjogeworICAgICAgIlZlcmlmaWVkIjogWworICAgICAgICAiLTEiLAorICAgICAgICAiIDAiLAorICAgICAgICAiKzEiCisgICAgICBdLAorICAgICAgIkNvZGUtUmV2aWV3IjogWworICAgICAgICAiLTIiLAorICAgICAgICAiLTEiLAorICAgICAgICAiIDAiLAorICAgICAgICAiKzEiLAorICAgICAgICAiKzIiCisgICAgICBdCisgICAgfSwKKyAgICAicmVtb3ZhYmxlX3Jldmlld2VycyI6IFsKKyAgICAgIHsKKyAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgICB9LAorICAgICAgeworICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworW1tnZXQtdG9waWNdXQorR2V0IFRvcGljCit+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3RvcGljJworCitSZXRyaWV2ZXMgdGhlIHRvcGljIG9mIGEgY2hhbmdlLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC90b3BpYyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJEb2N1bWVudGF0aW9uIgorLS0tLQorCitJZiB0aGUgY2hhbmdlIGRvZXMgbm90IGhhdmUgYSB0b3BpYyBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKK1tbc2V0LXRvcGljXV0KK1NldCBUb3BpYworfn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS90b3BpYycKKworU2V0cyB0aGUgdG9waWMgb2YgYSBjaGFuZ2UuCisKK1RoZSBuZXcgdG9waWMgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5IGluc2lkZSBhCitsaW5rOiN0b3BpYy1pbnB1dFtUb3BpY0lucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3RvcGljIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJ0b3BpYyI6ICJEb2N1bWVudGF0aW9uIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgdG9waWMgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIkRvY3VtZW50YXRpb24iCistLS0tCisKK0lmIHRoZSB0b3BpYyB3YXMgZGVsZXRlZCB0aGUgcmVzcG9uc2UgaXMgImAyMDQgTm8gQ29udGVudGAiLgorCitbW2RlbGV0ZS10b3BpY11dCitEZWxldGUgVG9waWMKK35+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vdG9waWMnCisKK0RlbGV0ZXMgdGhlIHRvcGljIG9mIGEgY2hhbmdlLgorCitUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhIGxpbms6I3RvcGljLWlucHV0WworVG9waWNJbnB1dF0gZW50aXR5IGlmIG5vIHJldmlldyBjb21tZW50IGlzIGFkZGVkLgorCitQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJveGllcyBwcm9oaWJpdCByZXF1ZXN0IGJvZGllcyBmb3IgREVMRVRFCityZXF1ZXN0cy4gSW4gdGhpcyBjYXNlLCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY29tbWl0IG1lc3NhZ2UsIHVzZQorbGluazojc2V0LXRvcGljW1BVVF0gdG8gZGVsZXRlIHRoZSB0b3BpYy4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvdG9waWMgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbYWJhbmRvbi1jaGFuZ2VdXQorQWJhbmRvbiBDaGFuZ2UKK35+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vYWJhbmRvbicKKworQWJhbmRvbnMgYSBjaGFuZ2UuCisKK1RoZSByZXF1ZXN0IGJvZHkgZG9lcyBub3QgbmVlZCB0byBpbmNsdWRlIGEgbGluazojYWJhbmRvbi1pbnB1dFsKK0FiYW5kb25JbnB1dF0gZW50aXR5IGlmIG5vIHJldmlldyBjb21tZW50IGlzIGFkZGVkLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvYWJhbmRvbiBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2NoYW5nZS1pbmZvW0NoYW5nZUluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGFiYW5kb25lZCBjaGFuZ2UuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJBQkFORE9ORUQiLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIgorICAgIH0KKyAgfQorLS0tLQorCitJZiB0aGUgY2hhbmdlIGNhbm5vdCBiZSBhYmFuZG9uZWQgYmVjYXVzZSB0aGUgY2hhbmdlIHN0YXRlIGRvZXNuJ3QKK2FsbG93IGFiYW5kb25pbmcgb2YgdGhlIGNoYW5nZSwgdGhlIHJlc3BvbnNlIGlzICJgNDA5IENvbmZsaWN0YCIgYW5kCit0aGUgZXJyb3IgbWVzc2FnZSBpcyBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSA0MDkgQ29uZmxpY3QKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Y2hhcnNldD1VVEYtOAorCisgIGNoYW5nZSBpcyBtZXJnZWQKKy0tLS0KKworW1tyZXN0b3JlLWNoYW5nZV1dCitSZXN0b3JlIENoYW5nZQorfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXN0b3JlJworCitSZXN0b3JlcyBhIGNoYW5nZS4KKworVGhlIHJlcXVlc3QgYm9keSBkb2VzIG5vdCBuZWVkIHRvIGluY2x1ZGUgYSBsaW5rOiNyZXN0b3JlLWlucHV0WworUmVzdG9yZUlucHV0XSBlbnRpdHkgaWYgbm8gcmV2aWV3IGNvbW1lbnQgaXMgYWRkZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXN0b3JlIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgcmVzdG9yZWQgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgImlkIjogIm15UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJwcm9qZWN0IjogIm15UHJvamVjdCIsCisgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICJjaGFuZ2VfaWQiOiAiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJzdWJqZWN0IjogIkltcGxlbWVudGluZyBGZWF0dXJlIFgiLAorICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAiY3JlYXRlZCI6ICIyMDEzLTAyLTAxIDA5OjU5OjMyLjEyNjAwMDAwMCIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yMSAxMToxNjozNi43NzUwMDAwMDAiLAorICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgIl9zb3J0a2V5IjogIjAwMjM0MTI0MDAwMDBmN2QiLAorICAgICJfbnVtYmVyIjogMzk2NSwKKyAgICAib3duZXIiOiB7CisgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICB9CisgIH0KKy0tLS0KKworSWYgdGhlIGNoYW5nZSBjYW5ub3QgYmUgcmVzdG9yZWQgYmVjYXVzZSB0aGUgY2hhbmdlIHN0YXRlIGRvZXNuJ3QKK2FsbG93IHJlc3RvcmluZyB0aGUgY2hhbmdlLCB0aGUgcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIiBhbmQKK3RoZSBlcnJvciBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDQwOSBDb25mbGljdAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgY2hhbmdlIGlzIG5ldworLS0tLQorCitbW3JldmVydC1jaGFuZ2VdXQorUmV2ZXJ0IENoYW5nZQorfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmVydCcKKworUmV2ZXJ0cyBhIGNoYW5nZS4KKworVGhlIHJlcXVlc3QgYm9keSBkb2VzIG5vdCBuZWVkIHRvIGluY2x1ZGUgYSBsaW5rOiNyZXZlcnQtaW5wdXRbCitSZXZlcnRJbnB1dF0gZW50aXR5IGlmIG5vIHJldmlldyBjb21tZW50IGlzIGFkZGVkLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2ZXJ0IEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgcmV2ZXJ0aW5nIGNoYW5nZS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjaGFuZ2UiLAorICAgICJpZCI6ICJteVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAicHJvamVjdCI6ICJteVByb2plY3QiLAorICAgICJicmFuY2giOiAibWFzdGVyIiwKKyAgICAiY2hhbmdlX2lkIjogIkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAic3ViamVjdCI6ICJSZXZlcnQgXCJJbXBsZW1lbnRpbmcgRmVhdHVyZSBYXCIiLAorICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAiY3JlYXRlZCI6ICIyMDEzLTAyLTAxIDA5OjU5OjMyLjEyNjAwMDAwMCIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yMSAxMToxNjozNi43NzUwMDAwMDAiLAorICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgIl9zb3J0a2V5IjogIjAwMjM0MTI0MDAwMDBmN2QiLAorICAgICJfbnVtYmVyIjogMzk2NSwKKyAgICAib3duZXIiOiB7CisgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICB9CisgIH0KKy0tLS0KKworSWYgdGhlIGNoYW5nZSBjYW5ub3QgYmUgcmV2ZXJ0ZWQgYmVjYXVzZSB0aGUgY2hhbmdlIHN0YXRlIGRvZXNuJ3QKK2FsbG93IHJldmVydGluZyB0aGUgY2hhbmdlLCB0aGUgcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIiBhbmQKK3RoZSBlcnJvciBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDQwOSBDb25mbGljdAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgY2hhbmdlIGlzIG5ldworLS0tLQorCitbW3N1Ym1pdC1jaGFuZ2VdXQorU3VibWl0IENoYW5nZQorfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3N1Ym1pdCcKKworU3VibWl0cyBhIGNoYW5nZS4KKworVGhlIHJlcXVlc3QgYm9keSBvbmx5IG5lZWRzIHRvIGluY2x1ZGUgYSBsaW5rOiNzdWJtaXQtaW5wdXRbCitTdWJtaXRJbnB1dF0gZW50aXR5IGlmIHRoZSByZXF1ZXN0IHNob3VsZCB3YWl0IGZvciB0aGUgbWVyZ2UgdG8KK2NvbXBsZXRlLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvc3VibWl0IEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJ3YWl0X2Zvcl9tZXJnZSI6IHRydWUKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2NoYW5nZS1pbmZvW0NoYW5nZUluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIHN1Ym1pdHRlZC9tZXJnZWQgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgImlkIjogIm15UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJwcm9qZWN0IjogIm15UHJvamVjdCIsCisgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICJjaGFuZ2VfaWQiOiAiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJzdWJqZWN0IjogIkltcGxlbWVudGluZyBGZWF0dXJlIFgiLAorICAgICJzdGF0dXMiOiAiTUVSR0VEIiwKKyAgICAiY3JlYXRlZCI6ICIyMDEzLTAyLTAxIDA5OjU5OjMyLjEyNjAwMDAwMCIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yMSAxMToxNjozNi43NzUwMDAwMDAiLAorICAgICJyZXZpZXdlZCI6IHRydWUsCisgICAgIl9zb3J0a2V5IjogIjAwMjM0MTI0MDAwMDBmN2QiLAorICAgICJfbnVtYmVyIjogMzk2NSwKKyAgICAib3duZXIiOiB7CisgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICB9CisgIH0KKy0tLS0KKworSWYgdGhlIGNoYW5nZSBjYW5ub3QgYmUgc3VibWl0dGVkIGJlY2F1c2UgdGhlIHN1Ym1pdCBydWxlIGRvZXNuJ3QgYWxsb3cKK3N1Ym1pdHRpbmcgdGhlIGNoYW5nZSwgdGhlIHJlc3BvbnNlIGlzICJgNDA5IENvbmZsaWN0YCIgYW5kIHRoZSBlcnJvcgorbWVzc2FnZSBpcyBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSA0MDkgQ29uZmxpY3QKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Y2hhcnNldD1VVEYtOAorCisgIGJsb2NrZWQgYnkgVmVyaWZpZWQKKy0tLS0KKworW1tyZXZpZXdlci1lbmRwb2ludHNdXQorUmV2aWV3ZXIgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLS0KKworW1tsaXN0LXJldmlld2Vyc11dCitMaXN0IFJldmlld2Vycworfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3Jldmlld2Vycy8nCisKK0xpc3RzIHRoZSByZXZpZXdlcnMgb2YgYSBjaGFuZ2UuCisKK0FzIHJlc3VsdCBhIGxpc3Qgb2YgbGluazojcmV2aWV3ZXItaW5mb1tSZXZpZXdlckluZm9dIGVudHJpZXMgaXMgcmV0dXJuZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jldmlld2Vycy8gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNyZXZpZXdlciIsCisgICAgICAiYXBwcm92YWxzIjogeworICAgICAgICAiVmVyaWZpZWQiOiAiKzEiLAorICAgICAgICAiQ29kZS1SZXZpZXciOiAiKzIiCisgICAgICB9LAorICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9LAorICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcmV2aWV3ZXIiLAorICAgICAgImFwcHJvdmFscyI6IHsKKyAgICAgICAgIlZlcmlmaWVkIjogIiAwIiwKKyAgICAgICAgIkNvZGUtUmV2aWV3IjogIi0xIgorICAgICAgfSwKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgfQorICBdCistLS0tCisKK1tbZ2V0LXJldmlld2VyXV0KK0dldCBSZXZpZXdlcgorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpZXdlcnMvbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dJworCitSZXRyaWV2ZXMgYSByZXZpZXdlciBvZiBhIGNoYW5nZS4KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNyZXZpZXdlci1pbmZvW1Jldmlld2VySW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgcmV2aWV3ZXIuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jldmlld2Vycy9qb2huLmRvZUBleGFtcGxlLmNvbSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Jldmlld2VyIiwKKyAgICAiYXBwcm92YWxzIjogeworICAgICAgIlZlcmlmaWVkIjogIisxIiwKKyAgICAgICJDb2RlLVJldmlldyI6ICIrMiIKKyAgICB9LAorICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgfQorLS0tLQorCitbW2FkZC1yZXZpZXdlcl1dCitBZGQgUmV2aWV3ZXIKK35+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3Jldmlld2VycycKKworQWRkcyBvbmUgdXNlciBvciBhbGwgbWVtYmVycyBvZiBvbmUgZ3JvdXAgYXMgcmV2aWV3ZXIgdG8gdGhlIGNoYW5nZS4KKworVGhlIHJldmlld2VyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2UgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdAorYm9keSBhcyBhIGxpbms6I3Jldmlld2VyLWlucHV0W1Jldmlld2VySW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jldmlld2VycyBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicmV2aWV3ZXIiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgYW4gbGluazojYWRkLXJldmlld2VyLXJlc3VsdFtBZGRSZXZpZXdlclJlc3VsdF0gZW50aXR5IGlzCityZXR1cm5lZCB0aGF0IGRlc2NyaWJlcyB0aGUgbmV3bHkgYWRkZWQgcmV2aWV3ZXJzLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAicmV2aWV3ZXJzIjogWworICAgICAgeworICAgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Jldmlld2VyIiwKKyAgICAgICAgImFwcHJvdmFscyI6IHsKKyAgICAgICAgICAiVmVyaWZpZWQiOiAiIDAiLAorICAgICAgICAgICJDb2RlLVJldmlldyI6ICIgMCIKKyAgICAgICAgfSwKKyAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgICB9CisgICAgXQorICB9CistLS0tCisKK0lmIGEgZ3JvdXAgaXMgc3BlY2lmaWVkLCBhZGRpbmcgdGhlIGdyb3VwIG1lbWJlcnMgYXMgcmV2aWV3ZXJzIGlzIGFuCithdG9taWMgb3BlcmF0aW9uLiBUaGlzIG1lYW5zIGlmIGFuIGVycm9yIGlzIHJldHVybmVkLCBub25lIG9mIHRoZQorbWVtYmVycyBhcmUgYWRkZWQgYXMgcmV2aWV3ZXIuCisKK0lmIGEgZ3JvdXAgd2l0aCBtYW55IG1lbWJlcnMgaXMgYWRkZWQgYXMgcmV2aWV3ZXIgYSBjb25maXJtYXRpb24gbWF5IGJlCityZXF1aXJlZC4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jldmlld2VycyBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicmV2aWV3ZXIiOiAiTXlQcm9qZWN0VmVyaWZpZXJzIgorICB9CistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJlcnJvciI6ICJUaGUgZ3JvdXAgTXkgR3JvdXAgaGFzIDE1IG1lbWJlcnMuIERvIHlvdSB3YW50IHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnM/IiwKKyAgICAiY29uZmlybSI6IHRydWUKKyAgfQorLS0tLQorCitUbyBjb25maXJtIHRoZSBhZGRpdGlvbiBvZiB0aGUgcmV2aWV3ZXJzLCByZXNlbmQgdGhlIHJlcXVlc3Qgd2l0aCB0aGUKK2Bjb25maXJtZWRgIGZsYWcgYmVpbmcgc2V0LgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aWV3ZXJzIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJyZXZpZXdlciI6ICJNeVByb2plY3RWZXJpZmllcnMiLAorICAgICJjb25maXJtZWQiOiB0cnVlCisgIH0KKy0tLS0KKworW1tkZWxldGUtcmV2aWV3ZXJdXQorRGVsZXRlIFJldmlld2VyCit+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3Jldmlld2Vycy9saW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0nCisKK0RlbGV0ZXMgYSByZXZpZXdlciBmcm9tIGEgY2hhbmdlLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpZXdlcnMvSm9obiUyMERvZSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworW1tyZXZpc2lvbi1lbmRwb2ludHNdXQorUmV2aXNpb24gRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLS0KKworW1tnZXQtcmV2aWV3XV0KK0dldCBSZXZpZXcKK35+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3JldmlldycKKworUmV0cmlldmVzIGEgcmV2aWV3IG9mIGEgcmV2aXNpb24uCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL3JldmlldyBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2NoYW5nZS1pbmZvW0NoYW5nZUluZm9dIGVudGl0eSB3aXRoCitsaW5rOiNkZXRhaWxlZC1sYWJlbHNbZGV0YWlsZWQgbGFiZWxzXSBhbmQgbGluazojZGV0YWlsZWQtYWNjb3VudHNbCitkZXRhaWxlZCBhY2NvdW50c10gaXMgcmV0dXJuZWQgdGhhdCBkZXNjcmliZXMgdGhlIHJldmlldyBvZiB0aGUKK3JldmlzaW9uLiBUaGUgcmV2aXNpb24gZm9yIHdoaWNoIHRoZSByZXZpZXcgaXMgcmV0cmlldmVkIGlzIGNvbnRhaW5lZAoraW4gdGhlIGByZXZpc2lvbnNgIGZpZWxkLiBJbiBhZGRpdGlvbiB0aGUgYGN1cnJlbnRfcmV2aXNpb25gIGZpZWxkIGlzCitzZXQgaWYgdGhlIHJldmlzaW9uIGZvciB3aGljaCB0aGUgcmV2aWV3IGlzIHJldHJpZXZlZCBpcyB0aGUgY3VycmVudAorcmV2aXNpb24gb2YgdGhlIGNoYW5nZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgbGFiZWxzIGFyZSBhbHdheXMKK2ZvciB0aGUgY3VycmVudCBwYXRjaCBzZXQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJORVciLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgfSwKKyAgICAibGFiZWxzIjogeworICAgICAgIlZlcmlmaWVkIjogeworICAgICAgICAiYWxsIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IDAsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogMCwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsdWVzIjogeworICAgICAgICAgICItMSI6ICJGYWlscyIsCisgICAgICAgICAgIiAwIjogIk5vIHNjb3JlIiwKKyAgICAgICAgICAiKzEiOiAiVmVyaWZpZWQiCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAiQ29kZS1SZXZpZXciOiB7CisgICAgICAgICJhbGwiOiBbCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogLTEsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogMSwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfQorICAgICAgICBdCisgICAgICAgICJ2YWx1ZXMiOiB7CisgICAgICAgICAgIi0yIjogIkRvIG5vdCBzdWJtaXQiLAorICAgICAgICAgICItMSI6ICJJIHdvdWxkIHByZWZlciB0aGF0IHlvdSBkaWRuXHUwMDI3dCBzdWJtaXQgdGhpcyIsCisgICAgICAgICAgIiAwIjogIk5vIHNjb3JlIiwKKyAgICAgICAgICAiKzEiOiAiTG9va3MgZ29vZCB0byBtZSwgYnV0IHNvbWVvbmUgZWxzZSBtdXN0IGFwcHJvdmUiLAorICAgICAgICAgICIrMiI6ICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInBlcm1pdHRlZF9sYWJlbHMiOiB7CisgICAgICAiVmVyaWZpZWQiOiBbCisgICAgICAgICItMSIsCisgICAgICAgICIgMCIsCisgICAgICAgICIrMSIKKyAgICAgIF0sCisgICAgICAiQ29kZS1SZXZpZXciOiBbCisgICAgICAgICItMiIsCisgICAgICAgICItMSIsCisgICAgICAgICIgMCIsCisgICAgICAgICIrMSIsCisgICAgICAgICIrMiIKKyAgICAgIF0KKyAgICB9LAorICAgICJyZW1vdmFibGVfcmV2aWV3ZXJzIjogWworICAgICAgeworICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgICAgfQorICAgIF0sCisgICAgImN1cnJlbnRfcmV2aXNpb24iOiAiNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMSIsCisgICAgInJldmlzaW9ucyI6IHsKKyAgICAgICI2NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxIjogeworICAgICAgIl9udW1iZXIiOiAyLAorICAgICAgImZldGNoIjogeworICAgICAgICAiaHR0cCI6IHsKKyAgICAgICAgICAidXJsIjogImh0dHA6Ly9nZXJyaXQvbXlQcm9qZWN0IiwKKyAgICAgICAgICAicmVmIjogInJlZnMvY2hhbmdlcy82NS8zOTY1LzIiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKy0tLS0KKworW1tzZXQtcmV2aWV3XV0KK1NldCBSZXZpZXcKK35+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9yZXZpZXcnCisKK1NldHMgYSByZXZpZXcgb24gYSByZXZpc2lvbi4KKworVGhlIHJldmlldyBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgYXMgYQorbGluazojcmV2aWV3LWlucHV0W1Jldmlld0lucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9yZXZpZXcgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIm1lc3NhZ2UiOiAiU29tZSBuaXRzIG5lZWQgdG8gYmUgZml4ZWQuIiwKKyAgICAibGFiZWxzIjogeworICAgICAgIkNvZGUtUmV2aWV3IjogLTEKKyAgICB9LAorICAgICJjb21tZW50cyI6IHsKKyAgICAgICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIjogWworICAgICAgICB7CisgICAgICAgICAgImxpbmUiOiAyMywKKyAgICAgICAgICAibWVzc2FnZSI6ICJbbml0XSB0cmFpbGluZyB3aGl0ZXNwYWNlIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgImxpbmUiOiA0OSwKKyAgICAgICAgICAibWVzc2FnZSI6ICJbbml0XSBzL2NvbnJ0b2wvY29udHJvbCIKKyAgICAgICAgfQorICAgICAgXQorICAgIH0KKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I3Jldmlldy1pbmZvW1Jldmlld0luZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGFwcGxpZWQgbGFiZWxzLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAibGFiZWxzIjogeworICAgICAgIkNvZGUtUmV2aWV3IjogLTEKKyAgICB9CisgIH0KKy0tLS0KKworW1tzdWJtaXQtcmV2aXNpb25dXQorU3VibWl0IFJldmlzaW9uCit+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9zdWJtaXQnCisKK1N1Ym1pdHMgYSByZXZpc2lvbi4KKworVGhlIHJlcXVlc3QgYm9keSBvbmx5IG5lZWRzIHRvIGluY2x1ZGUgYSBsaW5rOiNzdWJtaXQtaW5wdXRbCitTdWJtaXRJbnB1dF0gZW50aXR5IGlmIHRoZSByZXF1ZXN0IHNob3VsZCB3YWl0IGZvciB0aGUgbWVyZ2UgdG8KK2NvbXBsZXRlLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvc3VibWl0IEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJ3YWl0X2Zvcl9tZXJnZSI6IHRydWUKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I3N1Ym1pdC1pbmZvW1N1Ym1pdEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIHN0YXR1cyBvZiB0aGUgc3VibWl0dGVkIGNoYW5nZS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgInN0YXR1cyI6ICJNRVJHRUQiCisgIH0KKy0tLS0KKworSWYgdGhlIHJldmlzaW9uIGNhbm5vdCBiZSBzdWJtaXR0ZWQsIGUuZy4gYmVjYXVzZSB0aGUgc3VibWl0IHJ1bGUKK2RvZXNuJ3QgYWxsb3cgc3VibWl0dGluZyB0aGUgcmV2aXNpb24gb3IgdGhlIHJldmlzaW9uIGlzIG5vdCB0aGUKK2N1cnJlbnQgcmV2aXNpb24sIHRoZSByZXNwb25zZSBpcyAiYDQwOSBDb25mbGljdGAiIGFuZCB0aGUgZXJyb3IKK21lc3NhZ2UgaXMgY29udGFpbmVkIGluIHRoZSByZXNwb25zZSBib2R5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgNDA5IENvbmZsaWN0CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgInJldmlzaW9uIDY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEgaXMgbm90IGN1cnJlbnQgcmV2aXNpb24iCistLS0tCisKK1tbZ2V0LXN1Ym1pdC10eXBlXV0KK0dldCBTdWJtaXQgVHlwZQorfn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9zdWJtaXRfdHlwZScKKworR2V0cyB0aGUgbWV0aG9kIHRoZSBzZXJ2ZXIgd2lsbCB1c2UgdG8gc3VibWl0IChtZXJnZSkgdGhlIGNoYW5nZS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zL2N1cnJlbnQvc3VibWl0X3R5cGUgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiTUVSR0VfSUZfTkVDRVNTQVJZIgorLS0tLQorCitbW3Rlc3Qtc3VibWl0LXR5cGVdXQorVGVzdCBTdWJtaXQgVHlwZQorfn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3Rlc3Quc3VibWl0X3R5cGUnCisKK1Rlc3RzIHRoZSBzdWJtaXRfdHlwZSBQcm9sb2cgcnVsZSBpbiB0aGUgcHJvamVjdCwgb3IgdGhlIG9uZSBnaXZlbi4KKworUmVxdWVzdCBib2R5IG1heSBiZSBlaXRoZXIgdGhlIFByb2xvZyBjb2RlIGFzIGB0ZXh0L3BsYWluYCBvciBhCitsaW5rOiNydWxlLWlucHV0W1J1bGVJbnB1dF0gb2JqZWN0LiBUaGUgcXVlcnkgcGFyYW1ldGVyIGBmaWx0ZXJzYAorbWF5IGJlIHNldCB0byBgU0tJUGAgdG8gYnlwYXNzIHBhcmVudCBwcm9qZWN0IGZpbHRlcnMgd2hpbGUgdGVzdGluZworYSBwcm9qZWN0LXNwZWNpZmljIHJ1bGUuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvY3VycmVudC90ZXN0LnN1Ym1pdF90eXBlIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0LVVURi04CisKKyAgc3VibWl0X3R5cGUoY2hlcnJ5X3BpY2spLgorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJjaGVycnlfcGljayIKKy0tLS0KKworW1t0ZXN0LXN1Ym1pdC1ydWxlXV0KK1Rlc3QgU3VibWl0IFJ1bGUKK35+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS90ZXN0LnN1Ym1pdF9ydWxlJworCitUZXN0cyB0aGUgc3VibWl0X3J1bGUgUHJvbG9nIHJ1bGUgaW4gdGhlIHByb2plY3QsIG9yIHRoZSBvbmUgZ2l2ZW4uCisKK1JlcXVlc3QgYm9keSBtYXkgYmUgZWl0aGVyIHRoZSBQcm9sb2cgY29kZSBhcyBgdGV4dC9wbGFpbmAgb3IgYQorbGluazojcnVsZS1pbnB1dFtSdWxlSW5wdXRdIG9iamVjdC4gVGhlIHF1ZXJ5IHBhcmFtZXRlciBgZmlsdGVyc2AKK21heSBiZSBzZXQgdG8gYFNLSVBgIHRvIGJ5cGFzcyBwYXJlbnQgcHJvamVjdCBmaWx0ZXJzIHdoaWxlIHRlc3RpbmcKK2EgcHJvamVjdC1zcGVjaWZpYyBydWxlLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zL2N1cnJlbnQvdGVzdC5zdWJtaXRfdHlwZT9maWx0ZXJzPVNLSVAgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQtVVRGLTgKKworICBzdWJtaXRfcnVsZShzdWJtaXQoUikpIDotCisgICAgUiA9IGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIHJlamVjdChfKSkuCistLS0tCisKK1RoZSByZXNwb25zZSBpcyBhIGxpc3Qgb2YgbGluazojc3VibWl0LXJlY29yZFtTdWJtaXRSZWNvcmRdIGVudHJpZXMKK2Rlc2NyaWJpbmcgdGhlIHBlcm11dGF0aW9ucyB0aGF0IHNhdGlzZnkgdGhlIHRlc3RlZCBzdWJtaXQgcnVsZS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgInN0YXR1cyI6ICJOT1RfUkVBRFkiLAorICAgICAgInJlamVjdCI6IHsKKyAgICAgICAgIkFueS1MYWJlbC1OYW1lIjoge30KKyAgICAgIH0KKyAgICB9CisgIF0KKy0tLS0KKworW1tsaXN0LWRyYWZ0c11dCitMaXN0IERyYWZ0cworfn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2RyYWZ0cy8nCisKK0xpc3RzIHRoZSBkcmFmdCBjb21tZW50cyBvZiBhIHJldmlzaW9uIHRoYXQgYmVsb25nIHRvIHRoZSBjYWxsaW5nCit1c2VyLgorCitBcyByZXN1bHQgYSBtYXAgaXMgcmV0dXJuZWQgdGhhdCBtYXBzIHRoZSBmaWxlIHBhdGggdG8gYSBsaXN0IG9mCitsaW5rOiNjb21tZW50LWluZm9bQ29tbWVudEluZm9dIGVudHJpZXMuIFRoZSBlbnRyaWVzIGluIHRoZSBtYXAgYXJlCitzb3J0ZWQgYnkgZmlsZSBwYXRoLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9kcmFmdHMvIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIjogWworICAgICAgeworICAgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NvbW1lbnQiLAorICAgICAgICAiaWQiOiAiVHZjWHJtak0iLAorICAgICAgICAibGluZSI6IDIzLAorICAgICAgICAibWVzc2FnZSI6ICJbbml0XSB0cmFpbGluZyB3aGl0ZXNwYWNlIiwKKyAgICAgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yNiAxNTo0MDo0My45ODYwMDAwMDAiCisgICAgICB9LAorICAgICAgeworICAgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NvbW1lbnQiLAorICAgICAgICAiaWQiOiAiVHZlWHdGaUEiLAorICAgICAgICAibGluZSI6IDQ5LAorICAgICAgICAiaW5fcmVwbHlfdG8iOiAiVGZZWC1JdW8iLAorICAgICAgICAibWVzc2FnZSI6ICJEb25lIiwKKyAgICAgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yNiAxNTo0MDo0NS4zMjgwMDAwMDAiCisgICAgICB9CisgICAgXQorICB9CistLS0tCisKK1tbY3JlYXRlLWRyYWZ0XV0KK0NyZWF0ZSBEcmFmdAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9kcmFmdHMnCisKK0NyZWF0ZXMgYSBkcmFmdCBjb21tZW50IG9uIGEgcmV2aXNpb24uCisKK1RoZSBuZXcgZHJhZnQgY29tbWVudCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgaW5zaWRlIGEKK2xpbms6I2NvbW1lbnQtaW5wdXRbQ29tbWVudElucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL2RyYWZ0cyBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicGF0aCI6ICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIiwKKyAgICAibGluZSI6IDIzLAorICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjb21tZW50LWluZm9bQ29tbWVudEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGRyYWZ0IGNvbW1lbnQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIsCisgICAgImlkIjogIlR2Y1hybWpNIiwKKyAgICAicGF0aCI6ICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIiwKKyAgICAibGluZSI6IDIzLAorICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiLAorICAgICJ1cGRhdGVkIjogIjIwMTMtMDItMjYgMTU6NDA6NDMuOTg2MDAwMDAwIgorICB9CistLS0tCisKK1tbZ2V0LWRyYWZ0XV0KK0dldCBEcmFmdAorfn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9kcmFmdHMvbGluazojZHJhZnQtaWRbXHtkcmFmdC1pZFx9XScKKworUmV0cmlldmVzIGEgZHJhZnQgY29tbWVudCBvZiBhIHJldmlzaW9uIHRoYXQgYmVsb25ncyB0byB0aGUgY2FsbGluZwordXNlci4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvZHJhZnRzL1R2Y1hybWpNIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY29tbWVudC1pbmZvW0NvbW1lbnRJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBkcmFmdCBjb21tZW50LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NvbW1lbnQiLAorICAgICJpZCI6ICJUdmNYcm1qTSIsCisgICAgInBhdGgiOiAiZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2wuamF2YSIsCisgICAgImxpbmUiOiAyMywKKyAgICAibWVzc2FnZSI6ICJbbml0XSB0cmFpbGluZyB3aGl0ZXNwYWNlIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTI2IDE1OjQwOjQzLjk4NjAwMDAwMCIKKyAgfQorLS0tLQorCitbW3VwZGF0ZS1kcmFmdF1dCitVcGRhdGUgRHJhZnQKK35+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aXNpb25zL2xpbms6I3JldmlzaW9uLWlkW1x7cmV2aXNpb24taWRcfV0vZHJhZnRzL2xpbms6I2RyYWZ0LWlkW1x7ZHJhZnQtaWRcfV0nCisKK1VwZGF0ZXMgYSBkcmFmdCBjb21tZW50IG9uIGEgcmV2aXNpb24uCisKK1RoZSBuZXcgZHJhZnQgY29tbWVudCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgaW5zaWRlIGEKK2xpbms6I2NvbW1lbnQtaW5wdXRbQ29tbWVudElucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL2RyYWZ0cy9UdmNYcm1qTSBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicGF0aCI6ICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIiwKKyAgICAibGluZSI6IDIzLAorICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjb21tZW50LWluZm9bQ29tbWVudEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGRyYWZ0IGNvbW1lbnQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIsCisgICAgImlkIjogIlR2Y1hybWpNIiwKKyAgICAicGF0aCI6ICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIiwKKyAgICAibGluZSI6IDIzLAorICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiLAorICAgICJ1cGRhdGVkIjogIjIwMTMtMDItMjYgMTU6NDA6NDMuOTg2MDAwMDAwIgorICB9CistLS0tCisKK1tbZGVsZXRlLWRyYWZ0XV0KK0RlbGV0ZSBEcmFmdAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnREVMRVRFIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9kcmFmdHMvbGluazojZHJhZnQtaWRbXHtkcmFmdC1pZFx9XScKKworRGVsZXRlcyBhIGRyYWZ0IGNvbW1lbnQgZnJvbSBhIHJldmlzaW9uLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9kcmFmdHMvVHZjWHJtak0gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbc2V0LXJldmlld2VkXV0KK1NldCBSZXZpZXdlZAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9maWxlcy9saW5rOiNwYXRjaC1pZFtce3BhdGNoLWlkXH1dL3Jldmlld2VkJworCitNYXJrcyBhIHBhdGNoIG9mIGEgcmV2aXNpb24gYXMgcmV2aWV3ZWQgYnkgdGhlIGNhbGxpbmcgdXNlci4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvZmlsZXMvZ2Vycml0LXNlcnZlciUyRnNyYyUyRm1haW4lMkZqYXZhJTJGY29tJTJGZ29vZ2xlJTJGZ2Vycml0JTJGc2VydmVyJTJGcHJvamVjdCUyRlJlZkNvbnRyb2wuamF2YS9yZXZpZXdlZCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAxIENyZWF0ZWQKKy0tLS0KKworSWYgdGhlIHBhdGNoIHdhcyBhbHJlYWR5IG1hcmtlZCBhcyByZXZpZXdlZCBieSB0aGUgY2FsbGluZyB1c2VyIHRoZQorcmVzcG9uc2UgaXMgImAyMDAgT0tgIi4KKworW1tkZWxldGUtcmV2aWV3ZWRdXQorRGVsZXRlIFJldmlld2VkCit+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2ZpbGVzL2xpbms6I3BhdGNoLWlkW1x7cGF0Y2gtaWRcfV0vcmV2aWV3ZWQnCisKK0RlbGV0ZXMgdGhlIHJldmlld2VkIGZsYWcgb2YgdGhlIGNhbGxpbmcgdXNlciBmcm9tIGEgcGF0Y2ggb2YgYSByZXZpc2lvbi4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvZmlsZXMvZ2Vycml0LXNlcnZlciUyRnNyYyUyRm1haW4lMkZqYXZhJTJGY29tJTJGZ29vZ2xlJTJGZ2Vycml0JTJGc2VydmVyJTJGcHJvamVjdCUyRlJlZkNvbnRyb2wuamF2YS9yZXZpZXdlZCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworCitbW2lkc11dCitJRHMKKy0tLQorCitbW2FjY291bnQtaWRdXQorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy0tCistLQorCitbW2NoYW5nZS1pZF1dCitce2NoYW5nZS1pZFx9Cit+fn5+fn5+fn5+fn5+CitJZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvbmUgY2hhbmdlLgorCitUaGlzIGNhbiBiZToKKworKiBhbiBJRCBvZiB0aGUgY2hhbmdlIGluIHRoZSBmb3JtYXQgIickJDxwcm9qZWN0Pn48YnJhbmNoPn48Q2hhbmdlLUlkPiQkJyIsCisgIHdoZXJlIGZvciB0aGUgYnJhbmNoIHRoZSBgcmVmcy9oZWFkcy9gIHByZWZpeCBjYW4gYmUgb21pdHRlZAorICAoIiQkbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCQkIikKKyogYSBDaGFuZ2UtSWQgaWYgaXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvbmUgY2hhbmdlCisgICgiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiKQorKiBhIGxlZ2FjeSBudW1lcmljIGNoYW5nZSBJRCAoIjQyNDciKQorCitbW2RyYWZ0LWlkXV0KK1x7ZHJhZnQtaWRcfQorfn5+fn5+fn5+fn5+CitVVUlEIG9mIGEgZHJhZnQgY29tbWVudC4KKworW1twYXRjaC1pZF1dCitce3BhdGNoLWlkXH0KK35+fn5+fn5+fn5+fgorVGhlIGZpbGUgcGF0aCBvZiB0aGUgcGF0Y2guCisKK1tbcmV2aXNpb24taWRdXQorXHtyZXZpc2lvbi1pZFx9Cit+fn5+fn5+fn5+fn5+fn4KK0lkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIG9uZSByZXZpc2lvbiBvZiBhIGNoYW5nZS4KKworVGhpcyBjYW4gYmU6CisKKyogdGhlIGxpdGVyYWwgYGN1cnJlbnRgIHRvIG5hbWUgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0L3JldmlzaW9uCisqIGEgY29tbWl0IElEICgiNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMSIpCisqIGFuIGFiYnJldmlhdGVkIGNvbW1pdCBJRCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgb25lIHJldmlzaW9uIG9mIHRoZQorICBjaGFuZ2UgKCI2NzRhYzc1NCIpLCBhdCBsZWFzdCA0IGRpZ2l0cyBhcmUgcmVxdWlyZWQKKyogYSBsZWdhY3kgbnVtZXJpYyBwYXRjaCBudW1iZXIgKCIxIiBmb3IgZmlyc3QgcGF0Y2ggc2V0IG9mIHRoZSBjaGFuZ2UpCisKKworW1tqc29uLWVudGl0aWVzXV0KK0pTT04gRW50aXRpZXMKKy0tLS0tLS0tLS0tLS0KKworW1thYmFuZG9uLWlucHV0XV0KK0FiYW5kb25JbnB1dAorfn5+fn5+fn5+fn5+CitUaGUgYEFiYW5kb25JbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBhYmFuZG9uaW5nIGEgY2hhbmdlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBtZXNzYWdlYCAgICAgfG9wdGlvbmFsfAorTWVzc2FnZSB0byBiZSBhZGRlZCBhcyByZXZpZXcgY29tbWVudCB0byB0aGUgY2hhbmdlIHdoZW4gYWJhbmRvbmluZyB0aGUKK2NoYW5nZS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1thZGQtcmV2aWV3ZXItcmVzdWx0XV0KK0FkZFJldmlld2VyUmVzdWx0Cit+fn5+fn5+fn5+fn5+fn5+fgorVGhlIGBBZGRSZXZpZXdlclJlc3VsdGAgZW50aXR5IGRlc2NyaWJlcyB0aGUgcmVzdWx0IG9mIGFkZGluZyBhCityZXZpZXdlciB0byBhIGNoYW5nZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgcmV2aWV3ZXJzYCAgIHxvcHRpb25hbHwKK1RoZSBuZXdseSBhZGRlZCByZXZpZXdlcnMgYXMgYSBsaXN0IG9mIGxpbms6I3Jldmlld2VyLWluZm9bCitSZXZpZXdlckluZm9dIGVudGl0aWVzLgorfGBlcnJvcmAgICAgICAgfG9wdGlvbmFsfAorRXJyb3IgbWVzc2FnZSBleHBsYWluaW5nIHdoeSB0aGUgcmV2aWV3ZXIgY291bGQgbm90IGJlIGFkZGVkLiArCitJZiBhIGdyb3VwIHdhcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IGFuZCBhbiBlcnJvciBpcyByZXR1cm5lZCwgaXQKK21lYW5zIHRoYXQgbm9uZSBvZiB0aGUgbWVtYmVycyB3ZXJlIGFkZGVkIGFzIHJldmlld2VyLgorfGBjb25maXJtYCAgICAgfGBmYWxzZWAgaWYgbm90IHNldHwKK1doZXRoZXIgYWRkaW5nIHRoZSByZXZpZXdlciByZXF1aXJlcyBjb25maXJtYXRpb24uCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbYXBwcm92YWwtaW5mb11dCitBcHByb3ZhbEluZm8KK35+fn5+fn5+fn5+fgorVGhlIGBBcHByb3ZhbEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBhcHByb3ZhbCBmcm9tIGEKK3VzZXIgZm9yIGEgbGFiZWwgb24gYSBjaGFuZ2UuCisKK2BBcHByb3ZhbEluZm9gIGhhcyB0aGUgc2FtZSBmaWVsZHMgYXMKK2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bQWNjb3VudEluZm9dLgorSW4gYWRkaXRpb24gYEFwcHJvdmFsSW5mb2AgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGB2YWx1ZWAgICAgICAgfG9wdGlvbmFsfAorVGhlIHZvdGUgdGhhdCB0aGUgdXNlciBoYXMgZ2l2ZW4gZm9yIHRoZSBsYWJlbC4gSWYgcHJlc2VudCBhbmQgemVybywgdGhlCit1c2VyIGlzIHBlcm1pdHRlZCB0byB2b3RlIG9uIHRoZSBsYWJlbC4gSWYgYWJzZW50LCB0aGUgdXNlciBpcyBub3QKK3Blcm1pdHRlZCB0byB2b3RlIG9uIHRoYXQgbGFiZWwuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbY2hhbmdlLWluZm9dXQorQ2hhbmdlSW5mbworfn5+fn5+fn5+fgorVGhlIGBDaGFuZ2VJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICAgICAgIHx8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgICAgICAgICB8fGBnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZWAKK3xgaWRgICAgICAgICAgICAgICAgICB8fAorVGhlIElEIG9mIHRoZSBjaGFuZ2UgaW4gdGhlIGZvcm1hdCAiJzxwcm9qZWN0Plx+PGJyYW5jaD5+PENoYW5nZS1JZD4nIiwKK3doZXJlICdwcm9qZWN0JywgJ2JyYW5jaCcgYW5kICdDaGFuZ2UtSWQnIGFyZSBVUkwgZW5jb2RlZC4gRm9yICdicmFuY2gnIHRoZQorYHJlZnMvaGVhZHMvYCBwcmVmaXggaXMgb21pdHRlZC4KK3xgcHJvamVjdGAgICAgICAgICAgICB8fFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgorfGBicmFuY2hgICAgICAgICAgICAgIHx8CitUaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGJyYW5jaC4gKworVGhlIGByZWZzL2hlYWRzL2AgcHJlZml4IGlzIG9taXR0ZWQuCit8YHRvcGljYCAgICAgICAgICAgICAgfG9wdGlvbmFsfFRoZSB0b3BpYyB0byB3aGljaCB0aGlzIGNoYW5nZSBiZWxvbmdzLgorfGBjaGFuZ2VfaWRgICAgICAgICAgIHx8VGhlIENoYW5nZS1JZCBvZiB0aGUgY2hhbmdlLgorfGBzdWJqZWN0YCAgICAgICAgICAgIHx8CitUaGUgc3ViamVjdCBvZiB0aGUgY2hhbmdlIChoZWFkZXIgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2UpLgorfGBzdGF0dXNgICAgICAgICAgICAgIHx8CitUaGUgc3RhdHVzIG9mIHRoZSBjaGFuZ2UgKGBORVdgLCBgU1VCTUlUVEVEYCwgYE1FUkdFRGAsIGBBQkFORE9ORURgLAorYERSQUZUYCkuCit8YGNyZWF0ZWRgICAgICAgICAgICAgfHwKK1RoZSBsaW5rOnJlc3QtYXBpLmh0bWwjdGltZXN0YW1wW3RpbWVzdGFtcF0gb2Ygd2hlbiB0aGUgY2hhbmdlIHdhcworY3JlYXRlZC4KK3xgdXBkYXRlZGAgICAgICAgICAgICB8fAorVGhlIGxpbms6cmVzdC1hcGkuaHRtbCN0aW1lc3RhbXBbdGltZXN0YW1wXSBvZiB3aGVuIHRoZSBjaGFuZ2Ugd2FzIGxhc3QKK3VwZGF0ZWQuCit8YHN0YXJyZWRgICAgICAgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHwKK1doZXRoZXIgdGhlIGNhbGxpbmcgdXNlciBoYXMgc3RhcnJlZCB0aGlzIGNoYW5nZS4KK3xgcmV2aWV3ZWRgICAgICAgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgY2hhbmdlIHdhcyByZXZpZXdlZCBieSB0aGUgY2FsbGluZyB1c2VyLgorfGBtZXJnZWFibGVgICAgICAgICAgIHxvcHRpb25hbHwKK1doZXRoZXIgdGhlIGNoYW5nZSBpcyBtZXJnZWFibGUuICsKK05vdCBzZXQgZm9yIG1lcmdlZCBjaGFuZ2VzLgorfGBfc29ydGtleWAgICAgICAgICAgIHx8VGhlIHNvcnRrZXkgb2YgdGhlIGNoYW5nZS4KK3xgX251bWJlcmAgICAgICAgICAgICB8fFRoZSBsZWdhY3kgbnVtZXJpYyBJRCBvZiB0aGUgY2hhbmdlLgorfGBvd25lcmAgICAgICAgICAgICAgIHx8CitUaGUgb3duZXIgb2YgdGhlIGNoYW5nZSBhcyBhbiBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvWworQWNjb3VudEluZm9dIGVudGl0eS4KK3xgbGFiZWxzYCAgICAgICAgICAgICB8b3B0aW9uYWx8CitUaGUgbGFiZWxzIG9mIHRoZSBjaGFuZ2UgYXMgYSBtYXAgdGhhdCBtYXBzIHRoZSBsYWJlbCBuYW1lcyB0bworbGluazojbGFiZWwtaW5mb1tMYWJlbEluZm9dIGVudHJpZXMuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIG9yIGxpbms6I2RldGFpbGVkLWxhYmVsc1tkZXRhaWxlZAorbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGBwZXJtaXR0ZWRfbGFiZWxzYCAgIHxvcHRpb25hbHwKK0EgbWFwIG9mIHRoZSBwZXJtaXR0ZWQgbGFiZWxzIHRoYXQgbWFwcyBhIGxhYmVsIG5hbWUgdG8gdGhlIGxpc3Qgb2YKK3ZhbHVlcyB0aGF0IGFyZSBhbGxvd2VkIGZvciB0aGF0IGxhYmVsLiArCitPbmx5IHNldCBpZiBsaW5rOiNkZXRhaWxlZC1sYWJlbHNbZGV0YWlsZWQgbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGByZW1vdmFibGVfcmV2aWV3ZXJzYHxvcHRpb25hbHwKK1RoZSByZXZpZXdlcnMgdGhhdCBjYW4gYmUgcmVtb3ZlZCBieSB0aGUgY2FsbGluZyB1c2VyIGFzIGEgbGlzdCBvZgorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gZW50aXRpZXMuICsKK09ubHkgc2V0IGlmIGxpbms6I2RldGFpbGVkLWxhYmVsc1tkZXRhaWxlZCBsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YGN1cnJlbnRfcmV2aXNpb25gICAgfG9wdGlvbmFsfAorVGhlIGNvbW1pdCBJRCBvZiB0aGUgY3VycmVudCBwYXRjaCBzZXQgb2YgdGhpcyBjaGFuZ2UuICsKK09ubHkgc2V0IGlmIGxpbms6I2N1cnJlbnQtcmV2aXNpb25bdGhlIGN1cnJlbnQgcmV2aXNpb25dIGlzIHJlcXVlc3RlZAorb3IgaWYgbGluazojYWxsLXJldmlzaW9uc1thbGwgcmV2aXNpb25zXSBhcmUgcmVxdWVzdGVkLgorfGByZXZpc2lvbnNgICAgICAgICAgIHxvcHRpb25hbHwKK0FsbCBwYXRjaCBzZXRzIG9mIHRoaXMgY2hhbmdlIGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUgY29tbWl0IElEIG9mIHRoZQorcGF0Y2ggc2V0IHRvIGEgbGluazojcmV2aXNpb24taW5mb1tSZXZpc2lvbkluZm9dIGVudGl0eS4gKworT25seSBzZXQgaWYgbGluazojYWxsLXJldmlzaW9uc1thbGwgcmV2aXNpb25zXSBhcmUgcmVxdWVzdGVkLgorfGBfbW9yZV9jaGFuZ2VzYCAgICAgIHxvcHRpb25hbCwgbm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgcXVlcnkgd291bGQgZGVsaXZlciBtb3JlIHJlc3VsdHMgaWYgbm90IGxpbWl0ZWQuICsKK09ubHkgc2V0IG9uIGVpdGhlciB0aGUgbGFzdCBvciB0aGUgZmlyc3QgY2hhbmdlIHRoYXQgaXMgcmV0dXJuZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2NvbW1lbnQtaW5mb11dCitDb21tZW50SW5mbworfn5+fn5+fn5+fn4KK1RoZSBgQ29tbWVudEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmxpbmUgY29tbWVudC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgIHx8YGdlcnJpdGNvZGVyZXZpZXcjY29tbWVudGAKK3xgaWRgICAgICAgICAgIHx8VGhlIFVSTCBlbmNvZGVkIFVVSUQgb2YgdGhlIGRyYWZ0IGNvbW1lbnQuCit8YHBhdGhgICAgICAgICB8b3B0aW9uYWx8CitUaGUgcGF0aCBvZiB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIGlubGluZSBjb21tZW50IHdhcyBkb25lLiArCitOb3Qgc2V0IGlmIHJldHVybmVkIGluIGEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGZpbGUgcGF0aC4KK3xgc2lkZWAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBzaWRlIG9uIHdoaWNoIHRoZSBjb21tZW50IHdhcyBhZGRlZC4gKworQWxsb3dlZCB2YWx1ZXMgYXJlIGBSRVZJU0lPTmAgYW5kIGBQQVJFTlRgLiArCitJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBpcyBgUkVWSVNJT05gLgorfGBsaW5lYCAgICAgICAgfG9wdGlvbmFsfAorVGhlIG51bWJlciBvZiB0aGUgbGluZSBmb3Igd2hpY2ggdGhlIGNvbW1lbnQgd2FzIGRvbmUuICsKK0lmIG5vdCBzZXQsIGl0J3MgYSBmaWxlIGNvbW1lbnQuCit8YGluX3JlcGx5X3RvYCB8b3B0aW9uYWx8CitUaGUgVVJMIGVuY29kZWQgVVVJRCBvZiB0aGUgY29tbWVudCB0byB3aGljaCB0aGlzIGNvbW1lbnQgaXMgYSByZXBseS4KK3xgbWVzc2FnZWAgICAgIHxvcHRpb25hbHxUaGUgY29tbWVudCBtZXNzYWdlLgorfGB1cGRhdGVkYCAgICAgfHwKK1RoZSBsaW5rOnJlc3QtYXBpLmh0bWwjdGltZXN0YW1wW3RpbWVzdGFtcF0gb2Ygd2hlbiB0aGlzIGNvbW1lbnQgd2FzCit3cml0dGVuLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2NvbW1lbnQtaW5wdXRdXQorQ29tbWVudElucHV0Cit+fn5+fn5+fn5+fn4KK1RoZSBgQ29tbWl0SW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgY3JlYXRpbmcgYW4gaW5saW5lCitjb21tZW50LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgfG9wdGlvbmFsfAorTXVzdCBiZSBgZ2Vycml0Y29kZXJldmlldyNjb21tZW50YCBpZiBwcm92aWRlZC4KK3xgaWRgICAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBVUkwgZW5jb2RlZCBVVUlEIG9mIHRoZSBjb21tZW50IGlmIGFuIGV4aXN0aW5nIGRyYWZ0IGNvbW1lbnQgc2hvdWxkCitiZSB1cGRhdGVkLgorfGBwYXRoYCAgICAgICAgfG9wdGlvbmFsfAorVGhlIHBhdGggb2YgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBpbmxpbmUgY29tbWVudCBzaG91bGQgYmUgYWRkZWQuICsKK0RvZXNuJ3QgbmVlZCB0byBiZSBzZXQgaWYgY29udGFpbmVkIGluIGEgbWFwIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGZpbGUKK3BhdGguCit8YHNpZGVgICAgICAgICB8b3B0aW9uYWx8CitUaGUgc2lkZSBvbiB3aGljaCB0aGUgY29tbWVudCBzaG91bGQgYmUgYWRkZWQuICsKK0FsbG93ZWQgdmFsdWVzIGFyZSBgUkVWSVNJT05gIGFuZCBgUEFSRU5UYC4gKworSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMgYFJFVklTSU9OYC4KK3xgbGluZWAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBudW1iZXIgb2YgdGhlIGxpbmUgZm9yIHdoaWNoIHRoZSBjb21tZW50IHNob3VsZCBiZSBhZGRlZC4gKworYDBgIGlmIGl0IGlzIGEgZmlsZSBjb21tZW50LiArCitJZiBub3Qgc2V0LCBhIGZpbGUgY29tbWVudCBpcyBhZGRlZC4KK3xgaW5fcmVwbHlfdG9gIHxvcHRpb25hbHwKK1RoZSBVUkwgZW5jb2RlZCBVVUlEIG9mIHRoZSBjb21tZW50IHRvIHdoaWNoIHRoaXMgY29tbWVudCBpcyBhIHJlcGx5LgorfGB1cGRhdGVkYCAgICAgfG9wdGlvbmFsfAorVGhlIGxpbms6cmVzdC1hcGkuaHRtbCN0aW1lc3RhbXBbdGltZXN0YW1wXSBvZiB0aGlzIGNvbW1lbnQuICsKK0FjY2VwdGVkIGJ1dCBpZ25vcmVkLgorfGBtZXNzYWdlYCAgICAgfG9wdGlvbmFsfAorVGhlIGNvbW1lbnQgbWVzc2FnZS4gKworSWYgbm90IHNldCBhbmQgYW4gZXhpc3RpbmcgZHJhZnQgY29tbWVudCBpcyB1cGRhdGVkLCB0aGUgZXhpc3RpbmcgZHJhZnQKK2NvbW1lbnQgaXMgZGVsZXRlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tjb21taXQtaW5mb11dCitDb21taXRJbmZvCit+fn5+fn5+fn5+CitUaGUgYENvbW1pdEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGNvbW1pdC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfERlc2NyaXB0aW9uCit8YGNvbW1pdGAgICAgICB8VGhlIGNvbW1pdCBJRC4KK3xgcGFyZW50YCAgICAgIHwKK1RoZSBwYXJlbnQgY29tbWl0cyBvZiB0aGlzIGNvbW1pdCBhcyBhIGxpc3Qgb2YKK2xpbms6I2NvbW1pdC1pbmZvW0NvbW1pdEluZm9dIGVudGl0aWVzLgorfGBhdXRob3JgICAgICAgfFRoZSBhdXRob3Igb2YgdGhlIGNvbW1pdCBhcyBhCitsaW5rOiNnaXQtcGVyc29uLWluZm9bR2l0UGVyc29uSW5mb10gZW50aXR5LgorfGBjb21taXR0ZXJgICAgfFRoZSBjb21taXR0ZXIgb2YgdGhlIGNvbW1pdCBhcyBhCitsaW5rOiNnaXQtcGVyc29uLWluZm9bR2l0UGVyc29uSW5mb10gZW50aXR5LgorfGBzdWJqZWN0YCAgICAgfAorVGhlIHN1YmplY3Qgb2YgdGhlIGNvbW1pdCAoaGVhZGVyIGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlKS4KK3xgbWVzc2FnZWAgICAgIHxUaGUgY29tbWl0IG1lc3NhZ2UuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tmZXRjaC1pbmZvXV0KK0ZldGNoSW5mbworfn5+fn5+fn5+CitUaGUgYEZldGNoSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBmZXRjaCBhIHBhdGNoCitzZXQgdmlhIGEgY2VydGFpbiBwcm90b2NvbC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfERlc2NyaXB0aW9uCit8YHVybGAgICAgICAgICB8VGhlIFVSTCBvZiB0aGUgcHJvamVjdC4KK3xgcmVmYCAgICAgICAgIHxUaGUgcmVmIG9mIHRoZSBwYXRjaCBzZXQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tmaWxlLWluZm9dXQorRmlsZUluZm8KK35+fn5+fn5+CitUaGUgYEZpbGVJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGluIGEgcGF0Y2ggc2V0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgc3RhdHVzYCAgICAgICAgfG9wdGlvbmFsfAorVGhlIHN0YXR1cyBvZiB0aGUgZmlsZSAoImBBYCI9QWRkZWQsICJgRGAiPURlbGV0ZWQsICJgUmAiPVJlbmFtZWQsCisiYENgIj1Db3BpZWQsICJgV2AiPVJld3JpdHRlbikuICsKK05vdCBzZXQgaWYgdGhlIGZpbGUgd2FzIE1vZGlmaWVkICgiYE1gIikuCit8YGJpbmFyeWAgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgZmlsZSBpcyBiaW5hcnkuCit8YG9sZF9wYXRoYCAgICAgIHxvcHRpb25hbHwKK1RoZSBvbGQgZmlsZSBwYXRoLiArCitPbmx5IHNldCBpZiB0aGUgZmlsZSB3YXMgcmVuYW1lZCBvciBjb3BpZWQuCit8YGxpbmVzX2luc2VydGVkYHxvcHRpb25hbHwKK051bWJlciBvZiBpbnNlcnRlZCBsaW5lcy4gKworTm90IHNldCBmb3IgYmluYXJ5IGZpbGVzIG9yIGlmIG5vIGxpbmVzIHdlcmUgaW5zZXJ0ZWQuCit8YGxpbmVzX2RlbGV0ZWRgIHxvcHRpb25hbHwKK051bWJlciBvZiBkZWxldGVkIGxpbmVzLiArCitOb3Qgc2V0IGZvciBiaW5hcnkgZmlsZXMgb3IgaWYgbm8gbGluZXMgd2VyZSBkZWxldGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZ2l0LXBlcnNvbi1pbmZvXV0KK0dpdFBlcnNvbkluZm8KK35+fn5+fn5+fn5+fn4KK1RoZSBgR2l0UGVyc29uSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorYXV0aG9yL2NvbW1pdHRlciBvZiBhIGNvbW1pdC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfERlc2NyaXB0aW9uCit8YG5hbWVgICAgICAgICB8VGhlIG5hbWUgb2YgdGhlIGF1dGhvci9jb21taXR0ZXIuCit8YGVtYWlsYCAgICAgICB8VGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGF1dGhvci9jb21taXR0ZXIuCit8YGRhdGVgICAgICAgICB8VGhlIGxpbms6cmVzdC1hcGkuaHRtbCN0aW1lc3RhbXBbdGltZXN0YW1wXSBvZiB3aGVuCit0aGlzIGlkZW50aXR5IHdhcyBjb25zdHJ1Y3RlZC4KK3xgdHpgICAgICAgICAgIHxUaGUgdGltZXpvbmUgb2Zmc2V0IGZyb20gVVRDIG9mIHdoZW4gdGhpcyBpZGVudGl0eSB3YXMKK2NvbnN0cnVjdGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbbGFiZWwtaW5mb11dCitMYWJlbEluZm8KK35+fn5+fn5+fgorVGhlIGBMYWJlbEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGxhYmVsIG9uIGEgY2hhbmdlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBhcHByb3ZlZGAgICAgfG9wdGlvbmFsfFRoZSB1c2VyIHdobyBhcHByb3ZlZCB0aGlzIGxhYmVsIG9uIHRoZSBjaGFuZ2UKK2FzIGEgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gZW50aXR5LiArCitPbmx5IHNldCBpZiBsaW5rOiNsYWJlbHNbbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGByZWplY3RlZGAgICAgfG9wdGlvbmFsfFRoZSB1c2VyIHdobyByZWplY3RlZCB0aGlzIGxhYmVsIG9uIHRoZSBjaGFuZ2UKK2FzIGEgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gZW50aXR5LiArCitPbmx5IHNldCBpZiBsaW5rOiNsYWJlbHNbbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGByZWNvbW1lbmRlZGAgfG9wdGlvbmFsfFRoZSB1c2VyIHdobyByZWNvbW1lbmRlZCB0aGlzIGxhYmVsIG9uIHRoZQorY2hhbmdlIGFzIGEgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gZW50aXR5LiArCitPbmx5IHNldCBpZiBsaW5rOiNsYWJlbHNbbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGBkaXNsaWtlZGAgICAgfG9wdGlvbmFsfFRoZSB1c2VyIHdobyBkaXNsaWtlZCB0aGlzIGxhYmVsIG9uIHRoZSBjaGFuZ2UKK2FzIGEgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gZW50aXR5LiArCitPbmx5IHNldCBpZiBsaW5rOiNsYWJlbHNbbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGB2YWx1ZWAgICAgICAgfG9wdGlvbmFsfFRoZSB2b3RpbmcgdmFsdWUgb2YgdGhlIHVzZXIgd2hvCityZWNvbW1lbmRlZC9kaXNsaWtlZCB0aGlzIGxhYmVsIG9uIHRoZSBjaGFuZ2UgaWYgaXQgaXMgbm90CisiYCsxYCIvImAtMWAiLiArCitPbmx5IHNldCBpZiBsaW5rOiNsYWJlbHNbbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfGBvcHRpb25hbGAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHwKK1doZXRoZXIgdGhlIGxhYmVsIGlzIG9wdGlvbmFsLiBPcHRpb25hbCBtZWFucyB0aGUgbGFiZWwgbWF5IGJlIHNldCwgYnV0CitpdCdzIG5laXRoZXIgbmVjZXNzYXJ5IGZvciBzdWJtaXNzaW9uIG5vciBkb2VzIGl0IGJsb2NrIHN1Ym1pc3Npb24gaWYKK3NldC4KK3xgYWxsYCAgICAgICAgIHxvcHRpb25hbHxMaXN0IG9mIGFsbCBhcHByb3ZhbHMgZm9yIHRoaXMgbGFiZWwgYXMgYSBsaXN0CitvZiBsaW5rOiNhcHByb3ZhbC1pbmZvW0FwcHJvdmFsSW5mb10gZW50aXRpZXMuICsKK09ubHkgc2V0IGlmIGxpbms6I2RldGFpbGVkLWxhYmVsc1tkZXRhaWxlZCBsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHZhbHVlc2AgICAgICB8b3B0aW9uYWx8QSBtYXAgb2YgYWxsIHZhbHVlcyB0aGF0IGFyZSBhbGxvd2VkIGZvciB0aGlzCitsYWJlbC4gVGhlIG1hcCBtYXBzIHRoZSB2YWx1ZXMgKCJgLTJgIiwgImAtMWAiLCAiIGAwYCIsICJgKzFgIiwgImArMmAiKQordG8gdGhlIHZhbHVlIGRlc2NyaXB0aW9ucy4gKworT25seSBzZXQgaWYgbGluazojZGV0YWlsZWQtbGFiZWxzW2RldGFpbGVkIGxhYmVsc10gYXJlIHJlcXVlc3RlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXN0b3JlLWlucHV0XV0KK1Jlc3RvcmVJbnB1dAorfn5+fn5+fn5+fn5+CitUaGUgYFJlc3RvcmVJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciByZXN0b3JpbmcgYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YG1lc3NhZ2VgICAgICB8b3B0aW9uYWx8CitNZXNzYWdlIHRvIGJlIGFkZGVkIGFzIHJldmlldyBjb21tZW50IHRvIHRoZSBjaGFuZ2Ugd2hlbiByZXN0b3JpbmcgdGhlCitjaGFuZ2UuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcmV2ZXJ0LWlucHV0XV0KK1JldmVydElucHV0Cit+fn5+fn5+fn5+fgorVGhlIGBSZXZlcnRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciByZXZlcnRpbmcgYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YG1lc3NhZ2VgICAgICB8b3B0aW9uYWx8CitNZXNzYWdlIHRvIGJlIGFkZGVkIGFzIHJldmlldyBjb21tZW50IHRvIHRoZSBjaGFuZ2Ugd2hlbiByZXZlcnRpbmcgdGhlCitjaGFuZ2UuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcmV2aWV3LWluZm9dXQorUmV2aWV3SW5mbworfn5+fn5+fn5+fgorVGhlIGBSZXZpZXdJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSByZXZpZXcuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsNiJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgfERlc2NyaXB0aW9uCit8YGxhYmVsc2AgICAgICAgfAorVGhlIGxhYmVscyBvZiB0aGUgcmV2aWV3IGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUgbGFiZWwgbmFtZXMgdG8gdGhlCit2b3RpbmcgdmFsdWVzLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Jldmlldy1pbnB1dF1dCitSZXZpZXdJbnB1dAorfn5+fn5+fn5+fn4KK1RoZSBgUmV2aWV3SW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgYWRkaW5nIGEgcmV2aWV3IHRvIGEKK3JldmlzaW9uLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICB8fERlc2NyaXB0aW9uCit8YG1lc3NhZ2VgICAgICAgfG9wdGlvbmFsfAorVGhlIG1lc3NhZ2UgdG8gYmUgYWRkZWQgYXMgcmV2aWV3IGNvbW1lbnQuCit8YGxhYmVsc2AgICAgICAgfG9wdGlvbmFsfAorVGhlIHZvdGVzIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXZpc2lvbiBhcyBhIG1hcCB0aGF0IG1hcHMgdGhlCitsYWJlbCBuYW1lcyB0byB0aGUgdm90aW5nIHZhbHVlcy4KK3xgY29tbWVudHNgICAgICB8b3B0aW9uYWx8CitUaGUgY29tbWVudHMgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBtYXAgdGhhdCBtYXBzIGEgZmlsZSBwYXRoIHRvIGEKK2xpc3Qgb2YgbGluazojY29tbWVudC1pbnB1dFtDb21tZW50SW5wdXRdIGVudGl0aWVzLgorfGBzdHJpY3RfbGFiZWxzYHxgdHJ1ZWAgaWYgbm90IHNldHwKK1doZXRoZXIgYWxsIGxhYmVscyBhcmUgcmVxdWlyZWQgdG8gYmUgd2l0aGluIHRoZSB1c2VyJ3MgcGVybWl0dGVkIHJhbmdlcworYmFzZWQgb24gYWNjZXNzIGNvbnRyb2xzLiArCitJZiBgdHJ1ZWAsIGF0dGVtcHRpbmcgdG8gdXNlIGEgbGFiZWwgbm90IGdyYW50ZWQgdG8gdGhlIHVzZXIgd2lsbCBmYWlsCit0aGUgZW50aXJlIG1vZGlmeSBvcGVyYXRpb24gZWFybHkuICsKK0lmIGBmYWxzZWAsIHRoZSBvcGVyYXRpb24gd2lsbCBleGVjdXRlIGFueXdheSwgYnV0IHRoZSBwcm9wb3NlZCBsYWJlbHMKK3dpbGwgYmUgbW9kaWZpZWQgdG8gYmUgdGhlICJiZXN0IiB2YWx1ZSBhbGxvd2VkIGJ5IHRoZSBhY2Nlc3MgY29udHJvbHMuCit8YGRyYWZ0c2AgICAgICB8b3B0aW9uYWx8CitEcmFmdCBoYW5kbGluZyB0aGF0IGRlZmluZXMgaG93IGRyYWZ0IGNvbW1lbnRzIGFyZSBoYW5kbGVkIHRoYXQgYXJlCithbHJlYWR5IGluIHRoZSBkYXRhYmFzZSBidXQgdGhhdCB3ZXJlIG5vdCBhbHNvIGRlc2NyaWJlZCBpbiB0aGlzCitpbnB1dC4gKworQWxsb3dlZCB2YWx1ZXMgYXJlIGBERUxFVEVgLCBgUFVCTElTSGAgYW5kIGBLRUVQYC4gKworSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMgYERFTEVURWAuCit8YG5vdGlmeWAgICAgICB8b3B0aW9uYWx8CitOb3RpZnkgaGFuZGxpbmcgdGhhdCBkZWZpbmVzIHRvIHdob20gZW1haWwgbm90aWZpY2F0aW9ucyBzaG91bGQgYmUgc2VudAorYWZ0ZXIgdGhlIHJldmlldyBpcyBzdG9yZWQuICsKK0FsbG93ZWQgdmFsdWVzIGFyZSBgTk9ORWAsIGBPV05FUmAsIGBPV05FUl9SRVZJRVdFUlNgIGFuZCBgQUxMYC4gKworSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMgYEFMTGAuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Jldmlld2VyLWluZm9dXQorUmV2aWV3ZXJJbmZvCit+fn5+fn5+fn5+fn4KK1RoZSBgUmV2aWV3ZXJJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSByZXZpZXdlciBhbmQgaXRzCit2b3RlcyBvbiBhIGNoYW5nZS4KKworYFJldmlld2VySW5mb2AgaGFzIHRoZSBzYW1lIGZpZWxkcyBhcworbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gYW5kIGluY2x1ZGVzCitsaW5rOiNkZXRhaWxlZC1hY2NvdW50c1tkZXRhaWxlZCBhY2NvdW50IGluZm9ybWF0aW9uXS4KK0luIGFkZGl0aW9uIGBSZXZpZXdlckluZm9gIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfERlc2NyaXB0aW9uCit8YGtpbmRgICAgICAgICB8YGdlcnJpdGNvZGVyZXZpZXcjcmV2aWV3ZXJgCit8YGFwcHJvdmFsc2AgICB8CitUaGUgYXBwcm92YWxzIG9mIHRoZSByZXZpZXdlciBhcyBhIG1hcCB0aGF0IG1hcHMgdGhlIGxhYmVsIG5hbWVzIHRvIHRoZQorYXBwcm92YWwgdmFsdWVzICgiYC0yYCIsICJgLTFgIiwgIiBgMGAiLCAiYCsxYCIsICJgKzJgIikuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXZpZXdlci1pbnB1dF1dCitSZXZpZXdlcklucHV0Cit+fn5+fn5+fn5+fn5+CitUaGUgYFJldmlld2VySW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgYWRkaW5nIGEgcmV2aWV3ZXIKK3RvIGEgY2hhbmdlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGByZXZpZXdlcmAgICAgfHwKK1RoZSBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtJRF0gb2Ygb25lIGFjY291bnQgdGhhdAorc2hvdWxkIGJlIGFkZGVkIGFzIHJldmlld2VyIG9yIHRoZSBsaW5rOnJlc3QtYXBpLWdyb3Vwcy5odG1sI2dyb3VwLWlkWworSURdIG9mIG9uZSBncm91cCBmb3Igd2hpY2ggYWxsIG1lbWJlcnMgc2hvdWxkIGJlIGFkZGVkIGFzIHJldmlld2Vycy4gKworSWYgYW4gSUQgaWRlbnRpZmllcyBib3RoIGFuIGFjY291bnQgYW5kIGEgZ3JvdXAsIG9ubHkgdGhlIGFjY291bnQgaXMKK2FkZGVkIGFzIHJldmlld2VyIHRvIHRoZSBjaGFuZ2UuCit8YGNvbmZpcm1lZGAgICB8b3B0aW9uYWx8CitXaGV0aGVyIGFkZGluZyB0aGUgcmV2aWV3ZXIgaXMgY29uZmlybWVkLiArCitUaGUgR2Vycml0IHNlcnZlciBtYXkgYmUgY29uZmlndXJlZCB0bworbGluazpjb25maWctZ2Vycml0Lmh0bWwjYWRkcmV2aWV3ZXIubWF4V2l0aG91dENvbmZpcm1hdGlvbltyZXF1aXJlIGEKK2NvbmZpcm1hdGlvbl0gd2hlbiBhZGRpbmcgYSBncm91cCBhcyByZXZpZXdlciB0aGF0IGhhcyBtYW55IG1lbWJlcnMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcmV2aXNpb24taW5mb11dCitSZXZpc2lvbkluZm8KK35+fn5+fn5+fn5+fgorVGhlIGBSZXZpc2lvbkluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhdGNoIHNldC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgZHJhZnRgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgcGF0Y2ggc2V0IGlzIGEgZHJhZnQuCit8YF9udW1iZXJgICAgICB8fFRoZSBwYXRjaCBzZXQgbnVtYmVyLgorfGBmZXRjaGAgICAgICAgfHwKK0luZm9ybWF0aW9uIGFib3V0IGhvdyB0byBmZXRjaCB0aGlzIHBhdGNoIHNldC4gVGhlIGZldGNoIGluZm9ybWF0aW9uIGlzCitwcm92aWRlZCBhcyBhIG1hcCB0aGF0IG1hcHMgdGhlIHByb3RvY29sIG5hbWUgKCJgZ2l0YCIsICJgaHR0cGAiLAorImBzc2hgIikgdG8gbGluazojZmV0Y2gtaW5mb1tGZXRjaEluZm9dIGVudGl0aWVzLgorfGBjb21taXRgICAgICAgfHxUaGUgY29tbWl0IG9mIHRoZSBwYXRjaCBzZXQgYXMKK2xpbms6I2NvbW1pdC1pbmZvW0NvbW1pdEluZm9dIGVudGl0eS4KK3xgZmlsZXNgICAgICAgIHx8CitUaGUgZmlsZXMgb2YgdGhlIHBhdGNoIHNldCBhcyBhIG1hcCB0aGF0IG1hcHMgdGhlIGZpbGUgbmFtZXMgdG8KK2xpbms6I2ZpbGUtaW5mb1tGaWxlSW5mb10gZW50aXRpZXMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcnVsZS1pbnB1dF1dCitSdWxlSW5wdXQKK35+fn5+fn5+fgorVGhlIGBSdWxlSW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiB0byB0ZXN0IGEgUHJvbG9nIHJ1bGUuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgcnVsZWB8fAorUHJvbG9nIGNvZGUgdG8gZXhlY3V0ZSBpbnN0ZWFkIG9mIHRoZSBjb2RlIGluIGByZWZzL21ldGEvY29uZmlnYC4KK3xgZmlsdGVyc2B8YFJVTmAgaWYgbm90IHNldHwKK1doZW4gYFJVTmAgZmlsdGVyIHJ1bGVzIGluIHRoZSBwYXJlbnQgcHJvamVjdHMgYXJlIGNhbGxlZCB0bworcG9zdC1wcm9jZXNzIHRoZSByZXN1bHRzIG9mIHRoZSBwcm9qZWN0IHNwZWNpZmljIHJ1bGUuIFRoaXMKK2JlaGF2aW9yIG1hdGNoZXMgaG93IHRoZSBydWxlIHdpbGwgZXhlY3V0ZSBpZiBpbnN0YWxsZWQuICsKK0lmIGBTS0lQYCB0aGUgcGFyZW50IGZpbHRlcnMgYXJlIG5vdCBjYWxsZWQsIGFsbG93aW5nIHRoZSB0ZXN0Cit0byByZXR1cm4gcmVzdWx0cyBmcm9tIHRoZSBpbnB1dCBydWxlLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3N1Ym1pdC1pbmZvXV0KK1N1Ym1pdEluZm8KK35+fn5+fn5+fn4KK1RoZSBgU3VibWl0SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2Ugc3RhdHVzCithZnRlciBzdWJtaXR0aW5nLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xgc3RhdHVzYCAgICAgIHwKK1RoZSBzdGF0dXMgb2YgdGhlIGNoYW5nZSBhZnRlciBzdWJtaXR0aW5nLCBjYW4gYmUgYE1FUkdFRGAgb3IKK2BTVUJNSVRURURgLiArCitJZiBgd2FpdF9mb3JfbWVyZ2VgIGluIHRoZSBsaW5rOiNzdWJtaXQtaW5wdXRbU3VibWl0SW5wdXRdIHdhcyBzZXQgdG8KK2BmYWxzZWAgdGhlIHJldHVybmVkIHN0YXR1cyBpcyBgU1VCTUlUVEVEYCBhbmQgdGhlIGNhbGxlciBjYW4ndCBrbm93Cit3aGV0aGVyIHRoZSBjaGFuZ2UgY291bGQgYmUgbWVyZ2VkIHN1Y2Nlc3NmdWxseS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3N1Ym1pdC1pbnB1dF1dCitTdWJtaXRJbnB1dAorfn5+fn5+fn5+fn4KK1RoZSBgU3VibWl0SW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3Igc3VibWl0dGluZyBhIGNoYW5nZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGB3YWl0X2Zvcl9tZXJnZWB8YGZhbHNlYCBpZiBub3Qgc2V0fAorV2hldGhlciB0aGUgcmVxdWVzdCBzaG91bGQgd2FpdCBmb3IgdGhlIG1lcmdlIHRvIGNvbXBsZXRlLiArCitJZiBgZmFsc2VgIHRoZSByZXF1ZXN0IHJldHVybnMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNoYW5nZSBoYXMgYmVlbgorYWRkZWQgdG8gdGhlIG1lcmdlIHF1ZXVlIGFuZCB0aGUgY2FsbGVyIGNhbid0IGtub3cgd2hldGhlciB0aGUgY2hhbmdlCitjb3VsZCBiZSBtZXJnZWQgc3VjY2Vzc2Z1bGx5LgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3N1Ym1pdC1yZWNvcmRdXQorU3VibWl0UmVjb3JkCit+fn5+fn5+fn5+fn4KK1RoZSBgU3VibWl0UmVjb3JkYCBlbnRpdHkgZGVzY3JpYmVzIHJlc3VsdHMgZnJvbSBhIHN1Ym1pdF9ydWxlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICB8fERlc2NyaXB0aW9uCit8YHN0YXR1c2B8fAorYE9LYCwgdGhlIGNoYW5nZSBjYW4gYmUgc3VibWl0dGVkLiArCitgTk9UX1JFQURZYCwgYWRkaXRpb25hbCBsYWJlbHMgYXJlIHJlcXVpcmVkIGJlZm9yZSBzdWJtaXQuICsKK2BDTE9TRURgLCBjbG9zZWQgY2hhbmdlcyBjYW5ub3QgYmUgc3VibWl0dGVkLiArCitgUlVMRV9FUlJPUmAsIHJ1bGUgY29kZSBmYWlsZWQgd2l0aCBhbiBlcnJvci4KK3xgb2tgfG9wdGlvbmFsfAorTWFwIG9mIGxhYmVscyB0aGF0IGFyZSBhcHByb3ZlZDsgYW4KK2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bQWNjb3VudEluZm9dIGlkZW50aWZpZXMgdGhlCit2b3RlciBjaG9zZW4gYnkgdGhlIHJ1bGUuCit8YHJlamVjdGB8b3B0aW9uYWx8CitNYXAgb2YgbGFiZWxzIHRoYXQgYXJlIHByZXZlbnRpbmcgc3VibWl0OworbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gaWRlbnRpZmllcyB2b3Rlci4KK3xgbmVlZGB8b3B0aW9uYWx8CitNYXAgb2YgbGFiZWxzIHRoYXQgbmVlZCB0byBiZSBnaXZlbiB0byBzdWJtaXQuIFRoZSB2YWx1ZSBpcworY3VycmVudGx5IGFuIGVtcHR5IG9iamVjdC4KK3xgbWF5YHxvcHRpb25hbHwKK01hcCBvZiBsYWJlbHMgdGhhdCBjYW4gYmUgdXNlZCwgYnV0IGRvIG5vdCBhZmZlY3Qgc3VibWl0LgorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gaWRlbnRpZmllcyB2b3RlciwKK2lmIHRoZSBsYWJlbCBoYXMgYmVlbiBhcHBsaWVkLgorfGBpbXBvc3NpYmxlYHxvcHRpb25hbHwKK01hcCBvZiBsYWJlbHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGluIGBuZWVkYCBidXQgY2Fubm90IGJlCit1c2VkIGJ5IGFueSB1c2VyIGJlY2F1c2Ugb2YgYWNjZXNzIHJlc3RyaWN0aW9ucy4gVGhlIHZhbHVlCitpcyBjdXJyZW50bHkgYW4gZW1wdHkgb2JqZWN0LgorfGBlcnJvcl9tZXNzYWdlYHxvcHRpb25hbHwKK1doZW4gc3RhdHVzIGlzIFJVTEVfRVJST1IgdGhpcyBtZXNzYWdlIHByb3ZpZGVzIHNvbWUgdGV4dCBkZXNjcmliaW5nCit0aGUgZmFpbHVyZSBvZiB0aGUgcnVsZSBwcmVkaWNhdGUuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbdG9waWMtaW5wdXRdXQorVG9waWNJbnB1dAorfn5+fn5+fn5+fgorVGhlIGBUb3BpY0lucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHNldHRpbmcgYSB0b3BpYy4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgdG9waWNgICAgICAgIHxvcHRpb25hbHxUaGUgdG9waWMuICsKK1RoZSB0b3BpYyB3aWxsIGJlIGRlbGV0ZWQgaWYgbm90IHNldC4KK3xgbWVzc2FnZWAgICAgIHxvcHRpb25hbHwKK01lc3NhZ2UgdG8gYmUgYWRkZWQgYXMgcmV2aWV3IGNvbW1lbnQgdG8gdGhlIGNoYW5nZSB3aGVuIHNldHRpbmcgdGhlCit0b3BpYy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1ncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1ncm91cHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDBkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWdyb3Vwcy50eHQKQEAgLTAsMCArMSwxMjI5IEBACitHZXJyaXQgQ29kZSBSZXZpZXcgLSAvZ3JvdXBzLyBSRVNUIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBwYWdlIGRlc2NyaWJlcyB0aGUgZ3JvdXAgcmVsYXRlZCBSRVNUIGVuZHBvaW50cy4KK1BsZWFzZSBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiB0aGUKK2xpbms6cmVzdC1hcGkuaHRtbFtSRVNUIEFQSV0uCisKK1tbZ3JvdXAtZW5kcG9pbnRzXV0KK0dyb3VwIEVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tCisKK1tbbGlzdC1ncm91cHNdXQorTGlzdCBHcm91cHMKK35+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvJworCitMaXN0cyB0aGUgZ3JvdXBzIGFjY2Vzc2libGUgYnkgdGhlIGNhbGxlci4gVGhpcyBpcyB0aGUgc2FtZSBhcwordXNpbmcgdGhlIGxpbms6Y21kLWxzLWdyb3Vwcy5odG1sW2xzLWdyb3Vwc10gY29tbWFuZCBvdmVyIFNTSCwKK2FuZCBhY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgcXVlcnkgcGFyYW1ldGVycy4KKworQXMgcmVzdWx0IGEgbWFwIGlzIHJldHVybmVkIHRoYXQgbWFwcyB0aGUgZ3JvdXAgbmFtZXMgdG8KK2xpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRyaWVzLiBUaGUgZW50cmllcyBpbiB0aGUgbWFwIGFyZSBzb3J0ZWQKK2J5IGdyb3VwIG5hbWUuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiQWRtaW5pc3RyYXRvcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC02YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJHZXJyaXQgU2l0ZSBBZG1pbmlzdHJhdG9ycyIsCisgICAgICAiZ3JvdXBfaWQiOiAxLAorICAgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICAgIH0sCisgICAgIkFub255bW91cyBVc2VycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogImdsb2JhbCUzQUFub255bW91cy1Vc2VycyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtZ2xvYmFsJTNBQW5vbnltb3VzLVVzZXJzIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJBbnkgdXNlciwgc2lnbmVkLWluIG9yIG5vdCIsCisgICAgICAiZ3JvdXBfaWQiOiAyLAorICAgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICAgIH0sCisgICAgIk15UHJvamVjdF9Db21taXR0ZXJzIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNyIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZSwKKyAgICAgIH0sCisgICAgICAiZ3JvdXBfaWQiOiA2LAorICAgICAgIm93bmVyIjogIk15UHJvamVjdF9Db21taXR0ZXJzIiwKKyAgICAgICJvd25lcl9pZCI6ICI4MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IgorICAgIH0sCisgICAgIk5vbi1JbnRlcmFjdGl2ZSBVc2VycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjUwNTdmM2NiZDM1MTlkNmFiNjkzNjQ0MjlhODlmZmRmZmJhNTBmNzMiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTUwNTdmM2NiZDM1MTlkNmFiNjkzNjQ0MjlhODlmZmRmZmJhNTBmNzMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIlVzZXJzIHdobyBwZXJmb3JtIGJhdGNoIGFjdGlvbnMgb24gR2Vycml0IiwKKyAgICAgICJncm91cF9pZCI6IDQsCisgICAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfSwKKyAgICAiUHJvamVjdCBPd25lcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICJnbG9iYWwlM0FQcm9qZWN0LU93bmVycyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtZ2xvYmFsJTNBUHJvamVjdC1Pd25lcnMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkFueSBvd25lciBvZiB0aGUgcHJvamVjdCIsCisgICAgICAiZ3JvdXBfaWQiOiA1LAorICAgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICAgIH0sCisgICAgIlJlZ2lzdGVyZWQgVXNlcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICJnbG9iYWwlM0FSZWdpc3RlcmVkLVVzZXJzIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC1nbG9iYWwlM0FSZWdpc3RlcmVkLVVzZXJzIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJBbnkgc2lnbmVkLWluIHVzZXIiLAorICAgICAgImdyb3VwX2lkIjogMywKKyAgICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgICB9CisgIH0KKy0tLS0KKworLkdldCBhbGwgZ3JvdXBzCisqKioqCitnZXQ6Oi9ncm91cHMvCisqKioqCisKK1tbZ3JvdXAtb3B0aW9uc11dCitHcm91cCBPcHRpb25zCiteXl5eXl5eXl5eXl5eCitBZGRpdGlvbmFsIGZpZWxkcyBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIGBvYCBwYXJhbWV0ZXJzLCBlYWNoIG9wdGlvbgorcmVxdWlyZXMgbW9yZSBsb29rdXBzIGFuZCBzbG93cyBkb3duIHRoZSBxdWVyeSByZXNwb25zZSB0aW1lIHRvIHRoZQorY2xpZW50IHNvIHRoZXkgYXJlIGdlbmVyYWxseSBkaXNhYmxlZCBieSBkZWZhdWx0LiBPcHRpb25hbCBmaWVsZHMgYXJlOgorCitbW2luY2x1ZGVzXV0KKy0tCisqIGBJTkNMVURFU2A6IGluY2x1ZGUgbGlzdCBvZiBkaXJlY3RseSBpbmNsdWRlZCBncm91cHMuCistLQorCitbW21lbWJlcnNdXQorLS0KKyogYE1FTUJFUlNgOiBpbmNsdWRlIGxpc3Qgb2YgZGlyZWN0IGdyb3VwIG1lbWJlcnMuCistLQorCitDaGVjayBpZiBhIGdyb3VwIGlzIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXIKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorQnkgc2V0dGluZyB0aGUgb3B0aW9uIGBvd25lZGAgYW5kIHNwZWNpZnlpbmcgYSBncm91cCB0byBpbnNwZWN0IHdpdGgKK3RoZSBvcHRpb24gYHFgLCBpdCBpcyBwb3NzaWJsZSB0byBmaW5kIG91dCwgaWYgdGhpcyBncm91cCBpcyBvd25lZCBieQordGhlIGNhbGxpbmcgdXNlci4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvP293bmVkJnE9TXlQcm9qZWN0LUNvbW1pdHRlcnMgSFRUUC8xLjAKKy0tLS0KKworSWYgdGhlIGdyb3VwIGlzIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXIsIHRoZSByZXR1cm5lZCBtYXAgY29udGFpbnMKK3RoaXMgZ3JvdXAuIElmIHRoZSBjYWxsaW5nIHVzZXIgZG9lc24ndCBvd24gdGhpcyBncm91cCBhbiBlbXB0eSBtYXAgaXMKK3JldHVybmVkLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiTXlQcm9qZWN0LUNvbW1pdHRlcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICI5OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC05OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlCisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjoiY29udGFpbnMgYWxsIGNvbW1pdHRlcnMgZm9yIE15UHJvamVjdCIsCisgICAgICAiZ3JvdXBfaWQiOiA1NTEsCisgICAgICAib3duZXIiOiAiTXlQcm9qZWN0LU93bmVycyIsCisgICAgICAib3duZXJfaWQiOiAiN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIKKyAgICB9CisgIH0KKy0tLS0KKworW1tnZXQtZ3JvdXBdXQorR2V0IEdyb3VwCit+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dJworCitSZXRyaWV2ZXMgYSBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBncm91cC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgImlkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJuYW1lIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm9wdGlvbnMiOiB7CisgICAgfSwKKyAgICAiZGVzY3JpcHRpb24iOiAiR2Vycml0IFNpdGUgQWRtaW5pc3RyYXRvcnMiLAorICAgICJncm91cF9pZCI6IDEsCisgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgfQorLS0tLQorCitbW2NyZWF0ZS1ncm91cF1dCitDcmVhdGUgR3JvdXAKK35+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvZ3JvdXBzL2xpbms6I2dyb3VwLW5hbWVbXHtncm91cC1uYW1lXH1dJworCitDcmVhdGVzIGEgbmV3IEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworSW4gdGhlIHJlcXVlc3QgYm9keSBhZGRpdGlvbmFsIGRhdGEgZm9yIHRoZSBncm91cCBjYW4gYmUgcHJvdmlkZWQgYXMKK2xpbms6I2dyb3VwLWlucHV0W0dyb3VwSW5wdXRdLgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycyBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiY29udGFpbnMgYWxsIGNvbW1pdHRlcnMgZm9yIE15UHJvamVjdCIsCisgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZSwKKyAgICAib3duZXIiOiAiTXlQcm9qZWN0LU93bmVycyIsCisgICAgIm93bmVyX2lkIjogIjdjYTA0MmY0ZDU4NDc5MzZmY2I5MGNhOTEwNTc2NzMxNTdmZDA2ZmMiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBjcmVhdGVkIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAxIENyZWF0ZWQKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICJpZCI6ICI5OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwIiwKKyAgICAibmFtZSI6ICJNeVByb2plY3QtQ29tbWl0dGVycyIsCisgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAiLAorICAgICJvcHRpb25zIjogeworICAgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZQorICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjoiY29udGFpbnMgYWxsIGNvbW1pdHRlcnMgZm9yIE15UHJvamVjdCIsCisgICAgImdyb3VwX2lkIjogNTUxLAorICAgICJvd25lciI6ICJNeVByb2plY3QtT3duZXJzIiwKKyAgICAib3duZXJfaWQiOiAiN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIKKyAgfQorLS0tLQorCitJZiB0aGUgZ3JvdXAgY3JlYXRpb24gZmFpbHMgYmVjYXVzZSB0aGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSB0aGUKK3Jlc3BvbnNlIGlzICJgNDA5IENvbmZsaWN0YCIuCisKK1tbZ2V0LWdyb3VwLWRldGFpbF1dCitHZXQgR3JvdXAgRGV0YWlsCit+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9kZXRhaWwnCisKK1JldHJpZXZlcyBhIGdyb3VwIHdpdGggdGhlIGRpcmVjdCBsaW5rOiNtZW1iZXJzW21lbWJlcnNdIGFuZCB0aGUKK2RpcmVjdGx5IGxpbms6I2luY2x1ZGVzW2luY2x1ZGVkIGdyb3Vwc10uCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkvZGV0YWlsIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAiaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm5hbWUiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC02YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAib3B0aW9ucyI6IHsKKyAgICB9LAorICAgICJkZXNjcmlwdGlvbiI6ICJHZXJyaXQgU2l0ZSBBZG1pbmlzdHJhdG9ycyIsCisgICAgImdyb3VwX2lkIjogMSwKKyAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAibWVtYmVycyI6IFsKKyAgICAgIHsKKyAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICB9LAorICAgICAgeworICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0KKyAgICBdLAorICAgICJpbmNsdWRlcyI6IFtdCisgIH0KKy0tLS0KKworW1tnZXQtZ3JvdXAtbmFtZV1dCitHZXQgR3JvdXAgTmFtZQorfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL25hbWUnCisKK1JldHJpZXZlcyB0aGUgbmFtZSBvZiBhIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy85OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwL25hbWUgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiTXlQcm9qZWN0LUNvbW1pdHRlcnMiCistLS0tCisKK1tbcmVuYW1lLWdyb3VwXV0KK1JlbmFtZSBHcm91cAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9uYW1lJworCitSZW5hbWVzIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgbmV3IGdyb3VwIG5hbWUgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5LgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9uYW1lIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJuYW1lIjogIk15LVByb2plY3QtQ29tbWl0dGVycyIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSB0aGUgbmV3IGdyb3VwIG5hbWUgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIk15LVByb2plY3QtQ29tbWl0dGVycyIKKy0tLS0KKworSWYgcmVuYW1pbmcgdGhlIGdyb3VwIGZhaWxzIGJlY2F1c2UgdGhlIG5ldyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlIHRoZQorcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIi4KKworW1tnZXQtZ3JvdXAtZGVzY3JpcHRpb25dXQorR2V0IEdyb3VwIERlc2NyaXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2Rlc2NyaXB0aW9uJworCitSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvZGVzY3JpcHRpb24gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiY29udGFpbnMgYWxsIGNvbW1pdHRlcnMgZm9yIE15UHJvamVjdCIKKy0tLS0KKworSWYgdGhlIGdyb3VwIGRvZXMgbm90IGhhdmUgYSBkZXNjcmlwdGlvbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKK1tbc2V0LWdyb3VwLWRlc2NyaXB0aW9uXV0KK1NldCBHcm91cCBEZXNjcmlwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9kZXNjcmlwdGlvbicKKworU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKK1RoZSBuZXcgZ3JvdXAgZGVzY3JpcHRpb24gbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5LgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2dyb3Vwcy85OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwL2Rlc2NyaXB0aW9uIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29tbWl0dGVycyBvZiBNeVByb2plY3QuIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgZ3JvdXAgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIlRoZSBjb21taXR0ZXJzIG9mIE15UHJvamVjdC4iCistLS0tCisKK0lmIHRoZSBkZXNjcmlwdGlvbiB3YXMgZGVsZXRlZCB0aGUgcmVzcG9uc2UgaXMgImAyMDQgTm8gQ29udGVudGAiLgorCitbW2RlbGV0ZS1ncm91cC1kZXNjcmlwdGlvbl1dCitEZWxldGUgR3JvdXAgRGVzY3JpcHRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZGVzY3JpcHRpb24nCisKK0RlbGV0ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2dyb3Vwcy85OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwL2Rlc2NyaXB0aW9uIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCitbW2dldC1ncm91cC1vcHRpb25zXV0KK0dldCBHcm91cCBPcHRpb25zCit+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vb3B0aW9ucycKKworUmV0cmlldmVzIHRoZSBvcHRpb25zIG9mIGEgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvb3B0aW9ucyBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2dyb3VwLW9wdGlvbnMtaW5mb1tHcm91cE9wdGlvbnNJbmZvXSBlbnRpdHkgaXMKK3JldHVybmVkIHRoYXQgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9mIHRoZSBncm91cC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZQorICB9CistLS0tCisKK1tbc2V0LWdyb3VwLW9wdGlvbnNdXQorU2V0IEdyb3VwIE9wdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9vcHRpb25zJworCitTZXRzIHRoZSBvcHRpb25zIG9mIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgbmV3IGdyb3VwIG9wdGlvbnMgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5IGFzIGEKK2xpbms6I2dyb3VwLW9wdGlvbnMtaW5wdXRbR3JvdXBPcHRpb25zSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9ncm91cHMvOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMC9vcHRpb25zIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJ2aXNpYmxlX3RvX2FsbCI6IHRydWUKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSB0aGUgbmV3IGdyb3VwIG9wdGlvbnMgYXJlIHJldHVybmVkIGFzIGEKK2xpbms6I2dyb3VwLW9wdGlvbnMtaW5mb1tHcm91cE9wdGlvbnNJbmZvXSBlbnRpdHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJ2aXNpYmxlX3RvX2FsbCI6IHRydWUKKyAgfQorLS0tLQorCitbW2dldC1ncm91cC1vd25lcl1dCitHZXQgR3JvdXAgT3duZXIKK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vb3duZXInCisKK1JldHJpZXZlcyB0aGUgb3duZXIgZ3JvdXAgb2YgYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvb3duZXIgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgb3duZXIgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAibmFtZSI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJvcHRpb25zIjogeworICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIkdlcnJpdCBTaXRlIEFkbWluaXN0cmF0b3JzIiwKKyAgICAiZ3JvdXBfaWQiOiAxLAorICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgIH0KKy0tLS0KKworW1tzZXQtZ3JvdXAtb3duZXJdXQorU2V0IEdyb3VwIE93bmVyCit+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL293bmVyJworCitTZXRzIHRoZSBvd25lciBncm91cCBvZiBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIG5ldyBvd25lciBncm91cCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuCisKK1RoZSBuZXcgb3duZXIgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lLCBieSBncm91cCBVVUlEIG9yIGJ5IHRoZSBsZWdhY3kKK251bWVyaWMgZ3JvdXAgSUQuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvZGVzY3JpcHRpb24gSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIm93bmVyIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgbmV3IG93bmVyIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAiaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm5hbWUiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC02YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAib3B0aW9ucyI6IHsKKyAgICB9LAorICAgICJkZXNjcmlwdGlvbiI6ICJHZXJyaXQgU2l0ZSBBZG1pbmlzdHJhdG9ycyIsCisgICAgImdyb3VwX2lkIjogMSwKKyAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICB9CistLS0tCisKK1tbZ3JvdXAtbWVtYmVyLWVuZHBvaW50c11dCitHcm91cCBNZW1iZXIgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbZ3JvdXAtbWVtYmVyc11dCitMaXN0IEdyb3VwIE1lbWJlcnMKK35+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vbWVtYmVycy8nCisKK0xpc3RzIHRoZSBkaXJlY3QgbWVtYmVycyBvZiBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBkZXRhaWxlZCBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvWworQWNjb3VudEluZm9dIGVudHJpZXMgaXMgcmV0dXJuZWQuIFRoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSBzb3J0ZWQgYnkKK2Z1bGwgbmFtZSwgcHJlZmVycmVkIGVtYWlsIGFuZCBpZC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNy9tZW1iZXJzLyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIF0KKy0tLS0KKworLkdldCBhbGwgbWVtYmVycyBvZiB0aGUgJ0FkbWluaXN0cmF0b3JzJyBncm91cCAobm9ybWFsbHkgZ3JvdXAgaWQgPSAxKQorKioqKgorZ2V0OjovZ3JvdXBzLzEvbWVtYmVycy8KKyoqKioKKworVG8gcmVzb2x2ZSB0aGUgaW5jbHVkZWQgZ3JvdXBzIG9mIGEgZ3JvdXAgcmVjdXJzaXZlbHkgYW5kIHRvIGxpc3QgYWxsCittZW1iZXJzIHRoZSBwYXJhbWV0ZXIgYHJlY3Vyc2l2ZWAgY2FuIGJlIHNldC4KKworTWVtYmVycyBmcm9tIGluY2x1ZGVkIGV4dGVybmFsIGdyb3VwcyBhbmQgZnJvbSBpbmNsdWRlZCBncm91cHMgd2hpY2gKK2FyZSBub3QgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyIGFyZSBpZ25vcmVkLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy84MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3L21lbWJlcnMvP3JlY3Vyc2l2ZSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9LAorICAgIHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTgsCisgICAgICAibmFtZSI6ICJSaWNoYXJkIFJvZSIsCisgICAgICAiZW1haWwiOiAicmljaGFyZC5yb2VAZXhhbXBsZS5jb20iCisgICAgfQorICBdCistLS0tCisKK1tbZ2V0LWdyb3VwLW1lbWJlcl1dCitHZXQgR3JvdXAgTWVtYmVyCit+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzL2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XScKKworUmV0cmlldmVzIGEgZ3JvdXAgbWVtYmVyLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy84MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3L21lbWJlcnMvMTAwMDA5NiBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGRldGFpbGVkIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bCitBY2NvdW50SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQgZGVzY3JpYmVzIHRoZSBncm91cCBtZW1iZXIuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgfQorLS0tLQorCitbW2FkZC1ncm91cC1tZW1iZXJdXQorQWRkIEdyb3VwIE1lbWJlcgorfn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vbWVtYmVycy9saW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0nCisKK0FkZHMgYSB1c2VyIGFzIG1lbWJlciB0byBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9ncm91cHMvTXlQcm9qZWN0LUNvbW1pdHRlcnMvbWVtYmVycy9Kb2huJTIwRG9lIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgZGV0YWlsZWQgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1sKK0FjY291bnRJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdCBkZXNjcmliZXMgdGhlIGdyb3VwIG1lbWJlci4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMSBDcmVhdGVkCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiX2FjY291bnRfaWQiOiAxMDAwMDM3LAorICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgIH0KKy0tLS0KKworVGhlIHJlcXVlc3QgYWxzbyBzdWNjZWVkcyBpZiB0aGUgdXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyIG9mIHRoaXMKK2dyb3VwLCBidXQgdGhlbiB0aGUgSFRUUCByZXNwb25zZSBjb2RlIGlzIGAyMDAgT0tgLgorCitBZGQgR3JvdXAgTWVtYmVycworfn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzJworCitPUgorCitbdmVyc2VdCisnUE9TVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vbWVtYmVycy5hZGQnCisKK0FkZHMgb25lIG9yIHNldmVyYWwgdXNlcnMgdG8gYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKK1RoZSB1c2VycyB0byBiZSBhZGRlZCB0byB0aGUgZ3JvdXAgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5CithcyBhIGxpbms6I21lbWJlcnMtaW5wdXRbTWVtYmVyc0lucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9tZW1iZXJzLmFkZCBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAibWVtYmVycyI6IHsKKyAgICAgICJqYW5lLnJvZUBleGFtcGxlLmNvbSIsCisgICAgICAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgfQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGlzdCBvZiBkZXRhaWxlZCBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvWworQWNjb3VudEluZm9dIGVudGl0aWVzIGlzIHJldHVybmVkIHRoYXQgZGVzY3JpYmVzIHRoZSBncm91cCBtZW1iZXJzIHRoYXQKK3dlcmUgc3BlY2lmaWVkIGluIHRoZSBsaW5rOiNtZW1iZXJzLWlucHV0W01lbWJlcnNJbnB1dF0uIEFuCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkKK2lzIHJldHVybmVkIGZvciBlYWNoIHVzZXIgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCwgaW5kZXBlbmRlbnRseSBvZgord2hldGhlciB0aGUgdXNlciB3YXMgbmV3bHkgYWRkZWQgdG8gdGhlIGdyb3VwIG9yIHdoZXRoZXIgdGhlIHVzZXIgd2FzCithbHJlYWR5IGEgbWVtYmVyIG9mIHRoZSBncm91cC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA1NywKKyAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICB9LAorICAgIHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwMzcsCisgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgfQorICBdCistLS0tCisKK1tbZGVsZXRlLWdyb3VwLW1lbWJlcl1dCitEZWxldGUgR3JvdXAgTWVtYmVyCit+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnREVMRVRFIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzL2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XScKKworRGVsZXRlcyBhIHVzZXIgZnJvbSBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9ncm91cHMvTXlQcm9qZWN0LUNvbW1pdHRlcnMvbWVtYmVycy9Kb2huJTIwRG9lIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCitbW2RlbGV0ZS1ncm91cC1tZW1iZXJzXV0KK0RlbGV0ZSBHcm91cCBNZW1iZXJzCit+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL21lbWJlcnMuZGVsZXRlJworCitEZWxldGUgb25lIG9yIHNldmVyYWwgdXNlcnMgZnJvbSBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIHVzZXJzIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZ3JvdXAgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdAorYm9keSBhcyBhIGxpbms6I21lbWJlcnMtaW5wdXRbTWVtYmVyc0lucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9tZW1iZXJzLmRlbGV0ZSBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAibWVtYmVycyI6IHsKKyAgICAgICJqYW5lLnJvZUBleGFtcGxlLmNvbSIsCisgICAgICAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgfQorICB9CistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCitbW2dyb3VwLWluY2x1ZGUtZW5kcG9pbnRzXV0KK0dyb3VwIEluY2x1ZGUgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2luY2x1ZGVkLWdyb3Vwc11dCitMaXN0IEluY2x1ZGVkIEdyb3Vwcworfn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3Vwcy8nCisKK0xpc3RzIHRoZSBkaXJlY3RseSBpbmNsdWRlZCBncm91cHMgb2YgYSBncm91cC4KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50cmllcyBpcyByZXR1cm5lZC4KK1RoZSBlbnRyaWVzIGluIHRoZSBsaXN0IGFyZSBzb3J0ZWQgYnkgZ3JvdXAgbmFtZSBhbmQgVVVJRC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNy9ncm91cHMvIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjdjYTA0MmY0ZDU4NDc5MzZmY2I5MGNhOTEwNTc2NzMxNTdmZDA2ZmMiLAorICAgICAgIm5hbWUiOiAiTXlQcm9qZWN0LVZlcmlmaWVycyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgIH0sCisgICAgICAiZ3JvdXBfaWQiOiAzOCwKKyAgICAgICJvd25lciI6ICJNeVByb2plY3QtVmVyaWZpZXJzIiwKKyAgICAgICJvd25lcl9pZCI6ICI3Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIgorICAgIH0KKyAgXQorLS0tLQorCitbW2dldC1pbmNsdWRlZC1ncm91cF1dCitHZXQgSW5jbHVkZWQgR3JvdXAKK35+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0nCisKK1JldHJpZXZlcyBhbiBpbmNsdWRlZCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvODM0ZWMzNmRkNWUwZWQyMWEyZmY1ZDdlMjI1NWRhMDgyZDYzYmJkNy9ncm91cHMvN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBpbmNsdWRlZCBncm91cC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgImlkIjogIjdjYTA0MmY0ZDU4NDc5MzZmY2I5MGNhOTEwNTc2NzMxNTdmZDA2ZmMiLAorICAgICJuYW1lIjogIk15UHJvamVjdC1WZXJpZmllcnMiLAorICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC03Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIiwKKyAgICAib3B0aW9ucyI6IHsKKyAgICB9LAorICAgICJncm91cF9pZCI6IDM4LAorICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgIH0KKy0tLS0KKworW1tpbmNsdWRlLWdyb3VwXV0KK0luY2x1ZGUgR3JvdXAKK35+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dJworCitJbmNsdWRlcyBhIGdyb3VwIGludG8gYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL2dyb3Vwcy9NeUdyb3VwIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGluY2x1ZGVkIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAxIENyZWF0ZWQKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAibmFtZSI6ICJNeUdyb3VwIiwKKyAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm9wdGlvbnMiOiB7CisgICAgfSwKKyAgICAiZ3JvdXBfaWQiOiA4LAorICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgIH0KKy0tLS0KKworVGhlIHJlcXVlc3QgYWxzbyBzdWNjZWVkcyBpZiB0aGUgZ3JvdXAgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGlzCitncm91cCwgYnV0IHRoZW4gdGhlIEhUVFAgcmVzcG9uc2UgY29kZSBpcyBgMjAwIE9LYC4KKworW1tpbmNsdWRlLWdyb3Vwc11dCitJbmNsdWRlIEdyb3Vwcworfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9ncm91cHMnCisKK09SCisKK1t2ZXJzZV0KKydQT1NUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9ncm91cHMuYWRkJworCitJbmNsdWRlcyBvbmUgb3Igc2V2ZXJhbCBncm91cHMgaW50byBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIGdyb3VwcyB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBncm91cCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZQorcmVxdWVzdCBib2R5IGFzIGEgbGluazojZ3JvdXBzLWlucHV0W0dyb3Vwc0lucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9ncm91cHMuYWRkIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJncm91cHMiOiB7CisgICAgICAiTXlHcm91cCIsCisgICAgICAiTXlPdGhlckdyb3VwIgorICAgIH0KKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpc3Qgb2YgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0aWVzIGlzCityZXR1cm5lZCB0aGF0IGRlc2NyaWJlcyB0aGUgZ3JvdXBzIHRoYXQgd2VyZSBzcGVjaWZpZWQgaW4gdGhlCitsaW5rOiNncm91cHMtaW5wdXRbR3JvdXBzSW5wdXRdLiBBIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkKK2lzIHJldHVybmVkIGZvciBlYWNoIGdyb3VwIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQsIGluZGVwZW5kZW50bHkgb2YKK3doZXRoZXIgdGhlIGdyb3VwIHdhcyBuZXdseSBpbmNsdWRlZCBpbnRvIHRoZSBncm91cCBvciB3aGV0aGVyIHRoZQorZ3JvdXAgd2FzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAgICJuYW1lIjogIk15R3JvdXAiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImdyb3VwX2lkIjogOCwKKyAgICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgICB9LAorICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjUwNTdmM2NiZDM1MTlkNmFiNjkzNjQ0MjlhODlmZmRmZmJhNTBmNzMiLAorICAgICAgIm5hbWUiOiAiTXlPdGhlckdyb3VwIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC01MDU3ZjNjYmQzNTE5ZDZhYjY5MzY0NDI5YTg5ZmZkZmZiYTUwZjczIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJncm91cF9pZCI6IDEwLAorICAgICAgIm93bmVyIjogIk15T3RoZXJHcm91cCIsCisgICAgICAib3duZXJfaWQiOiAiNTA1N2YzY2JkMzUxOWQ2YWI2OTM2NDQyOWE4OWZmZGZmYmE1MGY3MyIKKyAgICB9CisgIF0KKy0tLS0KKworW1tkZWxldGUtaW5jbHVkZWQtZ3JvdXBdXQorRGVsZXRlIEluY2x1ZGVkIEdyb3VwCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dJworCitEZWxldGVzIGFuIGluY2x1ZGVkIGdyb3VwIGZyb20gYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIERFTEVURSAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL2dyb3Vwcy9NeUdyb3VwIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCitbW2RlbGV0ZS1pbmNsdWRlZC1ncm91cHNdXQorRGVsZXRlIEluY2x1ZGVkIEdyb3Vwcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3Vwcy5kZWxldGUnCisKK0RlbGV0ZSBvbmUgb3Igc2V2ZXJhbCBpbmNsdWRlZCBncm91cHMgZnJvbSBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIGdyb3VwcyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGdyb3VwIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QKK2JvZHkgYXMgYSBsaW5rOiNncm91cHMtaW5wdXRbR3JvdXBzSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL2dyb3Vwcy5kZWxldGUgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIm1lbWJlcnMiOiB7CisgICAgICAiTXlHcm91cCIsCisgICAgICAiTXlPdGhlckdyb3VwIgorICAgIH0KKyAgfQorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworCitbW2lkc11dCitJRHMKKy0tLQorCitbW2FjY291bnQtaWRdXQorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy0tCistLQorCitbW2dyb3VwLWlkXV0KK1x7Z3JvdXAtaWRcfQorfn5+fn5+fn5+fn5+CitJZGVudGlmaWVyIGZvciBhIGdyb3VwLgorCitUaGlzIGNhbiBiZToKKworKiB0aGUgVVVJRCBvZiB0aGUgZ3JvdXAKKyogdGhlIGxlZ2FjeSBudW1lcmljIElEIG9mIHRoZSBncm91cAorKiB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAgaWYgaXQgaXMgdW5pcXVlCisKK1tbZ3JvdXAtbmFtZV1dCitce2dyb3VwLW5hbWVcfQorfn5+fn5+fn5+fn5+fn4KK0dyb3VwIG5hbWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIG9uZSBncm91cC4KKworCitbW2pzb24tZW50aXRpZXNdXQorSlNPTiBFbnRpdGllcworLS0tLS0tLS0tLS0tLQorCitbW2dyb3VwLWluZm9dXQorR3JvdXBJbmZvCit+fn5+fn5+fn4KK1RoZSBgR3JvdXBJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBncm91cC4gVGhpcyBjYW4gYmUKK2EgR2Vycml0IGludGVybmFsIGdyb3VwLCBvciBhbiBleHRlcm5hbCBncm91cCB0aGF0IGlzIGtub3duIHRvIEdlcnJpdC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgIHx8YGdlcnJpdGNvZGVyZXZpZXcjZ3JvdXBgCit8YGlkYCAgICAgICAgICB8fFRoZSBVUkwgZW5jb2RlZCBVVUlEIG9mIHRoZSBncm91cC4KK3xgbmFtZWAgICAgICAgIHwKK25vdCBzZXQgaWYgcmV0dXJuZWQgaW4gYSBtYXAgd2hlcmUgdGhlIGdyb3VwIG5hbWUgaXMgdXNlZCBhcyBtYXAga2V5fAorVGhlIG5hbWUgb2YgdGhlIGdyb3VwLgorfGB1cmxgICAgICAgICAgfG9wdGlvbmFsfAorVVJMIHRvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBncm91cC4gVHlwaWNhbGx5IGEgVVJMIHRvIGEgd2ViIHBhZ2UgdGhhdAorcGVybWl0cyB1c2VycyB0byBhcHBseSB0byBqb2luIHRoZSBncm91cCwgb3IgbWFuYWdlIHRoZWlyIG1lbWJlcnNoaXAuCit8YG9wdGlvbnNgICAgICB8fGxpbms6I2dyb3VwLW9wdGlvbnMtaW5mb1tPcHRpb25zIG9mIHRoZSBncm91cF0KK3xgZGVzY3JpcHRpb25gIHxvbmx5IGZvciBpbnRlcm5hbCBncm91cHN8VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cC4KK3xgZ3JvdXBfaWRgICAgIHxvbmx5IGZvciBpbnRlcm5hbCBncm91cHN8VGhlIG51bWVyaWMgSUQgb2YgdGhlIGdyb3VwLgorfGBvd25lcmAgICAgICAgfG9ubHkgZm9yIGludGVybmFsIGdyb3Vwc3xUaGUgbmFtZSBvZiB0aGUgb3duZXIgZ3JvdXAuCit8YG93bmVyX2lkYCAgICB8b25seSBmb3IgaW50ZXJuYWwgZ3JvdXBzfFRoZSBVUkwgZW5jb2RlZCBVVUlEIG9mIHRoZSBvd25lciBncm91cC4KK3xgbWVtYmVyc2AgICAgIHxvcHRpb25hbCwgb25seSBmb3IgaW50ZXJuYWwgZ3JvdXBzfAorQSBsaXN0IG9mIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bQWNjb3VudEluZm9dCitlbnRpdGllcyBkZXNjcmliaW5nIHRoZSBkaXJlY3QgbWVtYmVycy4gKworT25seSBzZXQgaWYgbGluazojbWVtYmVyc1ttZW1iZXJzXSBhcmUgcmVxdWVzdGVkLgorfGBpbmNsdWRlc2AgICAgfG9wdGlvbmFsLCBvbmx5IGZvciBpbnRlcm5hbCBncm91cHN8CitBIGxpc3Qgb2YgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0aWVzIGRlc2NyaWJpbmcgdGhlIGRpcmVjdGx5CitpbmNsdWRlZCBncm91cHMuICsKK09ubHkgc2V0IGlmIGxpbms6I2luY2x1ZGVzW2luY2x1ZGVkIGdyb3Vwc10gYXJlIHJlcXVlc3RlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHR5cGUgb2YgYSBncm91cCBjYW4gYmUgZGVkdWNlZCBmcm9tIHRoZSBncm91cCdzIFVVSUQ6Citbd2lkdGg9IjUwJSJdCit8PT09PT09PT09PT09Cit8VVVJRCBtYXRjaGVzICJeWzAtOWEtZl1cezQwXH0kInxHZXJyaXQgaW50ZXJuYWwgZ3JvdXAKK3xVVUlEIHN0YXJ0cyB3aXRoICJnbG9iYWw6InxHZXJyaXQgc3lzdGVtIGdyb3VwCit8VVVJRCBzdGFydHMgd2l0aCAibGRhcDoifExEQVAgZ3JvdXAKK3xVVUlEIHN0YXJ0cyB3aXRoICI8cHJlZml4PjoifG90aGVyIGV4dGVybmFsIGdyb3VwCit8PT09PT09PT09PT09CisKK1tbZ3JvdXAtaW5wdXRdXQorR3JvdXBJbnB1dAorfn5+fn5+fn5+fgorVGhlICdHcm91cElucHV0JyBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHRoZSBjcmVhdGlvbiBvZgorYSBuZXcgaW50ZXJuYWwgZ3JvdXAuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgbmFtZWAgICAgICAgICAgfG9wdGlvbmFsfFRoZSBuYW1lIG9mIHRoZSBncm91cCAobm90IGVuY29kZWQpLiArCitJZiBzZXQsIG11c3QgbWF0Y2ggdGhlIGdyb3VwIG5hbWUgaW4gdGhlIFVSTC4KK3xgZGVzY3JpcHRpb25gICAgfG9wdGlvbmFsfFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZ3JvdXAuCit8YHZpc2libGVfdG9fYWxsYHxvcHRpb25hbHwKK1doZXRoZXIgdGhlIGdyb3VwIGlzIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMuICsKK2BmYWxzZWAgaWYgbm90IHNldC4KK3xgb3duZXJfaWRgfG9wdGlvbmFsfFRoZSBVUkwgZW5jb2RlZCBJRCBvZiB0aGUgb3duZXIgZ3JvdXAuICsKK1RoaXMgY2FuIGJlIGEgZ3JvdXAgVVVJRCwgYSBsZWdhY3kgbnVtZXJpYyBncm91cCBJRCBvciBhIHVuaXF1ZSBncm91cAorbmFtZS4gKworSWYgbm90IHNldCwgdGhlIG5ldyBncm91cCB3aWxsIGJlIHNlbGYtb3duZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZ3JvdXBzLWlucHV0XV0KK0dyb3Vwc0lucHV0Cit+fn5+fn5+fn5+fgorVGhlIGBHcm91cHNJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGdyb3VwcyB0aGF0IHNob3VsZAorYmUgaW5jbHVkZWQgaW50byBhIGdyb3VwIG9yIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbSBhIGdyb3VwLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgIHx8RGVzY3JpcHRpb24KK3xgX29uZV9ncm91cGAgfG9wdGlvbmFsfAorVGhlIGxpbms6I2dyb3VwLWlkW2lkXSBvZiBvbmUgZ3JvdXAgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgb3IgZGVsZXRlZC4KK3xgZ3JvdXBzYCAgICAgfG9wdGlvbmFsfAorQSBsaXN0IG9mIGxpbms6I2dyb3VwLWlkW2dyb3VwIGlkc10gdGhhdCBpZGVudGlmeSB0aGUgZ3JvdXBzIHRoYXQKK3Nob3VsZCBiZSBpbmNsdWRlZCBvciBkZWxldGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZ3JvdXAtb3B0aW9ucy1pbmZvXV0KK0dyb3VwT3B0aW9uc0luZm8KK35+fn5+fn5+fn5+fn5+fn4KK09wdGlvbnMgb2YgdGhlIGdyb3VwLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgdmlzaWJsZV90b19hbGxgfG5vdCBzZXQgaWYgYGZhbHNlYHwKK1doZXRoZXIgdGhlIGdyb3VwIGlzIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tncm91cC1vcHRpb25zLWlucHV0XV0KK0dyb3VwT3B0aW9uc0lucHV0Cit+fn5+fn5+fn5+fn5+fn5+fgorTmV3IG9wdGlvbnMgZm9yIGEgZ3JvdXAuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGB2aXNpYmxlX3RvX2FsbGB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgcmVnaXN0ZXJlZCB1c2Vycy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW21lbWJlcnMtaW5wdXRdXQorTWVtYmVyc0lucHV0Cit+fn5+fn5+fn5+fgorVGhlIGBNZW1iZXJzSW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhY2NvdW50cyB0aGF0IHNob3VsZAorYmUgYWRkZWQgYXMgbWVtYmVycyB0byBhIGdyb3VwIG9yIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZ3JvdXAuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgfHxEZXNjcmlwdGlvbgorfGBfb25lX21lbWJlcmB8b3B0aW9uYWx8CitUaGUgbGluazojYWNjb3VudC1pZFtpZF0gb2Ygb25lIGFjY291bnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgb3IKK2RlbGV0ZWQuCit8YG1lbWJlcnNgICAgIHxvcHRpb25hbHwKK0EgbGlzdCBvZiBsaW5rOiNhY2NvdW50LWlkW2FjY291bnQgaWRzXSB0aGF0IGlkZW50aWZ5IHRoZSBhY2NvdW50cyB0aGF0CitzaG91bGQgYmUgYWRkZWQgb3IgZGVsZXRlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLXByb2plY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktcHJvamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYmEwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLXByb2plY3RzLnR4dApAQCAtMCwwICsxLDkwMiBAQAorR2Vycml0IENvZGUgUmV2aWV3IC0gL3Byb2plY3RzLyBSRVNUIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHBhZ2UgZGVzY3JpYmVzIHRoZSBwcm9qZWN0IHJlbGF0ZWQgUkVTVCBlbmRwb2ludHMuCitQbGVhc2UgYWxzbyB0YWtlIG5vdGUgb2YgdGhlIGdlbmVyYWwgaW5mb3JtYXRpb24gb24gdGhlCitsaW5rOnJlc3QtYXBpLmh0bWxbUkVTVCBBUEldLgorCitFbmRwb2ludHMKKy0tLS0tLS0tLQorCitbW3Byb2plY3QtZW5kcG9pbnRzXV0KK1Byb2plY3QgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLQorCitbW2xpc3QtcHJvamVjdHNdXQorTGlzdCBQcm9qZWN0cworfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvJworCitMaXN0cyB0aGUgcHJvamVjdHMgYWNjZXNzaWJsZSBieSB0aGUgY2FsbGVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzCit1c2luZyB0aGUgbGluazpjbWQtbHMtcHJvamVjdHMuaHRtbFtscy1wcm9qZWN0c10gY29tbWFuZCBvdmVyIFNTSCwKK2FuZCBhY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgcXVlcnkgcGFyYW1ldGVycy4KKworQXMgcmVzdWx0IGEgbWFwIGlzIHJldHVybmVkIHRoYXQgbWFwcyB0aGUgcHJvamVjdCBuYW1lcyB0bworbGluazojcHJvamVjdC1pbmZvW1Byb2plY3RJbmZvXSBlbnRyaWVzLiBUaGUgZW50cmllcyBpbiB0aGUgbWFwIGFyZSBzb3J0ZWQKK2J5IHByb2plY3QgbmFtZS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy8/ZCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAiZXh0ZXJuYWwvYmlzb24iOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICAgImlkIjogImV4dGVybmFsJTJGYmlzb24iLAorICAgICAgImRlc2NyaXB0aW9uIjogIkdOVSBwYXJzZXIgZ2VuZXJhdG9yIgorICAgIH0sCisgICAgImV4dGVybmFsL2djYyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgICAiaWQiOiAiZXh0ZXJuYWwlMkZnY2MiLAorICAgIH0sCisgICAgImV4dGVybmFsL29wZW5zc2wiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICAgImlkIjogImV4dGVybmFsJTJGb3BlbnNzbCIsCisgICAgICAiZGVzY3JpcHRpb24iOiAiZW5jcnlwdGlvblxuY3J5cHRvIHJvdXRpbmVzIgorICAgIH0sCisgICAgInRlc3QiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICAgImlkIjogInRlc3QiLAorICAgICAgImRlc2NyaXB0aW9uIjogIlx1MDAzY2h0bWxcdTAwM2UgaXMgZXNjYXBlZCIKKyAgICB9CisgIH0KKy0tLS0KKworLkdldCBhbGwgcHJvamVjdHMgd2l0aCB0aGVpciBkZXNjcmlwdGlvbgorKioqKgorZ2V0OjovcHJvamVjdHMvP2QKKyoqKioKKworW1tzdWdnZXN0LXByb2plY3RzXV0KK1RoZSBgL3Byb2plY3RzL2AgVVJMIGFsc28gYWNjZXB0cyBhIHByZWZpeCBzdHJpbmcgaW4gdGhlIGBwYCBwYXJhbWV0ZXIuCitUaGlzIGxpbWl0cyB0aGUgcmVzdWx0cyB0byB0aG9zZSBwcm9qZWN0cyB0aGF0IHN0YXJ0IHdpdGggdGhlIHNwZWNpZmllZAorcHJlZml4LgorTGlzdCBhbGwgcHJvamVjdHMgdGhhdCBzdGFydCB3aXRoIGBwbGF0Zm9ybS9gOgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzLz9wPXBsYXRmb3JtJTJGIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJwbGF0Zm9ybS9kcml2ZXJzIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0IiwKKyAgICAgICJpZCI6ICJwbGF0Zm9ybSUyRmRyaXZlcnMiLAorICAgIH0sCisgICAgInBsYXRmb3JtL3Rvb2xzIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0IiwKKyAgICAgICJpZCI6ICJwbGF0Zm9ybSUyRnRvb2xzIiwKKyAgICB9CisgIH0KKy0tLS0KK0UuZy4gdGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGJ5IHN1Z2dlc3Rpb24gY2xpZW50IFVJJ3MgdG8gbGltaXQgcmVzdWx0cy4KKworW1tnZXQtcHJvamVjdF1dCitHZXQgUHJvamVjdAorfn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XScKKworUmV0cmlldmVzIGEgcHJvamVjdC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24gSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNwcm9qZWN0LWluZm9bUHJvamVjdEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIHByb2plY3QuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgImlkIjogInBsdWdpbnMlMkZyZXBsaWNhdGlvbiIsCisgICAgIm5hbWUiOiAicGx1Z2lucy9yZXBsaWNhdGlvbiIsCisgICAgInBhcmVudCI6ICJQdWJsaWMtUGx1Z2lucyIsCisgICAgImRlc2NyaXB0aW9uIjogIkNvcGllcyB0byBvdGhlciBzZXJ2ZXJzIHVzaW5nIHRoZSBHaXQgcHJvdG9jb2wiCisgIH0KKy0tLS0KKworW1tjcmVhdGUtcHJvamVjdF1dCitDcmVhdGUgUHJvamVjdAorfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XScKKworQ3JlYXRlcyBhIG5ldyBwcm9qZWN0LgorCitJbiB0aGUgcmVxdWVzdCBib2R5IGFkZGl0aW9uYWwgZGF0YSBmb3IgdGhlIHByb2plY3QgY2FuIGJlIHByb3ZpZGVkIGFzCitsaW5rOiNwcm9qZWN0LWlucHV0W1Byb2plY3RJbnB1dF0uCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvcHJvamVjdHMvTXlQcm9qZWN0IEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGEgZGVtbyBwcm9qZWN0LiIsCisgICAgInN1Ym1pdF90eXBlIjogIkNIRVJSWV9QSUNLIiwKKyAgICAib3duZXJzIjogWworICAgICAgIk15UHJvamVjdC1Pd25lcnMiCisgICAgXQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBsaW5rOiNwcm9qZWN0LWluZm9bUHJvamVjdEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGNyZWF0ZWQgcHJvamVjdC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMSBDcmVhdGVkCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICJpZCI6ICJNeVByb2plY3QiLAorICAgICJuYW1lIjogIk15UHJvamVjdCIsCisgICAgInBhcmVudCI6ICJBbGwtUHJvamVjdHMiLAorICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGEgZGVtbyBwcm9qZWN0LiIKKyAgfQorLS0tLQorCitbW2dldC1wcm9qZWN0LWRlc2NyaXB0aW9uXV0KK0dldCBQcm9qZWN0IERlc2NyaXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rlc2NyaXB0aW9uJworCitSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vZGVzY3JpcHRpb24gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiQ29waWVzIHRvIG90aGVyIHNlcnZlcnMgdXNpbmcgdGhlIEdpdCBwcm90b2NvbCIKKy0tLS0KKworSWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhIGRlc2NyaXB0aW9uIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworW1tzZXQtcHJvamVjdC1kZXNjcmlwdGlvbl1dCitTZXQgUHJvamVjdCBEZXNjcmlwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9kZXNjcmlwdGlvbicKKworU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0LgorCitUaGUgbmV3IHByb2plY3QgZGVzY3JpcHRpb24gbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5IGluc2lkZQorYSBsaW5rOiNwcm9qZWN0LWRlc2NyaXB0aW9uLWlucHV0W1Byb2plY3REZXNjcmlwdGlvbklucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvcHJvamVjdHMvcGx1Z2lucyUyRnJlcGxpY2F0aW9uL2Rlc2NyaXB0aW9uIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJQbHVnaW4gZm9yIEdlcnJpdCB0aGF0IGhhbmRsZXMgdGhlIHJlcGxpY2F0aW9uLiIsCisgICAgImNvbW1pdF9tZXNzYWdlIjogIlVwZGF0ZSB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSB0aGUgbmV3IHByb2plY3QgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIlBsdWdpbiBmb3IgR2Vycml0IHRoYXQgaGFuZGxlcyB0aGUgcmVwbGljYXRpb24uIgorLS0tLQorCitJZiB0aGUgZGVzY3JpcHRpb24gd2FzIGRlbGV0ZWQgdGhlIHJlc3BvbnNlIGlzICJgMjA0IE5vIENvbnRlbnRgIi4KKworW1tkZWxldGUtcHJvamVjdC1kZXNjcmlwdGlvbl1dCitEZWxldGUgUHJvamVjdCBEZXNjcmlwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9kZXNjcmlwdGlvbicKKworRGVsZXRlcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0LgorCitUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhCitsaW5rOiNwcm9qZWN0LWRlc2NyaXB0aW9uLWlucHV0W1Byb2plY3REZXNjcmlwdGlvbklucHV0XSBlbnRpdHkgaWYgbm8KK2NvbW1pdCBtZXNzYWdlIGlzIHNwZWNpZmllZC4KKworUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb3hpZXMgcHJvaGliaXQgcmVxdWVzdCBib2RpZXMgZm9yIERFTEVURQorcmVxdWVzdHMuIEluIHRoaXMgY2FzZSwgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGNvbW1pdCBtZXNzYWdlLCB1c2UKK2xpbms6I3NldC1wcm9qZWN0LWRlc2NyaXB0aW9uW1BVVF0gdG8gZGVsZXRlIHRoZSBkZXNjcmlwdGlvbi4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vZGVzY3JpcHRpb24gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbZ2V0LXByb2plY3QtcGFyZW50XV0KK0dldCBQcm9qZWN0IFBhcmVudAorfn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vcGFyZW50JworCitSZXRyaWV2ZXMgdGhlIG5hbWUgb2YgYSBwcm9qZWN0J3MgcGFyZW50IHByb2plY3QuIEZvciB0aGUKK2BBbGwtUHJvamVjdHNgIHJvb3QgcHJvamVjdCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvcGx1Z2lucyUyRnJlcGxpY2F0aW9uL3BhcmVudCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJBbGwtUHJvamVjdHMiCistLS0tCisKK1tbc2V0LXByb2plY3QtcGFyZW50XV0KK1NldCBQcm9qZWN0IFBhcmVudAorfn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vcGFyZW50JworCitTZXRzIHRoZSBwYXJlbnQgcHJvamVjdCBmb3IgYSBwcm9qZWN0LgorCitUaGUgbmV3IG5hbWUgb2YgdGhlIHBhcmVudCBwcm9qZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYm9keQoraW5zaWRlIGEgbGluazojcHJvamVjdC1wYXJlbnQtaW5wdXRbUHJvamVjdFBhcmVudElucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvcHJvamVjdHMvcGx1Z2lucyUyRnJlcGxpY2F0aW9uL3BhcmVudCBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicGFyZW50IjogIlB1YmxpYy1QbHVnaW5zIiwKKyAgICAiY29tbWl0X21lc3NhZ2UiOiAiVXBkYXRlIHRoZSBwcm9qZWN0IHBhcmVudCIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSB0aGUgbmV3IHBhcmVudCBwcm9qZWN0IG5hbWUgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIlB1YmxpYy1QbHVnaW5zIgorLS0tLQorCitbW2dldC1oZWFkXV0KK0dldCBIRUFECit+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL0hFQUQnCisKK1JldHJpZXZlcyBmb3IgYSBwcm9qZWN0IHRoZSBuYW1lIG9mIHRoZSBicmFuY2ggdG8gd2hpY2ggYEhFQURgIHBvaW50cy4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vSEVBRCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJyZWZzL2hlYWRzL21hc3RlciIKKy0tLS0KKworW1tzZXQtaGVhZF1dCitTZXQgSEVBRAorfn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9IRUFEJworCitTZXRzIGBIRUFEYCBmb3IgYSBwcm9qZWN0LgorCitUaGUgbmV3IHJlZiB0byB3aGljaCBgSEVBRGAgc2hvdWxkIHBvaW50IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlCityZXF1ZXN0IGJvZHkgaW5zaWRlIGEgbGluazojaGVhZC1pbnB1dFtIZWFkSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vSEVBRCBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAicmVmIjogInJlZnMvaGVhZHMvc3RhYmxlIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgcmVmIHRvIHdoaWNoIGBIRUFEYCBwb2ludHMgaXMgcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgInJlZnMvaGVhZHMvc3RhYmxlIgorLS0tLQorCitbW2dldC1yZXBvc2l0b3J5LXN0YXRpc3RpY3NdXQorR2V0IFJlcG9zaXRvcnkgU3RhdGlzdGljcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL3N0YXRpc3RpY3MuZ2l0JworCitSZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIHJlcG9zaXRvcnkgb2YgYSBwcm9qZWN0LgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9zdGF0aXN0aWNzLmdpdCBIVFRQLzEuMAorLS0tLQorCitUaGUgcmVwb3NpdG9yeSBzdGF0aXN0aWNzIGFyZSByZXR1cm5lZCBhcyBhCitsaW5rOiNyZXBvc2l0b3J5LXN0YXRpc3RpY3MtaW5mb1tSZXBvc2l0b3J5U3RhdGlzdGljc0luZm9dIGVudGl0eS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgIm51bWJlcl9vZl9sb29zZV9vYmplY3RzIjogMTI3LAorICAgICJudW1iZXJfb2ZfbG9vc2VfcmVmcyI6IDE1LAorICAgICJudW1iZXJfb2ZfcGFja19maWxlcyI6IDE1LAorICAgICJudW1iZXJfb2ZfcGFja2VkX29iamVjdHMiOiA2NywKKyAgICAibnVtYmVyX29mX3BhY2tlZF9yZWZzIjogMCwKKyAgICAic2l6ZV9vZl9sb29zZV9vYmplY3RzIjogMjk0NjYsCisgICAgInNpemVfb2ZfcGFja2VkX29iamVjdHMiOiA5NjQ2CisgIH0KKy0tLS0KKworW1tydW4tZ2NdXQorUnVuIEdDCit+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vZ2MnCisKK1J1biB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgdGhlIHJlcG9zaXRvcnkgb2YgYSBwcm9qZWN0LgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vZ2MgSFRUUC8xLjAKKy0tLS0KKworVGhlIHJlc3BvbnNlIGlzIHRoZSBzdHJlYW1lZCBvdXRwdXQgb2YgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbi4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgY29sbGVjdGluZyBnYXJiYWdlIGZvciAicGx1Z2lucy9yZXBsaWNhdGlvbiI6CisgIFBhY2sgcmVmczogICAgICAgICAgICAgIDEwMCUgKDIxLzIxKQorICBDb3VudGluZyBvYmplY3RzOiAgICAgICAyMAorICBGaW5kaW5nIHNvdXJjZXM6ICAgICAgICAxMDAlICgyMC8yMCkKKyAgR2V0dGluZyBzaXplczogICAgICAgICAgMTAwJSAoMTMvMTMpCisgIENvbXByZXNzaW5nIG9iamVjdHM6ICAgICA4MyUgKDUvNikKKyAgV3JpdGluZyBvYmplY3RzOiAgICAgICAgMTAwJSAoMjAvMjApCisgIFNlbGVjdGluZyBjb21taXRzOiAgICAgIDEwMCUgKDcvNykKKyAgQnVpbGRpbmcgYml0bWFwczogICAgICAgMTAwJSAoNy83KQorICBGaW5kaW5nIHNvdXJjZXM6ICAgICAgICAxMDAlICg0MS80MSkKKyAgR2V0dGluZyBzaXplczogICAgICAgICAgMTAwJSAoMjUvMjUpCisgIENvbXByZXNzaW5nIG9iamVjdHM6ICAgICA1MiUgKDEyLzIzKQorICBXcml0aW5nIG9iamVjdHM6ICAgICAgICAxMDAlICg0MS80MSkKKyAgUHJ1bmUgbG9vc2Ugb2JqZWN0cyBhbHNvIGZvdW5kIGluIHBhY2sgZmlsZXM6IDEwMCUgKDM2LzM2KQorICBQcnVuZSBsb29zZSwgdW5yZWZlcmVuY2VkIG9iamVjdHM6IDEwMCUgKDM2LzM2KQorICBkb25lLgorLS0tLQorCitbW2Rhc2hib2FyZC1lbmRwb2ludHNdXQorRGFzaGJvYXJkIEVuZHBvaW50cworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2xpc3QtZGFzaGJvYXJkc11dCitMaXN0IERhc2hib2FyZHMKK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rhc2hib2FyZHMvJworCitMaXN0IGN1c3RvbSBkYXNoYm9hcmRzIGZvciBhIHByb2plY3QuCisKK0FzIHJlc3VsdCBhIGxpc3Qgb2YgbGluazojZGFzaGJvYXJkLWluZm9bRGFzaGJvYXJkSW5mb10gZW50cmllcyBpcworcmV0dXJuZWQuCisKK0xpc3QgYWxsIGRhc2hib2FyZHMgZm9yIHRoZSBgd29yay9teS1wcm9qZWN0YCBwcm9qZWN0OgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3dvcmslMkZteS1wcm9qZWN0L2Rhc2hib2FyZHMvIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZGFzaGJvYXJkIiwKKyAgICAgICJpZCI6ICJtYWluOmNsb3NlZCIsCisgICAgICAicmVmIjogIm1haW4iLAorICAgICAgInBhdGgiOiAiY2xvc2VkIiwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJNZXJnZWQgYW5kIGFiYW5kb25lZCBjaGFuZ2VzIGluIGxhc3QgNyB3ZWVrcyIsCisgICAgICAidXJsIjogIi9kYXNoYm9hcmQvP3RpdGxlXHUwMDNkQ2xvc2VkK2NoYW5nZXNcdTAwMjZNZXJnZWRcdTAwM2RzdGF0dXM6bWVyZ2VkK2FnZTo3d1x1MDAyNkFiYW5kb25lZFx1MDAzZHN0YXR1czphYmFuZG9uZWQrYWdlOjd3IiwKKyAgICAgICJkZWZhdWx0IjogdHJ1ZSwKKyAgICAgICJ0aXRsZSI6ICJDbG9zZWQgY2hhbmdlcyIsCisgICAgICAic2VjdGlvbnMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAibmFtZSI6ICJNZXJnZWQiLAorICAgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6bWVyZ2VkIGFnZTo3dyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICJuYW1lIjogIkFiYW5kb25lZCIsCisgICAgICAgICAgInF1ZXJ5IjogInN0YXR1czphYmFuZG9uZWQgYWdlOjd3IgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCistLS0tCisKKy5HZXQgYWxsIGRhc2hib2FyZHMgb2YgdGhlICdBbGwtUHJvamVjdHMnIHByb2plY3QKKyoqKioKK2dldDo6L3Byb2plY3RzL0FsbC1Qcm9qZWN0cy9kYXNoYm9hcmRzLworKioqKgorCitbW2dldC1kYXNoYm9hcmRdXQorR2V0IERhc2hib2FyZAorfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rhc2hib2FyZHMvbGluazojZGFzaGJvYXJkLWlkW1x7ZGFzaGJvYXJkLWlkXH1dJworCitSZXRyaWV2ZXMgYSBwcm9qZWN0IGRhc2hib2FyZC4gVGhlIGRhc2hib2FyZCBjYW4gYmUgZGVmaW5lZCBvbiB0aGF0Citwcm9qZWN0IG9yIGJlIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IHByb2plY3QuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvd29yayUyRm15LXByb2plY3QvZGFzaGJvYXJkcy9tYWluOmNsb3NlZCBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2Rhc2hib2FyZC1pbmZvW0Rhc2hib2FyZEluZm9dIGVudGl0eSBpcyByZXR1cm5lZAordGhhdCBkZXNjcmliZXMgdGhlIGRhc2hib2FyZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNkYXNoYm9hcmQiLAorICAgICJpZCI6ICJtYWluOmNsb3NlZCIsCisgICAgInJlZiI6ICJtYWluIiwKKyAgICAicGF0aCI6ICJjbG9zZWQiLAorICAgICJkZXNjcmlwdGlvbiI6ICJNZXJnZWQgYW5kIGFiYW5kb25lZCBjaGFuZ2VzIGluIGxhc3QgNyB3ZWVrcyIsCisgICAgInVybCI6ICIvZGFzaGJvYXJkLz90aXRsZVx1MDAzZENsb3NlZCtjaGFuZ2VzXHUwMDI2TWVyZ2VkXHUwMDNkc3RhdHVzOm1lcmdlZCthZ2U6N3dcdTAwMjZBYmFuZG9uZWRcdTAwM2RzdGF0dXM6YWJhbmRvbmVkK2FnZTo3dyIsCisgICAgImRlZmF1bHQiOiB0cnVlLAorICAgICJ0aXRsZSI6ICJDbG9zZWQgY2hhbmdlcyIsCisgICAgInNlY3Rpb25zIjogWworICAgICAgeworICAgICAgICAibmFtZSI6ICJNZXJnZWQiLAorICAgICAgICAicXVlcnkiOiAic3RhdHVzOm1lcmdlZCBhZ2U6N3ciCisgICAgICB9LAorICAgICAgeworICAgICAgICAibmFtZSI6ICJBYmFuZG9uZWQiLAorICAgICAgICAicXVlcnkiOiAic3RhdHVzOmFiYW5kb25lZCBhZ2U6N3ciCisgICAgICB9CisgICAgXQorICB9CistLS0tCisKK1RvIHJldHJpZXZlIHRoZSBkZWZhdWx0IGRhc2hib2FyZCBvZiBhIHByb2plY3QgdXNlIGBkZWZhdWx0YCBhcworZGFzaGJvYXJkLWlkLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3dvcmslMkZteS1wcm9qZWN0L2Rhc2hib2FyZHMvZGVmYXVsdCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2Rhc2hib2FyZCIsCisgICAgImlkIjogIm1haW46Y2xvc2VkIiwKKyAgICAicmVmIjogIm1haW4iLAorICAgICJwYXRoIjogImNsb3NlZCIsCisgICAgImRlc2NyaXB0aW9uIjogIk1lcmdlZCBhbmQgYWJhbmRvbmVkIGNoYW5nZXMgaW4gbGFzdCA3IHdlZWtzIiwKKyAgICAidXJsIjogIi9kYXNoYm9hcmQvP3RpdGxlXHUwMDNkQ2xvc2VkK2NoYW5nZXNcdTAwMjZNZXJnZWRcdTAwM2RzdGF0dXM6bWVyZ2VkK2FnZTo3d1x1MDAyNkFiYW5kb25lZFx1MDAzZHN0YXR1czphYmFuZG9uZWQrYWdlOjd3IiwKKyAgICAiZGVmYXVsdCI6IHRydWUsCisgICAgInRpdGxlIjogIkNsb3NlZCBjaGFuZ2VzIiwKKyAgICAic2VjdGlvbnMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk1lcmdlZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6bWVyZ2VkIGFnZTo3dyIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFiYW5kb25lZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6YWJhbmRvbmVkIGFnZTo3dyIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworW1tzZXQtZGFzaGJvYXJkXV0KK1NldCBEYXNoYm9hcmQKK35+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9kYXNoYm9hcmRzL2xpbms6I2Rhc2hib2FyZC1pZFtce2Rhc2hib2FyZC1pZFx9XScKKworVXBkYXRlcy9DcmVhdGVzIGEgcHJvamVjdCBkYXNoYm9hcmQuCisKK0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIGBkZWZhdWx0YCBkYXNoYm9hcmQuCisKK1RoZSBjcmVhdGlvbi91cGRhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBkYXNoYm9hcmQgbXVzdCBiZSBwcm92aWRlZCBpbgordGhlIHJlcXVlc3QgYm9keSBhcyBhIGxpbms6I2Rhc2hib2FyZC1pbnB1dFtEYXNoYm9hcmRJbnB1dF0gZW50aXR5LgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL3Byb2plY3RzL3dvcmslMkZteS1wcm9qZWN0L2Rhc2hib2FyZHMvZGVmYXVsdCBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAiaWQiOiAibWFpbjpjbG9zZWQiLAorICAgICJjb21taXRfbWVzc2FnZSI6ICJEZWZpbmUgdGhlIGRlZmF1bHQgZGFzaGJvYXJkIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcvdXBkYXRlZCBkYXNoYm9hcmQgaXMgcmV0dXJuZWQgYXMgYQorbGluazojZGFzaGJvYXJkLWluZm9bRGFzaGJvYXJkSW5mb10gZW50aXR5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2Rhc2hib2FyZCIsCisgICAgImlkIjogIm1haW46Y2xvc2VkIiwKKyAgICAicmVmIjogIm1haW4iLAorICAgICJwYXRoIjogImNsb3NlZCIsCisgICAgImRlc2NyaXB0aW9uIjogIk1lcmdlZCBhbmQgYWJhbmRvbmVkIGNoYW5nZXMgaW4gbGFzdCA3IHdlZWtzIiwKKyAgICAidXJsIjogIi9kYXNoYm9hcmQvP3RpdGxlXHUwMDNkQ2xvc2VkK2NoYW5nZXNcdTAwMjZNZXJnZWRcdTAwM2RzdGF0dXM6bWVyZ2VkK2FnZTo3d1x1MDAyNkFiYW5kb25lZFx1MDAzZHN0YXR1czphYmFuZG9uZWQrYWdlOjd3IiwKKyAgICAiZGVmYXVsdCI6IHRydWUsCisgICAgInRpdGxlIjogIkNsb3NlZCBjaGFuZ2VzIiwKKyAgICAic2VjdGlvbnMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk1lcmdlZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6bWVyZ2VkIGFnZTo3dyIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFiYW5kb25lZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6YWJhbmRvbmVkIGFnZTo3dyIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworW1tkZWxldGUtZGFzaGJvYXJkXV0KK0RlbGV0ZSBEYXNoYm9hcmQKK35+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9kYXNoYm9hcmRzL2xpbms6I2Rhc2hib2FyZC1pZFtce2Rhc2hib2FyZC1pZFx9XScKKworRGVsZXRlcyBhIHByb2plY3QgZGFzaGJvYXJkLgorCitDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgZm9yIHRoZSBgZGVmYXVsdGAgZGFzaGJvYXJkLgorCitUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhIGxpbms6I2Rhc2hib2FyZC1pbnB1dFsKK0Rhc2hib2FyZElucHV0XSBlbnRpdHkgaWYgbm8gY29tbWl0IG1lc3NhZ2UgaXMgc3BlY2lmaWVkLgorCitQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJveGllcyBwcm9oaWJpdCByZXF1ZXN0IGJvZGllcyBmb3IgREVMRVRFCityZXF1ZXN0cy4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9wcm9qZWN0cy93b3JrJTJGbXktcHJvamVjdC9kYXNoYm9hcmRzL2RlZmF1bHQgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKKworW1tpZHNdXQorSURzCistLS0KKworW1tkYXNoYm9hcmQtaWRdXQorXHtkYXNoYm9hcmQtaWRcfQorfn5+fn5+fn5+fn5+fn5+fgorVGhlIElEIG9mIGEgZGFzaGJvYXJkIGluIHRoZSBmb3JtYXQgJzxyZWY+OjxwYXRoPicuCisKK0Egc3BlY2lhbCBkYXNoYm9hcmQgSUQgaXMgYGRlZmF1bHRgIHdoaWNoIHJlcHJlc2VudHMgdGhlIGRlZmF1bHQKK2Rhc2hib2FyZCBvZiBhIHByb2plY3QuCisKK1tbcHJvamVjdC1uYW1lXV0KK1x7cHJvamVjdC1uYW1lXH0KK35+fn5+fn5+fn5+fn5+fn4KK1RoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgorCisKK1tbanNvbi1lbnRpdGllc11dCitKU09OIEVudGl0aWVzCistLS0tLS0tLS0tLS0tCisKK1tbZGFzaGJvYXJkLWluZm9dXQorRGFzaGJvYXJkSW5mbworfn5+fn5+fn5+fn5+fgorVGhlIGBEYXNoYm9hcmRJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0CitkYXNoYm9hcmQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjIsNCJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICAgIHx8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgICAgICB8fGBnZXJyaXRjb2RlcmV2aWV3I2Rhc2hib2FyZGAKK3xgaWRgICAgICAgICAgICAgICB8fAorVGhlIElEIG9mIHRoZSBkYXNoYm9hcmQuIFRoZSBJRCBoYXMgdGhlIGZvcm1hdCAnPHJlZj46PHBhdGg+JywKK3doZXJlIHJlZiBhbmQgcGF0aCBhcmUgVVJMIGVuY29kZWQuCit8YHByb2plY3RgICAgICAgICAgfHwKK1RoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGZvciB3aGljaCB0aGlzIGRhc2hib2FyZCBpcyByZXR1cm5lZC4KK3xgZGVmaW5pbmdfcHJvamVjdGB8fAorVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgaW4gd2hpY2ggdGhpcyBkYXNoYm9hcmQgaXMgZGVmaW5lZC4KK1RoaXMgaXMgZGlmZmVyZW50IGZyb20gYHByb2plY3RgIGlmIHRoZSBkYXNoYm9hcmQgaXMgaW5oZXJpdGVkIGZyb20gYQorcGFyZW50IHByb2plY3QuCit8YHJlZmAgICAgICAgICAgICAgfHwKK1RoZSBuYW1lIG9mIHRoZSByZWYgaW4gd2hpY2ggdGhlIGRhc2hib2FyZCBpcyBkZWZpbmVkLCB3aXRob3V0IHRoZQorYHJlZnMvbWV0YS9kYXNoYm9hcmRzL2AgcHJlZml4LCB3aGljaCBpcyBjb21tb24gZm9yIGFsbCBkYXNoYm9hcmQgcmVmcy4KK3xgcGF0aGAgICAgICAgICAgICB8fAorVGhlIHBhdGggb2YgdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGRhc2hib2FyZCBpcyBkZWZpbmVkLgorfGBkZXNjcmlwdGlvbmAgICAgIHxvcHRpb25hbHxUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhc2hib2FyZC4KK3xgZm9yZWFjaGAgICAgICAgICB8b3B0aW9uYWx8CitTdWJxdWVyeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHNlY3Rpb25zIGluIHRoZSBkYXNoYm9hcmQuICsKK1Rva2VucyBzdWNoIGFzIGAke3Byb2plY3R9YCBhcmUgbm90IHJlc29sdmVkLgorfGB1cmxgICAgICAgICAgICAgIHx8CitUaGUgVVJMIHVuZGVyIHdoaWNoIHRoZSBkYXNoYm9hcmQgY2FuIGJlIG9wZW5lZCBpbiB0aGUgR2Vycml0IFdlYlVJLiArCitUaGUgVVJMIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW5vbmljYWwgd2ViIFVSTC4gKworVG9rZW5zIGluIHRoZSBxdWVyaWVzIHN1Y2ggYXMgYCR7cHJvamVjdH1gIGFyZSByZXNvbHZlZC4KK3xgZGVmYXVsdGAgICAgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGlzIGlzIHRoZSBkZWZhdWx0IGRhc2hib2FyZCBvZiB0aGUgcHJvamVjdC4KK3xgdGl0bGVgICAgICAgICAgICB8b3B0aW9uYWx8VGhlIHRpdGxlIG9mIHRoZSBkYXNoYm9hcmQuCit8YHNlY3Rpb25zYCAgICAgICAgfHwKK1RoZSBsaXN0IG9mIGxpbms6I2Rhc2hib2FyZC1zZWN0aW9uLWluZm9bc2VjdGlvbnNdIGluIHRoZSBkYXNoYm9hcmQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2Rhc2hib2FyZC1pbnB1dF1dCitEYXNoYm9hcmRJbnB1dAorfn5+fn5+fn5+fn5+fn4KK1RoZSBgRGFzaGJvYXJkSW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiB0byBjcmVhdGUvdXBkYXRlIGEKK3Byb2plY3QgZGFzaGJvYXJkLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4yLDQiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgaWRgICAgICAgICAgICAgfG9wdGlvbmFsfAorVVJMIGVuY29kZWQgSUQgb2YgYSBkYXNoYm9hcmQgdG8gd2hpY2ggdGhpcyBkYXNoYm9hcmQgc2hvdWxkIGxpbmsgdG8uCit8YGNvbW1pdF9tZXNzYWdlYHxvcHRpb25hbHwKK01lc3NhZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21taXQgdGhlIGNoYW5nZSBvZiB0aGUgZGFzaGJvYXJkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZGFzaGJvYXJkLXNlY3Rpb24taW5mb11dCitEYXNoYm9hcmRTZWN0aW9uSW5mbworfn5+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBgRGFzaGJvYXJkU2VjdGlvbkluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlY3Rpb24KK2luIGEgZGFzaGJvYXJkLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfERlc2NyaXB0aW9uCit8YG5hbWVgICAgICAgICB8VGhlIHRpdGxlIG9mIHRoZSBzZWN0aW9uLgorfGBxdWVyeWAgICAgICAgfFRoZSBxdWVyeSBvZiB0aGUgc2VjdGlvbi4gKworVG9rZW5zIHN1Y2ggYXMgYCR7cHJvamVjdH1gIGFyZSBub3QgcmVzb2x2ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbaGVhZC1pbnB1dF1dCitIZWFkSW5wdXQKK35+fn5+fn5+fgorVGhlIGBIZWFkSW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3Igc2V0dGluZyBgSEVBRGAgZm9yIGEKK3Byb2plY3QuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsNiJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICB8RGVzY3JpcHRpb24KK3xgcmVmYCAgICAgICAgICAgfAorVGhlIHJlZiB0byB3aGljaCBgSEVBRGAgc2hvdWxkIGJlIHNldCwgdGhlIGByZWZzL2hlYWRzYCBwcmVmaXggY2FuIGJlCitvbWl0dGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1twcm9qZWN0LWRlc2NyaXB0aW9uLWlucHV0XV0KK1Byb2plY3REZXNjcmlwdGlvbklucHV0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIGBQcm9qZWN0RGVzY3JpcHRpb25JbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBzZXR0aW5nIGEKK3Byb2plY3QgZGVzY3JpcHRpb24uCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjIsNCJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBkZXNjcmlwdGlvbmAgICB8b3B0aW9uYWx8VGhlIHByb2plY3QgZGVzY3JpcHRpb24uICsKK1RoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIHdpbGwgYmUgZGVsZXRlZCBpZiBub3Qgc2V0LgorfGBjb21taXRfbWVzc2FnZWB8b3B0aW9uYWx8CitNZXNzYWdlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tbWl0IHRoZSBjaGFuZ2Ugb2YgdGhlIHByb2plY3QKK2Rlc2NyaXB0aW9uIGluIHRoZSBgcHJvamVjdC5jb25maWdgIGZpbGUgdG8gdGhlIGByZWZzL21ldGEvY29uZmlnYAorYnJhbmNoLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcHJvamVjdC1pbmZvXV0KK1Byb2plY3RJbmZvCit+fn5+fn5+fn5+fgorVGhlIGBQcm9qZWN0SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMiw0Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgIHx8YGdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdGAKK3xgaWRgICAgICAgICAgIHx8VGhlIFVSTCBlbmNvZGVkIHByb2plY3QgbmFtZS4KK3xgbmFtZWAgICAgICAgIHwKK25vdCBzZXQgaWYgcmV0dXJuZWQgaW4gYSBtYXAgd2hlcmUgdGhlIHByb2plY3QgbmFtZSBpcyB1c2VkIGFzIG1hcCBrZXl8CitUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KK3xgcGFyZW50YCAgICAgIHxvcHRpb25hbHwKK1RoZSBuYW1lIG9mIHRoZSBwYXJlbnQgcHJvamVjdC4gKworYD8tPG4+YCBpZiB0aGUgcGFyZW50IHByb2plY3QgaXMgbm90IHZpc2libGUgKGA8bj5gIGlzIGEgbnVtYmVyIHdoaWNoCitpcyBpbmNyZWFzZWQgZm9yIGVhY2ggbm9uLXZpc2libGUgcHJvamVjdCkuCit8YGRlc2NyaXB0aW9uYCB8b3B0aW9uYWx8VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LgorfGBicmFuY2hlc2AgICAgfG9wdGlvbmFsfE1hcCBvZiBicmFuY2ggbmFtZXMgdG8gSEVBRCByZXZpc2lvbnMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcHJvamVjdC1pbnB1dF1dCitQcm9qZWN0SW5wdXQKK35+fn5+fn5+fn5+fgorVGhlIGBQcm9qZWN0SW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNyZWF0aW9uIG9mCithIG5ldyBwcm9qZWN0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4yLDQiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgICAgICAgICAgIHx8RGVzY3JpcHRpb24KK3xgbmFtZWAgICAgICAgICAgICAgICAgICAgICAgfG9wdGlvbmFsfAorVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgKG5vdCBlbmNvZGVkKS4gKworSWYgc2V0LCBtdXN0IG1hdGNoIHRoZSBwcm9qZWN0IG5hbWUgaW4gdGhlIFVSTC4KK3xgcGFyZW50YCAgICAgICAgICAgICAgICAgICAgfG9wdGlvbmFsfAorVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBwcm9qZWN0LiArCitJZiBub3Qgc2V0LCB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCB3aWxsIGJlIHRoZSBwYXJlbnQgcHJvamVjdC4KK3xgZGVzY3JpcHRpb25gICAgICAgICAgICAgICAgfG9wdGlvbmFsfFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdC4KK3xgcGVybWlzc2lvbnNfb25seWAgICAgICAgICAgfGBmYWxzZWAgaWYgbm90IHNldHwKK1doZXRoZXIgYSBwZXJtaXNzaW9uLW9ubHkgcHJvamVjdCBzaG91bGQgYmUgY3JlYXRlZC4KK3xgY3JlYXRlX2VtcHR5X2NvbW1pdGAgICAgICAgfGBmYWxzZWAgaWYgbm90IHNldHwKK1doZXRoZXIgYW4gZW1wdHkgaW5pdGlhbCBjb21taXQgc2hvdWxkIGJlIGNyZWF0ZWQuCit8YHN1Ym1pdF90eXBlYCAgICAgICAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBzdWJtaXQgdHlwZSB0aGF0IHNob3VsZCBiZSBzZXQgZm9yIHRoZSBwcm9qZWN0CisoYE1FUkdFX0lGX05FQ0VTU0FSWWAsIGBSRUJBU0VfSUZfTkVDRVNTQVJZYCwgYEZBU1RfRk9SV0FSRF9PTkxZYCwKK2BNRVJHRV9BTFdBWVNgLCBgQ0hFUlJZX1BJQ0tgKS4gKworSWYgbm90IHNldCwgYE1FUkdFX0lGX05FQ0VTU0FSWWAgaXMgc2V0IGFzIHN1Ym1pdCB0eXBlLgorfGBicmFuY2hlc2AgICAgICAgICAgICAgICAgICB8b3B0aW9uYWx8CitBIGxpc3Qgb2YgYnJhbmNoZXMgdGhhdCBzaG91bGQgYmUgaW5pdGlhbGx5IGNyZWF0ZWQuICsKK0ZvciB0aGUgYnJhbmNoIG5hbWVzIHRoZSBgcmVmcy9oZWFkcy9gIHByZWZpeCBjYW4gYmUgb21pdHRlZC4KK3xgb3duZXJzYCAgICAgICAgICAgICAgICAgICAgfG9wdGlvbmFsfAorQSBsaXN0IG9mIGdyb3VwcyB0aGF0IHNob3VsZCBiZSBhc3NpZ25lZCBhcyBwcm9qZWN0IG93bmVyLiArCitFYWNoIGdyb3VwIGluIHRoZSBsaXN0IG11c3QgYmUgc3BlY2lmaWVkIGFzCitsaW5rOnJlc3QtYXBpLWdyb3Vwcy5odG1sI2dyb3VwLWlkW2dyb3VwLWlkXS4gKworSWYgbm90IHNldCwgdGhlIGxpbms6Y29uZmlnLWdlcnJpdC5odG1sI3JlcG9zaXRvcnkubmFtZS5vd25lckdyb3VwWworZ3JvdXBzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgYXMgZGVmYXVsdCBvd25lcnNdIGFyZSBzZXQgYXMgcHJvamVjdAorb3duZXJzLgorfGB1c2VfY29udHJpYnV0b3JfYWdyZWVtZW50c2B8YElOSEVSSVRgIGlmIG5vdCBzZXR8CitXaGV0aGVyIGNvbnRyaWJ1dG9yIGFncmVlbWVudHMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBwcm9qZWN0ICAoYFRSVUVgLAorYEZBTFNFYCwgYElOSEVSSVRgKS4KK3xgdXNlX3NpZ25lZF9vZmZfYnlgICAgICAgICAgfGBJTkhFUklUYCBpZiBub3Qgc2V0fAorV2hldGhlciB0aGUgdXNhZ2Ugb2YgJ1NpZ25lZC1PZmYtQnknIGZvb3RlcnMgaXMgcmVxdWlyZWQgZm9yIHRoZQorcHJvamVjdCAoYFRSVUVgLCBgRkFMU0VgLCBgSU5IRVJJVGApLgorfGB1c2VfY29udGVudF9tZXJnZWAgICAgICAgICB8YElOSEVSSVRgIGlmIG5vdCBzZXR8CitXaGV0aGVyIGNvbnRlbnQgbWVyZ2Ugc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoZSBwcm9qZWN0IChgVFJVRWAsCitgRkFMU0VgLCBgSU5IRVJJVGApLiArCitgRkFMU0VgLCBpZiB0aGUgYHN1Ym1pdF90eXBlYCBpcyBgRkFTVF9GT1JXQVJEX09OTFlgLgorfGByZXF1aXJlX2NoYW5nZV9pZGAgICAgICAgICB8YElOSEVSSVRgIGlmIG5vdCBzZXR8CitXaGV0aGVyIHRoZSB1c2FnZSBvZiBDaGFuZ2UtSWRzIGlzIHJlcXVpcmVkIGZvciB0aGUgcHJvamVjdCAoYFRSVUVgLAorYEZBTFNFYCwgYElOSEVSSVRgKS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Byb2plY3QtcGFyZW50LWlucHV0XV0KK1Byb2plY3RQYXJlbnRJbnB1dAorfn5+fn5+fn5+fn5+fn5+fn5+CitUaGUgYFByb2plY3RQYXJlbnRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBzZXR0aW5nIGEKK3Byb2plY3QgcGFyZW50LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4yLDQiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgcGFyZW50YCAgICAgICAgfHxUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHByb2plY3QuCit8YGNvbW1pdF9tZXNzYWdlYHxvcHRpb25hbHwKK01lc3NhZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21taXQgdGhlIGNoYW5nZSBvZiB0aGUgcHJvamVjdCBwYXJlbnQKK2luIHRoZSBgcHJvamVjdC5jb25maWdgIGZpbGUgdG8gdGhlIGByZWZzL21ldGEvY29uZmlnYCBicmFuY2guCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXBvc2l0b3J5LXN0YXRpc3RpY3MtaW5mb11dCitSZXBvc2l0b3J5U3RhdGlzdGljc0luZm8KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIGBSZXBvc2l0b3J5U3RhdGlzdGljc0luZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAorc3RhdGlzdGljcyBvZiBhIEdpdCByZXBvc2l0b3J5LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgICAgICAgICB8RGVzY3JpcHRpb24KK3xgbnVtYmVyX29mX2xvb3NlX29iamVjdHNgIHxOdW1iZXIgb2YgbG9vc2Ugb2JqZWN0cy4KK3xgbnVtYmVyX29mX2xvb3NlX3JlZnNgICAgIHxOdW1iZXIgb2YgbG9vc2UgcmVmcy4KK3xgbnVtYmVyX29mX3BhY2tfZmlsZXNgICAgIHxOdW1iZXIgb2YgcGFjayBmaWxlcy4KK3xgbnVtYmVyX29mX3BhY2tlZF9vYmplY3RzYHxOdW1iZXIgb2YgcGFja2VkIG9iamVjdHMuCit8YG51bWJlcl9vZl9wYWNrZWRfcmVmc2AgICB8TnVtYmVyIG9mIHBhY2tlZCByZWZzLgorfGBzaXplX29mX2xvb3NlX29iamVjdHNgICAgfFNpemUgb2YgbG9vc2Ugb2JqZWN0cyBpbiBieXRlcy4KK3xgc2l6ZV9vZl9wYWNrZWRfb2JqZWN0c2AgIHxTaXplIG9mIHBhY2tlZCBvYmplY3RzIGluIGJ5dGVzLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmVzdC1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS50eHQKaW5kZXggMmY5ZDAzZi4uMzAzZmM0YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS50eHQKQEAgLTUsNiArNSwxNyBAQAogVGhlIEFQSSBpcyBzdWl0YWJsZSBmb3IgYXV0b21hdGVkIHRvb2xzIHRvIGJ1aWxkIHVwb24sIGFzIHdlbGwgYXMKIHN1cHBvcnRpbmcgc29tZSBhZC1ob2Mgc2NyaXB0aW5nIHVzZSBjYXNlcy4KIAorRW5kcG9pbnRzCistLS0tLS0tLS0KK2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbFsvYWNjb3VudHMvXTo6CisgIEFjY291bnQgcmVsYXRlZCBSRVNUIGVuZHBvaW50cworbGluazpyZXN0LWFwaS1jaGFuZ2VzLmh0bWxbL2NoYW5nZXMvXTo6CisgIENoYW5nZSByZWxhdGVkIFJFU1QgZW5kcG9pbnRzCitsaW5rOnJlc3QtYXBpLWdyb3Vwcy5odG1sWy9ncm91cHMvXTo6CisgIEdyb3VwIHJlbGF0ZWQgUkVTVCBlbmRwb2ludHMKK2xpbms6cmVzdC1hcGktcHJvamVjdHMuaHRtbFsvcHJvamVjdHMvXTo6CisgIFByb2plY3QgcmVsYXRlZCBSRVNUIGVuZHBvaW50cworCiBQcm90b2NvbCBEZXRhaWxzCiAtLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIxLDExICszMiwxOSBAQAogcHJlZml4IHRoZSBlbmRwb2ludCBVUkwgd2l0aCBgL2EvYC4gRm9yIGV4YW1wbGUgdG8gYXV0aGVudGljYXRlIHRvCiBgL3Byb2plY3RzL2AgcmVxdWVzdCBVUkwgYC9hL3Byb2plY3RzL2AuCiAKK1tbcHJlY29uZGl0aW9uc11dCitQcmVjb25kaXRpb25zCit+fn5+fn5+fn5+fn5+CitDbGllbnRzIGNhbiByZXF1ZXN0IFBVVCB0byBjcmVhdGUgYSBuZXcgcmVzb3VyY2UgYW5kIG5vdCBvdmVyd3JpdGUKK2FuIGV4aXN0aW5nIG9uZSBieSBhZGRpbmcgYElmLU5vbmUtTWF0Y2g6ICpgIHRvIHRoZSByZXF1ZXN0IEhUVFAKK2hlYWRlcnMuIElmIHRoZSBuYW1lZCByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyB0aGUgc2VydmVyIHdpbGwgcmVzcG9uZAord2l0aCBIVFRQIDQxMiBQcmVjb25kaXRpb24gRmFpbGVkLgorCiBbW291dHB1dF1dCiBPdXRwdXQgRm9ybWF0CiB+fn5+fn5+fn5+fn5+Ci1Nb3N0IEFQSXMgcmV0dXJuIHRleHQgZm9ybWF0IGJ5IGRlZmF1bHQuIEpTT04gY2FuIGJlIHJlcXVlc3RlZAotYnkgc2V0dGluZyB0aGUgYEFjY2VwdGAgSFRUUCByZXF1ZXN0IGhlYWRlciB0byBpbmNsdWRlCitNb3N0IEFQSXMgcmV0dXJuIHByZXR0eSBwcmludGVkIEpTT04gYnkgZGVmYXVsdC4gQ29tcGFjdCBKU09OIGNhbiBiZQorcmVxdWVzdGVkIGJ5IHNldHRpbmcgdGhlIGBBY2NlcHRgIEhUVFAgcmVxdWVzdCBoZWFkZXIgdG8gaW5jbHVkZQogYGFwcGxpY2F0aW9uL2pzb25gLCBmb3IgZXhhbXBsZToKIAogLS0tLQpAQCAtNDMsMzUwICs2Miw5OSBAQAogICBbIC4uLiB2YWxpZCBKU09OIC4uLiBdCiAtLS0tCiAKLVRoZSBkZWZhdWx0IEpTT04gZm9ybWF0IGlzIGBKU09OX0NPTVBBQ1RgLCB3aGljaCBza2lwcyB1bm5lY2Vzc2FyeQotd2hpdGVzcGFjZS4gVGhpcyBpcyBub3QgdGhlIGVhc2llc3QgZm9ybWF0IGZvciBhIGh1bWFuIHRvIHJlYWQuIE1hbnkKLWV4YW1wbGVzIGluIHRoaXMgZG9jdW1lbnRhdGlvbiB1c2UgYGZvcm1hdD1KU09OYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlcgotdG8gb2J0YWluIHByZXR0eSBmb3JtYXR0aW5nIGluIHRoZSByZXNwb25zZS4gUHJvZHVjaW5nIChhbmQgcGFyc2luZykKLXRoZSBjb21wYWN0IGZvcm1hdCBpcyBtb3JlIGVmZmljaWVudCwgc28gbW9zdCB0b29scyBzaG91bGQgcHJlZmVyIHRoZQotZGVmYXVsdCBjb21wYWN0IGZvcm1hdC4KK1RoZSBkZWZhdWx0IEpTT04gZm9ybWF0IGlzIHByZXR0eSwgd2hpY2ggdXNlcyBleHRyYSB3aGl0ZXNwYWNlIHRvIG1ha2UKK3RoZSBvdXRwdXQgbW9yZSByZWFkYWJsZSBmb3IgYSBodW1hbi4gUHJvZHVjaW5nIChhbmQgcGFyc2luZykgdGhlCitub24tcHJldHR5IGNvbXBhY3QgZm9ybWF0IGlzIG1vcmUgZWZmaWNpZW50IHNvIHRvb2xzIHNob3VsZCByZXF1ZXN0IGl0CitieSB1c2luZyB0aGUgYEFjY2VwdDogYXBwbGljYXRpb24vanNvbmAgaGVhZGVyIG9yIGBwcD0wYCBxdWVyeQorcGFyYW1ldGVyIHdoZW5ldmVyIHBvc3NpYmxlLgogCiBSZXNwb25zZXMgd2lsbCBiZSBnemlwIGNvbXByZXNzZWQgYnkgdGhlIHNlcnZlciBpZiB0aGUgSFRUUAogYEFjY2VwdC1FbmNvZGluZ2AgcmVxdWVzdCBoZWFkZXIgaXMgc2V0IHRvIGBnemlwYC4gVGhpcyBtYXkKIHNhdmUgb24gbmV0d29yayB0cmFuc2ZlciB0aW1lIGZvciBsYXJnZXIgcmVzcG9uc2VzLgogCi1FbmRwb2ludHMKLS0tLS0tLS0tLQorW1t0aW1lc3RhbXBdXQorVGltZXN0YW1wCit+fn5+fn5+fn4KK1RpbWVzdGFtcHMgYXJlIGdpdmVuIGluIFVUQyBhbmQgaGF2ZSB0aGUgZm9ybWF0CisiJ3l5eXktbW0tZGQgaGg6bW06c3MuZmZmZmZmZmZmJyIgd2hlcmUgIidmZmZmZmZmZmZmJyIgaW5kaWNhdGVzIHRoZQorbmFub3NlY29uZHMuCiAKLVtbYWNjb3VudHNfc2VsZl9jYXBhYmlsaXRpZXNdXQotL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzIChBY2NvdW50IENhcGFiaWxpdGllcykKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1SZXR1cm5zIHRoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIChzdWNoIGFzIGBjcmVhdGVQcm9qZWN0YCBvcgotYGNyZWF0ZUdyb3VwYCkgdGhhdCBhcmUgZW5hYmxlZCBmb3IgdGhlIGNhbGxpbmcgdXNlci4gVGhpcyBjYW4gYmUgdXNlZAotYnkgVUkgdG9vbHMgdG8gZGlzY292ZXIgaWYgYWRtaW5pc3RyYXRpdmUgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZQotdG8gdGhlIGNhbGxlciwgc28gdGhleSBjYW4gaGlkZSAob3Igc2hvdykgcmVsZXZhbnQgVUkgYWN0aW9ucy4KK1tbZW5jb2RpbmddXQorRW5jb2RpbmcKK35+fn5+fn5+CitBbGwgSURzIHRoYXQgYXBwZWFyIGluIHRoZSBVUkwgb2YgYSBSRVNUIGNhbGwgKGUuZy4gcHJvamVjdCBuYW1lLCBncm91cCBuYW1lKQorbXVzdCBiZSBVUkwgZW5jb2RlZC4KIAotLS0tLQotICBHRVQgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzP2Zvcm1hdD1KU09OIEhUVFAvMS4wCitbW3Jlc3BvbnNlLWNvZGVzXV0KK1Jlc3BvbnNlIENvZGVzCit+fn5+fn5+fn5+fn5+fgorSFRUUCBzdGF0dXMgY29kZXMgYXJlIHdlbGwgZGVmaW5lZCBhbmQgdGhlIEdlcnJpdCBSRVNUIGVuZHBvaW50cyB1c2UKK3RoZW0gYXMgZGVzY3JpYmVkIGluIHRoZSBIVFRQIHNwZWMuCiAKLSAgKV19JwotICB7Ci0gICAgInF1ZXJ5TGltaXQiOiB7Ci0gICAgICAibWluIjogMCwKLSAgICAgICJtYXgiOiA1MDAKLSAgICB9Ci0gIH0KLS0tLS0KK0hlcmUgYXJlIGV4YW1wbGVzIGZvciBzb21lIEhUVFAgc3RhdHVzIGNvZGVzIHRoYXQgc2hvdyBob3cgdGhleSBhcmUKK3VzZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIEdlcnJpdCBSRVNUIEFQSS4KIAotQWRtaW5pc3RyYXRvciB0aGF0IGhhcyBhdXRoZW50aWNhdGVkIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uOgotLS0tLQotICBHRVQgL2EvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXM/Zm9ybWF0PUpTT04gSFRUUC8xLjAKLSAgQXV0aG9yaXphdGlvbjogRGlnZXN0IHVzZXJuYW1lPSJhZG1pbiIsIHJlYWxtPSJHZXJyaXQgQ29kZSBSZXZpZXciLCBub25jZT0iLi4uCis0MDAgQmFkIFJlcXVlc3QKK15eXl5eXl5eXl5eXl5eXgorYDQwMCBCYWQgUmVxdWVzdGAgaXMgdXNlZCBpZiB0aGUgcmVxdWVzdCBpcyBub3QgdW5kZXJzdG9vZCBieSB0aGUKK3NlcnZlciBkdWUgdG8gbWFsZm9ybWVkIHN5bnRheC4KIAotICApXX0nCi0gIHsKLSAgICAiYWRtaW5pc3RyYXRlU2VydmVyIjogdHJ1ZSwKLSAgICAicXVlcnlMaW1pdCI6IHsKLSAgICAgICJtaW4iOiAwLAotICAgICAgIm1heCI6IDUwMAotICAgIH0sCi0gICAgImNyZWF0ZUFjY291bnQiOiB0cnVlLAotICAgICJjcmVhdGVHcm91cCI6IHRydWUsCi0gICAgImNyZWF0ZVByb2plY3QiOiB0cnVlLAotICAgICJraWxsVGFzayI6IHRydWUsCi0gICAgInZpZXdDYWNoZXMiOiB0cnVlLAotICAgICJmbHVzaENhY2hlcyI6IHRydWUsCi0gICAgInZpZXdDb25uZWN0aW9ucyI6IHRydWUsCi0gICAgInZpZXdRdWV1ZSI6IHRydWUsCi0gICAgInN0YXJ0UmVwbGljYXRpb24iOiB0cnVlCi0gIH0KLS0tLS0KK0UuZy4gYDQwMCBCYWQgUmVxdWVzdGAgaXMgcmV0dXJuZWQgaWYgSlNPTiBpbnB1dCBpcyBleHBlY3RlZCBidXQgdGhlCisnQ29udGVudC1UeXBlJyBvZiB0aGUgcmVxdWVzdCBpcyBub3QgJ2FwcGxpY2F0aW9uL2pzb24nIG9yIHRoZSByZXF1ZXN0Citib2R5IGRvZXNuJ3QgY29udGFpbiB2YWxpZCBKU09OLgogCi1UbyBmaWx0ZXIgdGhlIHNldCBvZiBnbG9iYWwgY2FwYWJpbGl0aWVzIHRoZSBgcWAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkLgotRmlsdGVyaW5nIG1heSBkZWNyZWFzZSB0aGUgcmVzcG9uc2UgdGltZSBieSBhdm9pZGluZyBsb29raW5nIGF0IGV2ZXJ5Ci1wb3NzaWJsZSBhbHRlcm5hdGl2ZSBmb3IgdGhlIGNhbGxlci4KK2A0MDAgQmFkIFJlcXVlc3RgIGlzIGFsc28gdXNlZCBpZiByZXF1aXJlZCBpbnB1dCBmaWVsZHMgYXJlIG5vdCBzZXQgb3IKK2lmIG9wdGlvbnMgYXJlIHNldCB3aGljaCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KIAotLS0tLQotICBHRVQgL2EvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXM/Zm9ybWF0PUpTT04mcT1jcmVhdGVBY2NvdW50JnE9Y3JlYXRlR3JvdXAgSFRUUC8xLjAKLSAgQXV0aG9yaXphdGlvbjogRGlnZXN0IHVzZXJuYW1lPSJhZG1pbiIsIHJlYWxtPSJHZXJyaXQgQ29kZSBSZXZpZXciLCBub25jZT0iLi4uCis0MDMgRm9yYmlkZGVuCiteXl5eXl5eXl5eXl5eCitgNDAzIEZvcmJpZGRlbmAgaXMgdXNlZCBpZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlCitjYWxsaW5nIHVzZXIgaGFzIG5vIHN1ZmZpY2llbnQgcGVybWlzc2lvbnMuCiAKLSAgKV19JwotICB7Ci0gICAgImNyZWF0ZUFjY291bnQiOiB0cnVlLAotICAgICJjcmVhdGVHcm91cCI6IHRydWUKLSAgfQotLS0tLQorRS5nLiBzb21lIFJFU1QgZW5kcG9pbnRzIHJlcXVpcmUgdGhhdCB0aGUgY2FsbGluZyB1c2VyIGhhcyBjZXJ0YWluCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjZ2xvYmFsX2NhcGFiaWxpdGllc1tnbG9iYWwgY2FwYWJpbGl0aWVzXQorYXNzaWduZWQuCiAKLU1vc3QgcmVzdWx0cyBhcmUgYm9vbGVhbiwgYW5kIGEgZmllbGQgaXMgb25seSBwcmVzZW50IHdoZW4gaXRzIHZhbHVlCi1pcyBgdHJ1ZWAuIGxpbms6anNvbi5odG1sI3F1ZXJ5TGltaXRbYHF1ZXJ5TGltaXRgXSBpcyBhIHJhbmdlIGFuZCBpcwotcHJlc2VudGVkIGFzIGEgbmVzdGVkIEpTT04gb2JqZWN0IHdpdGggYG1pbmAgYW5kIGBtYXhgIG1lbWJlcnMuCitgNDAzIEZvcmJpZGRlbmAgaXMgYWxzbyB1c2VkIGlmIGBzZWxmYCBpcyB1c2VkIGFzIGFjY291bnQgSUQgYW5kIHRoZQorUkVTVCBjYWxsIHdhcyBkb25lIHdpdGhvdXQgYXV0aGVudGljYXRpb24uCiAKLVtbcHJvamVjdHNdXQotL3Byb2plY3RzLyAoTGlzdCBQcm9qZWN0cykKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1MaXN0cyB0aGUgcHJvamVjdHMgYWNjZXNzaWJsZSBieSB0aGUgY2FsbGVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzCi11c2luZyB0aGUgbGluazpjbWQtbHMtcHJvamVjdHMuaHRtbFtscy1wcm9qZWN0c10gY29tbWFuZCBvdmVyIFNTSCwKLWFuZCBhY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgcXVlcnkgcGFyYW1ldGVycy4KKzQwNCBOb3QgRm91bmQKK15eXl5eXl5eXl5eXl4KK2A0MDQgTm90IEZvdW5kYCBpcyByZXR1cm5lZCBpZiB0aGUgcmVzb3VyY2UgdGhhdCBpcyBzcGVjaWZpZWQgYnkgdGhlCitVUkwgaXMgbm90IGZvdW5kIG9yIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIuIEEgcmVzb3VyY2UKK2Nhbm5vdCBiZSBmb3VuZCBpZiB0aGUgVVJMIGNvbnRhaW5zIGEgbm9uLWV4aXN0aW5nIElEIG9yIHZpZXcuCiAKLS0tLS0KLSAgR0VUIC9wcm9qZWN0cy8/Zm9ybWF0PUpTT04mZCBIVFRQLzEuMAorNDA1IE1ldGhvZCBOb3QgQWxsb3dlZAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorYDQwNSBNZXRob2QgTm90IEFsbG93ZWRgIGlzIHVzZWQgaWYgdGhlIHJlc291cmNlIGV4aXN0cyBidXQgZG9lc24ndAorc3VwcG9ydCB0aGUgb3BlcmF0aW9uLgogCi0gIEhUVFAvMS4xIDIwMCBPSwotICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ci0gIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04Ci0gICAKLSAgKV19JwotICB7Ci0gICAgImV4dGVybmFsL2Jpc29uIjogewotICAgICAgImRlc2NyaXB0aW9uIjogIkdOVSBwYXJzZXIgZ2VuZXJhdG9yIgotICAgIH0sCi0gICAgImV4dGVybmFsL2djYyI6IHt9LAotICAgICJleHRlcm5hbC9vcGVuc3NsIjogewotICAgICAgImRlc2NyaXB0aW9uIjogImVuY3J5cHRpb25cbmNyeXB0byByb3V0aW5lcyIKLSAgICB9LAotICAgICJ0ZXN0IjogewotICAgICAgImRlc2NyaXB0aW9uIjogIlx1MDAzY2h0bWxcdTAwM2UgaXMgZXNjYXBlZCIKLSAgICB9Ci0gIH0KLS0tLS0KK0UuZy4gc29tZSBvZiB0aGUgYC9ncm91cHMvYCBlbmRwb2ludHMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBHZXJyaXQKK2ludGVybmFsIGdyb3VwcywgaWYgdGhleSBhcmUgaW52b2tlZCBmb3IgYW4gZXh0ZXJuYWwgZ3JvdXAgdGhlIHJlc3BvbnNlCitpcyBgNDA1IE1ldGhvZCBOb3QgQWxsb3dlZGAuCiAKLVtbc3VnZ2VzdC1wcm9qZWN0c11dCi1UaGUgYC9wcm9qZWN0cy9gIFVSTCBhbHNvIGFjY2VwdHMgYSBwcmVmaXggc3RyaW5nIGFzIHBhcnQgb2YgdGhlIFVSTC4KLVRoaXMgbGltaXRzIHRoZSByZXN1bHRzIHRvIHRob3NlIHByb2plY3RzIHRoYXQgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkCi1wcmVmaXguCi1MaXN0IGFsbCBwcm9qZWN0cyB0aGF0IHN0YXJ0IHdpdGggYHBsYXRmb3JtL2A6Ci0tLS0tCi1HRVQgL3Byb2plY3RzL3BsYXRmb3JtLz9mb3JtYXQ9SlNPTiBIVFRQLzEuMAotSFRUUC8xLjEgMjAwIE9LCi1Db250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ci1Db250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAotKV19JwotewotInBsYXRmb3JtL2RyaXZlcnMiOiB7fSwKLSJwbGF0Zm9ybS90b29scyI6IHt9Ci19Ci0tLS0tCi1FLmcuIHRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCBieSBzdWdnZXN0aW9uIGNsaWVudCBVSSdzIHRvIGxpbWl0IHJlc3VsdHMuCis0MDkgQ29uZmxpY3QKK15eXl5eXl5eXl5eXgorYDQwOSBDb25mbGljdGAgaXMgdXNlZCBpZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgY29tcGxldGVkIGJlY2F1c2UgdGhlCitjdXJyZW50IHN0YXRlIG9mIHRoZSByZXNvdXJjZSBkb2Vzbid0IGFsbG93IHRoZSBvcGVyYXRpb24uCiAKLVtbY2hhbmdlc11dCi0vY2hhbmdlcy8gKFF1ZXJ5IENoYW5nZXMpCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1RdWVyaWVzIGNoYW5nZXMgdmlzaWJsZSB0byB0aGUgY2FsbGVyLiBUaGUgcXVlcnkgc3RyaW5nIG11c3QgYmUKLXByb3ZpZGVkIGJ5IHRoZSBgcWAgcGFyYW1ldGVyLiBUaGUgYG5gIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBsaW1pdAotdGhlIHJldHVybmVkIHJlc3VsdHMuCitFLmcuIGlmIHlvdSB0cnkgdG8gc3VibWl0IGEgY2hhbmdlIHRoYXQgaXMgYWJhbmRvbmVkLCB0aGlzIGZhaWxzIHdpdGgKK2A0MDkgQ29uZmxpY3RgIGJlY2F1c2UgdGhlIHN0YXRlIG9mIHRoZSBjaGFuZ2UgZG9lc24ndCBhbGxvdyB0aGUgc3VibWl0CitvcGVyYXRpb24uCiAKLVF1ZXJ5IGZvciBvcGVuIGNoYW5nZXMgb2Ygd2F0Y2hlZCBwcm9qZWN0czoKLS0tLS0KLSAgR0VUIC9jaGFuZ2VzLz9mb3JtYXQ9SlNPTiZxPXN0YXR1czpvcGVuK2lzOndhdGNoZWQmbj0yIEhUVFAvMS4wCitgNDA5IENvbmZsaWN0YCBpcyBhbHNvIHVzZWQgaWYgeW91IHRyeSB0byBjcmVhdGUgYSByZXNvdXJjZSBidXQgdGhlCituYW1lIGlzIGFscmVhZHkgb2NjdXBpZWQgYnkgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCiAKLSAgSFRUUC8xLjEgMjAwIE9LCi0gIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKLSAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKzQxMiBQcmVjb25kaXRpb24gRmFpbGVkCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorYDQxMiBQcmVjb25kaXRpb24gRmFpbGVkYCBpcyB1c2VkIGlmIGEgcHJlY29uZGl0aW9uIGZyb20gdGhlIHJlcXVlc3QKK2hlYWRlciBmaWVsZHMgaXMgbm90IGZ1bGZpbGxlZCBhcyBkZXNjcmliZWQgaW4gdGhlIGxpbms6I3ByZWNvbmRpdGlvbnNbCitQcmVjb25kaXRpb25zXSBzZWN0aW9uLgogCi0gICldfScKLSAgewotICAgICJwcm9qZWN0IjogImRlbW8iLAotICAgICJicmFuY2giOiAibWFzdGVyIiwKLSAgICAiaWQiOiAiSWRhZjVlMDk4ZDcwODk4YjcxMTlmNmY0YWY1YTZjMTMzNDNkNjRiNTciLAotICAgICJzdWJqZWN0IjogIk9uZSBjaGFuZ2UiLAotICAgICJzdGF0dXMiOiAiTkVXIiwKLSAgICAiY3JlYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg1NDAwMDAwMCIsCi0gICAgInVwZGF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxOToyNy43NjYwMDAwMDAiLAotICAgICJyZXZpZXdlZCI6IHRydWUsCi0gICAgIl9zb3J0a2V5IjogIjAwMWU3MDU3MDAwMDA2ZGMiLAotICAgICJfbnVtYmVyIjogMTc1NiwKLSAgICAib3duZXIiOiB7Ci0gICAgICAibmFtZSI6ICJKb2huIERvZSIKLSAgICB9LAotICB9LAotICB7Ci0gICAgInByb2plY3QiOiAiZGVtbyIsCi0gICAgImJyYW5jaCI6ICJtYXN0ZXIiLAotICAgICJpZCI6ICJJMDljODA0MWI1ODY3ZDViMzMxNzAzMTZlMmFiYzM0Yjc5YmJiODUwMSIsCi0gICAgInN1YmplY3QiOiAiQW5vdGhlciBjaGFuZ2UiLAotICAgICJzdGF0dXMiOiAiTkVXIiwKLSAgICAiY3JlYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg4NDAwMDAwMCIsCi0gICAgInVwZGF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxODozMC44ODUwMDAwMDAiLAotICAgICJfc29ydGtleSI6ICIwMDFlNzA1NjAwMDAwNmRkIiwKLSAgICAiX251bWJlciI6IDE3NTcsCi0gICAgIm93bmVyIjogewotICAgICAgIm5hbWUiOiAiSm9obiBEb2UiCi0gICAgfSwKLSAgICAiX21vcmVfY2hhbmdlcyI6IHRydWUKLSAgfQotLS0tLQotCi1UaGUgY2hhbmdlIG91dHB1dCBpcyBzb3J0ZWQgYnkgdGhlIGxhc3QgdXBkYXRlIHRpbWUsIG1vc3QgcmVjZW50bHkKLXVwZGF0ZWQgdG8gb2xkZXN0IHVwZGF0ZS4KLQotSWYgdGhlIGBuYCBxdWVyeSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQgYW5kIGFkZGl0aW9uYWwgY2hhbmdlcyBleGlzdAotdGhhdCBtYXRjaCB0aGUgcXVlcnkgYmV5b25kIHRoZSBlbmQsIHRoZSBsYXN0IGNoYW5nZSBvYmplY3QgaGFzIGEKLWBfbW9yZV9jaGFuZ2VzOiB0cnVlYCBKU09OIGZpZWxkIHNldC4gQ2FsbGVycyBjYW4gcmVzdW1lIGEgcXVlcnkgd2l0aAotdGhlIGBuYCBxdWVyeSBwYXJhbWV0ZXIsIHN1cHBseWluZyB0aGUgbGFzdCBjaGFuZ2UncyBgX3NvcnRrZXlgIGZpZWxkCi1hcyB0aGUgdmFsdWUuIFdoZW4gZ29pbmcgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uIHdpdGggdGhlIGBwYCBxdWVyeQotcGFyYW1ldGVyIGEgYF9tb3JlX2NoYW5nZXM6IHRydWVgIGlzIHB1dCBpbiB0aGUgZmlyc3QgY2hhbmdlIG9iamVjdCBpZgotdGhlcmUgYXJlIHJlc3VsdHMgKmJlZm9yZSogdGhlIGZpcnN0IGNoYW5nZSByZXR1cm5lZC4KLQotQ2xpZW50cyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgcXVlcnkgYnkgc2V0dGluZyB0aGUgYHFgCi1wYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIEluIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IG9mCi1hcnJheXMsIG9uZSBwZXIgcXVlcnkgaW4gdGhlIHNhbWUgb3JkZXIgdGhlIHF1ZXJpZXMgd2VyZSBnaXZlbiBpbi4KLQotUXVlcnkgdGhhdCByZXRyaWV2ZXMgY2hhbmdlcyBmb3IgYSB1c2VyJ3MgZGFzaGJvYXJkOgotLS0tLQotICBHRVQgL2NoYW5nZXMvP2Zvcm1hdD1KU09OJnE9aXM6b3Blbitvd25lcjpzZWxmJnE9aXM6b3BlbityZXZpZXdlcjpzZWxmKy1vd25lcjpzZWxmJnE9aXM6Y2xvc2VkK293bmVyOnNlbGYrbGltaXQ6NSZvPUxBQkVMUyBIVFRQLzEuMAotCi0gIEhUVFAvMS4xIDIwMCBPSwotICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ci0gIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04Ci0KLSAgKV19JwotICBbCi0gICAgWwotICAgICAgewotICAgICAgICAicHJvamVjdCI6ICJkZW1vIiwKLSAgICAgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAotICAgICAgICAiaWQiOiAiSWRhZjVlMDk4ZDcwODk4YjcxMTlmNmY0YWY1YTZjMTMzNDNkNjRiNTciLAotICAgICAgICAic3ViamVjdCI6ICJPbmUgY2hhbmdlIiwKLSAgICAgICAgInN0YXR1cyI6ICJORVciLAotICAgICAgICAiY3JlYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg1NDAwMDAwMCIsCi0gICAgICAgICJ1cGRhdGVkIjogIjIwMTItMDctMTcgMDc6MTk6MjcuNzY2MDAwMDAwIiwKLSAgICAgICAgInJldmlld2VkIjogdHJ1ZSwKLSAgICAgICAgIl9zb3J0a2V5IjogIjAwMWU3MDU3MDAwMDA2ZGMiLAotICAgICAgICAiX251bWJlciI6IDE3NTYsCi0gICAgICAgICJvd25lciI6IHsKLSAgICAgICAgICAibmFtZSI6ICJKb2huIERvZSIKLSAgICAgICAgfSwKLSAgICAgICAgImxhYmVscyI6IHsKLSAgICAgICAgICAiVmVyaWZpZWQiOiB7fSwKLSAgICAgICAgICAiQ29kZS1SZXZpZXciOiB7fQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgXSwKLSAgICBbXSwKLSAgICBbXQotICBdCi0tLS0tCi0KLUFkZGl0aW9uYWwgZmllbGRzIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgYG9gIHBhcmFtZXRlcnMsIGVhY2gKLW9wdGlvbiByZXF1aXJlcyBtb3JlIGRhdGFiYXNlIGxvb2t1cHMgYW5kIHNsb3dzIGRvd24gdGhlIHF1ZXJ5Ci1yZXNwb25zZSB0aW1lIHRvIHRoZSBjbGllbnQgc28gdGhleSBhcmUgZ2VuZXJhbGx5IGRpc2FibGVkIGJ5Ci1kZWZhdWx0LiBPcHRpb25hbCBmaWVsZHMgYXJlOgotCi0qIGBMQUJFTFNgOiBhIHN1bW1hcnkgb2YgZWFjaCBsYWJlbCByZXF1aXJlZCBmb3Igc3VibWl0LCBhbmQKLSAgYXBwcm92ZXJzIHRoYXQgaGF2ZSBncmFudGVkIChvciByZWplY3RlZCkgd2l0aCB0aGF0IGxhYmVsLgotCi0qIGBDVVJSRU5UX1JFVklTSU9OYDogZGVzY3JpYmUgdGhlIGN1cnJlbnQgcmV2aXNpb24gKHBhdGNoIHNldCkKLSAgb2YgdGhlIGNoYW5nZSwgaW5jbHVkaW5nIHRoZSBjb21taXQgU0hBLTEgYW5kIFVSTHMgdG8gZmV0Y2ggZnJvbS4KLQotKiBgQUxMX1JFVklTSU9OU2A6IGRlc2NyaWJlIGFsbCByZXZpc2lvbnMsIG5vdCBqdXN0IGN1cnJlbnQuCi0KLSogYENVUlJFTlRfQ09NTUlUYDogcGFyc2UgYW5kIG91dHB1dCBhbGwgaGVhZGVyIGZpZWxkcyBmcm9tIHRoZQotICBjb21taXQgb2JqZWN0LCBpbmNsdWRpbmcgbWVzc2FnZS4gT25seSB2YWxpZCB3aGVuIHRoZSBjdXJyZW50Ci0gIHJldmlzaW9uIG9yIGFsbCByZXZpc2lvbnMgYXJlIHNlbGVjdGVkLgotCi0qIGBBTExfQ09NTUlUU2A6IHBhcnNlIGFuZCBvdXRwdXQgYWxsIGhlYWRlciBmaWVsZHMgZnJvbSB0aGUKLSAgb3V0cHV0IHJldmlzaW9ucy4gSWYgb25seSBgQ1VSUkVOVF9SRVZJU0lPTmAgd2FzIHJlcXVlc3RlZAotICB0aGVuIG9ubHkgdGhlIGN1cnJlbnQgcmV2aXNpb24ncyBjb21taXQgZGF0YSB3aWxsIGJlIG91dHB1dC4KLQotKiBgQ1VSUkVOVF9GSUxFU2A6IGxpc3QgZmlsZXMgbW9kaWZpZWQgYnkgdGhlIGNvbW1pdCwgaW5jbHVkaW5nCi0gIGJhc2ljIGxpbmUgY291bnRzIGluc2VydGVkL2RlbGV0ZWQgcGVyIGZpbGUuIE9ubHkgdmFsaWQgd2hlbgotICB0aGUgY3VycmVudCByZXZpc2lvbiBvciBhbGwgcmV2aXNpb25zIGFyZSBzZWxlY3RlZC4KLQotKiBgQUxMX0ZJTEVTYDogbGlzdCBmaWxlcyBtb2RpZmllZCBieSB0aGUgY29tbWl0LCBpbmNsdWRpbmcKLSAgYmFzaWMgbGluZSBjb3VudHMgaW5zZXJ0ZWQvZGVsZXRlZCBwZXIgZmlsZS4gSWYgb25seSB0aGUKLSAgYENVUlJFTlRfUkVWSVNJT05gIHdhcyByZXF1ZXN0ZWQgdGhlIG9ubHkgdGhhdCBjb21taXQncwotICBtb2RpZmllZCBmaWxlcyB3aWxsIGJlIG91dHB1dC4KLQotLS0tLQotICBHRVQgL2NoYW5nZXMvP3E9OTcmZm9ybWF0PUpTT04mbz1DVVJSRU5UX1JFVklTSU9OJm89Q1VSUkVOVF9DT01NSVQmbz1DVVJSRU5UX0ZJTEVTIEhUVFAvMS4wCi0KLSAgSFRUUC8xLjEgMjAwIE9LCi0gIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKLSAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKLQotICApXX0nCi0gIFsKLSAgICB7Ci0gICAgICAicHJvamVjdCI6ICJnZXJyaXQiLAotICAgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAotICAgICAgImlkIjogIkk3ZWE0NmQyZTJlZTVjNjRjMGQ4MDc2Nzc4NTljZmI3ZDkwYjg5NjZhIiwKLSAgICAgICJzdWJqZWN0IjogIlVzZSBhbiBFdmVudEJ1cyB0byBtYW5hZ2Ugc3RhciBpY29ucyIsCi0gICAgICAic3RhdHVzIjogIk5FVyIsCi0gICAgICAiY3JlYXRlZCI6ICIyMDEyLTA0LTI1IDAwOjUyOjI1LjU4MDAwMDAwMCIsCi0gICAgICAidXBkYXRlZCI6ICIyMDEyLTA0LTI1IDAwOjUyOjI1LjU4NjAwMDAwMCIsCi0gICAgICAiX3NvcnRrZXkiOiAiMDAxYzliZjQwMDAwMDA2MSIsCi0gICAgICAiX251bWJlciI6IDk3LAotICAgICAgIm93bmVyIjogewotICAgICAgICAibmFtZSI6ICJTaGF3biBQZWFyY2UiCi0gICAgICB9LAotICAgICAgImN1cnJlbnRfcmV2aXNpb24iOiAiMTg0ZWJlNTM4MDVlMTAyNjA1ZDExZjZiMTQzNDg2ZDE1YzIzYTA5YyIsCi0gICAgICAicmV2aXNpb25zIjogewotICAgICAgICAiMTg0ZWJlNTM4MDVlMTAyNjA1ZDExZjZiMTQzNDg2ZDE1YzIzYTA5YyI6IHsKLSAgICAgICAgICAiX251bWJlciI6IDEsCi0gICAgICAgICAgImZldGNoIjogewotICAgICAgICAgICAgImdpdCI6IHsKLSAgICAgICAgICAgICAgInVybCI6ICJnaXQ6Ly9sb2NhbGhvc3QvZ2Vycml0IiwKLSAgICAgICAgICAgICAgInJlZiI6ICJyZWZzL2NoYW5nZXMvOTcvOTcvMSIKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiaHR0cCI6IHsKLSAgICAgICAgICAgICAgInVybCI6ICJodHRwOi8vMTI3LjAuMC4xOjgwODAvZ2Vycml0IiwKLSAgICAgICAgICAgICAgInJlZiI6ICJyZWZzL2NoYW5nZXMvOTcvOTcvMSIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9LAotICAgICAgICAgICJjb21taXQiOiB7Ci0gICAgICAgICAgICAicGFyZW50cyI6IFsKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICJjb21taXQiOiAiMWVlZTJjOWQ4ZjM1MjQ4Mzc4MWU3NzJmMzVkYzU4NmE2OWZmNTY0NiIsCi0gICAgICAgICAgICAgICAgInN1YmplY3QiOiAiTWlncmF0ZSBjb250cmlidXRvciBhZ3JlZW1lbnRzIHRvIEFsbC1Qcm9qZWN0cy4iCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAiYXV0aG9yIjogewotICAgICAgICAgICAgICAibmFtZSI6ICJTaGF3biBPLiBQZWFyY2UiLAotICAgICAgICAgICAgICAiZW1haWwiOiAic29wQGdvb2dsZS5jb20iLAotICAgICAgICAgICAgICAiZGF0ZSI6ICIyMDEyLTA0LTI0IDE4OjA4OjA4LjAwMDAwMDAwMCIsCi0gICAgICAgICAgICAgICJ0eiI6IC00MjAKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiY29tbWl0dGVyIjogewotICAgICAgICAgICAgICAibmFtZSI6ICJTaGF3biBPLiBQZWFyY2UiLAotICAgICAgICAgICAgICAiZW1haWwiOiAic29wQGdvb2dsZS5jb20iLAotICAgICAgICAgICAgICAiZGF0ZSI6ICIyMDEyLTA0LTI0IDE4OjA4OjA4LjAwMDAwMDAwMCIsCi0gICAgICAgICAgICAgICJ0eiI6IC00MjAKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAic3ViamVjdCI6ICJVc2UgYW4gRXZlbnRCdXMgdG8gbWFuYWdlIHN0YXIgaWNvbnMiLAotICAgICAgICAgICAgIm1lc3NhZ2UiOiAiVXNlIGFuIEV2ZW50QnVzIHRvIG1hbmFnZSBzdGFyIGljb25zXG5cbkltYWdlIHdpZGdldHMgdGhhdCBuZWVkIHRvIC4uLiIKLSAgICAgICAgICB9LAotICAgICAgICAgICJmaWxlcyI6IHsKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDYWNoZS5qYXZhIjogewotICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDgKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGV0YWlsQ2FjaGUuamF2YSI6IHsKLSAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YSI6IHsKLSAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMTEsCi0gICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMTkKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlVGFibGUuamF2YSI6IHsKLSAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMjMsCi0gICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMjAKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhckNhY2hlLmphdmEiOiB7Ci0gICAgICAgICAgICAgICJzdGF0dXMiOiAiRCIsCi0gICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMTM5Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N0YXJyZWRDaGFuZ2VzLmphdmEiOiB7Ci0gICAgICAgICAgICAgICJzdGF0dXMiOiAiQSIsCi0gICAgICAgICAgICAgICJsaW5lc19pbnNlcnRlZCI6IDIwNAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuLmphdmEiOiB7Ci0gICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogOQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgXQotLS0tLQotCis0MjIgVW5wcm9jZXNzYWJsZSBFbnRpdHkKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorYDQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eWAgaXMgcmV0dXJuZWQgaWYgdGhlIElEIG9mIGEgcmVzb3VyY2UgdGhhdCBpcworc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IGJvZHkgY2Fubm90IGJlIHJlc29sdmVkLgogCiBHRVJSSVQKIC0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLWNoYW5nZWlkLnR4dCBiL0RvY3VtZW50YXRpb24vdXNlci1jaGFuZ2VpZC50eHQKaW5kZXggYTMwMTVlMS4uYTQyMjRiZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2VyLWNoYW5nZWlkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItY2hhbmdlaWQudHh0CkBAIC0xMCwxMCArMTAsMTAgQEAKIEdlcnJpdCBjYW4gYXV0b21hdGljYWxseSBhc3NvY2lhdGUgYSBuZXcgdmVyc2lvbiBvZiBhIGNoYW5nZSBiYWNrCiB0byBpdHMgb3JpZ2luYWwgcmV2aWV3LCBldmVuIGFjcm9zcyBjaGVycnktcGlja3MgYW5kIHJlYmFzZXMuCiAKLVRvIGJlIHBpY2tlZCB1cCBieSBHZXJyaXQsIGEgQ2hhbmdlLUlkIGxpbmUgbXVzdCBiZSBpbiB0aGUgYm90dG9tCi1wb3J0aW9uIChsYXN0IHBhcmFncmFwaCkgb2YgYSBjb21taXQgbWVzc2FnZSwgYW5kIG1heSBiZSBtaXhlZAotdG9nZXRoZXIgd2l0aCB0aGUgU2lnbmVkLW9mZi1ieSwgQWNrZWQtYnksIG9yIG90aGVyIHN1Y2ggZm9vdGVycy4KLUZvciBleGFtcGxlOgorVG8gYmUgcGlja2VkIHVwIGJ5IEdlcnJpdCwgYSBDaGFuZ2UtSWQgbGluZSBtdXN0IGJlIGluIHRoZSBmb290ZXIKKyhsYXN0IHBhcmFncmFwaCkgb2YgYSBjb21taXQgbWVzc2FnZSwgYW5kIG1heSBiZSBtaXhlZAordG9nZXRoZXIgd2l0aCBsaW5rOnVzZXItc2lnbmVkb2ZmYnkuaHRtbFtTaWduZWQtb2ZmLWJ5XSwgQWNrZWQtYnksCitvciBvdGhlciBzdWNoIGxpbmVzLiBGb3IgZXhhbXBsZToKIAogLS0tLQogICAkIGdpdCBsb2cgLTEKQEAgLTQwLDYgKzQwLDcgQEAKIFRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIGNvbW1pdCBuYW1lcywgQ2hhbmdlLUlkcyBhcmUgdHlwaWNhbGx5IHByZWZpeGVkIHdpdGgKIGFuIHVwcGVyY2FzZSBgSWAuCiAKK1tbY3JlYXRpb25dXQogQ3JlYXRpb24KIC0tLS0tLS0tCiAKQEAgLTU0LDYgKzU1LDEwIEBACiAKICAgJCBjdXJsIC1vIC5naXQvaG9va3MvY29tbWl0LW1zZyBodHRwOi8vcmV2aWV3LmV4YW1wbGUuY29tL3Rvb2xzL2hvb2tzL2NvbW1pdC1tc2cKIAorVGhlbiBlbnN1cmUgdGhhdCB0aGUgZXhlY3V0ZSBiaXQgaXMgc2V0IG9uIHRoZSBob29rIHNjcmlwdDoKKworICAkIGNobW9kIHUreCAuZ2l0L2hvb2tzL2NvbW1pdC1tc2cKKwogRm9yIG1vcmUgZGV0YWlscywgc2VlIGxpbms6Y21kLWhvb2stY29tbWl0LW1zZy5odG1sW2NvbW1pdC1tc2ddLgogCiBDaGFuZ2UgVXBsb2FkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXItY3VzdG9tLWRhc2hib2FyZHMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLWN1c3RvbS1kYXNoYm9hcmRzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNWU0Yy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXItY3VzdG9tLWRhc2hib2FyZHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotR2Vycml0IENvZGUgUmV2aWV3IC0gQ3VzdG9tIERhc2hib2FyZHMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLURlc2NyaXB0aW9uCi0tLS0tLS0tLS0tLQotCi1BIGN1c3RvbSBkYXNoYm9hcmQgaXMgc2hvd24gaW4gYSBsYXlvdXQgc2ltaWxhciB0byB0aGUgcGVyLXVzZXIKLWRhc2hib2FyZCwgYnV0IHRoZSBzZWN0aW9ucyBhcmUgZW50aXJlbHkgY29uZmlndXJlZCBmcm9tIHRoZSBVUkwuCi1CZWNhdXNlIG9mIHRoaXMgY3VzdG9tIGRhc2hib2FyZHMgYXJlIHN0YXRlbGVzcyBvbiB0aGUgc2VydmVyIHNpZGUuCi1Vc2VycyBvciBwcm9qZWN0cyBjYW4gc2ltcGx5IHRyYWRlIFVSTHMgdXNpbmcgYW4gZXh0ZXJuYWwgc3lzdGVtIGxpa2UKLWEgcHJvamVjdCB3aWtpLCBvciBzaXRlIGFkbWluaXN0cmF0b3JzIGNhbiBwdXQgdGhlIGxpbmtzIGludG8gdGhlCi1zaXRlJ3MgYEdlcnJpdEhlYWRlci5odG1sYCBvciBgR2Vycml0Rm9vdGVyLmh0bWxgLgotCi1EYXNoYm9hcmRzIGFyZSBhdmFpbGFibGUgdmlhIFVSTHMgbGlrZToKLS0tLS0KLSAgLyMvZGFzaGJvYXJkLz90aXRsZT1DdXN0b20rVmlldyZUbytSZXZpZXc9cmV2aWV3ZXI6am9obi5kb2VAZXhhbXBsZS5jb20mUGVuZGluZytJbitteXByb2plY3Q9cHJvamVjdDpteXByb2plY3QraXM6b3BlbgotLS0tLQotVGhpcyBvcGVucyBhIHZpZXcgc2hvd2luZyB0aGUgdGl0bGUgIkN1c3RvbSBWaWV3IiB3aXRoIHR3byBzZWN0aW9ucywKLSJUbyBSZXZpZXciIGFuZCAiUGVuZGluZyBpbiBteXByb2plY3QiOgotLS0tLQotICBDdXN0b20gVmlldwotCi0gIFRvIFJldmlldwotCi0gICAgUmVzdWx0cyBvZiBgcmV2aWV3ZXI6am9obi5kb2VAZXhhbXBsZS5jb21gCi0KLSAgUGVuZGluZyBJbiBteXByb2plY3QKLQotICAgIFJlc3VsdHMgb2YgYHByb2plY3Q6bXlwcm9qZWN0IGlzOm9wZW5gCi0tLS0tCi0KLVRoZSBkYXNoYm9hcmQgVVJMcyBhcmUgZWFzeSB0byBjb25maWd1cmUuIEFsbCBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlCi1VUkwgYXJlIGVuY29kZWQgYXMgcXVlcnkgcGFyYW1ldGVycy4gU2V0IHRoZSBwYWdlIGFuZCB3aW5kb3cgdGl0bGUKLXVzaW5nIGFuIG9wdGlvbmFsIGB0aXRsZT1UZXh0YCBwYXJhbWV0ZXIuCi0KLUVhY2ggc2VjdGlvbidzIHRpdGxlIGlzIGRlZmluZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLCB0aGUgc2VjdGlvbgotZGlzcGxheSBvcmRlciBpcyBkZWZpbmVkIGJ5IHRoZSBvcmRlciB0aGUgcGFyYW1ldGVycyBhcHBlYXIgaW4gdGhlCi1VUkwsIGFuZCB0aGUgcXVlcnkgcmVzdWx0cyBhcmUgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHZhbHVlLiBUbwotbGltaXQgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcXVlcnkgdXNlIGBsaW1pdDpOYCwgb3RoZXJ3aXNlIHRoZQotZW50aXJlIHJlc3VsdCBzZXQgd2lsbCBiZSBzaG93biAodXAgdG8gdGhlIHVzZXIncyBxdWVyeSBsaW1pdCkuCi0KLVBhcmFtZXRlcnMgbWF5IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgdXNpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKLWNoYXJhY3RlcnMsIGFzIHNvbWUgdXNlcnMgbWF5IGZpbmQgb25lIG1vcmUgcmVhZGFibGUgdGhhbiBhbm90aGVyOgotYCZgIG9yIGA7YCBvciBgLGAKLQotR0VSUklUCi0tLS0tLS0KLVBhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1kYXNoYm9hcmRzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNlci1kYXNoYm9hcmRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEyYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi91c2VyLWRhc2hib2FyZHMudHh0CkBAIC0wLDAgKzEsMTY5IEBACitHZXJyaXQgQ29kZSBSZXZpZXcgLSBEYXNoYm9hcmRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0N1c3RvbSBEYXNoYm9hcmRzCistLS0tLS0tLS0tLS0tLS0tLQorCitBIGN1c3RvbSBkYXNoYm9hcmQgaXMgc2hvd24gaW4gYSBsYXlvdXQgc2ltaWxhciB0byB0aGUgcGVyLXVzZXIKK2Rhc2hib2FyZCwgYnV0IHRoZSBzZWN0aW9ucyBhcmUgZW50aXJlbHkgY29uZmlndXJlZCBmcm9tIHRoZSBVUkwuCitCZWNhdXNlIG9mIHRoaXMgY3VzdG9tIGRhc2hib2FyZHMgYXJlIHN0YXRlbGVzcyBvbiB0aGUgc2VydmVyIHNpZGUuCitVc2VycyBvciBwcm9qZWN0cyBjYW4gc2ltcGx5IHRyYWRlIFVSTHMgdXNpbmcgYW4gZXh0ZXJuYWwgc3lzdGVtIGxpa2UKK2EgcHJvamVjdCB3aWtpLCBvciBzaXRlIGFkbWluaXN0cmF0b3JzIGNhbiBwdXQgdGhlIGxpbmtzIGludG8gdGhlCitzaXRlJ3MgYEdlcnJpdEhlYWRlci5odG1sYCBvciBgR2Vycml0Rm9vdGVyLmh0bWxgLgorCitEYXNoYm9hcmRzIGFyZSBhdmFpbGFibGUgdmlhIFVSTHMgbGlrZToKKy0tLS0KKyAgLyMvZGFzaGJvYXJkLz90aXRsZT1DdXN0b20rVmlldyZUbytSZXZpZXc9cmV2aWV3ZXI6am9obi5kb2VAZXhhbXBsZS5jb20mUGVuZGluZytJbitteXByb2plY3Q9cHJvamVjdDpteXByb2plY3QraXM6b3BlbgorLS0tLQorVGhpcyBvcGVucyBhIHZpZXcgc2hvd2luZyB0aGUgdGl0bGUgIkN1c3RvbSBWaWV3IiB3aXRoIHR3byBzZWN0aW9ucywKKyJUbyBSZXZpZXciIGFuZCAiUGVuZGluZyBpbiBteXByb2plY3QiOgorLS0tLQorICBDdXN0b20gVmlldworCisgIFRvIFJldmlldworCisgICAgUmVzdWx0cyBvZiBgcmV2aWV3ZXI6am9obi5kb2VAZXhhbXBsZS5jb21gCisKKyAgUGVuZGluZyBJbiBteXByb2plY3QKKworICAgIFJlc3VsdHMgb2YgYHByb2plY3Q6bXlwcm9qZWN0IGlzOm9wZW5gCistLS0tCisKK1RoZSBkYXNoYm9hcmQgVVJMcyBhcmUgZWFzeSB0byBjb25maWd1cmUuIEFsbCBrZXlzIGFuZCB2YWx1ZXMgaW4gdGhlCitVUkwgYXJlIGVuY29kZWQgYXMgcXVlcnkgcGFyYW1ldGVycy4gU2V0IHRoZSBwYWdlIGFuZCB3aW5kb3cgdGl0bGUKK3VzaW5nIGFuIG9wdGlvbmFsIGB0aXRsZT1UZXh0YCBwYXJhbWV0ZXIuCisKK0VhY2ggc2VjdGlvbidzIHRpdGxlIGlzIGRlZmluZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLCB0aGUgc2VjdGlvbgorZGlzcGxheSBvcmRlciBpcyBkZWZpbmVkIGJ5IHRoZSBvcmRlciB0aGUgcGFyYW1ldGVycyBhcHBlYXIgaW4gdGhlCitVUkwsIGFuZCB0aGUgcXVlcnkgcmVzdWx0cyBhcmUgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHZhbHVlLiBUbworbGltaXQgdGhlIG51bWJlciBvZiByb3dzIGluIGEgcXVlcnkgdXNlIGBsaW1pdDpOYCwgb3RoZXJ3aXNlIHRoZQorZW50aXJlIHJlc3VsdCBzZXQgd2lsbCBiZSBzaG93biAodXAgdG8gdGhlIHVzZXIncyBxdWVyeSBsaW1pdCkuCisKK1BhcmFtZXRlcnMgbWF5IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgdXNpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKK2NoYXJhY3RlcnMsIGFzIHNvbWUgdXNlcnMgbWF5IGZpbmQgb25lIG1vcmUgcmVhZGFibGUgdGhhbiBhbm90aGVyOgorYCZgIG9yIGA7YCBvciBgLGAKKworVGhlIHNwZWNpYWwgYGZvcmVhY2g9Li4uYCBwYXJhbWV0ZXIgaXMgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZQorbW9yZSBlYXNpbHkgd3JpdHRpbmcgc2ltaWxhciBxdWVyaWVzIGluIGEgZGFzaGJvYXJkLiAgVGhlIHZhbHVlIG9mIHRoZQorZm9yZWFjaCBwYXJhbWV0ZXIgd2lsbCBiZSB1c2VkIGluIGV2ZXJ5IHF1ZXJ5IGluIHRoZSBkYXNoYm9hcmQgYnkKK2FwcGVuZGluZyBpdCB0byB0aGVpciBlbmRzIHdpdGggYSBzcGFjZSAoQU5EaW5nIGl0IHdpdGggdGhlIHF1ZXJpZXMpLgorCitFeGFtcGxlIGN1c3RvbSBkYXNoYm9hcmQgdXNpbmcgZm9yZWFjaCB0byBjb25zdHJhaW4gYSBkYXNoYm9hcmQKK3RvIGNoYW5nZXMgZm9yIHRoZSBjdXJyZW50IHVzZXI6CisKKy0tLS0KKyAgLyMvZGFzaGJvYXJkLz90aXRsZT1NaW5lJmZvcmVhY2g9b3duZXI6c2VsZiZNeStQZW5kaW5nPWlzOm9wZW4mTXkrTWVyZ2VkPWlzOm1lcmdlZAorLS0tLQorCisKK1tbcHJvamVjdC1kYXNoYm9hcmRzXV0KK1Byb2plY3QgRGFzaGJvYXJkcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHBvc3NpYmxlIHRvIHNoYXJlIGN1c3RvbSBkYXNoYm9hcmRzIGF0IGEgcHJvamVjdCBsZXZlbC4gVG8gZG8KK3RoaXMgZGVmaW5lIHRoZSBkYXNoYm9hcmRzIGluIGEgYHJlZnMvbWV0YS9kYXNoYm9hcmRzLypgIGJyYW5jaCBvZiB0aGUKK3Byb2plY3QuIEZvciBlYWNoIGRhc2hib2FyZCBjcmVhdGUgYSBjb25maWcgZmlsZS4gVGhlIGZpbGUgcGF0aC9uYW1lCit3aWxsIGJlIHVzZWQgYXMgbmFtZSAoZXF1aXZhbGVudCB0byBhIHRpdGxlIGluIGEgY3VzdG9tIGRhc2hib2FyZCkgZm9yCit0aGUgZGFzaGJvYXJkLgorCitFeGFtcGxlIGRhc2hib2FyZCBjb25maWcgZmlsZSBgTXlQcm9qZWN0IERhc2hib2FyZGA6CisKKy0tLS0KK1tkYXNoYm9hcmRdCisgIGRlc2NyaXB0aW9uID0gTW9zdCByZWNlbnQgb3BlbiBhbmQgbWVyZ2VkIGNoYW5nZXMuCitbc2VjdGlvbiAiT3BlbiBDaGFuZ2VzIl0KKyAgcXVlcnkgPSBzdGF0dXM6b3BlbiBwcm9qZWN0Om15UHJvamVjdCBsaW1pdDoxNQorW3NlY3Rpb24gIk1lcmdlZCBDaGFuZ2VzIl0KKyAgcXVlcnkgPSBzdGF0dXM6bWVyZ2VkIHByb2plY3Q6bXlQcm9qZWN0IGxpbWl0OjE1CistLS0tCisKK09uY2UgZGVmaW5lZCwgcHJvamVjdCBkYXNoYm9hcmRzIGFyZSBhY2Nlc3NpYmxlIHVzaW5nIHN0YWJsZSBVUkxzIGJ5Cit1c2luZyB0aGUgcHJvamVjdCBuYW1lLCByZWZuYW1lIGFuZCBwYXRobmFtZSBvZiB0aGUgZGFzaGJvYXJkIHZpYSBVUkxzCitsaWtlOgorLS0tLQorICAvIy9wcm9qZWN0cy9BbGwtUHJvamVjdHMsZGFzaGJvYXJkcy9TaXRlOk1haW4KKy0tLS0KKworUHJvamVjdCBkYXNoYm9hcmRzIGFyZSBpbmhlcml0ZWQgZnJvbSBhbmNlc3RvciBwcm9qZWN0cyB1bmxlc3MKK292ZXJyaWRkZW4gYnkgZGFzaGJvYXJkcyB3aXRoIHRoZSBzYW1lIHJlZiBhbmQgbmFtZS4gIFRoaXMgbWFrZXMKK2l0IGVhc3kgdG8gZGVmaW5lIGNvbW1vbiBkYXNoYm9hcmRzIGZvciBldmVyeSBwcm9qZWN0IGJ5IHNpbXBseQorZGVmaW5pbmcgcHJvamVjdCBkYXNoYm9hcmRzIG9uIHRoZSBBbGwtUHJvamVjdHMgcHJvamVjdC4KKworVG9rZW4gYCR7cHJvamVjdH1gCit+fn5+fn5+fn5+fn5+fn5+fn4KKworUHJvamVjdCBkYXNoYm9hcmQgcXVlcmllcyBtYXkgY29udGFpbiB0aGUgc3BlY2lhbCBgJHtwcm9qZWN0fWAgdG9rZW4KK3doaWNoIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUKK2Rhc2hib2FyZCBpcyBiZWluZyBhcHBsaWVkLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGRhc2hib2FyZHMKK2Rlc2lnbmVkIHRvIGJlIGluaGVyaXRlZC4gIFdpdGggdGhpcyB0b2tlbiwgaXQgaXMgcG9zc2libGUgdG8gY2F1c2UgYQorcXVlcnkgaW4gYSBwcm9qZWN0IGRhc2hib2FyZCB0byBiZSByZXN0cmljdGVkIHRvIG9ubHkgY2hhbmdlcyBmb3IgdGhlCitwcm9qZWN0IGluIHdoaWNoIGFuIGluaGVyaXRlZCBkYXNoYm9hcmQgaXMgYmVpbmcgYXBwbGllZCBieSBzaW1wbHkKK2FkZGluZyBgcHJvamVjdDoke3Byb2plY3R9YCB0byB0aGUgcXVlcnkgaW4gdGhlIGRhc2hib2FyZC4KKworVGhlIGAke3Byb2plY3R9YCB0b2tlbiBjYW4gYWxzbyBiZSB1c2VkIGluIHRoZSBsaW5rOiNkYXNoYm9hcmQudGl0bGVbCitkYXNoYm9hcmQgdGl0bGVdIGFuZCBpbiB0aGUgbGluazojZGFzaGJvYXJkLmRlc2NyaXB0aW9uW2Rhc2hib2FyZAorZGVzY3JpcHRpb25dLgorCitTZWN0aW9uIGBkYXNoYm9hcmRgCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1tbZGFzaGJvYXJkLnRpdGxlXV1kYXNoYm9hcmQudGl0bGU6OgorKworVGhlIHRpdGxlIG9mIHRoZSBkYXNoYm9hcmQuCisrCitJZiBub3Qgc3BlY2lmaWVkIHRoZSBwYXRoIG9mIHRoZSBkYXNoYm9hcmQgY29uZmlnIGZpbGUgaXMgdXNlZCBhcwordGl0bGUuCisKK1tbZGFzaGJvYXJkLmRlc2NyaXB0aW9uXV1kYXNoYm9hcmQuZGVzY3JpcHRpb246OgorKworVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXNoYm9hcmQuCisKK2Rhc2hib2FyZC5mb3JlYWNoOjoKKysKK1RoZSB2YWx1ZSBvZiB0aGUgZm9yZWFjaCBwYXJhbWV0ZXIgZ2V0cyBhcHBlbmRlZCB0byBldmVyeSBxdWVyeSBpbiB0aGUKK2Rhc2hib2FyZC4KKysKK0V4YW1wbGUgZGFzaGJvYXJkIGNvbmZpZyBzZWN0aW9uIHRvIGNvbnN0cmFpbiB0aGUgZW50aXJlIGRhc2hib2FyZCB0bwordGhlIHByb2plY3QgdG8gd2hpY2ggaXQgaXMgYXBwbGllZDoKKysKKy0tLS0KK1tkYXNoYm9hcmRdCisgIGZvcmVhY2ggPSBwcm9qZWN0OiR7cHJvamVjdH0KKy0tLS0KKworCitTZWN0aW9uIGBzZWN0aW9uYAorfn5+fn5+fn5+fn5+fn5+fn4KKworc2VjdGlvbi48bmFtZT4ucXVlcnk6OgorKworVGhlIGNoYW5nZSBxdWVyeSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZSBzZWN0aW9uIHdpdGggdGhlCitnaXZlbiBuYW1lLgorCitbW3Byb2plY3QtZGVmYXVsdC1kYXNoYm9hcmRdXQorUHJvamVjdCBEZWZhdWx0IERhc2hib2FyZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgYSBkZWZhdWx0IGRhc2hib2FyZCBmb3IgYSBwcm9qZWN0IGluIHRoZQorcHJvamVjdHMgYHByb2plY3QuY29uZmlnYCBmaWxlIGluIHRoZSBgcmVmcy9tZXRhL2NvbmZpZ2AgYnJhbmNoOgorCistLS0tCitbZGFzaGJvYXJkXQorICBkZWZhdWx0ID0gcmVmcy9tZXRhL2Rhc2hib2FyZHMvbWFpbjpkZWZhdWx0CistLS0tCisKK1RoZSBkYXNoYm9hcmQgc2V0IGFzIHRoZSBkZWZhdWx0IGRhc2hib2FyZCB3aWxsIGJlIGluaGVyaXRlZCBhcyB0aGUKK2RlZmF1bHQgZGFzaGJvYXJkIGJ5IGNoaWxkIHByb2plY3RzIGlmIHRoZXkgZG8gbm90IGRlZmluZSB0aGVpciBvd24KK2RlZmF1bHQgZGFzaGJvYXJkLiBUaGUgYGxvY2FsLWRlZmF1bHRgIGVudHJ5IG1ha2VzIGl0IHBvc3NpYmxlIHRvCitkZWZpbmUgYSBkaWZmZXJlbnQgZGVmYXVsdCBkYXNoYm9hcmQgdGhhdCBpcyBvbmx5IHVzZWQgYnkgdGhpcyBwcm9qZWN0CitidXQgbm90IGluaGVyaXRlZCB0byB0aGUgY2hpbGQgcHJvamVjdHMuCisKKy0tLS0KK1tkYXNoYm9hcmRdCisgIGRlZmF1bHQgPSByZWZzL21ldGEvZGFzaGJvYXJkcy9tYWluOmRlZmF1bHQKKyAgbG9jYWwtZGVmYXVsdCA9IHJlZnMvbWV0YS9kYXNoYm9hcmRzL21haW46bG9jYWwKKy0tLS0KKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1ub3RpZnkudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLW5vdGlmeS50eHQKaW5kZXggYWUzYzJkMDkuLjcxMWQxYWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNlci1ub3RpZnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNlci1ub3RpZnkudHh0CkBAIC0xOCw5ICsxOCw5IEBACiBgQWxsLVByb2plY3RzYCBjYW4gYmUgd2F0Y2hlZCB0byB3YXRjaCBhbGwgcHJvamVjdHMgdGhhdAogYXJlIHZpc2libGUgdG8gdGhlIHVzZXIuCiAKLUNoYW5nZSBzZWFyY2ggZXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIGNoYW5nZSBub3RpZmljYXRpb25zCi10byBzcGVjaWZpYyBzdWJzZXRzLCBmb3IgZXhhbXBsZSBgYnJhbmNoOm1hc3RlcmAgdG8gb25seSBzZWUgY2hhbmdlcwotcHJvcG9zZWQgZm9yIHRoZSBtYXN0ZXIgYnJhbmNoLgorbGluazp1c2VyLXNlYXJjaC5odG1sW0NoYW5nZSBzZWFyY2ggZXhwcmVzc2lvbnNdIGNhbiBiZSB1c2VkIHRvIGZpbHRlcgorY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gc3BlY2lmaWMgc3Vic2V0cywgZm9yIGV4YW1wbGUgYGJyYW5jaDptYXN0ZXJgCit0byBvbmx5IHNlZSBjaGFuZ2VzIHByb3Bvc2VkIGZvciB0aGUgbWFzdGVyIGJyYW5jaC4KIAogUHJvamVjdCBMZXZlbCBTZXR0aW5ncwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTIsMTMgKzkyLDI1IEBACiBhcmUgc2VudC4KICsKICogYG5ld19jaGFuZ2VzYDogT25seSBuZXdseSBjcmVhdGVkIGNoYW5nZXMuCisqIGBuZXdfcGF0Y2hzZXRzYDogT25seSBuZXdseSBjcmVhdGVkIHBhdGNoIHNldHMuCiAqIGBhbGxfY29tbWVudHNgOiBPbmx5IGNvbW1lbnRzIG9uIGV4aXN0aW5nIGNoYW5nZXMuCiAqIGBzdWJtaXR0ZWRfY2hhbmdlc2A6IE9ubHkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQuCisqIGBhYmFuZG9uZWRfY2hhbmdlc2A6IE9ubHkgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBhYmFuZG9uZWQuCiAqIGBhbGxgOiBBbGwgbm90aWZpY2F0aW9ucy4KIAogKwogTGlrZSBlbWFpbCwgdGhpcyB2YXJpYWJsZSBtYXkgYmUgYSBsaXN0IG9mIG9wdGlvbnMuCiAKK1tbbm90aWZ5Lm5hbWUuaGVhZGVyXV1ub3RpZnkuPG5hbWU+LmhlYWRlcjo6CisrCitFbWFpbCBoZWFkZXIgdXNlZCB0byBsaXN0IHRoZSBkZXN0aW5hdGlvbi4gSWYgbm90IHNldCBCQ0MgaXMgdXNlZC4KK09ubHkgb25lIHZhbHVlIG1heSBiZSBzcGVjaWZpZWQuIFRvIHVzZSBkaWZmZXJlbnQgaGVhZGVycyBmb3IgZWFjaAorYWRkcmVzcyBsaXN0IHRoZW0gaW4gZGlmZmVyZW50IG5vdGlmeSBibG9ja3MuCisrCisqIGB0b2A6IFRoZSBzdGFuZGFyZCBUbyBmaWVsZCBpcyB1c2VkOyBhZGRyZXNzZXMgYXJlIHZpc2libGUgdG8gYWxsLgorKiBgY2NgOiBUaGUgc3RhbmRhcmQgQ0MgZmllbGQgaXMgdXNlZDsgYWRkcmVzc2VzIGFyZSB2aXNpYmxlIHRvIGFsbC4KKyogYGJjY2A6IFNNVFAgUkNQVCBUTyBpcyB1c2VkIHRvIGhpZGUgdGhlIGFkZHJlc3MuCisKIFtbbm90aWZ5Lm5hbWUuZmlsdGVyXV1ub3RpZnkuPG5hbWU+LmZpbHRlcjo6CiArCiBsaW5rOnVzZXItc2VhcmNoLmh0bWxbQ2hhbmdlIHNlYXJjaCBleHByZXNzaW9uXSB0byBtYXRjaCBjaGFuZ2VzIHRoYXQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1zZWFyY2gudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLXNlYXJjaC50eHQKaW5kZXggOGEyMzFmZS4uZjQzMjhiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2VyLXNlYXJjaC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2VyLXNlYXJjaC50eHQKQEAgLTEsNyArMSw3IEBACiBHZXJyaXQgQ29kZSBSZXZpZXcgLSBTZWFyY2hpbmcgQ2hhbmdlcwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotRGVmYXVsdCBTZWFyY2hlcyAKK0RlZmF1bHQgU2VhcmNoZXMKIC0tLS0tLS0tLS0tLS0tLS0KIAogTW9zdCBiYXNpYyBzZWFyY2hlcyBjYW4gYmUgdmlld2VkIGJ5IGNsaWNraW5nIG9uIGEgbGluayBhbG9uZyB0aGUgdG9wCkBAIC0yMyw2ICsyMyw3IEBACiB8T3BlbiBjaGFuZ2VzIGluIEZvbyAgfCBzdGF0dXM6b3BlbiBwcm9qZWN0OkZvbwogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorCiBCYXNpYyBDaGFuZ2UgU2VhcmNoCiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM2LDcgKzM3LDcgQEAKIHxGdWxsIG9yIGFiYnJldmlhdGVkIENoYW5nZS1JZCAgICB8IEljMGZmMzMKIHxGdWxsIG9yIGFiYnJldmlhdGVkIGNvbW1pdCBTSEEtMSB8IGQ4MWIzMmVmCiB8RW1haWwgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgfCB1c2VyQGV4YW1wbGUuY29tCi18QXBwcm92YWwgcmVxdWlyZW1lbnQgICAgICAgICAgICAgfCBDb2RlUmV2aWV3Pj0rMiwgVmVyaWZpZWQ9MQorfEFwcHJvdmFsIHJlcXVpcmVtZW50ICAgICAgICAgICAgIHwgQ29kZS1SZXZpZXc+PSsyLCBWZXJpZmllZD0xCiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKQEAgLTEwOSw3ICsxMTAsNiBAQAogbGluazpodHRwOi8vd3d3LmJyaWNzLmRrL2F1dG9tYXRvbi9bZGsuYnJpY3MuYXV0b21hdG9uCiBsaWJyYXJ5XSBpcyB1c2VkIGZvciBldmFsdWF0aW9uIG9mIHN1Y2ggcGF0dGVybnMuCiAKLQogW1ticmFuY2hdXQogYnJhbmNoOidCUkFOQ0gnOjoKICsKQEAgLTI3MSw2ICsyNzEsMTcgQEAKIENoYW5nZSBoYXMgYmVlbiBhYmFuZG9uZWQuCiAKIAorQXJndW1lbnQgUXVvdGluZworLS0tLS0tLS0tLS0tLS0tLQorCitPcGVyYXRvciB2YWx1ZXMgdGhhdCBhcmUgbm90IGJhcmUgd29yZHMgKHJvdWdobHkgQS1aLCBhLXosIDAtOSwgQCwKK2h5cGVuLCBkb3QgYW5kIHVuZGVyc2NvcmUpIG11c3QgYmUgcXVvdGVkIGZvciB0aGUgcXVlcnkgcGFyc2VyLgorCitRdW90aW5nIGlzIGFjY2VwdGVkIGFzIGVpdGhlciBkb3VibGUgcXVvdGVzCisoZS5nLiAgYG1lc3NhZ2U6InRoZSB2YWx1ZSJgKSBvciBhcyBtYXRjaGVkCitjdXJseSBicmFjZXMgKGUuZy4gYG1lc3NhZ2U6e3RoZSB2YWx1ZX1gKS4KKworCiBCb29sZWFuIE9wZXJhdG9ycwogLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA2LDE4ICszMTcsMTIgQEAKIC0tLS0tLQogTGFiZWwgb3BlcmF0b3JzIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGFwcHJvdmFsIHNjb3JlcyBnaXZlbiBkdXJpbmcKIGEgY29kZSByZXZpZXcuICBUaGUgc3BlY2lmaWMgc2V0IG9mIHN1cHBvcnRlZCBsYWJlbHMgZGVwZW5kcyBvbgotdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBob3dldmVyIGBDb2RlUmV2aWV3YCBhbmQgYFZlcmlmaWVkYAordGhlIHNlcnZlciBjb25maWd1cmF0aW9uLCBob3dldmVyIGBDb2RlLVJldmlld2AgYW5kIGBWZXJpZmllZGAKIGFyZSB0aGUgZGVmYXVsdCBsYWJlbHMgcHJvdmlkZWQgb3V0IG9mIHRoZSBib3guCiAKIEEgbGFiZWwgbmFtZSBpcyBhbnkgb2YgdGhlIGZvbGxvd2luZzoKIAotKiBUaGUgY2F0ZWdvcnkgbmFtZS4gIElmIHRoZSBjYXRlZ29yeSBuYW1lIGNvbnRhaW5zIHNwYWNlcywKLSAgaXQgbXVzdCBiZSB3cmFwcGVkIGluIGRvdWJsZSBxdW90ZXMuICBFeGFtcGxlOiBgbGFiZWw6IkNvZGUgUmV2aWV3ImAuCi0KLSogVGhlIG5hbWUsIHdpdGhvdXQgc3BhY2VzLiAgVGhpcyBhdm9pZHMgbmVlZGluZyB0byB1c2UgZG91YmxlIHF1b3RlcwotICBmb3IgdGhlIGNvbW1vbiBjYXRlZ29yeSBDb2RlIFJldmlldy4gIEV4YW1wbGU6IGBsYWJlbDpDb2RlUmV2aWV3YC4KLQotKiBUaGUgaW50ZXJuYWwgc2hvcnQgbmFtZS4gIEV4YW1wbGU6IGBsYWJlbDpDUlZXYCwgb3IgYGxhYmVsOlZSSUZgLgorKiBUaGUgbGFiZWwgbmFtZS4gIEV4YW1wbGU6IGBsYWJlbDpDb2RlLVJldmlld2AuCiAKICogVGhlIG9uZSBvciB0d28gY2hhcmFjdGVyIGFiYnJldmlhdGlvbiBzaG93biBpbiB0aGUgY29sdW1uIGhlYWRlcgogICBvZiBjaGFuZ2UgbGlzdCBwYWdlcy4gIEV4YW1wbGU6IGBsYWJlbDpSYCBvciBgbGFiZWw6VmAuCkBAIC0zMjUsMzggKzMzMCwzOCBAQAogQSBsYWJlbCBuYW1lIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzY29yZSwgb3IgYW4gb3BlcmF0b3IgYW5kIGEgc2NvcmUuCiBUaGUgZWFzaWVzdCB3YXkgdG8gZXhwbGFpbiB0aGlzIGlzIGJ5IGV4YW1wbGUuCiAKLWBsYWJlbDpDb2RlUmV2aWV3PTJgOjoKLWBsYWJlbDpDb2RlUmV2aWV3PSsyYDo6Ci1gbGFiZWw6Q29kZVJldmlldysyYDo6CitgbGFiZWw6Q29kZS1SZXZpZXc9MmA6OgorYGxhYmVsOkNvZGUtUmV2aWV3PSsyYDo6CitgbGFiZWw6Q29kZS1SZXZpZXcrMmA6OgogKwotTWF0Y2hlcyBjaGFuZ2VzIHdoZXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSArMiBzY29yZSBmb3IgQ29kZSBSZXZpZXcuCitNYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lICsyIHNjb3JlIGZvciBDb2RlLVJldmlldy4KIFRoZSArIHByZWZpeCBpcyBvcHRpb25hbCBmb3IgcG9zaXRpdmUgc2NvcmUgdmFsdWVzLiAgSWYgdGhlICsgaXMgdXNlZCwKIHRoZSA9IG9wZXJhdG9yIGlzIG9wdGlvbmFsLgogCi1gbGFiZWw6Q29kZVJldmlldz0tMmA6OgotYGxhYmVsOkNvZGVSZXZpZXctMmA6OgorYGxhYmVsOkNvZGUtUmV2aWV3PS0yYDo6CitgbGFiZWw6Q29kZS1SZXZpZXctMmA6OgogKwotTWF0Y2hlcyBjaGFuZ2VzIHdoZXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAtMiBzY29yZSBmb3IgQ29kZSBSZXZpZXcuCitNYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIC0yIHNjb3JlIGZvciBDb2RlLVJldmlldy4KIEJlY2F1c2UgdGhlIG5lZ2F0aXZlIHNpZ24gaXMgcmVxdWlyZWQsIHRoZSA9IG9wZXJhdG9yIGlzIG9wdGlvbmFsLgogCi1gbGFiZWw6Q29kZVJldmlldz0xYDo6CitgbGFiZWw6Q29kZS1SZXZpZXc9MWA6OgogKwotTWF0Y2hlcyBjaGFuZ2VzIHdoZXJlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSArMSBzY29yZSBmb3IgQ29kZSBSZXZpZXcuCitNYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lICsxIHNjb3JlIGZvciBDb2RlLVJldmlldy4KIFNjb3JlcyBvZiArMiBhcmUgbm90IG1hdGNoZWQsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGhpZ2hlci4KIAotYGxhYmVsOkNvZGVSZXZpZXc+PTFgOjoKK2BsYWJlbDpDb2RlLVJldmlldz49MWA6OgogKwogTWF0Y2hlcyBjaGFuZ2VzIHdpdGggZWl0aGVyIGEgKzEsICsyLCBvciBhbnkgaGlnaGVyIHNjb3JlLgogCi1gbGFiZWw6Q29kZVJldmlldzw9LTFgOjoKK2BsYWJlbDpDb2RlLVJldmlldzw9LTFgOjoKICsKIE1hdGNoZXMgY2hhbmdlcyB3aXRoIGVpdGhlciBhIC0xLCAtMiwgb3IgYW55IGxvd2VyIHNjb3JlLgogCi1gaXM6b3BlbiBDb2RlUmV2aWV3KzIgVmVyaWZpZWQrMSAtVmVyaWZpZWQtMSAtQ29kZVJldmlldy0yYDo6CitgaXM6b3BlbiBDb2RlLVJldmlldysyIFZlcmlmaWVkKzEgLVZlcmlmaWVkLTEgLUNvZGUtUmV2aWV3LTJgOjoKICsKIE1hdGNoZXMgY2hhbmdlcyB0aGF0IGFyZSByZWFkeSB0byBiZSBzdWJtaXR0ZWQuCiAKLWBpczpvcGVuIChWZXJpZmllZC0xIE9SIENvZGVSZXZpZXctMilgOjoKK2BpczpvcGVuIChWZXJpZmllZC0xIE9SIENvZGUtUmV2aWV3LTIpYDo6CiArCiBDaGFuZ2VzIHRoYXQgYXJlIGJsb2NrZWQgZnJvbSBzdWJtaXNzaW9uIGR1ZSB0byBhIGJsb2NraW5nIHNjb3JlLgogCkBAIC00MjcsNiArNDMyLDcgQEAKIG9mIGEgcXVlcnkuICBJbmNsdWRpbmcgZWl0aGVyIHZhbHVlIGluIGEgd2ViIHF1ZXJ5IG1heSBsZWFkIHRvCiB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCiAKKwogR0VSUklUCiAtLS0tLS0KIFBhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1zdWJtb2R1bGVzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNlci1zdWJtb2R1bGVzLnR4dAppbmRleCBjZmFmM2U5Li42YWFiNDNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXItc3VibW9kdWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2VyLXN1Ym1vZHVsZXMudHh0CkBAIC0xLDUgKzEsNSBAQAotR2Vycml0IENvZGUgUmV2aWV3IC0gU3VwZXJwcm9qZWN0cyBzdWJzY3JpYmVkIHRvIHN1Ym1vZHVsZXMgdXBkYXRlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorR2Vycml0IENvZGUgUmV2aWV3IC0gU3VwZXJwcm9qZWN0IHN1YnNjcmlwdGlvbiB0byBzdWJtb2R1bGVzIHVwZGF0ZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIERlc2NyaXB0aW9uCiAtLS0tLS0tLS0tLQpAQCAtMjUsNyArMjUsNyBAQAogR2l0IFN1Ym1vZHVsZXMgT3ZlcnZpZXcKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUl0IGlzIGEgZ2l0IGZlYXR1cmUgdGhhdCBhbGxvd3MgYW4gZXh0ZXJuYWwgcmVwb3NpdG9yeSB0byBiZQorU3VibW9kdWxlcyBhcmUgYSBnaXQgZmVhdHVyZSB0aGF0IGFsbG93cyBhbiBleHRlcm5hbCByZXBvc2l0b3J5IHRvIGJlCiBhdHRhY2hlZCBpbnNpZGUgYSByZXBvc2l0b3J5IGF0IGEgc3BlY2lmaWMgcGF0aC4gVGhlIG9iamVjdGl2ZSBoZXJlCiBpcyB0byBwcm92aWRlIGEgYnJpZWYgb3ZlcnZpZXcsIGZ1cnRoZXIgZGV0YWlscyBjYW4gYmUgZm91bmQKIGluIHRoZSBvZmZpY2lhbCBnaXQgc3VibW9kdWxlIGNvbW1hbmQgZG9jdW1lbnRhdGlvbi4KQEAgLTM3LDIwICszNywyMCBAQAogJ3N1cGVyJzoKID09PT09CiBnaXQgc3VibW9kdWxlIGFkZCBzc2g6Ly9zZXJ2ZXIvYSBhCi09PT09Cis9PT09PQogCiBTdGlsbCBjb25zaWRlcmluZyB0aGUgYWJvdmUgZXhhbXBsZSwgYWZ0ZXIgaXRzIGV4ZWN1dGlvbiBub3RpY2UgdGhhdAogaW5zaWRlIHRoZSBsb2NhbCByZXBvc2l0b3J5ICdzdXBlcicgdGhlICdhJyBmb2xkZXIgaXMgY29uc2lkZXJlZCBhCiBnaXRsaW5rIHRvIHRoZSBleHRlcm5hbCByZXBvc2l0b3J5ICdhJy4gQWxzbyBub3RpY2UgYSBmaWxlIGNhbGxlZAotLmdpdG1vZHVsZXMgaXMgY3JlYXRlZCAoaXQgaXMgYSBjb25maWcgZmlsZSBjb250YWluaW5nIHRoZQotc3Vic2NyaXB0aW9uIG9mICdhJykuIFRvIHByb3ZpZGUgdGhlIHNoYS0xIGVhY2ggZ2l0bGluayBwb2ludHMgdG8gaW4KKy5naXRtb2R1bGVzIGlzIGNyZWF0ZWQgKGl0IGlzIGEgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5pbmcgdGhlCitzdWJzY3JpcHRpb24gb2YgJ2EnKS4gVG8gcHJvdmlkZSB0aGUgU0hBLTEgZWFjaCBnaXRsaW5rIHBvaW50cyB0byBpbgogdGhlIGV4dGVybmFsIHJlcG9zaXRvcnksIG9uZSBzaG91bGQgdXNlIHRoZSBjb21tYW5kOgogPT09PQogZ2l0IHN1Ym1vZHVsZSBzdGF0dXMKID09PT0KIAogSW4gdGhlIGV4YW1wbGUgcHJvdmlkZWQsIGlmICdhJyBpcyB1cGRhdGVkIGFuZCAnc3VwZXInIGlzIHN1cHBvc2VkCi10byBzZWUgdGhlIGxhdGVzdCBzaGEtMSAoY29uc2lkZXJpbmcgaGVyZSAnYScgaGFzIG9ubHkgdGhlIG1hc3RlcgordG8gc2VlIHRoZSBsYXRlc3QgU0hBLTEgKGNvbnNpZGVyaW5nIGhlcmUgJ2EnIGhhcyBvbmx5IHRoZSBtYXN0ZXIKIGJyYW5jaCksIG9uZSBzaG91bGQgdGhlbiBjb21taXQgdGhlIG1vZGlmaWVkIGdpdGxpbmsgZm9yICdhJyBpbgogdGhlICdzdXBlcicgcHJvamVjdC4gQWN0dWFsbHkgaXQgd291bGQgbm90IGV2ZW4gbmVlZCB0byBiZSBhbgogZXh0ZXJuYWwgdXBkYXRlLCBvbmUgY291bGQgbW92ZSB0byAnYScgZm9sZGVyIChpbnNpZGVyICdzdXBlcicpLApAQCAtNjMsMTEgKzYzLDExIEBACiBEZWZpbmluZyB0aGUgU3VibW9kdWxlIEJyYW5jaAogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIFN1Ym1vZHVsZSBzdWJzY3JpcHRpb24gaXMgYWN0dWFsbHkgdGhlCitUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugc3VibW9kdWxlIHN1YnNjcmlwdGlvbiBpcyBhY3R1YWxseSB0aGUKIHN1YnNjcmlwdGlvbiBvZiBhIHN1Ym1vZHVsZSBwcm9qZWN0IGFuZCBvbmUgb2YgaXRzIGJyYW5jaGVzIGZvcgogYSBicmFuY2ggb2YgYSBzdXBlciBwcm9qZWN0LgogCi1TaW5jZSBpdCBtYW5hZ2VzIHN1YnNjcmlwdGlvbnMgaW4gdGhlIGJyYW5jaCBzY29wZSwgd2UgY291bGQgaGF2ZQorU2luY2UgR2Vycml0IG1hbmFnZXMgc3Vic2NyaXB0aW9ucyBpbiB0aGUgYnJhbmNoIHNjb3BlLCB3ZSBjb3VsZCBoYXZlCiBhIHNjZW5hcmlvIGhhdmluZyBhIHByb2plY3QgY2FsbGVkICdzdXBlcicgaGF2aW5nIGEgYnJhbmNoICdpbnRlZ3JhdGlvbicKIHN1YnNjcmliZWQgdG8gYSBwcm9qZWN0IGNhbGxlZCAnYScgaW4gYnJhbmNoICdpbnRlZ3JhdGlvbicsIGFuZCBhbHNvCiBoYXZpbmcgdGhlIHNhbWUgJ3N1cGVyJyBwcm9qZWN0IGJ1dCBpbiBicmFuY2ggJ2Rldicgc3Vic2NyaWJlZCB0byB0aGUgJ2EnCkBAIC03NywyMiArNzcsMjMgQEAKIHRoZSAuZ2l0bW9kdWxlcyBmaWxlIHRvIGFkZCBhIGJyYW5jaCBmaWVsZCB0byBlYWNoIHN1Ym1vZHVsZQogc2VjdGlvbiB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBzdWJzY3JpYmVkLgogCi1UaGUgYnJhbmNoIGZpZWxkIGlzIG5vdCBmaWxsZWQgYnkgdGhlIGdpdCBzdWJtb2R1bGUgY29tbWFuZC4gSXRzIHZhbHVlCi1zaG91bGQgaW5kaWNhdGUgdGhlIGJyYW5jaCBvZiBhIHN1Ym1vZHVsZSBwcm9qZWN0IHRoYXQgd2hlbiB1cGRhdGVkCi13aWxsIHRyaWdnZXIgYXV0b21hdGljIHVwZGF0ZSBvZiBpdHMgcmVnaXN0ZXJlZCBnaXRsaW5rLgorQXMgdGhlIGJyYW5jaCBmaWVsZCBpcyBhIEdlcnJpdCBzcGVjaWZpYyBmaWVsZCBpdCB3aWxsIG5vdCBiZSBmaWxsZWQKK2F1dG9tYXRpY2FsbHkgYnkgdGhlIGdpdCBzdWJtb2R1bGUgY29tbWFuZCwgc28gb25lIG5lZWRzIHRvIGVkaXQgaXQKK21hbnVhbGx5LiBJdHMgdmFsdWUgc2hvdWxkIGluZGljYXRlIHRoZSBicmFuY2ggb2YgYSBzdWJtb2R1bGUgcHJvamVjdAordGhhdCB3aGVuIHVwZGF0ZWQgd2lsbCB0cmlnZ2VyIGF1dG9tYXRpYyB1cGRhdGUgb2YgaXRzIHJlZ2lzdGVyZWQKK2dpdGxpbmsuCiAKLVRoZSBicmFuY2ggdmFsdWUgY291bGQgYmUgJy4nIGlmIHRoZSBzdWJtb2R1bGUgcHJvamVjdCBicmFuY2gKK1RoZSBicmFuY2ggdmFsdWUgY291bGQgYmUgIicuJyIgaWYgdGhlIHN1Ym1vZHVsZSBwcm9qZWN0IGJyYW5jaAogaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBvZiB0aGUgY29tbWl0IGhhdmluZwogZ2l0bGlua3MvLmdpdG1vZHVsZXMgZmlsZS4KIAotVGhlIGJyYW5jaCBmaWVsZCBvZiBhIHN1Ym1vZHVsZSBzZWN0aW9uIGlzIGEgY3VzdG9tIGdpdCBzdWJtb2R1bGUKLWZlYXR1cmUgZm9yIEdlcnJpdCB1c2UuIE9uZSBzaG91bGQgYWx3YXlzIGJlIHN1cmUgdG8gZmlsbCBpdCBpbgotZWRpdGluZyAuZ2l0bW9kdWxlcyBmaWxlIGFmdGVyIGFkZGluZyBzdWJtb2R1bGVzIHRvIGEgc3VwZXIgcHJvamVjdCwKLWlmIGl0IGlzIHRoZSBpbnRlbnRpb24gdG8gbWFrZSB1c2Ugb2YgdGhlIEdlcnJpdCBmZWF0dXJlIGludHJvZHVjZWQgaGVyZS4KK0lmIHRoZSBpbnRlbnRpb24gaXMgdG8gbWFrZSB1c2Ugb2YgdGhlIEdlcnJpdCBmZWF0dXJlIGRlc2NyaWJlZAoraGVyZSwgb25lIHNob3VsZCBhbHdheXMgYmUgc3VyZSB0byB1cGRhdGUgdGhlIC5naXRtb2R1bGVzIGZpbGUgYWZ0ZXIKK2FkZGluZyBzdWJtb2R1bGVzIHRvIGEgc3VwZXIgcHJvamVjdC4KIAotQW55IGdpdCBzdWJtb2R1bGVzIHdoaWNoIGFyZSBhZGRlZCBhbmQgbm90IGhhdmUgdGhlIGJyYW5jaCBmaWVsZAotYXZhaWxhYmxlIGluIHRoZSAuZ2l0bW9kdWxlcyBmaWxlIHdpbGwgbm90IGJlIHN1YnNjcmliZWQgYnkgR2Vycml0Ci10byBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgc3VwZXJwcm9qZWN0LgorSWYgYSBnaXQgc3VibW9kdWxlIGlzIGFkZGVkIGJ1dCB0aGUgYnJhbmNoIGZpZWxkIGlzIG5vdCBhZGRlZCB0byB0aGUKKy5naXRtb2R1bGVzIGZpbGUsIEdlcnJpdCB3aWxsIG5vdCBjcmVhdGUgYSBzdWJzY3JpcHRpb24gZm9yIHRoZQorc3VibW9kdWxlIGFuZCB0aGVyZSB3aWxsIGJlIG5vIGF1dG9tYXRpYyB1cGRhdGVzIHRvIHRoZSBzdXBlcnByb2plY3QuCiAKIERldGVjdGluZyBhbmQgU3Vic2NyaWJpbmcgU3VibW9kdWxlcwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xMTgsMTcgKzExOSw2MiBAQAogY3JlYXRlcyBhIG5ldyBjb21taXQgb24gYnJhbmNoICdkZXYnIG9mICdzdXBlcicgdXBkYXRpbmcgdGhlIGdpdGxpbmsKIHRvIHBvaW50IHRvIHRoZSBqdXN0IG1lcmdlZCBjb21taXQuCiAKLUNhbm9uaWNhbCBXZWIgVXJsCi1+fn5+fn5+fn5+fn5+fn5+fgorU3Vic2NyaXB0aW9uIExpbWl0YXRpb25zCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotR2Vycml0IHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgb25seSB0aGUgc3VwZXJwcm9qZWN0cyB0aGF0IGFkZGVkCi10aGUgc3VibW9kdWxlcyBvZiB1cmxzIG9mIHRoZSBydW5uaW5nIHNlcnZlciAodGhlIG9uZSBkZXNjcmliZWQgaW4KLXRoZSBjYW5vbmljYWwgd2ViIHVybCB2YWx1ZSBpbiBHZXJyaXQgY29uZmlndXJhdGlvbiBmaWxlKS4KK0dlcnJpdCB3aWxsIG9ubHkgYXV0b21hdGljYWxseSB1cGRhdGUgc3VwZXJwcm9qZWN0cyB3aGVyZSB0aGUKK3N1Ym1vZHVsZXMgYXJlIGhvc3RlZCBvbiB0aGUgc2FtZSBHZXJyaXQgaW5zdGFuY2UgYXMgdGhlCitzdXBlcnByb2plY3QuIEdlcnJpdCBkZXRlcm1pbmVzIHRoaXMgYnkgY2hlY2tpbmcgdGhlIGhvc3RuYW1lIG9mIHRoZQorc3VibW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgLmdpdG1vZHVsZXMgZmlsZSBhbmQgY29tcGFyaW5nIGl0IHRvIHRoZQoraG9zdG5hbWUgZnJvbSB0aGUgY2Fub25pY2FsIHdlYiBVUkwuCisKK0l0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgdG8gdXNlIHRoZSBzdWJtb2R1bGUgc3Vic2NyaXB0aW9uIGZlYXR1cmUKK3dpdGggYSBjYW5vbmljYWwgd2ViIFVSTCBob3N0bmFtZSB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgaG9zdG5hbWUgb2YKK3RoZSBzdWJtb2R1bGUuIEluc3RlYWQgcmVsYXRpdmUgc3VibW9kdWxlcyBzaG91bGQgYmUgdXNlZC4KIAogVGhlIEdlcnJpdCBpbnN0YW5jZSBhZG1pbmlzdHJhdG9yIGdyb3VwIHNob3VsZCBhbHdheXMgY2VydGlmeSB0bwotcHJvdmlkZSB0aGUgY2Fub25pY2FsIHdlYiB1cmwgdmFsdWUgaW4gaXRzIGNvbmZpZ3VyYXRpb24gZmlsZS4gVXNlcnMKLXNob3VsZCBjZXJ0aWZ5IHRvIHVzZSB0aGUgdXJsIHZhbHVlIG9mIHRoZSBydW5uaW5nIEdlcnJpdCBpbnN0YW5jZSB0bwotYWRkL3N1YnNjcmliZSBzdWJtb2R1bGVzLgorcHJvdmlkZSB0aGUgY2Fub25pY2FsIHdlYiBVUkwgdmFsdWUgaW4gaXRzIGNvbmZpZ3VyYXRpb24gZmlsZS4gVXNlcnMKK3Nob3VsZCBjZXJ0aWZ5IHRvIHVzZSB0aGUgY29ycmVjdCBob3N0bmFtZSBvZiB0aGUgcnVubmluZyBHZXJyaXQKK2luc3RhbmNlIHRvIGFkZC9zdWJzY3JpYmUgc3VibW9kdWxlcy4KKworUmVsYXRpdmUgc3VibW9kdWxlcworfn5+fn5+fn5+fn5+fn5+fn5+fgorCitUbyBlbmFibGUgZWFzaWVyIHVzYWdlIG9mIEdlcnJpdCBtaXJyb3JzIGFuZC9vciBkaXN0cmlidXRpb24gb3Zlcgorc2V2ZXJhbCBwcm90b2NvbHMsIHN1Y2ggYXMgcGxhaW4gZ2l0IGFuZCBIVFRQKFMpIGFzIHdlbGwgYXMgU1NILCBvbmUKK2NhbiB1c2UgcmVsYXRpdmUgc3VibW9kdWxlcy4gVGhpcyBtZWFucyB0aGF0IGluc3RlYWQgb2YgcHJvdmlkaW5nIHRoZQorZW50aXJlIFVSTCB0byB0aGUgc3VibW9kdWxlIGEgcmVsYXRpdmUgcGF0aCBpcyBzdGF0ZWQgaW4gdGhlCisuZ2l0bW9kdWxlcyBmaWxlLgorCitHZXJyaXQgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIGVudGlyZSBwcm9qZWN0IG5hbWUgb2YgdGhlIHN1Ym1vZHVsZQoraW5jbHVkaW5nIGRpcmVjdG9yaWVzLiBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRvIHN1cHBseSB0aGUgZnVsbAorcGF0aCBuYW1lIG9mIHRoZSBHZXJyaXQgcHJvamVjdCwgbm90IG9ubHkgcmVsYXRpdmUgdG8gdGhlIHN1cGVyCityZXBvc2l0b3J5LiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCitXZSBoYXZlIGEgc3VwZXIgcmVwb3NpdG9yeSBwbGFjZWQgdW5kZXIgYSBzdWIgZGlyZWN0b3J5LgorCisgIHByb2R1Y3Qvc3VwZXJfcmVwb3NpdG9yeS5naXQKKworVG8gdGhpcyByZXBvc2l0b3J5IHdlIHdpc2ggYWRkIGEgc3VibW9kdWxlICJkZWVwZXIiIGludG8gdGhlIGRpcmVjdG9yeQorc3RydWN0dXJlLgorCisgIHByb2R1Y3QvZnJhbWV3b3JrL3N1YmNvbXBvbmVudC5naXQKKworTm93IHdlIG5lZWQgdG8gZWRpdCB0aGUgLmdpdG1vZHVsZXMgdG8gaW5jbHVkZSB0aGUgY29tcGxldGUgcGF0aCB0bwordGhlIEdlcnJpdCBwcm9qZWN0LiBPYnNlcnZlIHRoYXQgd2UgbmVlZCB0byB1c2UgdHdvICIuLi8iIHRvIGluY2x1ZGUKK3RoZSBjb21wbGV0ZSBHZXJyaXQgcHJvamVjdCBwYXRoLgorCisgIHBhdGggPSBzdWJjb21wb25lbnQuZ2l0CisgIHVybCA9IC4uLy4uL3Byb2R1Y3QvZnJhbWV3b3JrL3N1YmNvbXBvbmVudC5naXQKKyAgYnJhbmNoID0gbWFzdGVyCisKK0luIGNvbnRyYXN0IHRoZSBmb2xsb3dpbmcgd2lsbCBub3Qgc2V0dXAgcHJvcGVyIHN1Ym1vZHVsZQorc3Vic2NyaXB0aW9uLCBldmVuIGlmIHRoZSBzdWJtb2R1bGUgd2lsbCBiZSBzdWNjZXNzZnVsbHkgY2xvbmVkIGJ5IGdpdAorZnJvbSBHZXJyaXQuCisKKyAgcGF0aCA9IHN1YmNvbXBvbmVudC5naXQKKyAgdXJsID0gLi4vZnJhbWV3b3JrL3N1YmNvbXBvbmVudC5naXQKKyAgYnJhbmNoID0gbWFzdGVyCiAKIFJlbW92aW5nIFN1YnNjcmlwdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci11cGxvYWQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLXVwbG9hZC50eHQKaW5kZXggNmJkZmY3YS4uNTVhYjg5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2VyLXVwbG9hZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2VyLXVwbG9hZC50eHQKQEAgLTcsOCArNywzMSBAQAogKiBVc2UgYGdpdCBwdXNoYCwgdG8gY3JlYXRlIGNoYW5nZXMgZm9yIHJldmlldwogKiBVc2UgYGdpdCBwdXNoYCwgYW5kIGJ5cGFzcyBjb2RlIHJldmlldwogCi1BbGwgdGhyZWUgbWV0aG9kcyByZWx5IG9uIFNTSCBwdWJsaWMga2V5IGF1dGhlbnRpY2F0aW9uLCB3aGljaCBtdXN0Ci1maXJzdCBiZSBjb25maWd1cmVkIGJ5IHRoZSB1cGxvYWRpbmcgdXNlci4KK0FsbCB0aHJlZSBtZXRob2RzIHJlbHkgb24gYXV0aGVudGljYXRpb24sIHdoaWNoIG11c3QgZmlyc3QgYmUgY29uZmlndXJlZAorYnkgdGhlIHVwbG9hZGluZyB1c2VyLgorCitHZXJyaXQgc3VwcG9ydHMgdHdvIG1ldGhvZHMgb2YgYXV0aGVudGljYXRpbmcgdGhlIHVwbG9hZGluZyB1c2VyLiAgU1NICitwdWJsaWMga2V5LCBhbmQgSFRUUC9IVFRQUy4KKworW1todHRwXV0KK0hUVFAvSFRUUFMKKy0tLS0tLS0tLS0KKworT24gR2Vycml0IGluc3RhbGxhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBTU0ggYXV0aGVudGljYXRpb24sIHRoZQordXNlciBtdXN0IGF1dGhlbnRpY2F0ZSB2aWEgSFRUUC9IVFRQUy4KKworV2hlbiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNhdXRoLmdpdEJhc2ljQXV0aFtnaXRCYXNpY0F1dGhdIGlzIGVuYWJsZWQsCit0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIHVzaW5nIHN0YW5kYXJkIEJhc2ljQXV0aCBhbmQgY3JlZGVudGlhbHMgdmFsaWRhdGVkCit1c2luZyB0aGUgc2FtZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgY29uZmlndXJlZCBmb3IgdGhlIEdlcnJpdCBXZWIgVUkuCisKK1doZW4gZ2l0QmFzaWNBdXRoIGlzIG5vdCBjb25maWd1cmVkLCB0aGUgdXNlcidzIEhUVFAgY3JlZGVudGlhbHMgY2FuIGJlCithY2Nlc3NlZCB3aXRoaW4gR2Vycml0IGJ5IGdvaW5nIHRvIGBTZXR0aW5nc2AsIGFuZCB0aGVuIGFjY2Vzc2luZyB0aGUgYEhUVFAKK1Bhc3N3b3JkYCB0YWIuCisKK0ZvciBHZXJyaXQgaW5zdGFsbGF0aW9ucyB3aGVyZSBhbiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNhdXRoLmh0dHBQYXNzd29yZFVybFtIVFRQIHBhc3N3b3JkIFVSTF0KK2lzIGNvbmZpZ3VyZWQsIHRoZSBwYXNzd29yZCBjYW4gYmUgb2J0YWluZWQgYnkgY2xpY2tpbmcgb24gYE9idGFpbiBQYXNzd29yZGAKK2FuZCB0aGVuIGZvbGxvd2luZyB0aGUgc2l0ZS1zcGVjaWZpYyBpbnN0cnVjdGlvbnMuICBPbiBzaXRlcyB3aGVyZSB0aGlzIFVSTCBpcworbm90IGNvbmZpZ3VyZWQsIHRoZSBwYXNzd29yZCBjYW4gYmUgb2J0YWluZWQgYnkgY2xpY2tpbmcgb24gYEdlbmVyYXRlIFBhc3N3b3JkYC4KIAogU1NICiAtLS0KQEAgLTEwOCw3ICsxMzEsNyBAQAogbWFnaWNhbCBgcmVmcy9mb3IvJ2JyYW5jaCdgIHJlZiB1c2luZyBhbnkgR2l0IGNsaWVudCB0b29sOgogCiA9PT09Ci0gIGdpdCBwdXNoIHNzaDovL3NzaHVzZXJuYW1lQGhvc3RuYW1lOjI5NDE4L3Byb2plY3RuYW1lIEhFQUQ6cmVmcy9mb3IvYnJhbmNobmFtZQorICBnaXQgcHVzaCBzc2g6Ly9zc2h1c2VybmFtZUBob3N0bmFtZToyOTQxOC9wcm9qZWN0bmFtZSBIRUFEOnJlZnMvZm9yL2JyYW5jaAogPT09PQogCiBFLmcuIGBqb2huLmRvZWAgY2FuIHVzZSBnaXQgcHVzaCB0byB1cGxvYWQgbmV3IGNoYW5nZXMgZm9yIHRoZQpAQCAtMTMwLDEyICsxNTMsMTIgQEAKIAogVG8gaW5jbHVkZSBhIHNob3J0IHRhZyBhc3NvY2lhdGVkIHdpdGggYWxsIG9mIHRoZSBjaGFuZ2VzIGluIHRoZQogc2FtZSBncm91cCwgc3VjaCBhcyB0aGUgbG9jYWwgdG9waWMgYnJhbmNoIG5hbWUsIGFwcGVuZCBpdCBhZnRlcgotdGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBuYW1lLiAgSW4gdGhpcyBleGFtcGxlIHRoZSBzaG9ydCB0b3BpYyB0YWcKK3RoZSBkZXN0aW5hdGlvbiBicmFuY2ggbmFtZS4gSW4gdGhpcyBleGFtcGxlIHRoZSBzaG9ydCB0b3BpYyB0YWcKICdkcml2ZXIvaTQyJyB3aWxsIGJlIHNhdmVkIG9uIGVhY2ggY2hhbmdlIHRoaXMgcHVzaCBjcmVhdGVzIG9yCiB1cGRhdGVzOgogCiA9PT09Ci0gIGdpdCBwdXNoIHNzaDovL2pvaG4uZG9lQGdpdC5leGFtcGxlLmNvbToyOTQxOC9rZXJuZWwvY29tbW9uIEhFQUQ6cmVmcy9mb3IvZXhwZXJpbWVudGFsL2RyaXZlci9pNDIKKyAgZ2l0IHB1c2ggc3NoOi8vam9obi5kb2VAZ2l0LmV4YW1wbGUuY29tOjI5NDE4L2tlcm5lbC9jb21tb24gSEVBRDpyZWZzL2Zvci9leHBlcmltZW50YWwldG9waWM9ZHJpdmVyL2k0MgogPT09PQogCiBJZiB5b3UgYXJlIGZyZXF1ZW50bHkgdXBsb2FkaW5nIGNoYW5nZXMgdG8gdGhlIHNhbWUgR2Vycml0IHNlcnZlciwKQEAgLTE1NiwxNyArMTc5LDE3IEBACiAKIFNwZWNpZmljIHJldmlld2VycyBjYW4gYmUgcmVxdWVzdGVkIGFuZC9vciBhZGRpdGlvbmFsICdjYXJib24KIGNvcGllcycgb2YgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIG1heSBiZSBzZW50IGJ5IGluY2x1ZGluZyB0aGVzZQotYXMgYXJndW1lbnRzIHRvIGBnaXQgcmVjZWl2ZS1wYWNrYDoKK2FzIG9wdGlvbnMgaW4gdGhlIHJlZmVyZW5jZQogCiA9PT09Ci0gIGdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXI9YUBhLmNvbSAtLWNjPWJAby5jb20nIHRyOmtlcm5lbC9jb21tb24gSEVBRDpyZWZzL2Zvci9leHBlcmltZW50YWwKKyAgZ2l0IHB1c2ggdHI6a2VybmVsL2NvbW1vbiBIRUFEOnJlZnMvZm9yL2V4cGVyaW1lbnRhbCVyPWFAYS5jb20sY2M9YkBvLmNvbQogPT09PQogCi1UaGUgYC0tcmV2aWV3ZXI9J2VtYWlsJ2AgYW5kIGAtLWNjPSdlbWFpbCdgIG9wdGlvbnMgbWF5IGJlCi1zcGVjaWZpZWQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkgdG8gY292ZXIgYWxsIGludGVyZXN0ZWQKLXBhcnRpZXMuICBHZXJyaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGF2b2lkIHNlbmRpbmcgZHVwbGljYXRlIGVtYWlsCi1ub3RpZmljYXRpb25zLCBzdWNoIGFzIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHJldmlld2VycyBvciBDQwotYWRkcmVzc2VzIGhhZCBhbHNvIHJlcXVlc3RlZCB0byByZWNlaXZlIGFsbCBuZXcgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCitUaGUgYHI9J2VtYWlsJ2AgYW5kIGBjYz0nZW1haWwnYCBvcHRpb25zIG1heSBiZSBzcGVjaWZpZWQgYXMgbWFueQordGltZXMgYXMgbmVjZXNzYXJ5IHRvIGNvdmVyIGFsbCBpbnRlcmVzdGVkIHBhcnRpZXMuIEdlcnJpdCB3aWxsCithdXRvbWF0aWNhbGx5IGF2b2lkIHNlbmRpbmcgZHVwbGljYXRlIGVtYWlsIG5vdGlmaWNhdGlvbnMsIHN1Y2ggYXMKK2lmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHJldmlld2VycyBvciBDQyBhZGRyZXNzZXMgaGFkIGFsc28gcmVxdWVzdGVkCit0byByZWNlaXZlIGFsbCBuZXcgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCiAKIElmIHlvdSBhcmUgZnJlcXVlbnRseSBzZW5kaW5nIGNoYW5nZXMgdG8gdGhlIHNhbWUgcGFydGllcyBhbmQvb3IKIGJyYW5jaGVzLCBjb25zaWRlciBhZGRpbmcgYSBjdXN0b20gcmVtb3RlIGJsb2NrIHRvIHlvdXIgcHJvamVjdCdzCkBAIC0xNzUsMTIgKzE5OCwxMSBAQAogPT09PQogICAkIGNhdCAuZ2l0L2NvbmZpZwogICAuLi4KLSAgW3JlbW90ZSAiZm9yLWEtZXhwIl0KKyAgW3JlbW90ZSAiZXhwIl0KICAgICB1cmwgPSB0cjprZXJuZWwvY29tbW9uCi0gICAgcmVjZWl2ZXBhY2sgPSBnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXI9YUBhLmNvbSAtLWNjPWJAby5jb20KLSAgICBwdXNoID0gSEVBRDpyZWZzL2Zvci9leHBlcmltZW50YWwKKyAgICBwdXNoID0gSEVBRDpyZWZzL2Zvci9leHBlcmltZW50YWwlcj1hQGEuY29tLGNjPWJAby5jb20KIAotICAkIGdpdCBwdXNoIGZvci1hLWV4cAorICAkIGdpdCBwdXNoIGV4cAogPT09PQogCiAKZGlmZiAtLWdpdCBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4wLjIxLnR4dCBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4wLjIxLnR4dAppbmRleCA3ZGQ5ZWY0Li40N2JhNjU0IDEwMDY0NAotLS0gYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMC4yMS50eHQKKysrIGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjEudHh0CkBAIC0yMDEsNyArMjAxLDcgQEAKIEdlcnJpdCBubyBsb25nZXIgZm9yZ2VzIHRoZSBGcm9tIGhlYWRlciBpbiBub3RpZmljYXRpb24gZW1haWxzLgogVG8gZW5hYmxlIHRoZSBwcmlvciBmb3JnaW5nIGJlaGF2aW9yLCBzZXQgYHNlbmRlbWFpbC5mcm9tYAogdG8gYFVTRVJgIGluIGdlcnJpdC5jb25maWcuICBGb3IgbW9yZSBkZXRhaWxzIHNlZQotW2h0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL2NvbmZpZy1nZXJyaXQuaHRtbCNzZW5kZW1haWwuZnJvbSBzZW5kZW1haWwuZnJvbV0KK2xpbms6aHR0cDovL2dlcnJpdC5nb29nbGVjb2RlLmNvbS9zdm4vZG9jdW1lbnRhdGlvbi8yLjAvY29uZmlnLWdlcnJpdC5odG1sI3NlbmRlbWFpbC5mcm9tW3NlbmRlbWFpbC5mcm9tXQogCiBCdWcgRml4ZXMKIC0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjQudHh0IGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjQudHh0CmluZGV4IDk0ODFhM2EuLjdlMGE2MTcgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4wLjI0LnR4dAorKysgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMC4yNC50eHQKQEAgLTY3LDcgKzY3LDcgQEAKICogaXNzdWUgMzAwICAgIFN1cHBvcnQgU01UUCBvdmVyIFNTTC9UTFMKICsKIEVuY3J5cHRlZCBTTVRQIGlzIG5vdyBzdXBwb3J0ZWQgbmF0aXZlbHkgd2l0aGluIEdlcnJpdCwgc2VlCi1baHR0cDovL2dlcnJpdC5nb29nbGVjb2RlLmNvbS9zdm4vZG9jdW1lbnRhdGlvbi8yLjAvY29uZmlnLWdlcnJpdC5odG1sI3NlbmRlbWFpbC5zbXRwRW5jcnlwdGlvbiBzZW5kZW1haWwuc210cEVuY3J5cHRpb25dCitsaW5rOmh0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL2NvbmZpZy1nZXJyaXQuaHRtbCNzZW5kZW1haWwuc210cEVuY3J5cHRpb25bc2VuZGVtYWlsLnNtdHBFbmNyeXB0aW9uXQogCiBCdWcgRml4ZXMKIC0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUuMS50eHQgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS4xLnR4dAppbmRleCA5NjdkNzhkLi4zYTY0MGQxIDEwMDY0NAotLS0gYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS4xLnR4dAorKysgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS4xLnR4dApAQCAtMzgsOSArMzgsMTAgQEAKIGFkbWluaXN0cmF0b3JzLgogKwogSW4gYWRkaXRpb24gaXQgaXMgbm93IG5vIGxvbmdlciBwb3NzaWJsZSB0bwotLSBzZXQgYSBub24tZXhpc3RpbmcgcHJvamVjdCBhcyBwYXJlbnQgKGFzIHRoaXMgd291bGQgbWFrZSB0aGUgcHJvamVjdAorKworKiogc2V0IGEgbm9uLWV4aXN0aW5nIHByb2plY3QgYXMgcGFyZW50IChhcyB0aGlzIHdvdWxkIG1ha2UgdGhlIHByb2plY3QKICAgYmUgb3JwaGFuZWQpCi0tIHNldCBhIHBhcmVudCBwcm9qZWN0IGZvciB0aGUgYEFsbC1Qcm9qZWN0c2Agcm9vdCBwcm9qZWN0ICh0aGUgcm9vdAorKiogc2V0IGEgcGFyZW50IHByb2plY3QgZm9yIHRoZSBgQWxsLVByb2plY3RzYCByb290IHByb2plY3QgKHRoZSByb290CiAgIHByb2plY3QgYnkgZGVmaW5pdGlvbiBoYXMgbm8gcGFyZW50KQogYnkgcHVzaGluZyBjaGFuZ2VzIG9mIHRoZSBgcHJvamVjdC5jb25maWdgIGZpbGUgdG8gYHJlZnMvbWV0YS9jb25maWdgLgogCmRpZmYgLS1naXQgYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS4yLnR4dCBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjIudHh0CmluZGV4IDVlOTllYmYuLjA4YjRmODYgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjIudHh0CisrKyBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjIudHh0CkBAIC03LDcgKzcsNyBAQAogCiBUaGVyZSBhcmUgbm8gc2NoZW1hIGNoYW5nZXMgZnJvbSAyLjUsIG9yIDIuNS4xLgogCi1Ib3dldmVyLCBpZiB1cGdyYWRpbmcgZnJvbSBhbnl0aGluZyBlYXJsaWVyIHZlcnNpb24sIGZvbGxvdyB0aGUgdXBncmFkZQorSG93ZXZlciwgaWYgdXBncmFkaW5nIGZyb20gYW55IGVhcmxpZXIgdmVyc2lvbiwgZm9sbG93IHRoZSB1cGdyYWRlCiBwcm9jZWR1cmUgaW4gdGhlIDIuNSBsaW5rOlJlbGVhc2VOb3Rlcy0yLjUuaHRtbFtSZWxlYXNlIE5vdGVzXS4KIAogQnVnIEZpeGVzCmRpZmYgLS1naXQgYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS50eHQgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS50eHQKaW5kZXggNTVmYmI2MC4uMDIzYjRiZiAxMDA2NDQKLS0tIGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUudHh0CisrKyBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LnR4dApAQCAtMjcwLDExICsyNzAsMTEgQEAKICogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWxbRG9jdW1lbnRhdGlvbiBvZiB0aGUgUkVTVCBBUEldCiAKICogU3VwcG9ydCBSRVNUIGVuZHBvaW50cyB0bwotKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWwjY2hhbmdlc1txdWVyeSBjaGFuZ2VzXQotKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWwjcHJvamVjdHNbbGlzdCBwcm9qZWN0c10KLSoqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS5odG1sI3N1Z2dlc3QtcHJvamVjdHNbc3VnZ2VzdAorKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLWNoYW5nZXMuaHRtbFtxdWVyeSBjaGFuZ2VzXQorKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLXByb2plY3RzLmh0bWxbbGlzdCBwcm9qZWN0c10KKyoqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS1wcm9qZWN0cy5odG1sI3N1Z2dlc3QtcHJvamVjdHNbc3VnZ2VzdAogICAgcHJvamVjdHNdCi0qKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGkuaHRtbCNhY2NvdW50c19zZWxmX2NhcGFiaWxpdGllc1txdWVyeQorKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLWFjY291bnRzLmh0bWwjbGlzdC1hY2NvdW50LWNhcGFiaWxpdGllc1txdWVyeQogICAgdGhlIGdsb2JhbCBjYXBhYmlsaXRpZXMgb2YgdGhlIGNhbGxpbmcgdXNlcl0KIAogKiBTdXBwb3J0IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS5odG1sI2F1dGhlbnRpY2F0aW9uW2Fub255bW91cwpAQCAtMTM3Niw3ICsxMzc2LDcgQEAKICogQXZvaWQgc2Vjb25kIHJlbW90ZSBjYWxsIHRvIGxvb2t1cCBhcHByb3ZhbHMgd2hlbiBsb2FkaW5nIGNoYW5nZQogICByZXN1bHRzCiArCi1CeSB1c2luZyB0aGUgbmV3IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS5odG1sI2NoYW5nZXNbYC9jaGFuZ2VzL2BdCitCeSB1c2luZyB0aGUgbmV3IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS1jaGFuZ2VzLmh0bWxbYC9jaGFuZ2VzL2BdCiBSRVNUIGVuZHBvaW50IHRoZSB3ZWIgVUkgY2xpZW50IG5vdyBvYnRhaW5zIHRoZSBsYWJlbCBpbmZvcm1hdGlvbgogZHVyaW5nIHRoZSBxdWVyeSBhbmQgYXZvaWRzIGEgc2Vjb25kIHJvdW5kIHRyaXAgdG8gbG9va3VwIHRoZSBjdXJyZW50CiBhcHByb3ZhbHMgZm9yIGVhY2ggZGlzcGxheWVkIGNoYW5nZS4gRm9yIG1vc3QgdXNlcnMgdGhpcyBzaG91bGQgaW1wcm92ZQpkaWZmIC0tZ2l0IGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjYudHh0IGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjI4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNi50eHQKQEAgLTAsMCArMSwxNzAyIEBACitSZWxlYXNlIG5vdGVzIGZvciBHZXJyaXQgMi42Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0dlcnJpdCAyLjYgaXMgbm93IGF2YWlsYWJsZToKKworbGluazpodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2Rvd25sb2Fkcy9kZXRhaWw/bmFtZT1nZXJyaXQtMi42LndhcltodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2Rvd25sb2Fkcy9kZXRhaWw/bmFtZT1nZXJyaXQtMi42Lndhcl0KKworR2Vycml0IDIuNiBpbmNsdWRlcyB0aGUgYnVnIGZpeGVzIGRvbmUgd2l0aAorbGluazpSZWxlYXNlTm90ZXMtMi41LjEuaHRtbFtHZXJyaXQgMi41LjFdIGFuZAorbGluazpSZWxlYXNlTm90ZXMtMi41LjIuaHRtbFtHZXJyaXQgMi41LjJdLiBUaGVzZSBidWcgZml4ZXMgYXJlICpub3QqCitsaXN0ZWQgaW4gdGhlc2UgcmVsZWFzZSBub3Rlcy4KKworU2NoZW1hIENoYW5nZQorLS0tLS0tLS0tLS0tLQorKldBUk5JTkc6KiBUaGlzIHJlbGVhc2UgY29udGFpbnMgc2NoZW1hIGNoYW5nZXMuICBUbyB1cGdyYWRlOgorLS0tLQorICBqYXZhIC1qYXIgZ2Vycml0LndhciBpbml0IC1kIHNpdGVfcGF0aAorLS0tLQorCisqV0FSTklORzoqIFVwZ3JhZGluZyB0byAyLjYueCByZXF1aXJlcyB0aGUgc2VydmVyIGJlIGZpcnN0IHVwZ3JhZGVkIHRvIDIuMS43IChvcgorYSBsYXRlciAyLjEueCB2ZXJzaW9uKSwgYW5kIHRoZW4gdG8gMi42LnguICBJZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIDIuMi54Lnggb3IKK25ld2VyLCB5b3UgbWF5IGlnbm9yZSB0aGlzIHdhcm5pbmcgYW5kIHVwZ3JhZGUgZGlyZWN0bHkgdG8gMi42LnguCisKK1JlbGVhc2UgSGlnaGxpZ2h0cworLS0tLS0tLS0tLS0tLS0tLS0tCisqIDQyeCBpbXByb3ZlbWVudCBvbiBgZ2l0IGNsb25lYCBhbmQgYGdpdCBmZXRjaGAKKysKK1J1bm5pbmcgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NtZC1nYy5odG1sWworZ2Vycml0IGdjXSBhbGxvd3MgSkdpdCB0byBvcHRpbWl6ZSBhIHJlcG9zaXRvcnkgdG8gc2VydmUgY2xvbmUgYW5kIGZldGNoCitmYXN0ZXIgdGhhbiBDIEdpdCBjYW4sIHdpdGggbWFzc2l2ZWx5IGxvd2VyIHNlcnZlciBDUFUgcmVxdWlyZWQuIFR5cGljYWxseQorR2Vycml0IDIuNiBjYW4gY29tcGxldGVseSB0cmFuc2ZlciBhIHByb2plY3QgdG8gYSBjbGllbnQgZmFzdGVyIHRoYW4gQyBHaXQKK2NhbiBmaW5pc2ggIkNvdW50aW5nIiB0aGUgb2JqZWN0cy4KKworKiBDb21wbGV0ZWx5IGN1c3RvbWl6YWJsZSB3b3JrZmxvdworKworSW5kaXZpZHVhbCBwcm9qZWN0cyBjYW4gYWRkIChvciByZW1vdmUpIHNjb3JlIGNhdGVnb3JpZXMgdGhyb3VnaAorbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1sYWJlbHMuaHRtbFsKK2xhYmVsc10gYW5kIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9wcm9sb2ctY29va2Jvb2suaHRtbFsKK1Byb2xvZyBydWxlc10uCisKK05ldyBGZWF0dXJlcworLS0tLS0tLS0tLS0tCisKK1dlYiBVSQorfn5+fn5+CisKK0dsb2JhbAorXl5eXl5eCisKKyogTmV3IExvZ2luIFNjcmVlbnMKKysKK05ldyBmb3JtIGJhc2VkIEhUTUwgc2NyZWVucyBmb3IgbG9naW4gYWxsb3cgYnJvd3NlcnMgdG8gb2ZmZXIgdGhlCitjaG9pY2UgdG8gc2F2ZSB0aGUgbG9naW4gZGF0YSBsb2NhbGx5IGluIHRoZSB1c2VyJ3MgcGFzc3dvcmQgc3RvcmUuCisKKyogUmVuYW1lICJHcm91cHMiIHRvcC1sZXZlbCBtZW51IHRvICJQZW9wbGUiCisKKyogTW92ZSAiRHJhZnQgQ29tbWVudHMiIGxpbmsgbmV4dCB0byAiRHJhZnRzIiBsaW5rCisKKyogSGlnaGxpZ2h0IHRoZSBhY3RpdmUgbWVudSBpdGVtCisKKyogTW92ZSB1c2VyIGluZm8sIHNldHRpbmdzLCBhbmQgbG9nb3V0IHRvIHBvcHVwIGRpYWxvZworCisqIFNob3cgYSBzbWFsbCB2ZXJzaW9uIG9mIHRoZSBhdmF0YXIgaW1hZ2UgbmV4dCB0byB0aGUgdXNlcidzIG5hbWUuCisKKyogU2hvdyBhdmF0YXIgaW1hZ2UgaW4gdXNlciBpbmZvIHBvcHVwIGRpYWxvZworCisqIEFsd2F5cyBzaG93ICdXb3JraW5nIC4uLicgbWVzc2FnZQorKworVGhlICdXb3JraW5nIC4uLicgbWVzc2FnZSBpcyByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgZnJvbSB0aGUgdG9wIG9mCit0aGUgYnJvd3Nlciwgc28gdGhhdCB0aGUgbWVzc2FnZSBpcyBhbHdheXMgdmlzaWJsZSwgZXZlbiBpZiB0aGUgdXNlcgoraGFzIHNjcm9sbGVkIGRvd24gdGhlIHBhZ2UuCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNzdWdnZXN0LmZyb21bCisgIHN1Z2dlc3QuZnJvbV0gY29uZmlndXJlcyBhIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYmVmb3JlCisgIG1hdGNoZXMgZm9yIHJldmlld2VycywgYWNjb3VudHMsIGdyb3VwcyBvciBwcm9qZWN0cyBhcmUgb2ZmZXJlZC4KKworKiBNYWtlIHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSAic21hbGwiLgorCisqIE1hcmsgYWxsIENTUyBjbGFzc2VzIGFzIGV4dGVybmFsIHNvIHVzZXJzIGNhbiByZWx5IG9uIHRoZW0uCisKK1NlYXJjaAorXl5eXl5eCisqIEFuaW1hdGUgc2VhcmNoIGJhciBieSBleHBhbmRpbmcgJiB1bmV4cGFuZGluZworKworV2hlbiB0aGUgc2VhcmNoIGJhciBpcyB1c2VkLCBleHBhbmQgaXQgdG8gYWxsb3cgZm9yIG1vcmUgdGV4dCB0byBiZQordmlzaWJsZS4gV2hlbiBpdCBpcyBibHVycmVkLCBzaHJpbmsgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZS4KKworKiBTdWdnZXN0IHByb2plY3RzLCBncm91cHMgYW5kIHVzZXJzIGluIHNlYXJjaCBwYW5lbAorKworU3VnZ2VzdCBwcm9qZWN0cywgZ3JvdXBzIGFuZCB1c2VycyBpbiB0aGUgc2VhcmNoIHBhbmVsIGFzIHBhcmFtZXRlciBmb3IKK3Rob3NlIHNlYXJjaCBvcGVyYXRvcnMgdGhhdCBleHBlY3QgYSBwcm9qZWN0LCBncm91cCBvciB1c2VyLgorCisqIEluIHNlYXJjaCBwYW5lbCBzdWdnZXN0ICdzZWxmJyBhcyB2YWx1ZSBmb3Igb3BlcmF0b3JzIHRoYXQgZXhwZWN0IGEgdXNlcgorCisqIFF1b3RlIHZhbHVlcyBzdWdnZXN0ZWQgZm9yIHNlYXJjaCBvcGVyYXRvcnMgb25seSBpZiBuZWVkZWQKKysKK1RoZSB2YWx1ZXMgdGhhdCBhcmUgc3VnZ2VzdGVkIGZvciB0aGUgc2VhcmNoIG9wZXJhdG9ycyBpbiB0aGUgc2VhcmNoCitwYW5lbCBhcmUgbm93IG9ubHkgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBhIHdoaXRlc3BhY2UuCisKK0NoYW5nZSBTY3JlZW5zCiteXl5eXl5eXl5eXl5eXgorCisqIEEgY2hhbmdlJ3MgY29tbWl0IG1lc3NhZ2UgY2FuIGJlIGVkaXRlZCBmcm9tIHRoZSBjaGFuZ2Ugc2NyZWVuLgorCisqIEEgY2hhbmdlJ3MgdG9waWMgY2FuIGJlIGFkZGVkLCByZW1vdmVkIG9yIGNoYW5nZWQgZnJvbSB0aGUKKyAgY2hhbmdlIHNjcmVlbi4KKworKiBBbiAiQWRkIENvbW1lbnQiIGJ1dHRvbiBpcyBhZGRlZCB0byBjaGFuZ2Ugc2NyZWVuCisKKyogVGhlIHJldmlld2VyIG1hdHJpeCBvbiBhIGNoYW5nZSBkaXNwbGF5cyBncmF5IGJveGVzIHdoZXJlIHBlcm1pc3Npb25zCisgIGRvIG5vdCBhbGxvdyB2b3RpbmcgaW4gdGhhdCBjYXRlZ29yeS4KKysKK1RoZSBjb2xvcmluZyBlbmFibGVzIGF1dGhvcnMgdG8gcXVpY2tseSBpZGVudGlmeSBpZiBhbm90aGVyIHJldmlld2VyCitpcyBuZWNlc3NhcnkgdG8gY29udGludWUgdGhlIGNoYW5nZS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MzUzW0lzc3VlIDM1M10gJgorICBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyM1tJc3N1ZSAxMTIzXToKKyAgTmV3IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9wcm9qZWN0LXNldHVwLmh0bWwjcmViYXNlX2lmX25lY2Vzc2FyeVsKKyAgUmViYXNlIElmIE5lY2Vzc2FyeV0gc3VibWl0IHR5cGUKKysKK1RoaXMgaXMgc2ltaWxhciB0byBjaGVycnkgcGljaywgYnV0IGhvbm9ycyBjaGFuZ2UgZGVwZW5kZW5jeQoraW5mb3JtYXRpb24uCisKKyogVGhlIHJlYmFzZSBidXR0b24gaXMgaGlkZGVuIHdoZW4gdGhlIHBhdGNoIHNldCBpcyBjdXJyZW50LgorCisqIEltcHJvdmVkIHJldmlldyBtZXNzYWdlIHdoZW4gYSBjaGFuZ2UgaXMgcmViYXNlZCBpbiB0aGUgVUkKKysKK1doZW4gYSBjaGFuZ2UgaXMgcmViYXNlZCBpbiB0aGUgVUkgYnkgcHJlc3NpbmcgdGhlIHJlYmFzZSBidXR0b24sIGEKK2NvbW1lbnQgaXMgYWRkZWQgb250byB0aGUgcmV2aWV3LiBJbnN0ZWFkIG9mIG9ubHkgc2F5aW5nICdSZWJhc2VkJyB0aGUKK21lc3NhZ2UgaXMgbm93IG1vcmUgdmVyYm9zZSwgZS5nLiAnUGF0Y2ggU2V0IDEgd2FzIHJlYmFzZWQnLgorCisqIFRoZSBzdWJtaXQgdHlwZSB0aGF0IGlzIHVzZWQgZm9yIHN1Ym1pdHRpbmcgYSBjaGFuZ2UgaXMgc2hvd24gb24gdGhlCisgIGNoYW5nZSBzY3JlZW4gaW4gdGhlIGluZm8gYmxvY2suCisrCitUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHRoZSBzdWJtaXQgdHlwZSBvZiBhIGNoYW5nZSBjYW4gbm93IGJlCitsaW5rOiNzdWJtaXQtdHlwZS1mcm9tLXByb2xvZ1tjb250cm9sbGVkIGJ5IFByb2xvZ10uCisKKyogUmVwbGFjZSB0aGUgQWxsIERpZmYgYnV0dG9ucyBvbiB0aGUgY2hhbmdlIHNjcmVlbiB3aXRoIGxpbmtzCisrCitUaGUgYWN0aW9uIGJ1dHRvbnMgdG8gb3BlbiB0aGUgZGlmZiBmb3IgYWxsIGZpbGVzIGluIG93biB0YWJzIGNvbnN1bWVkCit0b28gbXVjaCBzcGFjZSBkdWUgdG8gdGhlIGxvbmcgbGFiZWwgdGV4dHMuCisKKyogVGhlIHBhdGNoIHNldCByZXZpZXcgc2NyZWVuIGNhbiBpbmNsdWRlIHJhZGlvIGJ1dHRvbnMgZm9yIGN1c3RvbQorICBsYWJlbHMgaWYgZW5hYmxlZCBieQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcHJvbG9nLWNvb2tib29rLmh0bWwjX2hvd190b193cml0ZV9zdWJtaXRfcnVsZXNbc3VibWl0IHJ1bGVzXS4KKworKiBWb3Rpbmcgb24gZHJhZnQgY2hhbmdlcyBpcyBub3cgcG9zc2libGUuCisKKyogUmVjb21tZW5kIHJlYmFzZSBvbiBQYXRoIENvbmZsaWN0CisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2ODVbSXNzdWUgMTY4NV06CisgIEFmdGVyICdVcCB0byBjaGFuZ2UnIGV4cGFuZCB0aGUgcGF0Y2ggc2V0IHRoYXQgd2FzIGp1c3QgcmV2aWV3ZWQKKysKK0FmdGVyIGNsaWNraW5nIG9uIHRoZSAnVXAgdG8gY2hhbmdlJyBsaW5rIG9uIGEgcGF0Y2ggc2NyZWVuLCB0aGUgcGF0Y2gKK3NldCB0aGF0IHdhcyBqdXN0IHJldmlld2VkIGlzIGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgb24gdGhlIGNoYW5nZQorc2NyZWVuLgorCisqIEFsbG93IGRpcmVjdCBjaGFuZ2UgVVJMcyB0byBlbmQgd2l0aCAnLycuCisKKyogU2xpZ2h0bHkgaW5jcmVhc2UgY29tbWl0IG1lc3NhZ2UgdGV4dCBzaXplIGZyb20gOHB4IHRvIDlweC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTM4MVtJc3N1ZSAxMzgxXToKKyAgUmVtb3ZlIHRoZSBJRCBjb2x1bW4gZnJvbSBjaGFuZ2UgdGFibGVzCisrCitVc2VycyBkb24ndCByZWFsbHkgbmVlZCB0aGUgSUQgY29sdW1uIHByZXNlbnQuIEZvciBtb3N0IGNoYW5nZXMgdGhlCitzdWJqZWN0IGlzIGRlc2NyaXB0aXZlIGFuZCB1bmlxdWUgZW5vdWdoIHRvIGlkZW50aWZ5IHRoZSBjb3JyZWN0CitjaGFuZ2UuCisKKyogRG8gbm90IHdyYXAgcHJvamVjdC9icmFuY2gvb3duZXIgZmllbGRzIGluIGNoYW5nZSB0YWJsZQorKworVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gdXNlIEdlcnJpdCBvbiBuYXJyb3cgc2NyZWVucy4KKworUGF0Y2ggU2NyZWVucworXl5eXl5eXl5eXl5eXgorCisqIFN1cHBvcnQgZm9yIGZpbGUgY29tbWVudHMKKysKK0l0IGlzIG5vdyBwb3NzaWJsZSB0byBjb21tZW50IG9uIGEgd2hvbGUgZmlsZSBpbiBhIHBhdGNoLgorCisqIEhhdmUgdGhlIHJldmlld2VkIHBhbmVsIGFsc28gYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGF0Y2ggc2NyZWVuCisrCitSZXZpZXdlcnMgbm9ybWFsbHkgcmV2aWV3IHBhdGNoZXMgdG9wIGRvd24sIGZpbmlzaGluZyB0aGUgcmV2aWV3IHdoZW4KK3RoZXkgcmVhY2ggdGhlIGJvdHRvbSBvZiB0aGUgcGF0Y2guIFRvIHVzZSB0aGUgc3RyZWFtbGluZWQgcmV2aWV3Cit3b3JrZmxvdyB0aGV5IG5vdyBkb24ndCBuZWVkIHRvIHNjcm9sbCBiYWNrIHRvIHRoZSB0b3AgdG8gZmluZCB0aGUKK3Jldmlld2VkIGNoZWNrYm94IGFuZCBsaW5rLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNDk0W0lzc3VlIDE0OTRdOgorICBVc2UgbW9uby1mb250IGZvciBkaXNwbGF5aW5nIHRoZSBmaWxlIGNvbnRlbnRzCisrCitUaGlzIGF2b2lkcyBhbGlnbm1lbnQgZXJyb3JzIHdoZW4gc3ludGF4IGhpZ2hsaWdodGluZyBpcyBlbmFibGVkLgorCitQcm9qZWN0IFNjcmVlbnMKK15eXl5eXl5eXl5eXl5eXgorCisqIFN1cHBvcnQgZmlsdGVyaW5nIG9mIHByb2plY3RzIGluIHRoZSBwcm9qZWN0IGxpc3Qgc2NyZWVuCisrCitGaWx0ZXIgbWF0Y2hlcyBhcmUgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBwcmludGluZy4KKysKK1RoZSBmaWx0ZXIgaXMgcmVmbGVjdGVkIGJ5IHRoZSBgZmlsdGVyYCBVUkwgcGFyYW1ldGVyLgorCisqIFN1cHBvcnQgZmlsdGVyaW5nIG9mIHByb2plY3RzIGluIFByb2plY3RMaXN0UG9wdXAKKysKK0ZpbHRlciBtYXRjaGVzIGFyZSBoaWdobGlnaHRlZCBieSBib2xkIHByaW50aW5nLgorCisqIERpc3BsYXkgYSBxdWVyeSBpY29uIGZvciBlYWNoIHByb2plY3QgaW4gdGhlIHByb2plY3QgbGlzdCBzY3JlZW4gdGhhdAorICBsaW5rcyB0byB0aGUgZGVmYXVsdCBxdWVyeS9kYXNoYm9hcmQgb2YgdGhhdCBwcm9qZWN0LgorCisqIFJlcGxhY2UgcHJvamVjdHMgc2lkZSBtZW51cyB3aXRoIHRvcCBtZW51cworKworVGhlIHRvcCBtZW51cyBhcmUgc3VibWVudXMgdG8gdGhlIFByb2plY3QgTWVudSBhbmQgdGhleSBhcHBlYXIgb25seQord2hlbiBhIHByb2plY3QgaGFzIGJlZW4gc2VsZWN0ZWQuCisKKyogUmVtZW1iZXIgdGhlIGxhc3QgUHJvamVjdCBTY3JlZW4gdXNlZAorKworUmVtZW1iZXIgdGhlIGxhc3QgcHJvamVjdCBzY3JlZW4gdXNlZCBldmVyeSB0aW1lIGEgcHJvamVjdCBzY3JlZW4gaXMKK2xvYWRlZC4gR28gdG8gdGhlIHJlbWVtYmVyZWQgc2NyZWVuIHdoZW4gc2VsZWN0aW5nIGEgbmV3IHByb2plY3QgZnJvbQordGhlIHByb2plY3QgbGlzdCBpbnN0ZWFkIG9mIGFsd2F5cyBnb2luZyB0byB0aGUgcHJvamVjdCBpbmZvIHNjcmVlbi4KKworKiBSZW1lbWJlciB0aGUgbGFzdCBwcm9qZWN0IHZpZXdlZAorKworUmVtZW1iZXIgdGhlIGxhc3QgcHJvamVjdCB2aWV3ZWQgd2hlbiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhIHByb2plY3QKK3NjcmVlbi4gIElmIHRoZXJlIGlzIGEgcmVtZW1iZXJlZCBwcm9qZWN0LCB0aGVuIHRoZSBleHRyYSBwcm9qZWN0IGxpbmtzCithcmUgbm90IGhpZGRlbi4KKworKiBBZGQgY2xvbmUgcGFuZWwgdG8gdGhlIHByb2plY3QgZ2VuZXJhbCBzY3JlZW4KKworKiBOZXcgc2NyZWVuIGZvciBsaXN0aW5nIGFuZCBhY2Nlc3NpbmcgdGhlIHByb2plY3QgZGFzaGJvYXJkcy4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY3N1tJc3N1ZSAxNjc3XToKKyAgUGxhY2UgdGhlICdCcm93c2UnIGJ1dHRvbiB0byBzZWxlY3QgYSB3YXRjaGVkIHByb2plY3QgbmV4dCB0byBpbnB1dCBmaWVsZAorCisqIEFzayB1c2VyIHRvIGxvZ2luIGlmIHByb2plY3QgaXMgbm90IGZvdW5kCisrCitBY2Nlc3NpbmcgYSBwcm9qZWN0IFVSTCB3YXMgZmFpbGluZyB3aXRoICdOb3QgRm91bmQgLSBUaGUgcGFnZSB5b3UKK3JlcXVlc3RlZCB3YXMgbm90IGZvdW5kLCBvciB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMKK3BhZ2UnIGlmIHRoZSB1c2VyIHdhcyBub3Qgc2lnbmVkIGluIGFuZCB0aGUgcHJvamVjdCB3YXMgbm90IHZpc2libGUgdG8KKydBbm9ueW1vdXMgVXNlcnMnLiBJbnN0ZWFkIEdlcnJpdCBub3cgYXNrcyB0aGUgdXNlciB0byBsb2dpbiBhbmQKK2FmdGVyd2FyZHMgc2hvd3MgdGhlIHByb2plY3QgdG8gdGhlIHVzZXIgaWYgaXQgZXhpc3RzIGFuZCBpcyB2aXNpYmxlLgorSWYgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdCBvciBpcyBub3QgdmlzaWJsZSwgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQKK3RoZSBOb3QgRm91bmQgc2NyZWVuIGFmdGVyIHNpZ24gaW4uCisKKyogSW1wcm92ZSBlcnJvciBoYW5kbGluZyBvbiBicmFuY2ggY3JlYXRpb24KKysKK0ltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGUgV2ViVUkgaWYgdGhlCitjcmVhdGlvbiBvZiBhIGJyYW5jaCBmYWlscyBkdWUgdG8gaW52YWxpZCB1c2VyIGlucHV0LgorCitHcm91cCBTY3JlZW5zCiteXl5eXl5eXl5eXl5eCisKKyogU3VwcG9ydCBmaWx0ZXJpbmcgb2YgZ3JvdXBzIGluIHRoZSBncm91cCBsaXN0IHNjcmVlbgorKworRmlsdGVyIG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkIGJ5IGJvbGQgcHJpbnRpbmcuCisrCitUaGUgZmlsdGVyIGlzIHJlZmxlY3RlZCBieSB0aGUgYGZpbHRlcmAgVVJMIHBhcmFtZXRlci4KKworKiBSZW1vdmUgZ3JvdXAgdHlwZSBmcm9tIGdyb3VwIGluZm8gc2NyZWVuCisrCitUaGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyb3VwIHR5cGUgd2FzIG5vdCBtdWNoIGhlbHBmdWwuIEFsbCBncm91cHMKK3RoYXQgY2FuIGJlIHNlZW4gaW4gR2Vycml0IGFyZSBvZiB0eXBlICdJTlRFUk5BTCcsIGV4Y2VwdCBhIGZldword2VsbC1rbm93biBzeXN0ZW0gZ3JvdXBzIHdoaWNoIGFyZSBvZiB0eXBlICdTWVNURU0nLiBUaGUgc3lzdGVtIGdyb3VwcworYXJlIHNvIHdlbGwta25vd24gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIGRpc3BsYXkgdGhlIHR5cGUgZm9yIHRoZW0uCisKK0Rhc2hib2FyZCBTY3JlZW5zCiteXl5eXl5eXl5eXl5eXl5eXgorCisqIExpbmsgZGFzaGJvYXJkIHRpdGxlIHRvIGEgVVJMIHZlcnNpb24gb2YgaXRzZWxmCisrCitXaGVuIHVzaW5nIGEgc3RhYmxlIHByb2plY3QgZGFzaGJvYXJkIFVSTCwgdGhlIFVSTCBvYmZ1c2NhdGVzIHRoZQorY29udGVudCBvZiB0aGUgZGFzaGJvYXJkIHdoaWNoIGNhbiBtYWtlIGl0IGhhcmQgdG8gZGVidWcgYSBkYXNoYm9hcmQgb3IKK2NvcHkgYW5kIG1vZGlmeSBpdC4gSW4gdGhlIHNwZWNpYWwgY2FzZSBvZiBzdGFibGUgZGFzaGJvYXJkcywgbWFrZSB0aGUKK3RpdGxlIGEgbGluayB0byBhbiB1bnN0YWJsZSBVUkwgdmVyc2lvbiBvZiB0aGUgZGFzaGJvYXJkIHdpdGggdGhlIFVSTAorcmVmbGVjdGluZyB0aGUgYWN0dWFsIGRhc2hib2FyZCBjb250ZW50cyB0aGUgd2F5IGEgY3VzdG9tIGRhc2hib2FyZAorZG9lcy4KKworKiBJbmNyZWFzZSB0aW1lIHNwYW4gZm9yICJSZWNlbnRseSBDbG9zZWQiIHNlY3Rpb24gaW4gdXNlciBkYXNoYm9hcmQgdG8gNCB3ZWVrcy4KKworQWNjb3VudCBTY3JlZW5zCiteXl5eXl5eXl5eXl5eXl4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTc0MFtJc3N1ZSAxNzQwXToKKyAgRGlzcGxheSBkZXNjcmlwdGlvbiBob3cgdG8gZ2VuZXJhdGUgU1NIIEtleSBpbiBTc2hQYW5lbAorKworRGlzcGxheSBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0byBnZW5lcmF0ZSBhbiBTU0ggS2V5IGluIGFuIGV4cGFuZGFibGUKK3NlY3Rpb24gaW4gdGhlIFNzaFBhbmVsIGluc3RlYWQgb2YgbGlua2luZyB0byB0aGUgR2l0SHViIFNTSCB0dXRvcmlhbC4KK1RoZSBHaXRIdWIgU1NIIHR1dG9yaWFsIHdhcyBwYXJ0aWFsbHkgbm90IHJlbGV2YW50IGFuZCBjb25mdXNlZCB1c2Vycy4KKworKiBNYWtlIHRoZSB0ZXh0IGZvciAiUmVnaXN0ZXIiIGN1c3RvbWl6YWJsZQorCitQbHVnaW4gU2NyZWVucworXl5eXl5eXl5eXl5eXl4KKworKiBTaG93IHN0YXR1cyBmb3IgZW5hYmxlZCBwbHVnaW5zIGluIHRoZSBXZWJVSSBhcyAnRW5hYmxlZCcKKysKK0VhcmxpZXIgbm8gc3RhdHVzIHdhcyBzaG93biBmb3IgZW5hYmxlZCBwbHVnaW5zLCB3aGljaCB3YXMgY29uZnVzaW5nIHRvCitzb21lIHVzZXJzLgorCitSRVNUIEFQSQorfn5+fn5+fn4KKworKiBBIGJpZyBjaHVuayBvZiB0aGUgR2Vycml0IGZ1bmN0aW9uYWxpdHkgaXMgbm93IGF2YWlsYWJsZSB2aWEgdGhlCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS5odG1sW1JFU1QgQVBJXS4KKysKK1RoZSBSRVNUIEFQSSBpcyAqTk9UKiBjb21wbGV0ZSB5ZXQgYW5kIHNvbWUgZnVuY3Rpb25hbGl0eSBpcyBzdGlsbCBtaXNzaW5nLgorKworVG8gZmluZCBvdXQgd2hpY2ggZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUsIGNoZWNrIHRoZSBSRVNUIGVuZHBvaW50IGRvY3VtZW50YXRpb24gZm9yCitsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGktcHJvamVjdHMuaHRtbFtwcm9qZWN0c10sCitsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGktY2hhbmdlcy5odG1sW2NoYW5nZXNdLAorbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLWdyb3Vwcy5odG1sW2dyb3Vwc10gYW5kCitsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGktYWNjb3VudHMuaHRtbFthY2NvdW50c10uCisKKyogU3VwcG9ydCBzZXR0aW5nIGBIRUFEYCBvZiBhIHByb2plY3QKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLXByb2plY3RzLmh0bWwjc2V0LWhlYWRbdmlhIFJFU1RdLgorCisqIEF1ZGl0IHN1cHBvcnQgZm9yIFJFU1QgQVBJLgorKworQWxsb3cgZ2VuZXJhdGluZyBBdWRpdCBldmVudHMgcmVsYXRlZCB0byBSRVNUIEFQSSBleGVjdXRpb24uIFRoZQorc3RydWN0dXJlIG9mIHRoZSBBdWRpdEV2ZW50IGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgdGhlIG5ldworbmFtZS1tdWx0aXZhbHVlIHBhaXJzIHVzZWQgaW4gdGhlIFJFU1QgQVBJLgorKworVGhpcyBpcyBicmVha2luZyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIDIuNSBBUEkgYXMgaXQgY2hhbmdlcyB0aGUKK3BhcmFtcyBkYXRhIHR5cGUsIHRoaXMgaXMgbmVlZGVkIGFueXdheSBhcyB0aGUgcHJldmlvdXMgbGlzdCBvZgorT2JqZWN0cyB3YXMgbm90IHByb3ZpZGluZyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBvZgorIndoYXQgcmVsYXRlcyB0byB3aGF0IiBpbiB0ZXJtcyBvZiBwYXJhbWV0ZXJzIGluZm8uCisrCitFeGlzdGluZyBzdXBwb3J0IGZvciBTU0ggYW5kIEpTT04tUlBDIGV2ZW50cyBoYXZlIGJlZW4gYWRhcHRlZCBpbgorb3JkZXIgdG8gZml0IGludG8gdGhlIG5ldyBuYW1lLW11bHRpdmFsdWUgc3ludGF4OiB0aGlzIGFsbG93IGEKK2dlbmVyaWMgYXVkaXQgcGx1Zy1pbiB0byBjYXB0dXJlIGFsbCBwYXJhbWV0ZXJzIHJlZ2FyZGxlc3Mgb2Ygd2hlcmUKK3RoZXkgaGF2ZSBiZWVuIGdlbmVyYXRlZC4KKworKiBSZW1vdmUgc3VwcG9ydCBmb3IgZGVwcmVjYXRlZCBgLS1mb3JtYXRgIG9wdGlvbiB3aGVuIGxpc3RpbmcgY2hhbmdlcworKworUXVlcnlpbmcgY2hhbmdlcyB2aWEgUkVTVCBpcyBub3cgYWx3YXlzIHByb2R1Y2luZyBKU09OIG91dHB1dC4KKworKiBJbnRyb2R1Y2UgYGlkYCBwcm9wZXJ0eSBvbiBSRVNUIGVudGl0aWVzCisrCitUaGUgYC9jaGFuZ2VzL2AgZW50aXRpZXMgbm93IHVzZSBgaWRgIHRvIGluY2x1ZGUgYSB0cmlwbGV0IG9mIHRoZQorcHJvamVjdCwgYnJhbmNoIGFuZCBjaGFuZ2UtaWQgc3RyaW5nIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoYXQgY2hhbmdlCitvbiB0aGUgc2VydmVyLiBUaGlzIG1vdmVzIHRoZSBvbGQgYGlkYCBmaWVsZCB0byBiZSBuYW1lZCBgY2hhbmdlX2lkYCwKK3doaWNoIGlzIGEgYnJlYWtpbmcgY2hhbmdlLgorCisqIEFjY2VwdCBjb21tb24gZm9ybXMgb2YgbWFsZm9ybWVkIEpTT04KKysKK1NvbWUgY2xpZW50cyBtYXkgc2VuZCBKU09OLWlzaCBpbnN0ZWFkIG9mIEpTT04uIEJlIG5pY2UgdG8gdGhvc2UKK2NsaWVudHMgYW5kIGFjY2VwdCB2YXJpb3VzIHVzZWZ1bCBmb3JtcyBvZiBpbmNvcnJlY3Qgc3ludGF4OgorKworKiogRW5kIG9mIGxpbmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCBgLy9gIG9yIGAjYCBhbmQgZW5kaW5nIHdpdGggYQorICAgbmV3bGluZSBjaGFyYWN0ZXIuCisqKiBDLXN0eWxlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggYC8qYCBhbmQgZW5kaW5nIHdpdGggYCovYAorICAgU3VjaCBjb21tZW50cyBtYXkgbm90IGJlIG5lc3RlZC4KKyoqIE5hbWVzIHRoYXQgYXJlIHVucXVvdGVkIG9yIHNpbmdsZSBxdW90ZWQuCisqKiBTdHJpbmdzIHRoYXQgYXJlIHVucXVvdGVkIG9yIHNpbmdsZSBxdW90ZWQuCisqKiBBcnJheSBlbGVtZW50cyBzZXBhcmF0ZWQgYnkgYDtgIGluc3RlYWQgb2YgYCxgLgorKiogVW5uZWNlc3NhcnkgYXJyYXkgc2VwYXJhdG9ycy4gVGhlc2UgYXJlIGludGVycHJldGVkIGFzIGlmIG51bGwgd2FzCisgICB0aGUgb21pdHRlZCB2YWx1ZS4KKyoqIE5hbWVzIGFuZCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGA9YCBvciBgPT5gIGluc3RlYWQgb2YgYDpgLgorKiogTmFtZS92YWx1ZSBwYWlycyBzZXBhcmF0ZWQgYnkgYDtgIGluc3RlYWQgb2YgYCxgLgorCisqIEJlIG1vcmUgbGliZXJhbCBhYm91dCBwYXJzaW5nIEpTT04gcmVzcG9uc2VzCisrCitJZiB0aGUgcmVzcG9uc2UgYmVnaW5zIHdpdGggdGhlIEpTT04gbWFnaWMgc3RyaW5nLCByZW1vdmUgaXQgYmVmb3JlCitwYXJzaW5nLiBJZiBhIHJlc3BvbnNlIGlzIG1pc3NpbmcgdGhpcyBsZWFkaW5nIHN0cmluZywgcGFyc2UgdGhlCityZXNwb25zZSBhcy1pcy4KKworKiBBY2NlcHQgc2ltcGxlIGZvcm0gZW5jb2RlZCBkYXRhIGZvciBSRVNUIEFQSXMKKysKK1NpbXBsZSBjYXNlcyBsaWtlIGAvcmV2aWV3YCBvciBgL2FiYW5kb25gIGNhbiBub3cgYWNjZXB0IHN0YW5kYXJkIGZvcm0KK3ZhbHVlcyBmb3IgYmFzaWMgcHJvcGVydGllcywgbWFraW5nIGl0IHNpbXBsZSBmb3IgdG9vbHMgdG8gZGlyZWN0bHkKK3Bvc3QgZGF0YToKKysKKy0tLS0KKyAgY3VybCAtbiAtLWRpZ2VzdCBcCisgIC0tZGF0YSAnbWVzc2FnZT1Eb2VzIG5vdCBjb21waWxlLicgXAorICAtLWRhdGEgbGFiZWxzLlZlcmlmaWVkPS0xIFwKKyAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvY2hhbmdlcy8zL3JldmlzaW9ucy8xL3JldmlldworLS0tLQorKworRm9ybSBmaWVsZCBuYW1lcyBhcmUgSlNPTiBmaWVsZCBuYW1lcyBpbiB0aGUgdG9wIGxldmVsIG9iamVjdC4gIElmIGRvdAorYXBwZWFycyBpbiB0aGUgbmFtZSB0aGUgcGFydCB0byB0aGUgbGVmdCBpcyB0YWtlbiBhcyB0aGUgSlNPTiBmaWVsZAorbmFtZSBhbmQgdGhlIHBhcnQgdG8gdGhlIHJpZ2h0IGFzIHRoZSBrZXkgZm9yIGEgTWFwLiBUaGlzIG5pY2VseSBmaXRzCit3aXRoIHRoZSBsYWJlbHMgc3RydWN0dXJlIHVzZWQgYnkgYC9yZXZpZXdgLCBidXQgZG9lc24ndCBzdXBwb3J0IHRoZQorbXVjaCBtb3JlIGNvbXBsZXggaW5saW5lIGNvbW1lbnQgY2FzZS4gQ2xpZW50cyB0aGF0IG5lZWQgdG8gdXNlIG1vcmUKK2NvbXBsZXggZmllbGRzIG11c3QgdXNlIEpTT04gZm9ybWF0dGluZyBmb3IgdGhlIHJlcXVlc3QgYm9keS4KKworKiBBbGxvdyBhZG1pbmlzdHJhdG9ycyB0byBzZWUgb3RoZXIgdXNlciBjYXBhYmlsaXRpZXMKKysKK0V4cGFuZCBgL2FjY291bnRzL3tpZH0vY2FwYWJpbGl0aWVzYCB0byBwZXJtaXQgYW4gYWRtaW5pc3RyYXRvcgordG8gaW5zcGVjdCBhbm90aGVyIHVzZXIncyBlZmZlY3RpdmUgY2FwYWJpbGl0aWVzLgorCisqIERlY2xhcmUga2luZCBpbiBKU09OIEFQSSByZXN1bHRzCisrCitUaGlzIGlzIHJlY29tbWVuZGVkIHRvIGhpbnQgdG8gY2xpZW50cyB3aGF0IHRoZSBlbnRpdHkgdHlwZSBpcyB3aGVuCitwcm9jZXNzaW5nIHRoZSBKU09OIHBheWxvYWQuCisKKyogRm9ybWF0IGgvaGVscCBvdXRwdXQgYXMgcGxhaW4gdGV4dCBub3QgSlNPTgorKworVGhlIG91dHB1dCBwcm9kdWNlZCB3aGVuIHRoZSBjbGllbnQgcmVxdWVzdGVkIHRoZSBoIG9yIGhlbHAgcHJvcGVydHkKK2Zyb20gYSBKU09OIEFQSSBpcyBhbHdheXMgcHJvZHVjZWQgZnJvbSBjb25zdGFudCBjb21waWxlZCBpbnRvIHRoZQorc2VydmVyLiBBc3N1bWUgdGhpcyBzYWZlIHRvIHJldHVybiB0byB0aGUgY2xpZW50IGFzIHRleHQvcGxhaW4gY29udGVudAorYW5kIGF2b2lkIHdyYXBwaW5nIGl0IGludG8gYW4gSFRNTCBlc2NhcGVkIEpTT04gc3RyaW5nLgorCisqIFVzZSBzdHJpbmcgZm9yIEpTT04gZW5jb2RlZCBwbGFpbiB0ZXh0IHJlcGxpZXMKKysKK0luc3RlYWQgb2Ygd3JhcHBpbmcgdGhlIHZhbHVlIGludG8gYW4gb2JqZWN0LCBqdXN0IHJldHVybiB0aGUKK3N0cmluZyBieSBpdHNlbGYuIFRoaXMgYmV0dGVyIG1hdGNoZXMgd2hhdCBoYXBwZW5zIHdpdGggdGhlIHBsYWluCit0ZXh0IHJldHVybiBmb3JtYXQuCisKKyogV3JhcCBwb3NzaWJsZSBIVE1MIHBsYWluIHRleHQgaW4gSlNPTiBvbiBHRVQKKysKK0lmIHRoZSBIVE1MIGFwcGVhcnMgbGlrZSBNU0lFIG1pZ2h0IGd1ZXNzIGl0IGlzIEhUTUwgKHN1Y2ggYXMgaWYgaXQKK2NvbnRhaW5zIGA8YCkgZW5jb2RlIHRoZSByZXNwb25zZSBhcyBhIEpTT04gb2JqZWN0IGluc3RlYWQgb2YgYXMgYQorc2ltcGxlIHBsYWluIHRleHQgc3RyaW5nLiBUaGlzIHdvbid0IHNob3cgdXAgdmVyeSBvZnRlbiBmb3IgY2xpZW50cywKK2FuZCBwcm90ZWN0cyBNU0lFIHVzZXJzIHN0dWNrIG9uIGFuY2llbnQgdmVyc2lvbnMgKHByZSBNU0lFIDgpLgorCisqIEFzayBNU0lFIHRvIG5ldmVyIHNuaWZmIGNvbnRlbnQgdHlwZXMgb24gUkVTVCBBUEkgcmVzcG9uc2VzCisrCitOZXdlciB2ZXJzaW9ucyBvZiBNU0lFIGNhbiBkaXNhYmxlIHRoZSBjb250ZW50IHNuaWZmaW5nIGZlYXR1cmUgaWYgdGhlCitzZXJ2ZXIgYXNrcyBpdCB0byBieSBzZXR0aW5nIGFuIGV4dGVuc2lvbiBoZWFkZXIuIEl0IGlzIGFubm95aW5nLCBidXQKK25lY2Vzc2FyeSwgdGhhdCBhIHNlcnZlciBuZWVkcyB0byBzYXkgIk5vIHJlYWxseSwgSSBfYW1fIHRlbGxpbmcgeW91Cit0aGUgcmlnaHQgQ29udGVudC1UeXBlLCB0cnVzdCBpdC4iCisrCitUaGlzIGZlYXR1cmUgd2FzIGFkZGVkIGluIE1TSUUgOCBCZXRhIDIgc28gaXQgZG9lc24ndCBwcm90ZWN0IHVzZXJzCitydW5uaW5nIE1TSUUgNiBvciA3LCBidXQgdGhvc2UgYXJlIGFuY2llbnQgYW5kIHVzZXJzIHNob3VsZCB1cGdyYWRlLgorKworRW5hYmxlIHRoaXMgb24gdGhlIFJFU1QgQVBJIHJlc3BvbnNlcyBiZWNhdXNlIHdlIHNvbWV0aW1lcyBzZW5kIGJhY2sKK3RleHQvcGxhaW4gcmVzdWx0cyB0aGF0IGFyZSByZWFsbHkganVzdCBwbGFpbiB0ZXh0LiBFeGlzdGluZyBKU09OCityZXNwb25zZXMgYXJlIHByb3RlY3RlZCBmcm9tIGFjY2lkZW50aWFsIHNuaWZmaW5nIGFuZCB0cmVhdG1lbnQgYXMKK0hUTUwgdGhhbmtzIHRvIEdzb24gZW5jb2RpbmcgSFRNTCBjb250cm9sIGNoYXJhY3RlcnMgdXNpbmcgVW5pY29kZQorY2hhcmFjdGVyIGVzY2FwZXMgd2l0aGluIEpTT04gc3RyaW5ncy4KKworKiBBcGFjaGUgcmV2ZXJzZSBwcm94aWVzIG11c3Qgc3dpdGNoIHRvIG1vZF9yZXdyaXRlCisrCitXaGVuIEFwYWNoZSBpcyB1c2VkIGFzIGEgcmV2ZXJzZSBwcm94eSB0aGUgc2VydmVyIG11c3QgYmUgcmVjb25maWd1cmVkCit0byB1c2UgbW9kX3Jld3JpdGUgYW5kIEFsbG93RW5jb2RlZFNsYXNoZXMuICBGb3IgdXBkYXRlZCBpbmZvcm1hdGlvbgorbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1yZXZlcnNlcHJveHkuaHRtbCNfYXBhY2hlXzJfY29uZmlndXJhdGlvblsKK3JldmlldyB0aGUgQXBhY2hlIDIgQ29uZmlndXJhdGlvbiBkb2N1bWVudGF0aW9uXS4KKworUHJvamVjdCBEYXNoYm9hcmRzCit+fn5+fn5+fn5+fn5+fn5+fn4KKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItZGFzaGJvYXJkcy5odG1sI3Byb2plY3QtZGFzaGJvYXJkc1sKKyAgU3VwcG9ydCBmb3Igc3RvcmluZyBjdXN0b20gZGFzaGJvYXJkcyBmb3IgcHJvamVjdHNdCisrCitDdXN0b20gZGFzaGJvYXJkcyBjYW4gbm93IGJlIHN0b3JlZCBpbiB0aGUgcHJvamVjdHMKK2ByZWZzL21ldGEvZGFzaGJvYXJkcy8qYCBicmFuY2hlcy4KKysKK1RoZSBwcm9qZWN0IGRhc2hib2FyZHMgYXJlIHNob3duIGluIGEgbmV3IHByb2plY3Qgc2NyZWVuIGFuZCBjYW4gYmUKK2xpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS1wcm9qZWN0cy5odG1sI2Rhc2hib2FyZC1lbmRwb2ludHNbCithY2Nlc3NlZCB2aWEgUkVTVF0uCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItZGFzaGJvYXJkcy5odG1sI3Byb2plY3QtZGVmYXVsdC1kYXNoYm9hcmRbCisgIEFsbG93IGRlZmluaW5nIGEgZGVmYXVsdCBkYXNoYm9hcmQgZm9yIHByb2plY3RzXQorCisqIFN1cHBvcnQgaW5oZXJpdGFuY2UgZm9yIHByb2plY3QgZGFzaGJvYXJkcy4KKysKK0luIGRhc2hib2FyZHMgcXVlcmllcyB0aGUgYCR7cHJvamVjdH1gIHRva2VuIGNhbiBiZSB1c2VkIGFzIHBsYWNlaG9sZGVyCitmb3IgdGhlIHByb2plY3QgbmFtZS4gVGhpcyB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHByb2plY3QgdG8KK3doaWNoIGEgZGFzaGJvYXJkIGlzIGJlaW5nIGFwcGxpZWQuCisKKyogT24gdGhlIHByb2plY3QgbGlzdCBzY3JlZW4gYSBxdWVyeSBpY29uIGlzIGRpc3BsYXllZCBmb3IgZWFjaCBwcm9qZWN0CisgIHRoYXQgbGlua3MgdG8gdGhlIGRlZmF1bHQgZGFzaGJvYXJkIG9mIHRoYXQgcHJvamVjdC4KKworKiBTdXBwb3J0IGEgYGZvcmVhY2hgIHBhcmFtZXRlciBmb3IgY3VzdG9tIGRhc2hib2FyZHMuCisrCitUaGUgYGZvcmVhY2hgIHBhcmFtZXRlciB3aGljaCB3aWxsIGdldCBhcHBlbmRlZCB0byBhbGwgdGhlIHF1ZXJpZXMgaW4KK3RoZSBkYXNoYm9hcmQuCisKK0FjY2VzcyBDb250cm9scworfn5+fn5+fn5+fn5+fn5+CisqIEFsbG93IHRvIG92ZXJydWxlIGBCTE9DS2AgcGVybWlzc2lvbnMgb24gdGhlIHNhbWUgcHJvamVjdAorKworSXQgd2FzIGltcG9zc2libGUgdG8gYmxvY2sgYSBwZXJtaXNzaW9uIGZvciBhIGdyb3VwIGFuZCBhbGxvdyB0aGUgc2FtZQorcGVybWlzc2lvbiBmb3IgYSBzdWItZ3JvdXAgb2YgdGhhdCBncm91cCBhcyB0aGUgYEJMT0NLYCBwZXJtaXNzaW9uCithbHdheXMgd29uIG92ZXIgYW55IGBBTExPV2AgcGVybWlzc2lvbi4gRm9yIGV4YW1wbGUsIGl0IHdhcyBpbXBvc3NpYmxlCit0byBibG9jayB0aGUgIkZvcmdlIENvbW1pdHRlciIgcGVybWlzc2lvbiBmb3IgYWxsIHVzZXJzIGFuZCB0aGVuIGFsbG93CitpdCBvbmx5IGZvciBhIGNvdXBsZSBvZiBwcml2aWxlZ2VkIHVzZXJzLgorKworQW4gYEFMTE9XYCBwZXJtaXNzaW9uIGhhcyBub3cgIHByaW9yaXR5IG92ZXIgYSBgQkxPQ0tgIHBlcm1pc3Npb24gd2hlbgordGhleSBhcmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBhY2Nlc3Mgc2VjdGlvbiBvZiBhIHByb2plY3QuIFRvIGFjaGlldmUgdGhlCithYm92ZSBtZW50aW9uZWQgcG9saWN5IHRoZSBmb2xsb3dpbmcgY291bGQgYmUgZGVmaW5lZDoKKysKKyAgW2FjY2VzcyAicmVmcy9oZWFkcy8qIl0KKyAgICBmb3JnZUNvbW1pdHRlciA9IGJsb2NrIGdyb3VwIEFub255bW91cyBVc2VycworICAgIGZvcmdlQ29tbWl0dGVyID0gZ3JvdXAgUHJpdmlsZWdlZCBVc2VycworKworQWNyb3NzIHByb2plY3RzIHRoZSBgQkxPQ0tgIHBlcm1pc3Npb24gc3RpbGwgd2lucyBvdmVyIGFueSBgQUxMT1dgCitwZXJtaXNzaW9uLiBUaGlzIHdheSBvbmUgY2Fubm90IG92ZXJyaWRlIGFuIGluaGVyaXRlZCBgQkxPQ0tgCitwZXJtaXNzaW9uIGluIGEgc3VicHJvamVjdC4KKysKK092ZXJydWxpbmcgb2YgYEJMT0NLYCBwZXJtaXNzaW9ucyB3aXRoIGBBTExPV2AgcGVybWlzc2lvbnMgYWxzbyB3b3JrcworZm9yIGxhYmVscyBpLmUuIHBlcm1pc3Npb24gcmFuZ2VzLiBJZiBhIGRlZGljYXRlZCAnVmVyaWZpZXJzJyBncm91cAorbmVlZCB0byBiZSB0aGUgb25seSBncm91cCB3aG8gY2FuIHZvdGUgaW4gdGhlICdWZXJpZmllZCcgbGFiZWwgYW5kIGl0CittdXN0IGJlIGVuc3VyZWQgdGhhdCBldmVuIHByb2plY3Qgb3duZXJzIGNhbm5vdCBjaGFuZ2UgdGhpcyBwb2xpY3ksCit0aGVuIHRoZSBmb2xsb3dpbmcgY2FuIGJlIGRlZmluZWQgaW4gYSBjb21tb24gcGFyZW50IHByb2plY3Q6CisrCisgIFthY2Nlc3MgInJlZnMvaGVhZHMvKiJdCisgICAgbGFiZWwtVmVyaWZpZWQgPSBibG9jayAtMS4uKzEgZ3JvdXAgQW5vbnltb3VzIFVzZXJzCisgICAgbGFiZWwtVmVyaWZpZWQgPSAtMS4uKzEgZ3JvdXAgVmVyaWZpZXJzCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE1MTZbaXNzdWUgMTUxNl06CisgIFNob3cgZ2xvYmFsIGNhcGFiaWxpdGllcyB0byBhbGwgdXNlcnMgdGhhdCBjYW4gcmVhZCBgcmVmcy9tZXRhL2NvbmZpZ2AKKysKK1VzZXJzIGNhbiBub3cgcHJvcG9zZSBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIGZvciByZXZpZXcKK2Zyb20gdGhlIFdlYlVJLgorCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X3JlbW92ZV9yZXZpZXdlclsKKyAgUmVtb3ZlIFJldmlld2VyXSBpcyBhIG5ldyBwZXJtaXNzaW9uLgorCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X3B1c2hfc2lnbmVkWworICBQdXNoaW5nIGEgc2lnbmVkIHRhZ10gaXMgYSBuZXcgcGVybWlzc2lvbi4KKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvYWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV9lZGl0X3RvcGljX25hbWVbCisgIEVkaXRpbmcgdGhlIHRvcGljIG5hbWVdIGlzIGEgbmV3IHBlcm1pc3Npb24uCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9hY2Nlc3NEYXRhYmFzZVsKKyAgUmF3IGRhdGFiYXNlIGFjY2Vzc10gd2l0aCB0aGUgYGdzcWxgIGNvbW1hbmQgaXMgYSBuZXcgZ2xvYmFsIGNhcGFiaWxpdHkuCisrCitQcmV2aW91c2x5IHNpdGUgYWRtaW5pc3RyYXRvcnMgaGFkIHRoaXMgY2FwYWJpbGl0eSBieSBkZWZhdWx0LiAgTm93IGl0IGhhcwordG8gYmUgZXhwbGljaXRseSBhc3NpZ25lZCwgZXZlbiBmb3Igc2l0ZSBhZG1pbmlzdHJhdG9ycy4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTU4NVtJc3N1ZSAxNTg1XToKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfdmlld19kcmFmdHNbCisgIFZpZXdpbmcgb3RoZXIgdXNlcnMnIGRyYWZ0IGNoYW5nZXNdIGlzIGEgbmV3IHBlcm1pc3Npb24uCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2NzVbSXNzdWUgMTY3NV06CisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X2RlbGV0ZV9kcmFmdHNbRGVsZXRpbmddIGFuZAorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvYWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV9wdWJsaXNoX2RyYWZ0c1twdWJsaXNoaW5nXQorICBvdGhlciB1c2VycycgZHJhZnQgY2hhbmdlcyBpcyBhIG5ldyBwZXJtaXNzaW9uLgorCisqIEdyYW50IG1vc3QgcGVybWlzc2lvbnMgd2hlbiBjcmVhdGluZyBgQWxsLVByb2plY3RzYAorKworTWFrZSBHZXJyaXQgbW9yZSBsaWtlIGEgR2l0IHNlcnZlciBvdXQtb2YtdGhlIGJveCBieSBncmFudGluZyBib3RoCitBZG1pbmlzdHJhdG9ycyBhbmQgUHJvamVjdCBPd25lcnMgcGVybWlzc2lvbnMgdG8gcmV2aWV3IGNoYW5nZXMsIHN1Ym1pdAordGhlbSwgY3JlYXRlIGJyYW5jaGVzLCBjcmVhdGUgdGFncywgYW5kIHB1c2ggZGlyZWN0bHkgdG8gYnJhbmNoZXMuCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNsZGFwLmdyb3VwTmFtZVsKKyAgTERBUCBncm91cCBuYW1lc10gYXJlIGNvbmZpZ3VyYWJsZSwgYGNuYCBpcyBzdGlsbCB0aGUgZGVmYXVsdC4KKworKiBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbiB0byBMREFQIHNlcnZlcnMgaXMgbm93IHN1cHBvcnRlZC4KKworKiBCYXNpYyBwcm9qZWN0IHByb3BlcnRpZXMgYXJlIG5vdyBpbmhlcml0ZWQgYnkgZGVmYXVsdCBmcm9tIHBhcmVudAorICBwcm9qZWN0czogVXNlIENvbnRlbnQgTWVyZ2UsIFJlcXVpcmUgQ29udHJpYnV0b3IgQWdyZWVtZW50LCBSZXF1aXJlCisgIENoYW5nZSBJZCwgUmVxdWlyZSBTaWduZWQgT2ZmIEJ5LgorCisqIEFsbG93IGFzc2lnbmluZyBgUHVzaGAgZm9yIGByZWZzL21ldGEvY29uZmlnYCBvbiBgQWxsLVByb2plY3RzYAorKworVGhlIGByZWZzL21ldGEvY29uZmlnYCBicmFuY2ggb2YgdGhlIGBBbGwtUHJvamVjdHNgIHByb2plY3Qgc2hvdWxkIG9ubHkKK2JlIG1vZGlmaWVkIGJ5IEdlcnJpdCBhZG1pbmlzdHJhdG9ycyBiZWNhdXNlIGJlaW5nIGFibGUgdG8gZG8KK21vZGlmaWNhdGlvbnMgb24gdGhpcyBicmFuY2ggbWVhbnMgdGhhdCB0aGUgdXNlciBjb3VsZCBhc3NpZ24gaGltc2VsZgorYWRtaW5pc3RyYXRvciBwZXJtaXNzaW9ucy4KKysKK0luIGFkZGl0aW9uIHRvIGJlaW5nIGFkbWluaXN0cmF0b3IgR2Vycml0IHJlcXVpcmVzIHRoYXQgdGhlCithZG1pbmlzdHJhdG9yIGhhcyB0aGUgYFB1c2hgIGFjY2VzcyByaWdodCBmb3IgYHJlZnMvbWV0YS9jb25maWdgIGluCitvcmRlciB0byBiZSBhYmxlIHRvIG1vZGlmeSBpdCAoanVzdCBhcyB3aXRoIGFsbCBvdGhlciBicmFuY2hlcworYWRtaW5pc3RyYXRvcnMgZG8gbm90IGhhdmUgZWRpdCBwZXJtaXNzaW9ucyBieSBkZWZhdWx0KS4KKysKK1RoZSBwcm9ibGVtIHdhcyB0aGF0IGFzc2lnbmluZyB0aGUgYFB1c2hgIGFjY2VzcyByaWdodCBmb3IKK2ByZWZzL21ldGEvY29uZmlnYCBvbiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCB3YXMgbm90IGFsbG93ZWQuCisrCitIYXZpbmcgdGhlIGBQdXNoYCBhY2Nlc3MgcmlnaHQgZm9yIGByZWZzL21ldGEvY29uZmlnYCBvbiB0aGUKK2BBbGwtUHJvamVjdHNgIHByb2plY3Qgd2l0aG91dCBiZWluZyBhZG1pbmlzdHJhdG9yIGhhcyBubyBlZmZlY3QuCisKK0hvb2tzCit+fn5+fgorKiBDaGFuZ2UgdG9waWMgaXMgcGFzc2VkIHRvIGhvb2tzIGFzIGAtLXRvcGljIE5BTUVgLgorKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTIwMFtJc3N1ZSAxMjAwXToKK05ldyBgcmV2aWV3ZXItYWRkZWRgIGhvb2sgYW5kIHN0cmVhbSBldmVudCB3aGVuIGEgcmV2aWV3ZXIgaXMgYWRkZWQuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTEyMzdbSXNzdWUgMTIzN106CitOZXcgYG1lcmdlLWZhaWxlZGAgaG9vayBhbmQgc3RyZWFtIGV2ZW50IHdoZW4gYSBjaGFuZ2UgY2Fubm90IGJlIHN1Ym1pdHRlZCBkdWUgdG8gZmFpbGVkIG1lcmdlLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD05MjVbSXNzdWUgOTI1XToKK05ldyBgcmVmLXVwZGF0ZWAgaG9vayBydW4gYmVmb3JlIGEgcHVzaCBpcyBhY2NlcHRlZCBieSBHZXJyaXQuCisKKyogQWRkIGAtLWlzLWRyYWZ0YCBwYXJhbWV0ZXIgdG8gYGNvbW1lbnQtYWRkZWRgIGhvb2sKKworR2l0Cit+fn4KKyogQWRkIG9wdGlvbnMgdG8gYHJlZnMvZm9yL2AgbWFnaWMgYnJhbmNoIHN5bnRheAorKworR2l0IGRvZXNuJ3Qgd2FudCB0byBtb2RpZnkgdGhlIG5ldHdvcmsgcHJvdG9jb2wgdG8gc3VwcG9ydCBwYXNzaW5nCitkYXRhIGZyb20gdGhlIGdpdCBwdXNoIGNsaWVudCB0byB0aGUgc2VydmVyLiBXb3JrIGFyb3VuZCB0aGlzIGJ5CitlbWJlZGRpbmcgb3B0aW9uIGRhdGEgaW50byBhIG5ldyBzdHlsZSBvZiByZWZlcmVuY2Ugc3BlY2lmaWNhdGlvbjoKKysKKy0tLS0KKyAgcmVmcy9mb3IvbWFzdGVyJXI9YWxpY2UsY2M9Ym9iLGNjPWNoYXJsaWUsdG9waWM9b3B0aW9ucworLS0tLQorKworaXMgbm93IHBhcnNlZCBieSB0aGUgc2VydmVyIGFzOgorKworLS0KKyoqIHNldCB0b3BpYyB0byAib3B0aW9ucyIKKyoqIENDIGNoYXJsaWUgYW5kIGJvYgorKiogYWRkIHJldmlld2VyIGFsaWNlCisqKiBmb3IgYnJhbmNoIHJlZnMvaGVhZHMvbWFzdGVyCistLQorKworSWYgYCVgIGlzIHVzZWQgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGFmdGVyIHRoZSBicmFuY2ggbmFtZSBpcworcGFyc2VkIGFzIG9wdGlvbnMgd2l0aCBhcmdzNGouIEVhY2ggb3B0aW9uIGlzIGRlbGltaXRlZCBieSBgLGAuCisrCitTZWxlY3RpbmcgcHVibGlzaCB2cy4gZHJhZnQgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgb3B0aW9ucyBgZHJhZnRgIG9yCitgcHVibGlzaGAsIGFwcGVhcmluZyBhbnl3aGVyZSBpbiB0aGUgcmVmc3BlYyBhZnRlciB0aGUgYCVgIG1hcmtlcjoKKysKKy0tLS0KKyAgcmVmcy9mb3IvbWFzdGVyJWRyYWZ0CisgIHJlZnMvZm9yL21hc3RlciVkcmFmdCxyPWFsaWNlCisgIHJlZnMvZm9yL21hc3RlciVyPWFsaWNlLGRyYWZ0CisgIHJlZnMvZm9yL21hc3RlciVyPWFsaWNlLHB1Ymxpc2gKKy0tLS0KKworKiBFbmFibGUgY29udGVudCBtZXJnZSBieSBkZWZhdWx0CisrCitNb3N0IHRlYW1zIHNlZW0gdG8gZXhwZWN0IEdlcnJpdCB0byBtYW5hZ2Ugc2ltcGxlIG1lcmdlcyB3aXRoaW4gYQorc291cmNlIGNvZGUgZmlsZS4gRW5hYmxlIHRoaXMgb3V0LW9mLXRoZS1ib3guCisKKyogQWRkZWQgYSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI2NvcmUudXNlUmVjdXJzaXZlTWVyZ2VbCisgIHNlcnZlci1sZXZlbCBvcHRpb25dIHRvIHVzZSBKR2l0J3MgbmV3LCBleHBlcmltZW50YWwgcmVjdXJzaXZlIG1lcmdlci4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTYwOFtJc3N1ZSAxNjA4XToKK0NvbW1pdHMgcHVzaGVkIHdpdGhvdXQgYSBDaGFuZ2UtSWQgbm93IHdhcm4gd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93Cit0byBkb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgY29tbWl0LW1zZyBob29rLgorCisqIEFkZCBgb2xkT2JqZWN0SWRgIGFuZCBgbmV3T2JqZWN0SWRgIHRvIHRoZSBgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLlVwZGF0ZWAKKworU1NICit+fn4KKyogTmV3IFNTSCBjb21tYW5kIHRvIGh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY21kLWdjLmh0bWxbCisgIHJ1biBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uXQorKworQWxsIEdDIHJ1bnMgYXJlIGxvZ2dlZCBpbiBhIEdDIGxvZyBmaWxlLgorCisqIERlc2NyaXB0aW9ucyBhcmUgYWRkZWQgdG8gc3NoIGNvbW1hbmRzLgorKworSWYgYGdlcnJpdGAgaXMgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBpdCB3aWxsIG5vdyBzaG93IGEgbGlzdCBvZiBhdmFpbGFibGUKK2NvbW1hbmRzIHdpdGggdGhlaXIgZGVzY3JpcHRpb25zLgorCisqIGBjcmVhdGUtYWNjb3VudCAtLWh0dHAtcGFzc3dvcmRgIGVuYWJsZXMgc2V0dGluZy9yZXNldHRpbmcgdGhlCisgIEhUVFAgcGFzc3dvcmQgb2Ygcm9sZSBhY2NvdW50cywgZm9yIEdpdCBvciBSRVNUIEFQSSBhY2Nlc3MuCisKKyogaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jbWQtbHMtdXNlci1yZWZzLmh0bWxbCisgIGxzLXVzZXItcmVmc10gbGlzdHMgd2hpY2ggcmVmcyBhcmUgdmlzaWJsZSBmb3IgYSBnaXZlbiB1c2VyLgorCisqIGBscy1wcm9qZWN0cyAtLWhhcy1hY2wtZm9yYCBsaXN0cyBwcm9qZWN0cyB0aGF0IG1lbnRpb24gYSBncm91cAorICBpbiBhbiBBQ0wsIGlkZW50aWZ5aW5nIHdoZXJlIHJpZ2h0cyBhcmUgZ3JhbnRlZC4KKworKiBgcmV2aWV3YCBjb21tYW5kIHN1cHBvcnRzIHByb2plY3Qtc3BlY2lmaWMgbGFiZWxzCisKKyogYHRlc3Qtc3VibWl0LXJ1bGVgIHdhcyByZW5hbWVkIHRvIGB0ZXN0LXN1Ym1pdCBydWxlYDoKKysKK2BydWxlYCBpcyBub3cgYSBzdWJjb21tYW5kIG9mIHRoZSBgdGVzdC1zdWJtaXRgIGNvbW1hbmQuCisKKyogaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jbWQtdGVzdC1zdWJtaXQtdHlwZS5odG1sWworICB0ZXN0LXN1Ym1pdCB0eXBlXSB0ZXN0cyB0aGUgUHJvbG9nIHN1Ym1pdCB0eXBlIHdpdGggYSBjaG9zZW4gY2hhbmdlLgorCitRdWVyeQorfn5+fn4KKyogQWxsb3cgYHt9YCB0byBiZSB1c2VkIGZvciBxdW90aW5nIGluIHF1ZXJ5IGV4cHJlc3Npb25zCisrCitUaGlzIG1ha2VzIGl0IGEgbGl0dGxlIGVhc2llciB0byBxdWVyeSBmb3IgZ3JvdXAgbmFtZXMgdGhhdCBjb250YWluCithIHNwYWNlIG92ZXIgU1NIOgorKworICBzc2ggc3J2IGdlcnJpdCBxdWVyeSAiICdzdGF0dXM6b3BlbiBOT1QgcmV2aWV3ZXJpbjp7RGV2ZWxvcGVyIEdyb3VwfScgIgorCisqIFRoZSBxdWVyeSBzdW1tYXJ5IGJsb2NrIGluY2x1ZGVzIGByZXN1bWVTb3J0S2V5YC4KKworKiBRdWVyeSByZXN1bHRzIGluY2x1ZGUgYXV0aG9yIGFuZCBjaGFuZ2Ugc2l6ZSBpbmZvcm1hdGlvbiB3aGVuIGNlcnRhaW4KKyAgb3B0aW9ucyBhcmUgc3BlY2lmaWVkLgorCisqIFdoZW4gYSBmaWxlIGlzIHJlbmFtZWQgdGhlIG9sZCBmaWxlIG5hbWUgaXMgaW5jbHVkZWQgaW4gdGhlIFBhdGNoCisgIGF0dHJpYnV0ZQorCitQbHVnaW5zCit+fn5+fn5+CisqIFBsdWdpbnMgY2FuIGNvbnRyaWJ1dGUgUHJvbG9nIGZhY3RzL3ByZWRpY2F0ZXMgZnJvbSBKYXZhLgorKiBQbHVnaW5zIGNhbiBwcm9tcHQgZm9yIHBhcmFtZXRlcnMgZHVyaW5nIGBpbml0YCB3aXRoIGBJbml0U3RlcGAuCisqIFBsdWdpbnMgY2FuIG5vdyBjb250cmlidXRlIEphdmFTY3JpcHQgdG8gdGhlIHdlYiBVSS4gVUkgcGx1Z2lucyBjYW4KKyAgYWxzbyBiZSB3cml0dGVuIGFuZCBjb21waWxlZCB3aXRoIEdXVC4KKyogTmV3IE1hdmVuIGFyY2hldHlwZXMgZm9yIEphdmFTY3JpcHQgYW5kIEdXVCBwbHVnaW5zLgorKiBQbHVnaW5zIGNhbiBjb250cmlidXRlIHZhbGlkYXRpb24gc3RlcHMgdG8gcmVjZWl2ZWQgY29tbWl0cy4KKyogQ29tbWl0IG1lc3NhZ2UgbGVuZ3RoIGNoZWNrcyBhcmUgbW92ZWQgdG8gdGhlIGBjb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yYAorICBwbHVnaW4gd2hpY2ggaXMgaW5jbHVkZWQgYXMgYSBjb3JlIHBsdWdpbiBpbiB0aGUgR2Vycml0IGRpc3RyaWJ1dGlvbiBhbmQKKyAgY2FuIGJlIGluc3RhbGxlZCBkdXJpbmcgc2l0ZSBpbml0aWFsaXphdGlvbi4KKyogQ3JlYXRpb24gb2YgY29kZSByZXZpZXcgbm90ZXMgaXMgbW92ZWQgdG8gdGhlIGByZXZpZXdub3Rlc2AgcGx1Z2luCisgIHdoaWNoIGlzIGluY2x1ZGVkIGFzIGEgY29yZSBwbHVnaW4gaW4gdGhlIEdlcnJpdCBkaXN0cmlidXRpb24gYW5kIGNhbgorICBiZSBpbnN0YWxsZWQgZHVyaW5nIHNpdGUgaW5pdGlhbGl6YXRpb24uCisqIEEgcGx1Z2luIGV4dGVuc2lvbiBwb2ludCBmb3IgYXZhdGFyIGltYWdlcyB3YXMgYWRkZWQuCisqIEFsbG93IEhUVFAgcGx1Z2lucyB0byBjaGFuZ2UgYHN0YXRpY2Agb3IgYGRvY3NgIHByZWZpeGVzCisrCitBbiBIVFRQIHBsdWdpbiBtYXkgd2FudCBtb3JlIGNvbnRyb2wgb3ZlciBpdHMgVVJMIHNwYWNlLCBidXQgc3RpbGwKK2RlbGVnYXRlIHRvIHRoZSBwbHVnaW4gc2VydmxldCdzIG1hZ2ljIGhhbmRsaW5nIGZvciBzdGF0aWMgZmlsZXMgYW5kCitkb2N1bWVudGF0aW9uLiBBZGQgSkFSIGF0dHJpYnV0ZXMgdG8gY29uZmlndXJlIHRoZXNlIHByZWZpeGVzLgorCitQcm9sb2cKK35+fn5+fgorW1tzdWJtaXQtdHlwZS1mcm9tLXByb2xvZ11dCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9wcm9sb2ctY29va2Jvb2suaHRtbCNIb3dUb1dyaXRlU3VibWl0VHlwZVsKKyAgU3VwcG9ydCBjb250cm9sbGluZyB0aGUgc3VibWl0IHR5cGUgZm9yIGNoYW5nZXMgZnJvbSBQcm9sb2ddCisrCitTaW1pbGFybHkgbGlrZSB0aGUgYHN1Ym1pdF9ydWxlYCB0aGVyZSBpcyBub3cgYSBgc3VibWl0X3R5cGVgIHByZWRpY2F0ZQord2hpY2ggcmV0dXJucyB0aGUgYWxsb3dlZCBzdWJtaXQgdHlwZSBmb3IgYSBjaGFuZ2UuIFdoZW4gdGhlCitgc3VibWl0X3R5cGVgIHByZWRpY2F0ZSBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIGBydWxlcy5wbGAgdGhlbiB0aGUKK3Byb2plY3QgZGVmYXVsdCBzdWJtaXQgdHlwZSBpcyB1c2VkIGZvciBhbGwgY2hhbmdlcyBvZiB0aGF0IHByb2plY3QuCisrCitGaWx0ZXJpbmcgdGhlIHJlc3VsdHMgb2YgdGhlIGBzdWJtaXRfdHlwZWAgaXMgYWxzbyBzdXBwb3J0ZWQgaW4gdGhlCitzYW1lIHdheSBsaWtlIGZpbHRlcmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgYHN1Ym1pdF9ydWxlYC4gVXNpbmcgYQorYHN1Ym1pdF90eXBlX2ZpbHRlcmAgcHJlZGljYXRlIG9uZSBjYW4gZW5mb3JjZSBhIHBhcnRpY3VsYXIgc3VibWl0IHR5cGUKK2Zyb20gYSBwYXJlbnQgcHJvamVjdC4KKworKiBQbHVnaW5zIGNhbiBjb250cmlidXRlIFByb2xvZyBmYWN0cy9wcmVkaWNhdGVzIGZyb20gSmF2YS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg4W0lzc3VlIDI4OF06CisgIEV4cG9zZSBiYXNpYyBjb21taXQgc3RhdGlzdGljcyBmb3IgdGhlIFByb2xvZyBydWxlIGVuZ2luZQorKworQSBuZXcgbWV0aG9kIGBnZXJyaXQ6Y29tbWl0X3N0YXRzKC1GaWxlcywtSW5zZXJ0aW9ucywgLURlbGV0aW9ucylgIHdhcworYWRkZWQuCisKKyogQSBuZXcgYG1heF93aXRoX2Jsb2NrYCBwcmVkaWNhdGUgd2FzIGFkZGVkIGZvciBtb3JlIGNvbnZlbmllbnQgdXNhZ2UKKworRW1haWwKK35+fn5+CisqIE5vdGlmeSBwcm9qZWN0IHdhdGNoZXJzIGlmIGRyYWZ0IGNoYW5nZSBpcyBwdWJsaXNoZWQKKyogTm90aWZ5IHVzZXJzIG1lbnRpb25lZCBpbiBjb21taXQgZm9vdGVyIG9uIGRyYWZ0IHB1Ymxpc2gKKyogQWRkIG5ldyBub3RpZnkgdHlwZSB0aGF0IGFsbG93cyB3YXRjaGluZyBvZiBuZXcgcGF0Y2ggc2V0cworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY4NltJc3N1ZSAxNjg2XToKKyAgQWRkIG5ldyBub3RpZnkgdHlwZSB0aGF0IGFsbG93cyB3YXRjaGluZyBhYmFuZG9uaW5nIG9mIGNoYW5nZXMKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItbm90aWZ5Lmh0bWxbCisgIE5vdGlmaWNhdGlvbnMgY29uZmlndXJlZCBpbiBgcHJvamVjdC5jb25maWdgXSBjYW4gbm93IGJlIGFkZHJlc3NlZAorICB1c2luZyBhbnkgb2YgVG8sIENDLCBvciBCQ0MgaGVhZGVycy4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE1MzFbSXNzdWUgMTUzMV06CitFbWFpbCBmb290ZXJzIG5vdyBpbmNsdWRlIGBHZXJyaXQtSGFzQ29tbWVudHM6IHtZZXN8Tm99YC4KKyogYCNpZigkZW1haWwuaGFzSW5saW5lQ29tbWVudHMoKSlgIGNhbiBiZSB1c2VkIGluIHRlbXBsYXRlcyB0byB0ZXN0CisgIGlmIHRoZXJlIGFyZSBjb21tZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGlzIGVtYWlsLgorKiBOb3RpZmljYXRpb24gZW1haWxzIGFyZSBzZW50IHRvIGluY2x1ZGVkIGdyb3Vwcy4KKyogQ29tbWVudCBub3RpZmljYXRpb24gZW1haWxzIGFyZSBzZW50IHRvIHByb2plY3Qgd2F0Y2hlcnMuCisqICJDaGFuZ2UgTWVyZ2VkIiBlbWFpbHMgaW5jbHVkZSB0aGUgZGlmZiBvdXRwdXQgd2hlbiBgc2VuZGVtYWlsLmluY2x1ZGVEaWZmYCBpcyBlbmFibGVkLgorKiBXaGVuIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS1jaGFuZ2VzLmh0bWwjc2V0LXJldmlld1sKKyAgcG9zdGluZyBhIHJldmlldyB2aWEgUkVTVF0gdGhlIGNhbGxlciBjYW4gY29udHJvbCBlbWFpbCBkZWxpdmVyeQorKworVGhpcyBtYXkgaGVscCBhdXRvbWF0ZWQgc3lzdGVtcyB0byBiZSBsZXNzIG5vaXN5LiBUb29scyBjYW4gbm93IGNob29zZQord2hpY2ggcmV2aWV3IHVwZGF0ZXMgc2hvdWxkIHNlbmQgZW1haWwsIGFuZCB3aGljaCBjYXRlZ29yaWVzIG9mIHVzZXJzCitvbiBhIGNoYW5nZSBzaG91bGQgZ2V0IHRoYXQgZW1haWwuCisKK0xhYmVscworfn5+fn5+CisqIEFwcHJvdmFsIGNhdGVnb3JpZXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBsYWJlbHMKKyAgY29uZmlndXJlZCBpbiBgcHJvamVjdC5jb25maWdgLiBFeGlzdGluZyBjYXRlZ29yaWVzIGFyZSBtaWdyYXRlZCB0bworICBgcHJvamVjdC5jb25maWdgIGluIGBBbGwtUHJvamVjdHNgIGFzIHBhcnQgb2YgdGhlIHNjaGVtYSB1cGdyYWRlOyBubyB1c2VyCisgIGFjdGlvbiBpcyByZXF1aXJlZC4KKyogTGFiZWxzIGFyZSBubyBsb25nZXIgZ2xvYmFsOworICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWxhYmVscy5odG1sWworICBwcm9qZWN0cyBtYXkgZGVmaW5lIHRoZWlyIG93biBsYWJlbHNdLCB3aXRoIGluaGVyaXRhbmNlLgorKiBEb24ndCBjcmVhdGUgYFZlcmlmeWAgY2F0ZWdvcnkgYnkgZGVmYXVsdAorKworTW9zdCBwcm9qZWN0IHRlYW1zIHNlZW0gY29uZnVzZWQgd2l0aCB0aGUgb3V0LW9mLXRoZS1ib3ggZXhwZXJpZW5jZQorbmVlZGluZyB0byB2b3RlIG9uIGJvdGggYENvZGUtUmV2aWV3YCBhbmQgYFZlcmlmaWVkYCBjYXRlZ29yaWVzIGluCitvcmRlciB0byBzdWJtaXQgYSBjaGFuZ2UuIFNpbXBsaWZ5IHRoZSBvdXQtb2YtdGhlLWJveCB3b3JrZmxvdyB0byBvbmx5CitoYXZlIGBDb2RlLVJldmlld2AuIFdoZW4gYSB0ZWFtIGluc3RhbGxzIHRoZSBIdWRzb24vSmVua2lucyBpbnRlZ3JhdGlvbgorb3IgdGhlaXIgb3duIGJ1aWxkIHN5c3RlbSB0aGV5IGNhbiBub3cgdHJpdmlhbGx5IGFkZCB0aGUgYFZlcmlmaWVkYAorY2F0ZWdvcnkgYnkgcGFzdGluZyA1IGxpbmVzIGludG8gYHByb2plY3QuY29uZmlnYC4KKworRGV2Cit+fn4KKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LXJlYWRtZS5odG1sI2RlYnVnLWphdmFzY3JpcHRbCisgIFN1cHBvcnQgbG9hZGluZyBkZWJ1ZyBKYXZhU2NyaXB0XQorCisqIEdlcnJpdCBhY2NlcHRhbmNlIHRlc3RzCisrCitBbiBpbmZyYXN0cnVjdHVyZSBmb3IgdGVzdGluZyB0aGUgR2Vycml0IGRhZW1vbiB2aWEgUkVTVCBhbmQvb3IgU1NICitwcm90b2NvbHMgaGFzIGJlZW4gYWRkZWQuIEdlcnJpdCBkYWVtb24gaXMgcnVuIGluIHRoZSBoZWFkbGVzcyBtb2RlIGFuZAoraW4gdGhlIHNhbWUgSlZNIHdoZXJlIHRoZSB0ZXN0cyBydW4uIEJlc2lkZXMgdXNpbmcgUkVTVC9TU0gsIHRoZSB0ZXN0cworY2FuIGFsc28gYWNjZXNzIEdlcnJpdCBzZXJ2ZXIgaW50ZXJuYWxzIHRvIHByZXBhcmUgdGhlIHRlc3QgZW52aXJvbm1lbnQKK2FuZCB0byBwZXJmb3JtIGFzc2VydGlvbnMuCisrCitBIG5ldyByZXZpZXcgc2l0ZSBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QgYW5kIHRoZSBHZXJyaXQgZGFlbW9uIGlzCitzdGFydGVkIG9uIHRoYXQgc2l0ZS4gV2hlbiB0aGUgdGVzdCBoYXMgZmluaXNoZWQgdGhlIEdlcnJpdCBkYWVtb24gaXMKK3NodXRkb3duLgorCisqIExpZ2h0d2VpZ2h0IExEQVAgc2VydmVyIGZvciBkZWJ1Z2dpbmcKKworKiBBZGQgYXNjaWlkb2MgY2hlY2tzIGluIHRoZSBkb2N1bWVudGF0aW9uIG1ha2VmaWxlCisrCitFeGl0IHdpdGggZXJyb3IgaWYgdGhlIGFzY2lpZG9jIGV4ZWN1dGFibGUgaXMgbm90IGF2YWlsYWJsZSBvciBoYXMKK3ZlcnNpb24gbG93ZXIgdGhhbiA4LjYuMy4KKysKK1RoZSByZWxlYXNlIHNjcmlwdCBpcyBhYm9ydGVkIGlmIGFzY2lpZG9jIGlzIG1pc3NpbmcuCisKKyogQWRkZWQgc3VibGltZSBwcm9qZWN0IGZpbGVzIHRvIGAuZ2l0aWdub3JlYAorCisqIEV4Y2x1ZGUgYWxsIGBwb20ueG1sYCBmaWxlcyB0aGF0IGFyZSBhcmNoZXR5cGUgcmVzb3VyY2VzIGluIGB2ZXJzaW9uLnNoYAorCitQZXJmb3JtYW5jZQorfn5+fn5+fn5+fn4KKyogQml0bWFwIE9wdGltaXphdGlvbnMKKysKK09uIHJ1bm5pbmcgdGhlIGh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY21kLWdjLmh0bWxbCitnYXJiYWdlIGNvbGxlY3Rpb25dIEpHaXQgY3JlYXRlcyBiaXRtYXAgZGF0YSB0aGF0IGlzIHNhdmVkIHRvIGFuCithdXhpbGlhcnkgZmlsZS4gVGhlIGJpdG1hcCBvcHRpbWl6YXRpb25zIGltcHJvdmUgdGhlIGNsb25lIGFuZCBmZXRjaAorcGVyZm9ybWFuY2UuIGdpdC1jb3JlIHdpbGwgaWdub3JlIHRoZSBiaXRtYXAgZGF0YS4KKworKiBJbXByb3ZlIHN1Z2dlc3QgdXNlciBwZXJmb3JtYW5jZSB3aGVuIGFkZGluZyBhIHJldmlld2VyLgorKworRG8gbm90IGNoZWNrIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBjaGFuZ2UgZm9yIGVhY2ggc3VnZ2VzdGVkIGFjY291bnQgaWYKK3RoZSByZWYgaXMgdmlzaWJsZSBieSBhbGwgcmVnaXN0ZXJlZCB1c2Vycy4KKysKK09uIGEgc3lzdGVtIHdpdGggYWJvdXQgMi0zMDAwIHVzZXJzLCB3aGVyZSBtb3N0IG9mIHRoZSBwcm9qZWN0cyBhcmUKK3Zpc2libGUgYnkgZXZlcnkgcmVnaXN0ZXJlZCB1c2VyLCB0aGlzIGltcHJvdmVzIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUKK3N1Z2dlc3RpbmcgcmV2aWV3ZXIgYnkgYSBmYWN0b3Igb2YgMTAwMCBhdCBsZWFzdC4KKworKiBDYWNoZSBSZWZDb250cm9sLmlzVmlzaWJsZSgpCisrCitGb3IgR2l0IHJlcG9zaXRvcmllcyB3aXRoIG1hbnkgY2hhbmdlcyB0aGUgdGltZSBmb3IgY2FsY3VsYXRpbmcgdmlzaWJsZQorcmVmcyBpcyByZWR1Y2VkIGJ5IDMwLTUwJS4KKworKiBBbGxvdyBhZG1pbnMgdG8gZGlzYWJsZSBtYWdpYyByZWYgY2hlY2sgb24gdXBsb2FkCisrCitTb21lIHNpdGVzIG1hbmFnZSB0byBydW4gdGhlaXIgcmVwb3NpdG9yaWVzIGluIGEgd2F5IHRoYXQgcHJldmVudHMKK3VzZXJzIGZyb20gZXZlciBiZWluZyBhYmxlIHRvIGNyZWF0ZSBgcmVmcy9mb3JgLCBgcmVmcy9kcmFmdHNgIG9yCitgcmVmcy9wdWJsaXNoYCBuYW1lcyBpbiBhIHJlcG9zaXRvcnkuIEFsbG93IGFkbWlucyBvbiB0aG9zZSBzZXJ2ZXJzCit0byBkaXNhYmxlIHRoaXMgKHNvbWV3aGF0KSBleHBlbnNpdmUgY2hlY2sgYmVmb3JlIGV2ZXJ5IHVwbG9hZC4KKworKiBQZXJtaXQgUHJvamVjdENhY2hlQ2xvY2sgdG8gYmUgY29tcGxldGVseSBkaXNhYmxlZAorKworU29tZSBhZG1pbnMgbWF5IGp1c3Qgd2FudCB0byByZXF1aXJlIGFsbCB1cGRhdGVzIHRvIHByb2plY3RzIHRvIGJlCittYWRlIHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2UsIGFuZCBhdm9pZCB0aGUgc21hbGwgZXhwZW5zZSBvZiBhCitiYWNrZ3JvdW5kIHRocmVhZCB0aWNraW5nIG9mZiBjaGFuZ2VzLgorCisqIEJhdGNoIHJlYWQgQ2hhbmdlIG9iamVjdHMgZHVyaW5nIHF1ZXJ5CisKKyogRGVmYXVsdCBgY29yZS5zdHJlYW1GaWxlVGhyZXNob2xkYCB0byBhIGxhcmdlciB2YWx1ZQorKworSWYgdGhpcyB2YWx1ZSBpcyBub3QgY29uZmlndXJlZCBieSB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IKK3BlcmZvcm1hbmNlIG9uIGxhcmdlciB0ZXh0IGZpbGVzIHN1ZmZlcnMgY29uc2lkZXJhYmx5IGFuZAorR2Vycml0IG1heSBncmluZCB0byBhIGhhbHQgYW5kIGJlIHVuYWJsZSB0byBhbnN3ZXIgdXNlcnMuCisrCitEZWZhdWx0IHRvIGVpdGhlciAyNSUgb2YgdGhlIGF2YWlsYWJsZSBKVk0gaGVhcCBvciB+MjA0OG0uCisKKyogSW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBSZWNlaXZlQ29tbWl0cyBmb3IgcmVwb3NpdG9yaWVzIHdpdGggbWFueSByZWZzCisrCitBdm9pZCBhZGRpbmcgYHJlZnMvY2hhbmdlcy9gIGFuZCBgcmVmcy90YWdzL2AgdG8gUmV2V2FsaydzIGFzCit1bmludGVyZXN0aW5nIHNpbmNlIEpHaXQgUmV2V2FsayBkb2Vzbid0IHBlcmZvcm0gd2VsbCB3aGVuIGEgbGFyZ2UKK251bWJlciBvZiBvYmplY3RzIGlzIG1hcmtlZCBhcyB1bmludGVyZXN0aW5nLgorCisqIFBhdGNoU2V0LmlzUmVmKCktb3B0aW1pemF0aW9ucy4KKysKK1BhdGNoU2V0LmlzUmVmKCkgaXMgdXNlZCBleHRlbnNpdmVseSB3aGVuIHByZXBhcmluZyBmb3IgYSByZWYKK2FkdmVydGlzbWVudCBhbmQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGJ5IGlzUmVmcygpIHdhcyBub3RhYmx5Citjb3N0bHkgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcywgZXNwZWNpYWxseSBzaW5jZSBpdCBjb3VsZCBub3QgYmUKK3ByZS1jb21waWxlZC4KKysKK1RoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgcmVtb3ZlZCBhbmQgdGhlIGNoZWNrIGlzIG5vdyBkaXJlY3RseQoraW1wbGVtZW50ZWQuIEFzIHJlc3VsdCB0aGUgcGVyZm9ybWFuY2Ugb2YgYGdpdCBscy1yZW1vdGVgIGNvdWxkIGJlCitpbmNyZWFzZWQgdXB0byAxNSUuCisKKyogTmV3IGNvbmZpZyBvcHRpb24gYHJlY2VpdmUuY2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZWAKKysKK0lmIHNldCB0byB0cnVlLCBHZXJyaXQgd2lsbCB2YWxpZGF0ZSB0aGF0IGFsbCByZWZlcmVuY2VkIG9iamVjdHMgdGhhdAorYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVjZWl2ZWQgcGFjayBhcmUgcmVhY2hhYmxlIGJ5IHRoZSB1c2VyLgorKworQ2Fycnlpbmcgb3V0IHRoaXMgY2hlY2sgb24gR2l0IHJlcG9zaXRvcmllcyB3aXRoIG1hbnkgcmVmcyBhbmQgY29tbWl0cworY2FuIGJlIGEgdmVyeSBDUFUtaGVhdnkgb3BlcmF0aW9uLiBGb3Igbm9uIHB1YmxpYyBHZXJyaXQgc2VydmVycyBpdCBtYXkKK21ha2Ugc2Vuc2UgdG8gZGlzYWJsZSB0aGlzIGNoZWNrLCB3aGljaCBpcyBub3cgcG9zc2libGUuCisKKyogQ2FjaGUgY29uZmlnIHZhbHVlIGluIExkYXBBdXRoQmFja2VuZAorCisqIFBlcmZvcm0gYSBzaW5nbGUgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzIG9uIHBhZ2UgbG9hZAorKworVGhpcyBqb2lucyB1cCAzIHJlcXVlc3RzIGludG8gYSBzaW5nbGUgY2FsbCwgd2hpY2ggc2hvdWxkIHNwZWVkIHVwCitpbml0aWFsIHBhZ2UgbG9hZCBmb3IgbW9zdCB1c2Vycy4KKworKiBPbmx5IGd6aXAgY29tcHJlc3MgcmVzcG9uc2VzIHRoYXQgYXJlIHNtYWxsZXIgY29tcHJlc3NlZAorCisqIENhY2hpbmcgb2YgY2hhbmdlcworKworRHVyaW5nIFJlZiBBZHZlcnRpc21lbnRzICh2aWEgVmlzaWJsZVJlZkZpbHRlciksIGFsbCBjaGFuZ2VzIG5lZWQgdG8KK2JlIGZldGNoZWQgZnJvbSB0aGUgZGF0YWJhc2UgdG8gYWxsb3cgR2Vycml0IHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhbmdlCityZWZzIGFyZSB2aXNpYmxlIGFuZCBzaG91bGQgYmUgYWR2ZXJ0aXNlZCB0byB0aGUgdXNlci4gVG8gcmVkdWNlCitkYXRhYmFzZSB0cmFmZmljIGEgY2FjaGUgZm9yIGNoYW5nZXMgd2FzIGludHJvZHVjZWQuIFRoaXMgY2FjaGUgaXMKK2Rpc2FibGVkIGJ5IGRlZmF1bHQgc2luY2UgaXQgY2FuIG1lc3MtdXAgbXVsdGktc2VydmVyIHNldHVwcy4KKworTWlzYworfn5+fgorKiBBZGQgY29uZmlnIHBhcmFtZXRlciB0byBtYWtlIG5ldyBncm91cHMgYnkgZGVmYXVsdCB2aXNpYmxlIHRvIGFsbAorKworQWRkIGEgbmV3IGh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI2dyb3Vwcy5uZXdHcm91cHNWaXNpYmxlVG9BbGxbCitHZXJyaXQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJdIHRoYXQgY29udHJvbHMgd2hldGhlciBuZXdseQorY3JlYXRlZCBncm91cHMgc2hvdWxkIGJlIGJ5IGRlZmF1bHQgdmlzaWJsZSB0byBhbGwgcmVnaXN0ZXJlZCB1c2Vycy4KKworKiBTdXBwb3J0IGZvciBPcGVuSUQgZG9tYWluIGZpbHRlcmluZworKworQWRkZWQgdGhlIGFiaWxpdHkgdG8gb25seSBhbGxvdyBlbWFpbCBhZGRyZXNzZXMgdW5kZXIgc3BlY2lmaWMgZG9tYWlucwordG8gYmUgdXNlZCBmb3IgT3BlbklEIGxvZ2luLgorKworVGhlIGFsbG93ZWQgZG9tYWlucyBjYW4gYmUgY29uZmlndXJlZCBieSBzZXR0aW5nCitodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNhdXRoLm9wZW5JZERvbWFpblsKK2F1dGgub3BlbklkRG9tYWluXSBpbiB0aGUgR2Vycml0IGNvbmZpZ3VyYXRpb24uCisKKyogQWx3YXlzIGNvbmZpZ3VyZQorICBodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNnZXJyaXQuY2Fub25pY2FsV2ViVXJsWworICBnZXJyaXQuY2Fub25pY2FsV2ViVXJsXSBvbiBpbml0CisrCitHZXJyaXQgaGFzIGJlZW4gcmVxdWlyaW5nIHRoaXMgZmllbGQgZm9yIHNldmVyYWwgdmVyc2lvbnMgbm93LCBidXQgaW5pdAorZGlkIG5vdCBjb25maWd1cmUgaXQuIEVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIHNldCBzbyB0aGUgc2VydmVyIGlzIG5vdAorY29uZnVzZWQgYXQgcnVudGltZS4KKworKiBBZGQgc3VibW9kdWxlIHN1YnNjcmlwdGlvbnMgZmV0Y2hpbmcgYnkgcHJvamVjdHMKKysKK1doaWxlIHN1Ym1vZHVsZSBzdWJzY3JpcHRpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGJyYW5jaCwgc29tZSBwbHVnaW5zCisoZS5nLjogZGVsZXRlLXByb2plY3QpIHdvdWxkIHJhdGhlciBuZWVkIHRvIGFjY2VzcyBhbGwgc3VibW9kdWxlCitzdWJzY3JpcHRpb25zIG9mIGEgcHJvamVjdCAocmVnYXJkbGVzcyBvZiB0aGUgYnJhbmNoKS4gSW5zdGVhZCBvZgoraXRlcmF0aW5nIG92ZXIgYWxsIGJyYW5jaGVzIG9mIGEgcHJvamVjdCwgYW5kIGZldGNoaW5nIHRoZQorc3Vic2NyaXB0aW9uIGZvciBlYWNoIGJyYW5jaCBzZXBhcmF0ZWx5LCB3ZSBhbGxvdyBmZXRjaGluZyBvZgorc3Vic2NyaXB0aW9ucyBkaXJlY3RseSBieSBwcm9qZWN0cy4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTgwNVtJc3N1ZSAxODA1XToKKyAgTWFrZSBjbGllbnQgU1NMIGNlcnRpZmljYXRlcyB0aGF0IGNvbnRhaW4gYW4gZW1haWwgYWRkcmVzcyB3b3JrCisrCitBdXRoZW50aWNhdGlvbiB3aXRoIENMSUVOVF9TU0xfQ0VSVF9MREFQIGRpZG4ndCB3b3JrIGlmIHRoZSBjZXJ0aWZpY2F0ZQorY29udGFpbmVkIGVtYWlsIGFkZHJlc3MuCisKKyogR3Vlc3MgTERBUCB0eXBlIG9mIEFjdGl2ZSBEaXJlY3RvcnkgTERTIGFzIEFjdGl2ZURpcmVjdG9yeQorKworSWYgR2Vycml0IGNvbm5lY3RzIHRvIGFuIEFEIExEUyBbMV0gc2VydmVyIGl0IHdpbGwgZ3Vlc3MgaXRzIHR5cGUgYXMKK1JDRl8yMzA3IGluc3RlYWQgb2YgQWN0aXZlRGlyZWN0b3J5LiBUaGUgcmVhc29uIGlzIHRoYXQgYW4gQUQgTERTCitkb2Vzbid0IHN1cHBvcnQgdGhlICIxLjIuODQwLjExMzU1Ni4xLjQuODAwIiBjYXBhYmlsaXR5LiAgSG93ZXZlciwKK0FEIExEUyBiZWhhdmVzIGxpa2UgQWN0aXZlRGlyZWN0b3J5IGFuZCBHZXJyaXQgYWxzbyBuZWVkcyB0byBndWVzcworaXRzIHR5cGUgYXMgQWN0aXZlRGlyZWN0b3J5IHRvIG1ha2UgdGhlIGRlZmF1bHQgcXVlcnkgcGF0dGVybnMgd29yaworcHJvcGVybHkuCisrCitFeHRlbmQgdGhlIExEQVAgc2VydmVyIHR5cGUgZ3Vlc3NpbmcgYnkgY2hlY2tpbmcgZm9yIHByZXNlbmNlIG9mIHRoZQorIjEuMi44NDAuMTEzNTU2LjEuNC4xODUxIiBjYXBhYmlsaXR5IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgTERBUAorc2VydmVyIHJ1bnMgQWN0aXZlRGlyZWN0b3J5IGFzIEFEIExEUyBbMl0uCisrCitBbHNvIHJlbW92ZSB0aGUgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgImRlZmF1bHROYW1pbmdDb250ZXh0IgorYXR0cmlidXRlIGFzIHdlIGRvbid0IHVzZSBpdCBhbnl3aGVyZSBhbmQsIGJ5IGRlZmF1bHQsIHRoaXMgYXR0cmlidXRlIGlzCitub3Qgc2V0IG9uIGFuIEFEIExEUyBbM10KKysKK1sxXSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYWE3MDU4ODYoVlMuODUpLmFzcHggKworWzJdIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzIyMzM2NC5hc3B4ICsKK1szXSBodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M4MTY5Mjkodj13cy4xMCkuYXNweAorCisqIEFsbG93IGdyb3VwIGRlc2NyaXB0aW9ucyB0byBzdXBwbHkgZW1haWwgYW5kIFVSTAorKworU29tZSBiYWNrZW5kcyBoYXZlIGV4dGVybmFsIG1hbmFnZW1lbnQgaW50ZXJmYWNlcyB0aGF0IGFyZSBub3QKK2VtYmVkZGVkIGludG8gR2Vycml0IENvZGUgUmV2aWV3LiBBbGxvdyB0aG9zZSBiYWNrZW5kcyB0byBzdXBwbHkKK2EgVVJMIHRvIHRoZSB3ZWIgbWFuYWdlbWVudCBpbnRlcmZhY2UgZm9yIGEgZ3JvdXAsIHNvIGEgdXNlciBjYW4KK21hbmFnZSB0aGVpciBtZW1iZXJzaGlwLCB2aWV3IGN1cnJlbnQgbWVtYmVycywgb3IgZG8gd2hhdGV2ZXIgb3RoZXIKK2ZlYXR1cmVzIHRoZSBncm91cCBzeXN0ZW0gbWlnaHQgc3VwcG9ydC4KKysKK1NvbWUgYmFja2VuZHMgYWxzbyBoYXZlIGFuIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGV2ZXJ5Citncm91cC4gU2VuZGluZyBlbWFpbCB0byB0aGF0IGFkZHJlc3Mgd2lsbCBkaXN0cmlidXRlIHRoZSBtZXNzYWdlIHRvCit0aGUgZ3JvdXAncyBtZW1iZXJzLiBQZXJtaXQgYmFja2VuZHMgdG8gc3VwcGx5IGFuIG9wdGlvbmFsIGVtYWlsCithZGRyZXNzLCBhbmQgdXNlIHRoaXMgaW4gdGhlIHByb2plY3QgbGV2ZWwgbm90aWZpY2F0aW9uIHN5c3RlbSBpZgorYSBncm91cCBpcyBzZWxlY3RlZCBhcyB0aGUgdGFyZ2V0IGZvciBhIG1lc3NhZ2UuCisKKyogQWxsb3cgZ3JvdXAgYmFja2VuZHMgdG8gZ3Vlc3Mgb24gcmVsZXZhbnQgVVVJRHMKKysKK0V4cG9zZSBhbGwgY2hlYXBseSBrbm93biBncm91cCBVVUlEcyBmcm9tIHRoZSBQcm9qZWN0Q2FjaGUsCitlbnVtZXJhdGluZyBncm91cHMgdXNlZCBieSBhY2Nlc3MgY29udHJvbHMuIFRoaXMgYWxsb3dzIGEgYmFja2VuZAordGhhdCBoYXMgYSBsYXJnZSBudW1iZXIgb2YgZ3JvdXBzIHRvIGZpbHRlciBpdHMgZ2V0S25vd25Hcm91cHMoKQorb3V0cHV0IHRvIG9ubHkgZ3JvdXBzIHRoYXQgbWF5IGJlIHJlbGV2YW50IGZvciB0aGlzIEdlcnJpdCBzZXJ2ZXIuCisrCitUaGUgYmVzdCB1c2UgY2FzZSB0byBjb25zaWRlciBpcyBhbiBMREFQIHNlcnZlciBhdCBhIGxhcmdlCitvcmdhbml6YXRpb24uIEEgdHlwaWNhbCB1c2VyIG1heSBiZWxvbmcgdG8gNTAgTERBUCBncm91cHMsIGJ1dCBvbmx5CiszIGFyZSByZWxldmFudCB0byB0aGlzIEdlcnJpdCBzZXJ2ZXIuIFRha2luZyB0aGUgaW50ZXJzZWN0aW9uIG9mCit0aGUgdHdvIGdyb3VwcyBsaW1pdHMgdGhlIG91dHB1dCBHZXJyaXQgZGlzcGxheXMgdG8gdXNlcnMsIG9yIHVzZXMKK3doZW4gY29uc2lkZXJpbmcgc2FtZSBncm91cCB2aXNpYmlsaXR5LgorCisqIEFkZCBtb3JlIGZvcmJpZGRlbiBjaGFyYWN0ZXJzIGZvciBwcm9qZWN0IG5hbWVzCisrCitgP2AsIGAlYCwgYCpgLCBgOmAsIGA8YCwgYD5gLCBgfGAsIGAkYCwgYFxyYCBhcmUgbm93IGZvcmJpZGRlbiBpbgorcHJvamVjdCBuYW1lcy4KKworKiBNYWtlIGBnZXJyaXQuc2hgIExTQiBjb21wbGlhbnQKKysKKyoqIEFkZCBMU0IgaGVhZGVycworKiogQWRkICdzdGF0dXMnIGFzIHN5bm9ueW0gZm9yICdjaGVjaycKKyoqIEZpeCBleGl0IHN0YXR1cyBjb2RlcyBhY2NvcmRpbmcgdG8gaHR0cDovL3JlZnNwZWNzLmxpbnV4LWZvdW5kYXRpb24ub3JnL0xTQl8zLjIuMC9MU0ItQ29yZS1nZW5lcmljL0xTQi1Db3JlLWdlbmVyaWMvaW5pc2NycHRhY3QuaHRtbAorCisqIE9wdGlvbiB0byBzdGFydCBoZWFkbGVzcyBHZXJyaXQgZGFlbW9uCisrCitBZGQgYC0taGVhZGxlc3NgIG9wdGlvbiB0byB0aGUgRGFlbW9uIHdoaWNoIHdpbGwgc3RhcnQgR2Vycml0IGRhZW1vbgord2l0aG91dCB0aGUgV2ViIFVJIGZyb250IGVuZCAoaGVhZGxlc3MgbW9kZSkuCisrCitUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHJ1bm5pbmcgR2Vycml0IHNlcnZlciB3aXRoIGFuIGFsdGVybmF0aXZlIChyZXN0CitiYXNlZCkgVUkgb3Igd2hlbiBzdGFydGluZyBHZXJyaXQgc2VydmVyIGZvciB0aGUgcHVycG9zZSBvZiBhdXRvbWF0ZWQKK1JFU1QvU1NIIGJhc2VkIHRlc3RpbmcuCisrCitDdXJyZW50bHkgdGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgdmlhIHRoZSBgLS1oZWFkbGVzc2Agb3B0aW9uIG9mCit0aGUgZGFlbW9uIHByb2dyYW0uIFdlIHdvdWxkIG5lZWQgdG8gaW50cm9kdWNlIGEgY29uZmlnIG9wdGlvbiBpbiBvcmRlcgordG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUgZm9yIGRlcGxveWVkIHdhciBtb2RlLgorCisqIFNob3cgcGF0aCB0byBnZXJyaXQud2FyIGluIGNvbW1hbmQgZm9yIHVwZ3JhZGUgc2NoZW1hCisKK1VwZ3JhZGVzCit+fn5+fn5+fgorKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTYxOVtJc3N1ZSAxNjE5XToKK0VtYmVkZGVkIEpldHR5IGlzIG5vdyA4LjEuNy52MjAxMjA5MTAuCisKKyogQVNNIGJ5dGVjb2RlIGxpYnJhcnkgaXMgbm93IDQuMC4KKyogSkdpdCBpcyBub3cgMi4zLjEuMjAxMzAyMjAxODM4LXIuNzgtZzhmY2RlNGIuCisqIGFzY2lpZG9jIDguNi4zIGlzIG5vdyByZXF1aXJlZCB0byBidWlsZCB0aGUgZG9jdW1lbnRhdGlvbi4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTExNTVbSXNzdWUgMTE1NV06CitwcmV0dGlmeSBpcyBub3cgcjIyNQorCisqIFRoZSB1c2VkIEdXVCB2ZXJzaW9uIGlzIG5vdyAyLjUuMAorKworRml4ZXMgc29tZSBpc3N1ZXMgd2l0aCBJRTkgYW5kIElFMTAuCisKK0J1ZyBGaXhlcworLS0tLS0tLS0tCisKK1dlYiBVSQorfn5+fn5+CisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjYyW0lzc3VlIDE2NjJdOgorICBEb24ndCBzaG93IGVycm9yIG9uIEFDTCBtb2RpZmljYXRpb24gaWYgZW1wdHkgcGVybWlzc2lvbnMgYXJlIGFkZGVkCisrCitUaGlzIGVycm9yIG1lc3NhZ2Ugd2FzIGluY29ycmVjdGx5IGRpc3BsYXllZCBpZiBhIHBlcm1pc3Npb24gd2l0aG91dAorcnVsZXMgd2FzIGFkZGVkLCBhbHRob3VnaCB0aGUgc2F2ZSB3YXMgYWN0dWFsbHkgc3VjY2Vzc2Z1bC4KKworKiBEb24ndCBzaG93IGVycm9yIG9uIEFDTCBtb2RpZmljYXRpb24gaWYgYSBzZWN0aW9uIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlCisrCitUaGlzIGVycm9yIG1lc3NhZ2Ugd2FzIGluY29ycmVjdGx5IGRpc3BsYXllZCBpZiBtdWx0aXBsZSBzZWN0aW9ucyBmb3IKK3RoZSBzYW1lIHJlZiB3ZXJlIGFkZGVkLCBhbHRob3VnaCB0aGUgc2F2ZSB3YXMgYWN0dWFsbHkgc3VjY2Vzc2Z1bC4KKworKiBMaW5rcyB0byBDR2l0IHdlcmUgYnJva2VuIHdoZW4gYHJlbW92ZS1zdWZmaXhgIHdhcyBlbmFibGVkLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD05MjZbSXNzdWUgOTI2XToKK0ludGVybmV0IEV4cGxvcmVyIHZlcnNpb25zIDkgYW5kIDEwIGFyZSBzdXBwb3J0ZWQuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2NjRbSXNzdWUgMTY2NF06CisgIFJldmVydGluZyBhIGNoYW5nZSBkaWQgbm90IHByZXNlcnZlIHRoZSBjaGFuZ2UncyB0b3BpYworCisqIEZpeDogVXNlciBjb3VsZCBnZXQgYXJvdW5kIHJlc3RyaWN0aW9ucyBieSByZXZlcnRpbmcgYSBjb21taXQKKysKK1RoZSBHZXJyaXQgc2VydmVyIG1heSBlbmZvcmNlIHNldmVyYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb21taXQKK21lc3NhZ2UgKGNoYW5nZS1pZCByZXF1aXJlZCwgc2lnbmVkLW9mZi1ieSwgZXRjKS4gQSB1c2VyIHdhcyBhYmxlIHRvCitnZXQgYXJvdW5kIHRoZXNlIHJlc3RyaWN0aW9ucyBieSByZXZlcnRpbmcgYSBjb21taXQgdXNpbmcgdGhlIFVJLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNTE4W0lzc3VlIDE1MThdOgorICBSZXNldCAnT2xkIFZlcnNpb24gSGlzdG9yeScgaWYgZGVwZW5kZW50IGNoYW5nZSBpcyBvcGVuZWQKKysKK0ZvbGxvd2luZyB0aGUgbmF2aWdhdGlvbiBsaW5rIGluIHRoZSBkZXBlbmRlbmNpZXMgdGFibGUgb24gdGhlCitjaGFuZ2Ugc2NyZWVuLCB0aGUgdXNlciBjYW4gZGlyZWN0bHkgbmF2aWdhdGUgdG8gZGVwZW5kZW50IGNoYW5nZXMuCitUaGUgdmFsdWUgZm9yICdPbGQgVmVyc2lvbiBIaXN0b3J5JyBvZiB0aGUgY3VycmVudCBjaGFuZ2Ugd2FzCitpbmNvcnJlY3RseSBhcHBsaWVkIHRvIHRoZSBuZXcgY2hhbmdlLiBJZiB0aGUgdmFsdWUgd2FzIGludmFsaWQgZm9yCit0aGUgbmV3IGNoYW5nZSB0aGUgJ09sZCBWZXJzaW9uIEhpc3RvcnknIGZpZWxkIGJlY2FtZSBibGFuay4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTczNltJc3N1ZSAxNzM2XToKKyAgQ2xlYXIgJ09sZCBWZXJzaW9uIEhpc3RvcnknIExpc3RCb3ggYmVmb3JlIHBvcHVsYXRpbmcgaXQKKysKK1RoZSBMaXN0Qm94IHdhcyBub3QgYWx3YXlzIGNsZWFyZWQgYW5kIGFzIHJlc3VsdCB0aGUgc2FtZSBlbnRyaWVzIHdlcmUKK3NvbWV0aW1lcyBhZGRlZCBtdWx0aXBsZSB0aW1lcyBlLmcuIGFmdGVyIHJlYmFzaW5nIGEgY2hhbmdlIGluIHRoZQorV2ViVUkuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2NzNbSXNzdWUgMTY3M106CisgIEZpeCBkaXNhcHBlYXJhbmNlIG9mIHBhdGNoIGhlYWRlcnMgd2hlbiBjb21wYXJlZCBwYXRjaGVzIGFyZSBpZGVudGljYWwKKysKK1doZW4gdHdvIHBhdGNoZXMgd2VyZSBjb21wYXJlZCB0aGF0IHdlcmUgaWRlbnRpY2FsICdObyBEaWZmZXJlbmNlcycgaXMKK2Rpc3BsYXllZCB0byB0aGUgdXNlci4gSW4gdGhpcyBjYXNlIHRoZSBwYXRjaCBoZWFkZXJzIGRpc2FwcGVhcmVkIGFuZAorYXMgcmVzdWx0IHRoZSB1c2VyIGNvdWxkbid0IGNoYW5nZSB0aGUgcGF0Y2ggc2VsZWN0aW9uIGFueW1vcmUuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE3NTlbSXNzdWUgMTc1OV06CisgIEZpeCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gb24gaW50cmFsaW5lIGRpZmYKKysKK0luIHNvbWUgY2FzZXMgZGlzcGxheWluZyB0aGUgaW50cmFsaW5lIGRpZmYgZmFpbGVkIHdpdGggYW4gZXhjZXB0aW9uIGxpa2UKK3RoaXM6CisrCistLS0tCitqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uOiBBcnJheSBpbmRleCBvdXQgb2YgcmFuZ2U6IDEwCisgIGF0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5TcGFyc2VGaWxlQ29udGVudC5tYXBJbmRleFRvTGluZShTcGFyc2VGaWxlQ29udGVudC5qYXZhOjE0OSkKKyAgYXQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLlByZXR0eUZvcm1hdHRlci5mb3JtYXQoUHJldHR5Rm9ybWF0dGVyLmphdmE6MTg4KQorICBhdCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5BYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlLmdldFNwYXJzZUh0bWxGaWxlQihBYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlLmphdmE6Mjg3KQorICBhdCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5TaWRlQnlTaWRlVGFibGUucmVuZGVyKFNpZGVCeVNpZGVUYWJsZS5qYXZhOjExMykKKyAgYXQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5kaXNwbGF5KEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuamF2YToyMzgpCisgIGF0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoU2NyZWVuLm9uUmVzdWx0KFBhdGNoU2NyZWVuLmphdmE6NDQ0KQorLi4uCistLS0tCisrCitUaGlzIGhhcHBlbmVkIHdoZW4gdGhlIG9sZCBsaW5lIHdhczoKKysKKy0tLS0KKyAgZm9vLW9sZDxMRj4KKy0tLS0KKysKK2FuZCB0aGUgbmV3IGxpbmUgd2FzOgorKworLS0tLQorICBmb28tbmV3PENSTEY+CistLS0tCisKKyogUHJldmVudCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb24gdXNlcidzIEZ1bGwgTmFtZQorKworU3RyaXAgb2ZmIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgRnVsbCBOYW1lIHRoYXQgdGhlCit1c2VyIGVudGVycyBvbiB0aGUgQ29udGFjdCBJbmZvcm1hdGlvbiBmb3JtLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNDgwW0lzc3VlIDE0ODBdOgorICBTaG93IHByb3BlciBlcnJvciBtZXNzYWdlIGlmIHJlZ2lzdGVyaW5nIGVtYWlsIGFkZHJlc3MgZmFpbHMKKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9ODE2W0lzc3VlIDgxNl06CisgIER1ZSB0byBpc3N1ZXMgd2l0aCB0aGUgZGlmZl9pbnRyYWxpbmUgY2FjaGUgdGhlIGZpbGUgaW5kZW50aW9uIGluIHRoZQorICBTaWRlLUJ5LVNpZGUgZGlmZiB3YXMgc29tZXRpbWVzIHdyb25nLgorCisqIE1ha2UgcmViYXNlIGZhaWxlZCBhbmQgbWVyZ2UgZmFpbGVkIG1lc3NhZ2VzIGNvbnNpc3RlbnQKKworKiBTZWxlY3QgJ1Byb2plY3RzJyBtZW51IG9uIGxvYWRpbmcgb2YgYSBwcm9qZWN0IHNjcmVlbgorKworSWYgaW4gdGhlIHRvcCBsZXZlbCBtZW51ICdBbGwnIGlzIHNlbGVjdGVkIGFuZCB0aGUgdXNlciBuYXZpZ2F0ZXMgdG8KK2EgY2hhbmdlIGFuZCB0aGVuIGZyb20gdGhlIGNoYW5nZSB0byB0aGUgcHJvamVjdCBieSBjbGlja2luZyBvbiB0aGUKK3Byb2plY3QgbGluayBpbiB0aGUgQ2hhbmdlSW5mb0Jsb2NrLCB0aGUgcHJvamVjdCBzY3JlZW4gaXMgbG9hZGVkIGJ1dAordGhlICdQcm9qZWN0cycgbWVudSB3YXMgbm90IHNlbGVjdGVkLgorCisqIEZpeCBkaXNwbGF5IGlzc3VlcyBmb3IgaW5saW5lIGNvbW1lbnRzIGFuZCBpbmxpbmUgY29tbWVudCBlZGl0b3JzCisrCisqKiBTb21ldGltZXMgYSBzZWNvbmQgY29tbWVudCBlZGl0b3Igd2FzIHNob3duIGluc3RlYWQgb2YgdXNpbmcgdGhlCisgICBleGlzdGluZyBjb21tZW50IGVkaXRvci4KKyoqIEZpeCBkb3VibGljYXRlZCBib3JkZXIgbGluZSBiZXR3ZWVuIGNvbW1lbnRzLgorKiogU29tZXRpbWVzIHRoZSBwYXJ0cyBvZiB0aGUgYm9yZGVyIHdlcmUgbWlzc2luZyB3aGVuIGEgY29tbWVudCB3YXMKKyAgIGV4cGFuZGVkLgorKiogRml4IGRpc3BsYXlpbmcgdGhlIGJsdWUgbGluZSB0aGF0IG1hcmtzIHRoZSBjdXJyZW50IGxpbmUgd2hlbiB0aGVyZQorICAgYXJlIHNldmVyYWwgcHVibGlzaGVkIGNvbW1lbnRzLgorKiogU29tZXRpbWVzIG9uIGRpc2NhcmQgb2YgYSBjb21tZW50IHNvbWUgZnJhbWVzIG9mIHRoZSBjb21tZW50IGVkaXRvcgorICAgc3RheWVkIGFuZCBzb21lIGJvcmRlciBsaW5lcyBvZiBuZWlnaGJvdXIgY29tbWVudHMgZGlzYXBwZWFyZWQuCisKKyogSW4gZGlmZiB2aWV3IGRvbid0IGxldCBhcnJvdyBjb2x1bW4gYWNjZXB0IGNsaWNrcy4KKworKiBGaXggZGlzcGxheSBvZiBjb21taXQgbWVzc2FnZQorKworSWYgdGhlcmUgYXJlIG5vIEhUTUwgdGFncyBpbiB0aGUgdGV4dCwganVzdCBicmVhayBvbiBsaW5lcy4KKworKiBVcG9uIHNlbGVjdGlvbiBpbiBBZGRNZW1iZXJCb3gsIGZvY3VzIHRoZSBib3gncyB0ZXh0IGZpZWxkCisrCitJbiB0aGUgY2hhbmdlIHNjcmVlbiwgYWZ0ZXIgY2xpY2tpbmcgb24gYW4gZWxlbWVudCBvZiB0aGUgJ0FkZAorUmV2aWV3ZXInIHN1Z2dlc3Rpb24gbGlzdCwgdXNlcnMgZXhwZWN0IHRvIGJlIGFibGUgdG8gYWRkIHRoZSByZXZpZXdlcgorYnkgaGl0dGluZyBlbnRlci4gVGhpcyBkaWQgbm90IHdvcmsgaW4gRmlyZWZveC4KKworKiBGaXggZW50ZXIga2V5IGRldGVjdGlvbiBpbiBwcm9qZWN0IGNyZWF0aW9uIHNjcmVlbgorKworVGhlIGVudGVyIGtleSBkZXRlY3Rpb24gd2FzIG5vdCB3b3JraW5nIGluIGFsbCBicm93c2VycyAoZS5nLiBGaXJlZm94KS4KKworKiBEaXNwbGF5IGEgdG9vbHRpcCBmb3IgYWxsIHRpbnkgaWNvbnMgYW5kIGVuc3VyZSB0aGF0IHRoZSBjdXJzb3IgaXMKKyAgc2hvd24gYXMgcG9pbnRlciB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlbS4KKworKiBDbGVhbiBxdWVyeSBzdHJpbmcgd2hlbiBzd2l0Y2hpbmcgcGFnZXMKKysKK0lmIHdlIGxvYWQgYSBwYWdlIHdpdGhvdXQgYSBxdWVyeSBzdHJpbmcsIHN1Y2ggYXMgUHJvamVjdHMtPkxpc3QsCitNeS0+Q2hhbmdlcywgb3IgU2V0dGluZ3MsIGl0IG1pZ2h0IGJlIGNvbmZ1c2luZyB0byBzaG93IHRoZSBvbGQgcXVlcnkKK3N0cmluZyBmcm9tIHRoZSBwcmV2aW91cyBwYWdlLiBUaGUgcXVlcnkgc3RyaW5nIGlzIG5vdyBjbGVhcmVkIG91dAord2hlbiBzd2l0Y2hpbmcgcGFnZXMsIGxlYXZpbmcgdGhlIGhlbHAgdGV4dCB2aXNpYmxlLgorCisqIEZpeCBoaWdobGlnaHRpbmcgaW4gc2VhcmNoIHN1Z2dlc3Rpb25zCisrCitUaGUgcHJvdmlkZWQgc3VnZ2VzdGlvbnMgc2hvdWxkIGhpZ2hsaWdodCB0aGUgcGFydCB0aGF0IHRoZSB1c2VyIGhhcworYWxyZWFkeSB0eXBlZCBhcyBib2xkIHRleHQuIFRoaXMgb25seSB3b3JrZWQgZm9yIHRoZSBmaXJzdCBvcGVyYXRvci4KK0ZvciBzdWdnZXN0aW9ucyBvZiBhbnkgZnVydGhlciBvcGVyYXRvciBubyBoaWdodGxpZ2h0aW5nIHdhcyBkb25lLgorCisqIEZpeCBzdHlsZSBvZiBoaW50IHRleHQgaW4gc2VhcmNoIGJveCBvbiBpbml0aWFsIHBhZ2UgbG9hZAorKworVGhlIGhpbnQgdGV4dCBzaG91bGQgYmUgYSBsaWdodCBncmF5IG9uIHRoZSB3aGl0ZSBiYWNrZ3JvdW5kLAorYnV0IHdhcyBjb21pbmcgdXAgYmxhY2sgb24gaW5pdGlhbCBwYWdlIGxvYWQgZHVlIHRvIGEgc3R5bGUgc2V0dXAKK29yZGVyaW5nIGlzc3VlIGJldHdlZW4gdGhlIFNlYXJjaFBhbmVsIGFuZCB0aGUgSGludFRleHRCb3guCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2NjFbSXNzdWUgMTY2MV06CisgIFVwZGF0ZSBsaW5rcyB0byBDaGFuZ2UtSWQgYW5kIFNpZ25lZC1vZmYtYnkgZG9jdSBvbiBwcm9qZWN0IGluZm8KKyAgc2NyZWVuCisKKyogVXNlIGhyZWY9ImphdmFzY3JpcHQ7IiBmb3IgQWxsIHtTaWRlLWJ5LVNpZGUsVW5pZmllZH0gbGlua3MKKysKK1RoZXNlIGxpbmtzIHNob3VsZG4ndCBoYXZlIGFuIGFuY2hvciBsb2NhdGlvbi4gVGhlcmUgaXMgbm90aGluZyBmb3IKK3RoZSBicm93c2VyIHRvIHJlbWVtYmVyIG9yIHZpc2l0IGlmIGl0IHdlcmUgb3BlbmVkIGluIGEgbmV3IHRhYiBmb3IKK2V4YW1wbGUuCisKKyogSW1wcm92ZSBtZXNzYWdlIGZvciB1bnNhdGlzZmlhYmxlIGRlcGVuZGVuY2llcworKworSWYgYSBjaGFuZ2UgY2Fubm90IGJlIG1lcmdlZCBkdWUgdG8gdW5zYXRpc2ZpYWJsZSBkZXBlbmRlbmNpZXMgYQorY29tbWVudCBpcyBhZGRlZCB0byB0aGUgY2hhbmdlIHRoYXQgbGlzdHMgdGhlIG1pc3NpbmcgY29tbWl0cyBhbmQgc2F5cwordGhhdCBhIHJlYmFzZSBpcyBuZWNlc3NhcnkuCisrCitGb3IgZWFjaCBtaXNzaW5nIGNvbW1pdCB0aGUgY29tbWVudCBzYWlkICJEZXBlbmRzIG9uIHBhdGNoIHNldCBYCitvZiAuLi4sIGhvd2V2ZXIgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IGlzIFkuIgorKworSWYgbXVsdGlwbGUgY29tbWl0cyBhcmUgbWlzc2luZyBpdCBtYXkgYmUgdGhhdCBmb3Igc29tZSBjb21taXRzIHRoZQorZGVwZW5kZW5jeSBpcyBub3Qgb3V0ZGF0ZWQgKFggPT0gWSkuIEluIHRoaXMgY2FzZSB0aGUgbWVzc2FnZSB3YXMKK2NvbmZ1c2luZy4KKysKKyIsIGhvd2V2ZXIgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IGlzIFkuIiBpcyBub3cgc2tpcHBlZCBpZiBZID09IFguCisKK1JFU1QgQVBJCit+fn5+fn5+fgorKiBGaXggcmV0dXJuaW5nIG9mICdFbWFpbCBSZXZpZXdlcnMnIGNhcGFiaWxpdHkgdmlhIFJFU1QKKysKK1RoZSBgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzL2AgZGlkbid0IHJldHVybiB0aGUgJ0VtYWlsIFJldmlld2VycycKK2NhcGFiaWxpdHkgd2hlbiBpdCB3YXMgbm90IGV4cGxpY2l0bHkgYXNzaWduZWQsIGFsdGhvdWdoIGJ5IGRlZmF1bHQKK2V2ZXJ5b25lIGhhcyB0aGUgJ0VtYWlsIFJldmlld2VycycgY2FwYWJpbGl0eS4KKysKK0lmICdFbWFpbCBSZXZpZXdlcnMnIGNhcGFiaWxpdHkgd2FzIGFsbG93ZWQgb3IgZGVuaWVkLAorYC9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcy9gIHJldHVybmVkIHRoZSAnRW1haWwgUmV2aWV3ZXJzJworY2FwYWJpbGl0eSBhbHdheXMgYXMgdHJ1ZSwgd2hpY2ggd2FzIHdyb25nIGZvciB0aGUgREVOWSBjYXNlLgorCisqIFByb3ZpZGUgYSBtb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgZm9yIHVuYXV0aGVudGljYXRlZCBSRVNUCisgIEFQSSBhY2Nlc3MKKworR2l0Cit+fn4KKyogVGhlIHdpbGRjYXJkIGAuYCBpcyBub3cgcGVybWl0dGVkIGluIHJlZmVyZW5jZSByZWdleCBydWxlcy4KKworKiBDaGVja2luZyBpZiBhIGNoYW5nZSBpcyBtZXJnZWFibGUgbm8gbG9uZ2VyIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeS4KKworKiBTdWJtaXR0ZWQgYnV0IHVubWVyZ2VkIGNoYW5nZXMgYXJlIHBlcmlvZGljYWxseSByZXRyaWVkLiBUaGlzIGlzCisgIG5lY2Vzc2FyeSBmb3IgYSBtdWx0aS1tYXN0ZXIgY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgc2Vjb25kIG1hc3RlcgorICBtYXkgbmVlZCB0byByZXRyeSBhIGNoYW5nZSBub3QgeWV0IG1lcmdlZCBieSB0aGUgZmlyc3QuIFBsZWFzZSBub3RlCisgIHdlIHN0aWxsIGRvIG5vdCBiZWxpZXZlIHRoaXMgaXMgc3VmZmljaWVudCB0byBlbmFibGUgbXVsdGktbWFzdGVyLgorCisqIFJldHJ5IG1lcmdlIGFmdGVyIExPQ0tfRkFJTFVSRSB3aGVuIHVwZGF0aW5nIGJyYW5jaAorKworSWYgdGhlIHByb2plY3QgcmVxdWlyZXMgZmFzdC1mb3J3YXJkcywgdGhlIG1lcmdlIGNhbm5vdCBzdWNjZWVkIG9uY2UKK2EgbG9jayBmYWlsdXJlIG9jY3VycywgYnV0IGluIG90aGVyIGNhc2VzLCBpdCBpcyBzYWZlIHRvIHJldHJ5IHRoZQorbWVyZ2UgaW1tZWRpYXRlbHkuCisKKyogRG8gbm90IGF1dG9tYXRpY2FsbHkgYWRkIHJldmlld2VycyBmcm9tIGZvb3RlciBsaW5lcyB0byBkcmFmdCBwYXRjaCBzZXRzCisrCitHZXJyaXQgYWxyZWFkeSBhdm9pZHMgYWRkaW5nIHJldmlld2VycyBmcm9tIGZvb3RlciBsaW5lcyB3aGVuIGEgbmV3CitkcmFmdCBjaGFuZ2UgaXMgY3JlYXRlZC4gTm93IHRoZSBzYW1lIGlzIGRvbmUgZm9yIGRyYWZ0IHBhdGNoIHNldHMuCisKKyogQWRkIHVzZXJzIG1lbnRpb25lZCBpbiBjb21taXQgZm9vdGVyIGFzIHJldmlld2VycyBvbiBkcmFmdCBwdWJsaXNoCisKKyogSGlkZSBhbnkgZXhpc3RpbmcgbWFnaWMgYnJhbmNoZXMgZHVyaW5nIHB1c2gKKysKK0lmIHRoZXJlIGlzIGEgbWFnaWMgYnJhbmNoIHZpc2libGUgZHVyaW5nIHB1c2gsIGp1c3QgaGlkZSBpdCBmcm9tIHRoZQorY2xpZW50LiBBZG1pbmlzdHJhdG9ycyBjYW4gY2xlYXIgdGhlc2UgYnkgYWNjZXNzaW5nIHRoZSByZXBvc2l0b3J5CitkaXJlY3RseS4KKworKiBQcmV2ZW50IGZyb20gZGVsZXRpbmcgYHJlZnMvY2hhbmdlcy9gCisrCitFdmVyeXRoaW5nIHVuZGVyIGByZWZzL2NoYW5nZXMvYCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IEdlcnJpdCwgdXNlcnMKK3Nob3VsZG4ndCBiZSBhYmxlIHRvIGRlbGV0ZSBhIHBhcnRpY3VsYXIgcGF0Y2ggc2V0IG9yIGEgd2hvbGUgY2hhbmdlCitmcm9tIHRoZSByZXZpZXcgcHJvY2Vzcy4KKworKiBVcGRhdGUgZGVzY3JpcHRpb24gZmlsZSBpbiBHaXQKKysKK1doZW4gd3JpdGluZyB0aGUgZGVzY3JpcHRpb24gdG8gYHByb2plY3QuY29uZmlnYCwgaXQgaXMgYWxzbyBuZWNlc3NhcnkKK3RvIHdyaXRlIGl0IHRvIHRoZSBkZXNjcmlwdGlvbiBmaWxlIGluIHRoZSByZXBvc2l0b3J5IHNvIHRoZSBzYW1lIHRleHQKK2lzIHZpc2libGUgaW4gQ0dpdCBvciBHaXRXZWIuCisKKyogV3JpdGUgdmFsaWQgcmVmbG9nIGZvciBgSEVBRGAgd2hlbiBjcmVhdGluZyB0aGUgYEFsbC1Qcm9qZWN0c2AKKyAgcHJvamVjdAorKworV2hlbiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCBpcyBjcmVhdGVkIGR1cmluZyB0aGUgc2NoZW1hCitpbml0aWFsaXphdGlvbiwgYEhFQURgIGlzIHNldCB0byBwb2ludCB0byB0aGUgYHJlZnMvbWV0YS9jb25maWdgCiticmFuY2guIFdoZW4gYEhFQURgIGlzIHVwZGF0ZWQgYW4gZW50cnkgaW50byB0aGUgcmVmbG9nIGlzIHdyaXR0ZW4uCitUaGlzIHJlZiBsb2cgZW50cnkgc2hvdWxkIGNvbnRhaW4gdGhlIElEIG9mIHRoZSBpbml0aWFsIGNvbW1pdCBhcwordGFyZ2V0LCBidXQgaW5zdGVhZCB0aGUgdGFyZ2V0IHdhcyB0aGUgemVybyBJRC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTcwMltJc3N1ZSAxNzAyXToKKyAgRml4OiAnaW50ZXJuYWwgc2VydmVyIGVycm9yJyB3aGVuIHB1c2hpbmcgdGhlIHNhbWUgY29tbWl0IHR3aWNlCisrCitPbiB0aGUgc2Vjb25kIHB1c2ggb2YgdGhlIHNhbWUgY29tbWl0IHRvIGByZWZzL2Zvci88YnJhbmNoIG5hbWU+YCwgR2Vycml0CityZXR1cm5zICdubyBuZXcgY2hhbmdlcycuCisrCitIb3dldmVyIGlmIHRoZSB1c2VyIHB1c2hlZCB0byAncmVmcy9jaGFuZ2VzLzxjaGFuZ2UgaWQ+JywgR2Vycml0IHJldHVybmVkCisnaW50ZXJuYWwgc2VydmVyIGVycm9yJy4KKworKiBNYXRjaCBhbGwgZ2l0IGZldGNoL2Nsb25lL3B1c2ggY29tbWFuZHMgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IKKysKK1JvdXRlIG5vdCBqdXN0IGAvcC9gIGJ1dCBhbnkgR2l0IGFjY2VzcyB0byB0aGUgc2FtZSB0aHJlYWQgcG9vbCBhcyB0aGUKK1NTSCBzZXJ2ZXIgaXMgdXNpbmcsIGFsbG93aW5nIGFsbCByZXF1ZXN0cyB0byBjb21wZXRlIGZhaXJseSBmb3IKK3Jlc291cmNlcy4KKworKiBGaXggYXV0byBjbG9zaW5nIG9mIGNoYW5nZXMgb24gZGlyZWN0IHB1c2gKKysKK1doZW4gYSBjb21taXQgd2FzIGRpcmVjdGx5IHB1c2hlZCBpbnRvIGEgcmVwb3NpdG9yeSAoYnlwYXNzaW5nIGNvZGUKK3JldmlldykgYW5kIHRoaXMgY29tbWl0IGhhZCBhIENoYW5nZS1JZCBpbiBpdHMgY29tbWl0IG1lc3NhZ2UgdGhlbiB0aGUKK2NvcnJlc3BvbmRpbmcgY2hhbmdlIHdhcyBub3QgYXV0b21hdGljYWxseSBjbG9zZWQgaWYgaXQgd2FzIG9wZW4uCisKKyogU2V0IGNoYW5nZSBzdGF0ZSB0byBORVcgaWYgbWVyZ2UgZmFpbHMgZHVlIHRvIG5vbi1leGlzdGluZyBkZXN0IGJyYW5jaAorKworSWYgYSBzdWJtaXR0ZWQgY2hhbmdlIGZhaWxlZCB0byBtZXJnZSBiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBicmFuY2gKK2RpZG4ndCBleGlzdCBhbnltb3JlLCBpdCBzdGF5ZWQgaW4gc3RhdGUgJ1N1Ym1pdHRlZCwgTWVyZ2UgUGVuZGluZycuCitUaGlzIG1lYW50IEdlcnJpdCB3YXMgcmUtYXR0ZW1wdGluZyB0byBtZXJnZSB0aGlzIGNoYW5nZSAoZS5nLiBvbgorc3RhcnR1cCksIGJ1dCB0aGlzIGRpZG4ndCBtYWtlIHNlbnNlLiBFaXRoZXIgdGhlIGJyYW5jaCBkaWQgc3RpbGwgbm90CitleGlzdCAodGhlbiB0aGVyZSB3YXMgbm8gbmVlZCB0byB0cnkgbWVyZ2luZyBpdCkgb3IgYSBuZXcgYnJhbmNoIHdpdGgKK3RoZSBvbGQgbmFtZSB3YXMgY3JlYXRlZCAodGhlbiBpdCB3YXMgcXVlc3Rpb25hYmxlIGlmIHRoZSBjaGFuZ2Ugc2hvdWxkCitzdGlsbCBiZSBtZXJnZWQgaW50byB0aGlzIGJyYW5jaCkuIFRoaXMgaXMgd2h5IGl0J3MgYmV0dGVyIHRvIHNldCB0aGUKK2NoYW5nZSBiYWNrIHRvIHRoZSAnUmV2aWV3IGluIFByb2dyZXNzJyBzdGF0ZSBhbmQgdXBkYXRlIGl0IHdpdGggYQorbWVzc2FnZSBzYXlpbmcgdGhhdCBpdCBjb3VsZG4ndCBiZSBtZXJnZWQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24KK2JyYW5jaCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCisrCitJbiBhZGRpdGlvbiBHZXJyaXQgd2FzIHdyaXRpbmcgYW4gZXJyb3IgaW50byB0aGUgZXJyb3IgbG9nIGlmIGEgY2hhbmdlCitjb3VsZG4ndCBiZSBtZXJnZWQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gYnJhbmNoIHdhc3MgbWlzc2luZy4KK1RoYXQgd2FzIG5vdCByZWFsbHkgYSBzZXJ2ZXIgZXJyb3IgYW5kIGlzIG5vdCBsb2dnZWQgYW55bW9yZS4KKworKiBGaXggTlBFIHdoZW4gcHVzaGluZyBhIHBhdGNoIHdpdGggYW4gaW52YWxpZCBhdXRob3Igd2l0aAorICBgRm9yZ2UgQXV0aG9yYCBwZXJtaXNzaW9ucworCisqIEZpeCBkdXBsaWNhdGVkIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZXZlbnQgb24gcHJvamVjdCBjcmVhdGlvbi4KKysKK0NyZWF0aW5nIGEgbmV3IEdlcnJpdCBwcm9qZWN0IHdhcyBmaXJpbmcgdGhlIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZXZlbnQKK2ZvciB0aGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaCB0d28gdGltZXMuCisKKyogRml4IGVycm9yIGxvZyBtZXNzYWdlIGluIFJlY2VpdmVDb21taXRzCisrCitXaGVuIHRoZSBjcmVhdGlvbiBvZiBvbmUgb3IgbW9yZSByZWZlcmVuY2VzIGZhaWxlZCBSZWNlaXZlQ29tbWl0cyBmYWlsZWQKK3dpdGggJ2ludGVybmFsIHNlcnZlciBlcnJvcicgYW5kIHdyb3RlIHRoZSBmb2xsb3dpbmcgZXJyb3IgbG9nOgorIk9ubHkgWCBvZiBZIG5ldyBjaGFuZ2UgcmVmcyBjcmVhdGVkIGluIHh4eDsgYWJvcnRpbmciCitUaGUgcHJpbnRlZCB2YWx1ZSBmb3IgWSBjb3VsZCBiZSB3cm9uZyBzaW5jZSBpdCBkaWRuJ3QgaW5jbHVkZSB0aGUKK3JlcGxhY2VDb3VudC4gQXMgYSByZXN1bHQsIGEgY29uZnVzaW5nIG1lc3NhZ2UgbGlrZQorIk9ubHkgMCBvZiAwIG5ldyBjaGFuZ2UgcmVmcyBjcmVhdGVkIGluIHh4eDsgYWJvcnRpbmciCitjb3VsZCBhcHBlYXIgaW4gdGhlIGVycm9yIGxvZy4KKworU1NICit+fn4KKyogYHJldmlldyAtLXJlc3RvcmVgIGFsbG93cyBhIHJldmlldyBzY29yZSB0byBiZSBhZGRlZCBvbiB0aGUgcmVzdG9yZWQgY2hhbmdlLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzIxW0lzc3VlIDE3MjFdOgorICBgcmV2aWV3IC0tbWVzc2FnZWAgb25seSBhZGRzIHRoZSBtZXNzYWdlIG9uY2UuCisKKyogYGxzLWdyb3Vwc2AgcHJpbnRzICJOL0EiIGlmIHRoZSBncm91cCdzIG5hbWUgaXMgbm90IHNldC4KKworKiBgc2V0LXByb2plY3QtcGFyZW50IC0tY2hpbGRyZW4tb2ZgOiBGaXggZ2V0dGluZyBwYXJlbnQgZm9yIGxldmVsIDEgcHJvamVjdHMKKysKK0ZvciBkaXJlY3QgY2hpbGQgcHJvamVjdHMgb2YgdGhlIGBBbGwtUHJvamVjdHNgIHByb2plY3QgdGhlIG5hbWUgb2YgdGhlCitwYXJlbnQgcHJvamVjdCB3YXMgaW5jb3JyZWN0bHkgcmV0cmlldmVkIGlmIHRoZSBwYXJlbnQgbmFtZSB3YXMgbm90CitleHBsaWNpdGx5IHN0b3JlZCBhcyBgQWxsLVByb2plY3RzYCBpbiB0aGUgcHJvamVjdC5jb25maWcgZmlsZS4KKworKiBGaXggTlBFIHdoZW4gYWJhbmRvbmluZyBjaGFuZ2Ugd2l0aCBpbnZhbGlkIGF1dGhvcgorKworSWYgdGhlIGF1dGhvciBvZiBhIGNoYW5nZSBpc24ndCBrbm93biB0byBHZXJyaXQgKHB1c2hlZCB3aXRoCitgRm9yZ2UgQXV0aG9yYCBwZXJtaXNzaW9ucyksIHRyeWluZyB0byBhYmFuZG9uIHRoYXQgY2hhbmdlIG92ZXIgU1NICitmYWlsZWQgd2l0aCBhbiBOUEUuCisKK1F1ZXJ5Cit+fn5+fgorKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTcyOVtJc3N1ZSAxNzI5XToKKyAgRml4IHF1ZXJ5IGJ5ICdsYWJlbDpWZXJpZmllZD0wJworCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzcyW0lzc3VlIDE3NzJdOgorICBTZXQgYF9tb3JlX2NoYW5nZXNgIGlmIHJlc3VsdCBpcyBsaW1pdGVkIGR1ZSB0byBjb25maWd1cmVkIHF1ZXJ5IGxpbWl0CisKKyogRml4IHF1ZXJ5IGNvc3QgZm9yICJzdGF0dXM6bWVyZ2VkIGNvbW1pdDpjMGZmZWUiCisKK1BsdWdpbnMKK35+fn5+fn4KKyogU2tpcCBkaXNhYmxlZCBwbHVnaW5zIG9uIHJlc2NhbgorKworSW4gYSBiYWNrZ3JvdW5kIHRocmVhZCBHZXJyaXQgcGVyaW9kaWNhbGx5IHNjYW5zIGZvciBuZXcgb3IgY2hhbmdlZAorcGx1Z2lucy4gT24gZXZlcnkgc3VjaCBhIHJlc2NhbiBkaXNhYmxlZCBwbHVnaW5zIHdlcmUgbG9hZGVkIGFuZCBhIG5ldworY29weSBvZiB0aGVpciBqYXIgZmlsZXMgd2FzIHN0b3JlZCBpbiB0aGUgcmV2aWV3IHNpdGUncyB0bXAgZm9sZGVyLgorCisqIEZpeCBjbGVhbnVwIG9mIHBsdWdpbnMgZnJvbSB0bXAgZm9sZGVyIG9uIGdyYWNlZnVsIEdlcnJpdCBzaHV0ZG93bgorKworTG9hZGVkIHBsdWdpbiBqYXJzIGFyZSBjb3BpZWQgdG8gdGhlIHJldmlldyBzaXRlJ3MgdG1wIGZvbGRlciB0byBzdXBwb3J0Citob3QgdXBkYXRlcyBvZiB0aGUgcGx1Z2luIGphcnMgaW4gdGhlIHBsdWdpbnMgZm9sZGVyLiBPbiBHZXJyaXQgc2h1dGRvd24KK3RoZXNlIGNvcGllcyBvZiB0aGUgamFyIGZpbGVzIHNob3VsZCBiZSBjbGVhbmVkIHVwLiBGb3IgdGhpcyBwdXJwb3NlIGEKK0NsZWFudXBIYW5kbGUgaXMgY3JlYXRlZCwgYnV0IHRoZSBDbGVhbnVwSGFuZGxlIHdhc24ndCBlbnF1ZXVlZCBpbiB0aGUKK2NsZWFudXBRdWV1ZSB3aGljaCBpcyB3aHkgY2xlYW51cCBvbiBHZXJyaXQgc2h1dGRvd24gZGlkbid0IGhhcHBlbi4KKworKiBSZWF0dGVtcHQgZGVsZXRpb24gb2YgcGx1Z2luIGphcnMgZnJvbSB0bXAgZm9sZGVyIG9uIEpWTSB0ZXJtaW5hdGlvbgorKworTG9hZGVkIHBsdWdpbiBqYXJzIGFyZSBjb3BpZWQgdG8gdGhlIHJldmlldyBzaXRlJ3MgdG1wIGZvbGRlciB0byBzdXBwb3J0Citob3QgdXBkYXRlcyBvZiB0aGUgcGx1Z2luIGphcnMgaW4gdGhlIHBsdWdpbnMgZm9sZGVyLiBPbiBHZXJyaXQgc2h1dGRvd24KK3RoZXNlIGNvcGllcyBvZiB0aGUgamFyIGZpbGVzIHNob3VsZCBiZSBjbGVhbmVkIHVwLiBGb3IgdGhpcyBwdXJwb3NlIGEKK0NsZWFudXBIYW5kbGUgaXMgY3JlYXRlZC4gVGhlIGRlbGV0aW9uIG9mIHRoZSB0bXAgZmlsZSBpbiB0aGUKK0NsZWFudXBIYW5kbGUgY2FuIGZhaWwgYWx0aG91Z2ggdGhlIGphciBmaWxlIHdhcyBjbG9zZWQuIEluIHRoaXMgY2FzZQorcmVhdHRlbXB0IHRoZSBkZWxldGlvbiBvbiB0ZXJtaW5hdGlvbiBvZiB0aGUgdmlydHVhbCBtYWNoaW5lLiBUaGlzCitub3JtYWxseSBzdWNjZWVkcy4KKworKiBGaXggdW5sb2FkaW5nIG9mIHBsdWdpbnMKKysKK1doZW4gdHdvIHBsdWdpbnMsIHNheSBwbHVnaW5BLCBhbmQgcGx1Z2luQiBoYWQgYmVlbiBsb2FkZWQsIGFuZCBwbHVnaW5BCit3YXMgcmVtb3ZlZCBmcm9tICRzaXRlUGF0aC9wbHVnaW5zLCBwbHVnaW5BIGdvdCBzdG9wcGVkLCBhbmQgYSBjbGVhbmluZworcnVuIHdhcyBvcmRlcmVkLiBCdXQgdGhpcyBjbGVhbmluZyBydW4gY2xlYW5lZCBib3RoIHBsdWdpbnMgYW5kIGJvdGgKK3BsdWdpbnMgaGFkIHRoZWlyIGphcnMgcmVtb3ZlZC4gVGhpcyBsZWZ0IHBsdWdpbkIgdmlzaWJsZSB0byBHZXJyaXQKK2FsdGhvdWdoIGl0J3MgYmFja2luZyBqYXIgd2FzIGdvbmUuIFVwb24gY2FsbGluZyBub3QgeWV0IGluaXRpYWxpemVkCitwYXJ0cyBvZiBwbHVnaW5CIChlLmcuOiB2aWV3aW5nIG5vdCB5ZXQgdmlld2VkIERvY3VtZW50YXRpb24gcGFnZXMgb2YKK3BsdWdpbkIpLCBleGNlcHRpb25zIGFzIGZvbGxvd2luZyB3ZXJlIHRocm93bjoKKysKKy0tLS0KKyAgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogemlwIGZpbGUgY2xvc2VkCisgICAgICAgICAgYXQgamF2YS51dGlsLnppcC5aaXBGaWxlLmVuc3VyZU9wZW4oWmlwRmlsZS5qYXZhOjQyMCkKKyAgICAgICAgICBhdCBqYXZhLnV0aWwuemlwLlppcEZpbGUuZ2V0RW50cnkoWmlwRmlsZS5qYXZhOjE2NSkKKy0tLS0KKworKiBGaXggZG91YmxlIGJvdW5kIGV4Y2VwdGlvbiB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9ucworKworU2VydmVySW5mb3JtYXRpb24gY2xhc3Mgd2FzIGFscmVhZHkgYm91bmQsIHRoZXJlZm9yZSBpdCBzaG91bGRuJ3QgYmUKK2JvdW5kIGEgc2Vjb25kIHRpbWUgZm9yIEdlcnJpdCBleHRlbnNpb25zLgorCisqIERvIG5vdCBjYWxsIG9uTW9kdWxlTG9hZCgpIHNlY29uZCB0aW1lCisrCitvbk1vZHVsZUxvYWQoKSBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgYnkgR1dUIGZyYW1ld29yay4gQ2FsbGluZworaXQgb25jZSBhZ2FpbiBpbiBQbHVnaW5HZW5lcmF0b3IgY2F1c2VkIGRvdWJsZSBwbHVnaW4gaW5pdGlhbGl6YXRpb24uCisKKyogUmVxdWlyZSBgQWRtaW5pc3RyYXRlIFNlcnZlcmAgY2FwYWJpbGl0eSB0byBHRVQgL3BsdWdpbnMvCisrCitMaXN0aW5nIHBsdWdpbnMgcmVxdWlyZXMgYmVpbmcgYW4gYWRtaW5pc3RyYXRvci4gVGhpcyB3YXMgbWlzc2VkIGluIHRoZQorUkVTVCBBUEkuCisKK0VtYWlsCit+fn5+fgorKiBNZXJnZSBmYWlsdXJlIGVtYWlscyBhcmUgb25seSBzZW50IG9uY2UgcGVyIGRheS4KKyogVW51c2VkIG1hY3JvcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBtYWlsIHRlbXBsYXRlcy4KKyogVW5uZWNlc3NhcnkgZWxsaXBzZXMgYXJlIG5vIGxvbmdlciBhcHBsaWVkIHRvIGVtYWlsIHN1YmplY3RzLgorKiBUaGUgZW1wdHkgZGlmZiBvdXRwdXQgZnJvbSBhbiAib2N0b3B1cyBtZXJnZSIgaXMgbm93IGV4cGxhaW5lZCBpbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGVtYWlscy4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE0ODBbSXNzdWUgMTQ4MF06CitQcm9wZXIgZXJyb3IgbWVzc2FnZSBpcyBzaG93biB3aGVuIHJlZ2lzdGVyaW5nIGFuIGVtYWlsIGFkZHJlc3MgZmFpbHMuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2OTJbSXNzdWUgMTY5Ml06CitSZXZpZXcgY29tbWVudHMgYXJlIHNvcnRlZCBiZWZvcmUgYmVpbmcgYWRkZWQgdG8gbm90aWZpY2F0aW9uIGVtYWlscy4KKworKiBGaXggd2F0Y2hpbmcgb2YgJ0FsbCBDb21tZW50cycgb24gYEFsbC1Qcm9qZWN0c2AKKysKK0lmIGEgdXNlciBpcyB3YXRjaGluZyAnQWxsIENvbW1lbnRzJyBvbiBgQWxsLVByb2plY3RzYCB0aGlzIHNob3VsZAorYXBwbHkgdG8gYWxsIHByb2plY3RzLgorCitNaXNjCit+fn5+CisqIFByb3ZpZGUgbW9yZSBkZXNjcmlwdGl2ZSBtZXNzYWdlIGZvciBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uCisKKyogT24gaW50ZXJuYWwgZXJyb3IgZHVlIHRvIHJlY2VpdmUgdGltZW91dCBpbmNsdWRlIHRoZSB2YWx1ZSBvZgorICBgcmVjZWl2ZS50aW1lb3V0YCBpbnRvIHRoZSBsb2cgbWVzc2FnZQorCisqIFNpbGVuY2UgSU5GTy9ERUJVRyBvdXRwdXQgZnJvbSBhcGFjaGUuaHR0cAorKworVGhpcyBzcGFtbWVkIHRoZSBsb2cgd2hlbiB1c2luZyBPcGVuSUQsIGZvciBlYWNoIGFuZCBldmVyeSBsb2dpbi4KKworKiBSZW1vdmUgYG15c3FsX25leHR2YWxgIHNjcmlwdAorKworVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3b3JrIG9uIGJpbmFyeSBsb2dnaW5nIGVuYWJsZWQgc2VydmVycywKK2FzIE15U1FMIGlzIHVuYWJsZSB0byBleGVjdXRlIHRoZSBmdW5jdGlvbiBvbiBzbGF2ZXMgd2l0aG91dAorY2F1c2luZyBwb3NzaWJsZSBjb3JydXB0aW9uLiBEcm9wIHRoZSBmdW5jdGlvbiBzaW5jZSBpdCB3YXMgb25seQorY3JlYXRlZCB0byBoZWxwIGFkbWluaXN0cmF0b3JzLCBhbmQgaXMgdW5zYWZlLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xMzEyW0lzc3VlIDEzMTJdOgorICBGaXggcmVsYXRpdmUgVVJMIGRldGVjdGlvbiBpbiBzdWJtb2R1bGVzCisrCitSZWxhdGl2ZSBzdWJtb2R1bGVzIGRvIG5vdCBzdGFydCB3aXRoIGAvYC4gSW5zdGVhZCB0aGV5IHN0YXJ0IHdpdGgKK2AuLi9gLiAgRml4IHRoZSBTdWJtb2R1bGUgU3Vic2NyaXB0aW9ucyBlbmdpbmUgdG8gcmVjb2duaXplIHJlbGF0aXZlCitzdWJtb2R1bGVzLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjIyW0lzc3VlIDE2MjJdOgorICBGaXggTlBFIGluIExEQVAgSGVscGVyIGNsYXNzIGlmIHVzZXJuYW1lIGlzIG51bGwKKworKiBGaXggY29tbWl0LW1zZyBob29rIGZhaWx1cmUgd2l0aCBzcGFjZXMgaW4gcGF0aAorKworSWYgdGhlIHByb2plY3QgYWJzb2x1dGUgcGF0aCBoYWQgYW55IHdoaXRlc3BhY2UsIHRoZSBjb21taXQKK2hvb2sgZmFpbGVkIHRvIGNvbXBsZXRlIGJlY2F1c2UgYSBzY3JpcHQgdmFyaWFibGUgd2FzIG5vdAorZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4KKworKiBEcm9wIHRoZSB0cmFpbGluZyAiLmdpdCIgc3VmZml4IG9mIHRoZSBuYW1lIG9mIG5ldyBwcm9qZWN0CisKKyogUHJldmVudCBwb3NzaWJsZSBOUEUgd2hlbiBydW5uaW5nIGBjaGFuZ2UtbWVyZ2VkYCBob29rCisrCitJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHN1Ym1pdHRlciBpcyBudWxsLiBBZGQgYSBjaGVjayBmb3IgdGhpcworYmVmb3JlIGludm9raW5nIHRoZSBgY2hhbmdlLW1lcmdlZGAgaG9vayB3aXRoIGl0LgorCisqIEtlZXAgY2hhbmdlIG9wZW4gaWYgaXRzIGNvbW1pdCBpcyBwdXNoZWQgdG8gYW5vdGhlciBicmFuY2guCisKKyogRmlyZSBHaXRSZWZlcmVuY2VVcGRhdGVkIGV2ZW50IHdoZW4gQmFuQ29tbWl0IHVwZGF0ZXMgdGhlCisgIGByZWZzL21ldGEvcmVqZWN0LWNvbW1pdHNgIGJyYW5jaC4KKworKiBGaXggR2l0V2ViIENhY2hpbmcKKysKK0dpdFdlYiBDYWNoaW5nIHdhcyBub3Qgd29ya2luZyB3aGVuIGl0cyBjZ2kgZmlsZSB3YXMgZXhlY3V0ZWQgZnJvbQorb3V0c2lkZS4gVGhlIHNhbWUgYXBwcm9hY2ggd2lsbCBhbHNvIHdvcmsgd2l0aCB2YW5pbGxhIEdpdFdlYi4KKworKiBGaXggaW5maW5pdGUgbG9vcHMgd2hlbiB3YWxraW5nIHByb2plY3QgaGllcmFyY2h5CisKKyogRml4IHJlc291cmNlIGxlYWsgaW4gTWFya2Rvd25Gb3JtYXR0ZXIKKworKiBRdWVyeSBhbGwgZXh0ZXJuYWwgZ3JvdXBzIGZvciBpbnRlcm5hbCBncm91cCBtZW1iZXJzaGlwcworKworV2hlbiBhc2tpbmcgZm9yIHRoZSBrbm93biBncm91cHMgYSB1c2VyIGJlbG9uZ3MgdG8gdGhleSBtYXkgYmVsb25nCit0byBhbiBpbnRlcm5hbCBncm91cCBieSB3YXkgb2YgbWVtYmVyc2hpcCBpbiBhIG5vbi1pbnRlcm5hbCBncm91cCwKK3N1Y2ggYXMgTERBUC4gQ2FjaGUgaW4gbWVtb3J5IHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFueSBub24taW50ZXJuYWwKK2dyb3VwIFVVSURzIHVzZWQgYXMgbWVtYmVycyBvZiBhbiBpbnRlcm5hbCBncm91cC4gVGhlc2UgbXVzdCBnZXQKK2NoZWNrZWQgZm9yIG1lbWJlcnNoaXAgYmVmb3JlIGNvbXBsZXRpbmcgdGhlIGtub3duIGdyb3VwIGRhdGEgZnJvbQordGhlIGludGVybmFsIGJhY2tlbmQuCisKKyogSGFuZGxlIHNvcnRpbmcgZ3JvdXBzIHdpdGggbm8gbmFtZSB0byBhdm9pZCBOUEUKKworKiBgZ2Vycml0LnNoYAorKiogRG9uJ3Qgc3VnZ2VzdCBzaXRlIGluaXQgaWYgc2NoZW1hIHZlcnNpb24gaXMgbmV3ZXIgdGhhbiBleHBlY3RlZAorKiogSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBpbiBzY2hlbWEgY2hlY2sKKyoqIFN1Z2dlc3QgY2hhbmdpbmcgYGdlcnJpdC5jb25maWdgIHdoZW4gSkRLIG5vdCBmb3VuZAorKiogRXhwbGljaXRseSBzZXQgYSBzaGVsbAorKiogRGV0ZXJtaW5lIGBHRVJSSVRfU0lURWAgZnJvbSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorKiogRml4IGBnZXJyaXQuc2ggcmVzdGFydGAgZm9yIHJlbGF0aXZlIHBhdGhzCisqKiBGaXggc2l0ZSBwYXRoIGNvbXB1dGF0aW9uIGlmICcuJyBvY2N1cnMgaW4gcGF0aAorKiogV2hpdGVzcGFjZSBmaXhlcworCisqIERpc3BsYXkgdGhlIHJlYXNvbiBvZiBhbiBJbml0IGluamVjdGlvbiBmYWlsdXJlLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xODIxW0lzc3VlIDE4MjFdOgorICBXYXJuIGlmIGBjYWNoZS53ZWJfc2Vzc2lvbnMubWF4QWdlYCBpcyB0byBzbWFsbAorKworU2V0dGluZyBgbWF4QWdlYCB0byBhIHNtYWxsIHZhbHVlIGNhbiByZXN1bHQgaW4gdGhlIGJyb3dzZXIgZW5kbGVzc2x5CityZWRpcmVjdGluZyB0cnlpbmcgdG8gc2V0dXAgYSBuZXcgdmFsaWQgc2Vzc2lvbi4gV2FybiBhZG1pbmlzdHJhdG9ycwordGhhdCB0aGUgdmFsdWUgaXMgc2V0IHNtYWxsZXIgdGhhbiA1IG1pbnV0ZXMuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE4MjFbSXNzdWUgMTgyMV06CisgIFN1cHBvcnQgYGNhY2hlLndlYl9zZXNzaW9ucy5tYXhBZ2VgIDwgMSBtaW51dGUKKworKiBVc2UgU0VDT05EUyBhcyBkZWZhdWx0IHRpbWUgdW5pdCBmb3IgYGNhY2hlLndlYl9zZXNzaW9ucy5tYXhBZ2VgCisrCitEZWZhdWx0Q2FjaGVGYWN0b3J5IGFscmVhZHkgdXNlcyBTRUNPTkRTIGFzIGRlZmF1bHQgdGltZSB1bml0IGZvcgorYGNhY2hlLioubWF4QWdlYC4KKysKK1VwZGF0ZSB0aGUgZGVzY3JpYmVkIGRlZmF1bHQgdGltZSB1bml0IGZvciBgY2FjaGUuKi5tYXhBZ2VgIGluIHRoZQorZG9jdW1lbnRhdGlvbi4KKysKK0FkbWluaXN0cmF0b3JzIG1heSBuZWVkIHRvIHVwZGF0ZSB0aGVpciBjb25maWd1cmF0aW9uIHRvIGZvciB0aGUgbmV3CitkZWZhdWx0IHRpbWUgdW5pdC4KKworKiBBZGQgcHlsaW50IGNvbmZpZ3VyYXRpb24gZm9yIGNvbnRyaWJ1dGVkIFB5dGhvbiBzY3JpcHRzCisKKyogVmFyaW91cyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIG9mIHRoZSBgY29udHJpYi90cml2aWFsX3JlYmFzZS5weWAKKyAgc2NyaXB0CisrCisqKiBBZGFwdCBvcHRpb25zIHRvIEdlcnJpdCAyLjYKKyoqIFVzZSBjaGFuZ2UtdXJsIGZsYWcgZm9yIENoYW5nZUlkCisqKiBQcmV2ZW50IGV4Y2VwdGlvbiBmb3IgZW1wdHkgY29tbWl0CisqKiBGaXggcHlsaW50IGVycm9ycworKiogQ2FsbCBgZ2Vycml0IHJldmlld2AgaW5zdGVhZCBvZiBgZ2Vycml0IGFwcHJvdmVgCisqKiBNYWtlIHRoZSBwcml2YXRlIGtleSBhcmd1bWVudCBvcHRpb25hbAorKiogU3VwcG9ydCBhbHRlcm5hdGl2ZSBzc2ggZXhlY3V0YWJsZSwgZm9yIGV4YW1wbGUgYHBsaW5rYAorKiogU3VwcG9ydCBjdXN0b20gcmV2aWV3IGxhYmVscworKiogQ29ycmVjdGx5IGhhbmRsZSBlbXB0eSBwYXRjaCBJRAorKworSWYgb25seSBvbmUgb2YgdGhlIHBhdGNoIElEcyBpcyBlbXB0eSwgaXQgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkCithIHRyaXZpYWwgcmViYXNlLgorCisqKiBVc2UgcGxhaW4gcHl0aG9uIGluc3RlYWQgb2YgcHl0aG9uMi42CisrCitXaW5kb3dzIGluc3RhbGxhdGlvbiBvbmx5IGhhcyBweXRob24uZXhlCisKKyogQ29ycmVjdCBNSU1FIHR5cGUgb2YgYGZhdmljb24uaWNvYCByZWZlcmVuY2UKKysKK1RoaXMgaXMgbm90IGEgR0lGLCBpdCBpcyBhbiAiTVMgV2luZG93cyBpY29uIHJlc291cmNlIi4KK1NvbWUgYnJvd3NlcnMgbWF5IHNraXAgdGhlIGltYWdlIGlmIHRoZSB0eXBlIGlzIHdyb25nLgorCisqIFVzZSBgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIj5gIGZvciBgZmF2aWNvbi5pY29gIHJlZmVyZW5jZQorKworSUUgbG9va3MgZm9yIGEgdHdvLXdvcmQgInNob3J0Y3V0IGljb24iIHJlbGF0aW9uc2hpcC4gIE90aGVyIGJyb3dzZXJzCitpbnRlcnByZXQgdGhpcyBhcyB0d28gcmVsYXRpb25zaGlwcywgb25lIG9mIHdoaWNoIGlzICJpY29uIiwgc28gdGhleQorY2FuIGhhbmRsZSB0aGlzIHN5bnRheCBhcyB3ZWxsLgorKworU2VlOgorKworKiogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM3NjU2KFZTLjg1KS5hc3B4CisqKiBodHRwOi8vamVmZmNvZGUuYmxvZ3Nwb3QuY29tLzIwMDcvMTIvd2h5LWRvZXNudC1mYXZpY29uLWZvci1teS1zaXRlLWFwcGVhci5odG1sCisKKyogUmVtb3ZlIGBzZXJ2bGV0LWFwaWAgZnJvbSBgV0FSL2xpYmAKKysKK0l0IGlzIHdyb25nIHRvIGluY2x1ZGUgdGhlIHNlcnZsZXQgQVBJIGluIGEgV0FSJ3MgYFdFQi1JTkYvbGliYAorZGlyZWN0b3J5LiBUaGlzIGNvbmZ1c2VzIHNvbWUgc2VydmxldCBjb250YWluZXJzIHdobyByZWZ1c2UgdG8KK2xvYWQgdGhlIEdlcnJpdCBXQVIuIEluc3RlYWQgcGFja2FnZSB0aGUgSmV0dHkgcnVudGltZSBhbmQgdGhlCitzZXJ2bGV0IEFQSSBpbiBhIG5ldyBgV0VCLUlORi9wZ20tbGliYCBkaXJlY3RvcnkuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE4MjJbSXNzdWUgMTgyMl06CisgIFZlcmlmeSBzZXNzaW9uIG1hdGNoZXMgY29udGFpbmVyIGF1dGhlbnRpYXRpb24gaGVhZGVyCisrCitJZiB0aGUgdXNlciBhbHRlcnMgdGhlaXIgaWRlbnRpdHkgaW4gdGhlIGNvbnRhaW5lciBpbnZhbGlkYXRlCit0aGUgR2Vycml0IHVzZXIgc2Vzc2lvbiBhbmQgZm9yY2UgYSBuZXcgb25lIHRvIGJlZ2luLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzQzW0lzc3VlIDE3NDNdOgorICBNb3ZlIFJQQyBhdXRoIHRva2VuIGZyb20gYEF1dGhvcml6YXRpb25gIGhlYWRlciB0byBgWC1HZXJyaXQtQXV0aGAKKysKK1NlcnZlcnMgdGhhdCBydW4gd2l0aCBhdXRoLnR5cGUgPSBIVFRQIG9yIEhUVFBfTERBUCBhcmUgdW5hYmxlIHRvCit1c2UgdGhlIHdlYiBVSSBiZWNhdXNlIHRoZSBBdXRob3JpemF0aW9uIGNvZGUgc3VwcGxpZWQgYnkgdGhlIFVJCitvdmVycmlkZXMgdGhlIGJyb3dzZXIncyBuYXRpdmUgYEF1dGhvcml6YXRpb25gIGhlYWRlciBhbmQgY2F1c2VzIHRoZQorcmVxdWVzdCB0byBiZSBibG9ja2VkIGF0IHRoZSBIVFRQIHJldmVyc2UgcHJveHksIGJlZm9yZSBHZXJyaXQgZXZlbgorc2VlcyB0aGUgcmVxdWVzdC4KKysKK0luc3RlYWQgaW5zZXJ0IGEgdW5pcXVlIHRva2VuIGludG8gYFgtR2Vycml0LUF1dGhgLCBsZWF2aW5nIHRoZSBIVFRQCitzdGFuZGFyZCBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIHVuc3BlY2lmaWVkIGFuZCBhdmFpbGFibGUgZm9yIHVzZSBpbgorSFRUUCByZXZlcnNlIHByb3hpZXMuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworVXNlciBEb2N1bWVudGF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn4KKyogU3BsaXQgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLmh0bWxbCisgIFJFU1QgQVBJIGRvY3VtZW50YXRpb25dIGFuZCBoYXZlIG9uZSBwYWdlIHBlciB0b3AgbGV2ZWwgcmVzb3VyY2UKKworKiBBZGQgZXhlY3V0YWJsZSBleGFtcGxlcyBmb3IgR0VUIHJlcXVlc3RzIHRvCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS5odG1sWworICBSRVNUIEFQSSBkb2N1bWVudGF0aW9uXQorKworQWRkIGV4YW1wbGVzIGZvciBHRVQgcmVxdWVzdHMgdG8gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24gb24gd2hpY2gKK3RoZSB1c2VyIGNhbiBjbGljayB0byBmaXJlIHRoZSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgdXNlcnMgdG8KK2ltbWVkaWF0ZWx5IHRyeSBvdXQgdGhlIHJlcXVlc3RzIGFuZCBwbGF5IGFyb3VuZCB3aXRoIHRoZW0uCisKKyogRG9jdW1lbnQgdGhlIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2Jsb2NrWworICBCTE9DSyBhY2Nlc3MgcnVsZV0uCisKKyogQWRkZWQgZG9jdW1lbnRhdGlvbiBvZgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvdXNlci11cGxvYWQuaHRtbCNodHRwWworICBob3cgdG8gYXV0aGVudGljYXRlIHVwbG9hZHMgb3ZlciBIVFRQXS4KKworKiBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIHRoZQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI2F1dGguZWRpdEZ1bGxOYW1lVXJsW2F1dGguZWRpdEZ1bGxOYW1lVXJsXSBhbmQKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNhdXRoLmh0dHBQYXNzd29yZFVybFthdXRoLmh0dHBQYXNzd29yZFVybF0KKyAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCisqIEFkZCBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcHJvbG9nLWNvb2tib29rLmh0bWxbCisgIHN1Ym1pdF9ydWxlIGV4YW1wbGVzXSBmcm9tIEdlcnJpdCBVc2VyIFN1bW1pdCAyMDEyLgorCisqIEltcHJvdmVkIHRoZSBwdXNoIHRhZyBleGFtcGxlcyBpbiB0aGUgYWNjZXNzIGNvbnRyb2wgZG9jdW1lbnRhdGlvbi4KKworKiBJbXByb3ZlZCBkb2N1bWVudGF0aW9uIG9mIGVycm9yIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gY29tbWl0IG1lc3NhZ2UgZm9vdGVyIGNvbnRlbnQuCisKKyogQWRkZWQgZG9jdW1lbnRhdGlvbiBvZiB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2Vycm9yLWNvbW1pdC1hbHJlYWR5LWV4aXN0cy5odG1sWworICBjb21taXQgYWxyZWFkeSBleGlzdHNdIGVycm9yIG1lc3NhZ2UuCisKKyogQWRkZWQgbWlzc2luZyBkb2N1bWVudGF0aW9uIG9mIHRoZSBzc2gKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NtZC12ZXJzaW9uLmh0bWxbCisgIHZlcnNpb25dIGNvbW1hbmQuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTEzNjlbSXNzdWUgMTM2OV06CisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2l0d2ViLmh0bWxbCisgIEdpdHdlYiBJbnN0cnVjdGlvbiBVcGRhdGVzXQorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNTk0W0lzc3VlIDE1OTRdOgorICBEb2N1bWVudCBleGVjdXRlIHBlcm1pc3Npb24gZm9yIGNvbW1pdC1tc2cgaW4KKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItY2hhbmdlaWQuaHRtbCNjcmVhdGlvblsKKyAgQ2hhbmdlLUlkIGRvY3NdCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2MDJbSXNzdWUgMTYwMl06CitDb3JyZWN0ZWQgcmVmZXJlbmNlcyB0byBgcmVmcy9jaGFuZ2VzYCBpbiB0aGUgYWNjZXNzIGNvbnRyb2wgZG9jdW1lbnRhdGlvbi4KKworKiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBvZgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI3RyYWNraW5naWQubmFtZS5tYXRjaFsKKyAgbWF4aW1hbCBsZW5ndGggZm9yIHRyYWNraW5nIGlkc10KKworKiBBZGRlZCBtaXNzaW5nIGRvY3VtZW50YXRpb24gb2YKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2pzb24uaHRtbFtKU09OIGF0dHJpYnV0ZXNdLgorCisqIFJlbmFtZSBgY3VzdG9tLWRhc2hib2FyZHMuaHRtbGAgdG8KKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItZGFzaGJvYXJkcy5odG1sW3VzZXItZGFzaGJvYXJkcy5odG1sXQorKworVGhpcyBkb2N1bWVudCBubyBsb25nZXIgZGVhbHMgZXhjbHVzaXZlbHkgd2l0aCBjdXN0b20gZGFzaGJvYXJkcywgaXQgbm93IGRlc2NyaWJlcyBwcm9qZWN0IGxldmVsIGRhc2hib2FyZHMgYWxzby4KKworKiBTZXBhcmF0ZSB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1sb2dpbi1yZWdpc3Rlci5odG1sWworICBpbml0aWFsIHVzZXIgc2V0dXAgaW5zdHJ1Y3Rpb25zXSB0byBhIHNoYXJlZCBmaWxlCisKKyogU2VwYXJhdGUgdGhlCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kYXRhYmFzZS1zZXR1cC5odG1sWworICBkYXRhYmFzZSBzZXR1cCBpbnN0cnVjdGlvbnNdIHRvIGEgc2hhcmVkIGZpbGUKKworKiBJbXByb3ZlIHRoZSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGF0YWJhc2Utc2V0dXAuaHRtbFsKKyAgaW5zdHJ1Y3Rpb25zIGZvciBQZ1NRTCBzZXR1cF0KKworKiBGaXggdGhlIG9yZGVyIG9mIHN0ZXBzIGluIHRoZQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvaW5zdGFsbC1qMmVlLmh0bWxbCisgIEoyRUUgSW5zdGFsbGF0aW9uIGRvY3VtZW50XQorKworSXQgaXMgYmV0dGVyIHRvIGZpcnN0IGRlZmluZSB0aGUgSk5ESSBkYXRhIHNvdXJjZSBpbiB0aGUgYXBwbGljYXRpb24KK3NlcnZlciBhbmQgdGhlbiBkZXBsb3kgR2Vycml0IHRoYW4gb3Bwb3NpdGUuIFRoaXMgc2hvdWxkIGF2b2lkIGVycm9ycworbGlrZSAiTm8gRGF0YVNvdXJjZSIgb24gdGhlIGZpcnN0IGRlcGxveW1lbnQuCisKKyogQ2xhcmlmeSBkb2N1bWVudGF0aW9uIG9mCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjbGRhcC5ncm91cE5hbWVbCisgIExEQVAgZ3JvdXAgbmFtZSBzZXR0aW5nXQorCisqIEFkYXB0IGRvY3VtZW50YXRpb24gdG8gaGF2aW5nICdQcm9qZWN0cycgYXMgdG9wIGxldmVsIG1lbnUKKyogQWRkZWQgbWlzc2luZyBkb2N1bWVudGF0aW9uIG9mIG1haWwgdGVtcGxhdGVzLgorKiBBZGRlZCBkb2N1bWVudGF0aW9uIG9mIGNvbnRyaWJ1dG9yIGFncmVlbWVudHMuCisqIEZpeCBgaW5pdC5kYCBzeW1ib2xpYyBsaW5rIGNvbW1hbmRzLgorKiBSZW1vdmUgb2Jzb2xldGUgZGlza2J1ZmZlciBzZXR0aW5nIGZyb20gZXhhbXBsZSBjb25maWcgZmlsZS4KKyogVmFyaW91cyBtaW5vciBncmFtbWF0aWNhbCBhbmQgZm9ybWF0dGluZyBjb3JyZWN0aW9ucy4KKyogRml4IGV4dGVybmFsIGxpbmtzIGluIDIuMC4yMSBhbmQgMi4wLjI0IHJlbGVhc2Ugbm90ZXMKKyogTWFudWFsIHBhZ2VzIGNhbiBiZSBvcHRpb25hbGx5IGNyZWF0ZWQvaW5zdGFsbGVkIGZvciBjb3JlIGdlcnJpdCBzc2ggY29tbWFuZHMuCisKK0RldmVsb3BlciBBbmQgTWFpbnRhaW5lciBEb2N1bWVudGF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorKiBVcGRhdGVkIHRoZSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LWVjbGlwc2UuaHRtbCNtYXZlblsKKyAgTWF2ZW4gcGx1Z2luIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnNdIGZvciBFY2xpcHNlIDMuNyAoSW5kaWdvKS4KKworKiBEb2N1bWVudCBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LWNvbnRyaWJ1dGluZy5odG1sI2NvbW1pdC1tZXNzYWdlWworICB1c2FnZSBvZiB0aGUgcGFzdCB0ZW5zZSBpbiBjb21taXQgbWVzc2FnZXNdCisKKyogQWRkIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtY29udHJpYnV0aW5nLmh0bWxbCisgIGluc3RydWN0aW9uc10gb24gaG93IHRvIGNvbmZpZ3VyZSBnaXQgZm9yIHB1c2hpbmcgdG8gR2Vycml0J3MgR2Vycml0CisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2Rldi1jb250cmlidXRpbmcuaHRtbCNwcm9jZXNzWworICBTdGFibGUgYnJhbmNoZXMgcHJvY2VzcyBkb2N1bWVudGF0aW9uXQorCisqIEltcHJvdmVkIHRoZQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LXJlbGVhc2UuaHRtbFsKKyAgcmVsZWFzZSBkb2N1bWVudGF0aW9uXS4KKworKiBEb2N1bWVudCB0aGF0IHBsYW5zIGZvcgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LXJlbGVhc2UuaHRtbCNzdGFibGVbCisgIHN0YWJsZS1maXggcmVsZWFzZXNdIHNob3VsZCBiZSBhbm5vdW5jZWQKKworKiBEb2N1bWVudCBwcm9jZXNzIGZvcgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LXJlbGVhc2UuaHRtbCNzZWN1cml0eVsKKyAgc2VjdXJpdHktZml4IHJlbGVhc2VzXQorCisqIFRoZSByZWxlYXNlIG5vdGVzIGFyZSBub3cgbWFkZSB3aGVuIGEgcmVsZWFzZSBpcyBjcmVhdGVkIGJ5IHJ1bm5pbmcgdGhlIGB0b29scy9yZWxlYXNlLnNoYCBzY3JpcHQuCisKZGlmZiAtLWdpdCBhL1JlbGVhc2VOb3Rlcy9pbmRleC50eHQgYi9SZWxlYXNlTm90ZXMvaW5kZXgudHh0CmluZGV4IGUyNDg3YmMuLjI2Y2NhZTcgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VOb3Rlcy9pbmRleC50eHQKKysrIGIvUmVsZWFzZU5vdGVzL2luZGV4LnR4dApAQCAtMSw2ICsxLDExIEBACiBHZXJyaXQgQ29kZSBSZXZpZXcgLSBSZWxlYXNlIE5vdGVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK1tbMl82XV0KK1ZlcnNpb24gMi42LngKKy0tLS0tLS0tLS0tLS0KKyogbGluazpSZWxlYXNlTm90ZXMtMi42Lmh0bWxbMi42XQorCiBbWzJfNV1dCiBWZXJzaW9uIDIuNS54CiAtLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9jb250cmliLy5weWxpbnRyYyBiL2NvbnRyaWIvLnB5bGludHJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODg4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliLy5weWxpbnRyYwpAQCAtMCwwICsxLDMwMSBAQAorIyBsaW50IFB5dGhvbiBtb2R1bGVzIHVzaW5nIGV4dGVybmFsIGNoZWNrZXJzLgorIworIyBUaGlzIGlzIHRoZSBtYWluIGNoZWNrZXIgY29udHJvbGluZyB0aGUgb3RoZXIgb25lcyBhbmQgdGhlIHJlcG9ydHMKKyMgZ2VuZXJhdGlvbi4gSXQgaXMgaXRzZWxmIGJvdGggYSByYXcgY2hlY2tlciBhbmQgYW4gYXN0bmcgY2hlY2tlciBpbiBvcmRlcgorIyB0bzoKKyMgKiBoYW5kbGUgbWVzc2FnZSBhY3RpdmF0aW9uIC8gZGVhY3RpdmF0aW9uIGF0IHRoZSBtb2R1bGUgbGV2ZWwKKyMgKiBoYW5kbGUgc29tZSBiYXNpYyBidXQgbmVjZXNzYXJ5IHN0YXRzJ2RhdGEgKG51bWJlciBvZiBjbGFzc2VzLCBtZXRob2RzLi4uKQorIworW01BU1RFUl0KKworIyBTcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlLgorI3JjZmlsZT0KKworIyBQeXRob24gY29kZSB0byBleGVjdXRlLCB1c3VhbGx5IGZvciBzeXMucGF0aCBtYW5pcHVsYXRpb24gc3VjaCBhcworIyBweWd0ay5yZXF1aXJlKCkuCisjaW5pdC1ob29rPQorCisjIFByb2ZpbGVkIGV4ZWN1dGlvbi4KK3Byb2ZpbGU9bm8KKworIyBBZGQgPGZpbGUgb3IgZGlyZWN0b3J5PiB0byB0aGUgYmxhY2sgbGlzdC4gSXQgc2hvdWxkIGJlIGEgYmFzZSBuYW1lLCBub3QgYQorIyBwYXRoLiBZb3UgbWF5IHNldCB0aGlzIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4KK2lnbm9yZT1TVk4KKworIyBQaWNrbGUgY29sbGVjdGVkIGRhdGEgZm9yIGxhdGVyIGNvbXBhcmlzb25zLgorcGVyc2lzdGVudD15ZXMKKworIyBTZXQgdGhlIGNhY2hlIHNpemUgZm9yIGFzdG5nIG9iamVjdHMuCitjYWNoZS1zaXplPTUwMAorCisjIExpc3Qgb2YgcGx1Z2lucyAoYXMgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyBvZiBweXRob24gbW9kdWxlcyBuYW1lcykgdG8gbG9hZCwKKyMgdXN1YWxseSB0byByZWdpc3RlciBhZGRpdGlvbmFsIGNoZWNrZXJzLgorbG9hZC1wbHVnaW5zPQorCisKK1tNRVNTQUdFUyBDT05UUk9MXQorCisjIEVuYWJsZSBvbmx5IGNoZWNrZXIocykgd2l0aCB0aGUgZ2l2ZW4gaWQocykuIFRoaXMgb3B0aW9uIGNvbmZsaWN0cyB3aXRoIHRoZQorIyBkaXNhYmxlLWNoZWNrZXIgb3B0aW9uCisjZW5hYmxlLWNoZWNrZXI9CisKKyMgRW5hYmxlIGFsbCBjaGVja2VyKHMpIGV4Y2VwdCB0aG9zZSB3aXRoIHRoZSBnaXZlbiBpZChzKS4gVGhpcyBvcHRpb24KKyMgY29uZmxpY3RzIHdpdGggdGhlIGVuYWJsZS1jaGVja2VyIG9wdGlvbgorI2Rpc2FibGUtY2hlY2tlcj0KKworIyBFbmFibGUgYWxsIG1lc3NhZ2VzIGluIHRoZSBsaXN0ZWQgY2F0ZWdvcmllcy4KKyNlbmFibGUtbXNnLWNhdD0KKworIyBEaXNhYmxlIGFsbCBtZXNzYWdlcyBpbiB0aGUgbGlzdGVkIGNhdGVnb3JpZXMuCisjZGlzYWJsZS1tc2ctY2F0PQorCisjIEVuYWJsZSB0aGUgbWVzc2FnZShzKSB3aXRoIHRoZSBnaXZlbiBpZChzKS4KK2VuYWJsZT1SUDAwMDQKKworIyBEaXNhYmxlIHRoZSBtZXNzYWdlKHMpIHdpdGggdGhlIGdpdmVuIGlkKHMpLgorZGlzYWJsZT1SMDkwMyxSMDkxMixSMDkxMyxSMDkxNCxSMDkxNSxXMDE0MSxDMDExMSxDMDEwMyxXMDYwMyxXMDcwMyxSMDkxMSxDMDMwMSxDMDMwMixSMDkwMixSMDkwNCxXMDE0MixXMDIxMixFMTEwMSxFMTEwMyxSMDIwMSxXMDIwMSxXMDEyMixXMDIzMixSUDAwMDEsUlAwMDAzLFJQMDEwMSxSUDAwMDIsUlAwNDAxLFJQMDcwMSxSUDA4MDEKKworW1JFUE9SVFNdCisKKyMgc2V0IHRoZSBvdXRwdXQgZm9ybWF0LiBBdmFpbGFibGUgZm9ybWF0cyBhcmUgdGV4dCwgcGFyc2VhYmxlLCBjb2xvcml6ZWQsIG1zdnMKKyMgKHZpc3VhbCBzdHVkaW8pIGFuZCBodG1sCitvdXRwdXQtZm9ybWF0PXRleHQKKworIyBJbmNsdWRlIG1lc3NhZ2UncyBpZCBpbiBvdXRwdXQKK2luY2x1ZGUtaWRzPXllcworCisjIFB1dCBtZXNzYWdlcyBpbiBhIHNlcGFyYXRlIGZpbGUgZm9yIGVhY2ggbW9kdWxlIC8gcGFja2FnZSBzcGVjaWZpZWQgb24gdGhlCisjIGNvbW1hbmQgbGluZSBpbnN0ZWFkIG9mIHByaW50aW5nIHRoZW0gb24gc3Rkb3V0LiBSZXBvcnRzIChpZiBhbnkpIHdpbGwgYmUKKyMgd3JpdHRlbiBpbiBhIGZpbGUgbmFtZSAicHlsaW50X2dsb2JhbC5bdHh0fGh0bWxdIi4KK2ZpbGVzLW91dHB1dD1ubworCisjIFRlbGxzIHdoZXRoZXIgdG8gZGlzcGxheSBhIGZ1bGwgcmVwb3J0IG9yIG9ubHkgdGhlIG1lc3NhZ2VzCityZXBvcnRzPXllcworCisjIFB5dGhvbiBleHByZXNzaW9uIHdoaWNoIHNob3VsZCByZXR1cm4gYSBub3RlIGxlc3MgdGhhbiAxMCAoMTAgaXMgdGhlIGhpZ2hlc3QKKyMgbm90ZSkuWW91IGhhdmUgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZXMgZXJyb3JzIHdhcm5pbmcsIHN0YXRlbWVudCB3aGljaAorIyByZXNwZWN0aXZseSBjb250YWluIHRoZSBudW1iZXIgb2YgZXJyb3JzIC8gd2FybmluZ3MgbWVzc2FnZXMgYW5kIHRoZSB0b3RhbAorIyBudW1iZXIgb2Ygc3RhdGVtZW50cyBhbmFseXplZC4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBnbG9iYWwgZXZhbHVhdGlvbiByZXBvcnQKKyMgKFIwMDA0KS4KK2V2YWx1YXRpb249MTAuMCAtICgoZmxvYXQoNSAqIGVycm9yICsgd2FybmluZyArIHJlZmFjdG9yICsgY29udmVudGlvbikgLyBzdGF0ZW1lbnQpICogMTApCisKKyMgQWRkIGEgY29tbWVudCBhY2NvcmRpbmcgdG8geW91ciBldmFsdWF0aW9uIG5vdGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgZ2xvYmFsCisjIGV2YWx1YXRpb24gcmVwb3J0IChSMDAwNCkuCitjb21tZW50PW5vCisKKyMgY2hlY2tzIGZvcgorIyAqIHVudXNlZCB2YXJpYWJsZXMgLyBpbXBvcnRzCisjICogdW5kZWZpbmVkIHZhcmlhYmxlcworIyAqIHJlZGVmaW5pdGlvbiBvZiB2YXJpYWJsZSBmcm9tIGJ1aWx0aW5zIG9yIGZyb20gYW4gb3V0ZXIgc2NvcGUKKyMgKiB1c2Ugb2YgdmFyaWFibGUgYmVmb3JlIGFzc2lnbWVudAorIworW1ZBUklBQkxFU10KKworIyBUZWxscyB3aGV0aGVyIHdlIHNob3VsZCBjaGVjayBmb3IgdW51c2VkIGltcG9ydCBpbiBfX2luaXRfXyBmaWxlcy4KK2luaXQtaW1wb3J0PW5vCisKKyMgQSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgbmFtZXMgdXNlZCBmb3IgZHVtbXkgdmFyaWFibGVzIChpLmUuIG5vdCB1c2VkKS4KK2R1bW15LXZhcmlhYmxlcy1yZ3g9X3xkdW1teQorCisjIExpc3Qgb2YgYWRkaXRpb25hbCBuYW1lcyBzdXBwb3NlZCB0byBiZSBkZWZpbmVkIGluIGJ1aWx0aW5zLiBSZW1lbWJlciB0aGF0CisjIHlvdSBzaG91bGQgYXZvaWQgdG8gZGVmaW5lIG5ldyBidWlsdGlucyB3aGVuIHBvc3NpYmxlLgorYWRkaXRpb25hbC1idWlsdGlucz0KKworCisjIHRyeSB0byBmaW5kIGJ1Z3MgaW4gdGhlIGNvZGUgdXNpbmcgdHlwZSBpbmZlcmVuY2UKKyMKK1tUWVBFQ0hFQ0tdCisKKyMgVGVsbHMgd2hldGhlciBtaXNzaW5nIG1lbWJlcnMgYWNjZXNzZWQgaW4gbWl4aW4gY2xhc3Mgc2hvdWxkIGJlIGlnbm9yZWQuIEEKKyMgbWl4aW4gY2xhc3MgaXMgZGV0ZWN0ZWQgaWYgaXRzIG5hbWUgZW5kcyB3aXRoICJtaXhpbiIgKGNhc2UgaW5zZW5zaXRpdmUpLgoraWdub3JlLW1peGluLW1lbWJlcnM9eWVzCisKKyMgTGlzdCBvZiBjbGFzc2VzIG5hbWVzIGZvciB3aGljaCBtZW1iZXIgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIGNoZWNrZWQKKyMgKHVzZWZ1bCBmb3IgY2xhc3NlcyB3aXRoIGF0dHJpYnV0ZXMgZHluYW1pY2FseSBzZXQpLgoraWdub3JlZC1jbGFzc2VzPVNRTE9iamVjdAorCisjIFdoZW4gem9wZSBtb2RlIGlzIGFjdGl2YXRlZCwgY29uc2lkZXIgdGhlIGFjcXVpcmVkLW1lbWJlcnMgb3B0aW9uIHRvIGlnbm9yZQorIyBhY2Nlc3MgdG8gc29tZSB1bmRlZmluZWQgYXR0cmlidXRlcy4KK3pvcGU9bm8KKworIyBMaXN0IG9mIG1lbWJlcnMgd2hpY2ggYXJlIHVzdWFsbHkgZ2V0IHRocm91Z2ggem9wZSdzIGFjcXVpc2l0aW9uIG1lY2FuaXNtIGFuZAorIyBzbyBzaG91bGRuJ3QgdHJpZ2dlciBFMDIwMSB3aGVuIGFjY2Vzc2VkIChuZWVkIHpvcGU9eWVzIHRvIGJlIGNvbnNpZGVyZWQpLgorYWNxdWlyZWQtbWVtYmVycz1SRVFVRVNULGFjbF91c2VycyxhcV9wYXJlbnQKKworCisjIGNoZWNrcyBmb3IgOgorIyAqIGRvYyBzdHJpbmdzCisjICogbW9kdWxlcyAvIGNsYXNzZXMgLyBmdW5jdGlvbnMgLyBtZXRob2RzIC8gYXJndW1lbnRzIC8gdmFyaWFibGVzIG5hbWUKKyMgKiBudW1iZXIgb2YgYXJndW1lbnRzLCBsb2NhbCB2YXJpYWJsZXMsIGJyYW5jaHMsIHJldHVybnMgYW5kIHN0YXRlbWVudHMgaW4KKyMgZnVuY3Rpb25zLCBtZXRob2RzCisjICogcmVxdWlyZWQgbW9kdWxlIGF0dHJpYnV0ZXMKKyMgKiBkYW5nZXJvdXMgZGVmYXVsdCB2YWx1ZXMgYXMgYXJndW1lbnRzCisjICogcmVkZWZpbml0aW9uIG9mIGZ1bmN0aW9uIC8gbWV0aG9kIC8gY2xhc3MKKyMgKiB1c2VzIG9mIHRoZSBnbG9iYWwgc3RhdGVtZW50CisjCitbQkFTSUNdCisKKyMgUmVxdWlyZWQgYXR0cmlidXRlcyBmb3IgbW9kdWxlLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorcmVxdWlyZWQtYXR0cmlidXRlcz0KKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggZnVuY3Rpb25zIG9yIGNsYXNzZXMgbmFtZSB3aGljaCBkbworIyBub3QgcmVxdWlyZSBhIGRvY3N0cmluZworbm8tZG9jc3RyaW5nLXJneD1fbWFpbnxfXy4qX18KKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBtb2R1bGUgbmFtZXMKK21vZHVsZS1yZ3g9KChbYS16X11bYS16MC05X10qKXwoW0EtWl1bYS16QS1aMC05XSspKSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBtb2R1bGUgbGV2ZWwgbmFtZXMKK2NvbnN0LXJneD0oKFtBLVpfXVtBLVoxLTlfXSopfChfXy4qX18pKXwobG9nKSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBjbGFzcyBuYW1lcworY2xhc3Mtcmd4PVtBLVpfXVthLXpBLVowLTldKyQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBmdW5jdGlvbiBuYW1lcworZnVuY3Rpb24tcmd4PVthLXpfXVthLXowLTlfXXsyLDMwfSQKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIG9ubHkgbWF0Y2ggY29ycmVjdCBtZXRob2QgbmFtZXMKK21ldGhvZC1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lcworYXR0ci1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGFyZ3VtZW50IG5hbWVzCithcmd1bWVudC1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IHZhcmlhYmxlIG5hbWVzCit2YXJpYWJsZS1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGxpc3QgY29tcHJlaGVuc2lvbiAvCisjIGdlbmVyYXRvciBleHByZXNzaW9uIHZhcmlhYmxlIG5hbWVzCitpbmxpbmV2YXItcmd4PVtBLVphLXpfXVtBLVphLXowLTlfXSokCisKKyMgR29vZCB2YXJpYWJsZSBuYW1lcyB3aGljaCBzaG91bGQgYWx3YXlzIGJlIGFjY2VwdGVkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorZ29vZC1uYW1lcz1pLGosayxleCxSdW4sXyxlLGQxLGQyLHYsZixsLGQKKworIyBCYWQgdmFyaWFibGUgbmFtZXMgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSByZWZ1c2VkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorYmFkLW5hbWVzPWZvbyxiYXIsYmF6LHRvdG8sdHV0dSx0YXRhCisKKyMgTGlzdCBvZiBidWlsdGlucyBmdW5jdGlvbiBuYW1lcyB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCwgc2VwYXJhdGVkIGJ5IGEgY29tbWEKK2JhZC1mdW5jdGlvbnM9bWFwLGZpbHRlcixhcHBseSxpbnB1dAorCisKKyMgY2hlY2tzIGZvciBzaWduIG9mIHBvb3IvbWlzZGVzaWduOgorIyAqIG51bWJlciBvZiBtZXRob2RzLCBhdHRyaWJ1dGVzLCBsb2NhbCB2YXJpYWJsZXMuLi4KKyMgKiBzaXplLCBjb21wbGV4aXR5IG9mIGZ1bmN0aW9ucywgbWV0aG9kcworIworW0RFU0lHTl0KKworIyBNYXhpbXVtIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kCittYXgtYXJncz01CisKKyMgTWF4aW11bSBudW1iZXIgb2YgbG9jYWxzIGZvciBmdW5jdGlvbiAvIG1ldGhvZCBib2R5CittYXgtbG9jYWxzPTE1CisKKyMgTWF4aW11bSBudW1iZXIgb2YgcmV0dXJuIC8geWllbGQgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1yZXR1cm5zPTYKKworIyBNYXhpbXVtIG51bWJlciBvZiBicmFuY2ggZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1icmFuY2hzPTEyCisKKyMgTWF4aW11bSBudW1iZXIgb2Ygc3RhdGVtZW50cyBpbiBmdW5jdGlvbiAvIG1ldGhvZCBib2R5CittYXgtc3RhdGVtZW50cz01MAorCisjIE1heGltdW0gbnVtYmVyIG9mIHBhcmVudHMgZm9yIGEgY2xhc3MgKHNlZSBSMDkwMSkuCittYXgtcGFyZW50cz03CisKKyMgTWF4aW11bSBudW1iZXIgb2YgYXR0cmlidXRlcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAyKS4KK21heC1hdHRyaWJ1dGVzPTIwCisKKyMgTWluaW11bSBudW1iZXIgb2YgcHVibGljIG1ldGhvZHMgZm9yIGEgY2xhc3MgKHNlZSBSMDkwMykuCittaW4tcHVibGljLW1ldGhvZHM9MgorCisjIE1heGltdW0gbnVtYmVyIG9mIHB1YmxpYyBtZXRob2RzIGZvciBhIGNsYXNzIChzZWUgUjA5MDQpLgorbWF4LXB1YmxpYy1tZXRob2RzPTMwCisKKworIyBjaGVja3MgZm9yCisjICogZXh0ZXJuYWwgbW9kdWxlcyBkZXBlbmRlbmNpZXMKKyMgKiByZWxhdGl2ZSAvIHdpbGRjYXJkIGltcG9ydHMKKyMgKiBjeWNsaWMgaW1wb3J0cworIyAqIHVzZXMgb2YgZGVwcmVjYXRlZCBtb2R1bGVzCisjCitbSU1QT1JUU10KKworIyBEZXByZWNhdGVkIG1vZHVsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSB1c2VkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorZGVwcmVjYXRlZC1tb2R1bGVzPXJlZ3N1YixzdHJpbmcsVEVSTUlPUyxCYXN0aW9uLHJleGVjCisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgZXZlcnkgKGkuZS4gaW50ZXJuYWwgYW5kIGV4dGVybmFsKSBkZXBlbmRlbmNpZXMgaW4gdGhlCisjIGdpdmVuIGZpbGUgKHJlcG9ydCBSMDQwMiBtdXN0IG5vdCBiZSBkaXNhYmxlZCkKK2ltcG9ydC1ncmFwaD0KKworIyBDcmVhdGUgYSBncmFwaCBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMgaW4gdGhlIGdpdmVuIGZpbGUgKHJlcG9ydCBSMDQwMiBtdXN0CisjIG5vdCBiZSBkaXNhYmxlZCkKK2V4dC1pbXBvcnQtZ3JhcGg9CisKKyMgQ3JlYXRlIGEgZ3JhcGggb2YgaW50ZXJuYWwgZGVwZW5kZW5jaWVzIGluIHRoZSBnaXZlbiBmaWxlIChyZXBvcnQgUjA0MDIgbXVzdAorIyBub3QgYmUgZGlzYWJsZWQpCitpbnQtaW1wb3J0LWdyYXBoPQorCisKKyMgY2hlY2tzIGZvciA6CisjICogbWV0aG9kcyB3aXRob3V0IHNlbGYgYXMgZmlyc3QgYXJndW1lbnQKKyMgKiBvdmVycmlkZGVuIG1ldGhvZHMgc2lnbmF0dXJlCisjICogYWNjZXNzIG9ubHkgdG8gZXhpc3RhbnQgbWVtYmVycyB2aWEgc2VsZgorIyAqIGF0dHJpYnV0ZXMgbm90IGRlZmluZWQgaW4gdGhlIF9faW5pdF9fIG1ldGhvZAorIyAqIHN1cHBvcnRlZCBpbnRlcmZhY2VzIGltcGxlbWVudGF0aW9uCisjICogdW5yZWFjaGFibGUgY29kZQorIworW0NMQVNTRVNdCisKKyMgTGlzdCBvZiBpbnRlcmZhY2UgbWV0aG9kcyB0byBpZ25vcmUsIHNlcGFyYXRlZCBieSBhIGNvbW1hLiBUaGlzIGlzIHVzZWQgZm9yCisjIGluc3RhbmNlIHRvIG5vdCBjaGVjayBtZXRob2RzIGRlZmluZXMgaW4gWm9wZSdzIEludGVyZmFjZSBiYXNlIGNsYXNzLgoraWdub3JlLWlmYWNlLW1ldGhvZHM9aXNJbXBsZW1lbnRlZEJ5LGRlZmVycmVkLGV4dGVuZHMsbmFtZXMsbmFtZXNBbmREZXNjcmlwdGlvbnMscXVlcnlEZXNjcmlwdGlvbkZvcixnZXRCYXNlcyxnZXREZXNjcmlwdGlvbkZvcixnZXREb2MsZ2V0TmFtZSxnZXRUYWdnZWRWYWx1ZSxnZXRUYWdnZWRWYWx1ZVRhZ3MsaXNFcXVhbE9yRXh0ZW5kZWRCeSxzZXRUYWdnZWRWYWx1ZSxpc0ltcGxlbWVudGVkQnlJbnN0YW5jZXNPZixhZGFwdFdpdGgsaXNfaW1wbGVtZW50ZWRfYnkKKworIyBMaXN0IG9mIG1ldGhvZCBuYW1lcyB1c2VkIHRvIGRlY2xhcmUgKGkuZS4gYXNzaWduKSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorZGVmaW5pbmctYXR0ci1tZXRob2RzPV9faW5pdF9fLF9fbmV3X18sc2V0VXAKKworCisjIGNoZWNrcyBmb3Igc2ltaWxhcml0aWVzIGFuZCBkdXBsaWNhdGVkIGNvZGUuIFRoaXMgY29tcHV0YXRpb24gbWF5IGJlCisjIG1lbW9yeSAvIENQVSBpbnRlbnNpdmUsIHNvIHlvdSBzaG91bGQgZGlzYWJsZSBpdCBpZiB5b3UgZXhwZXJpbWVudHMgc29tZQorIyBwcm9ibGVtcy4KKyMKK1tTSU1JTEFSSVRJRVNdCisKKyMgTWluaW11bSBsaW5lcyBudW1iZXIgb2YgYSBzaW1pbGFyaXR5LgorbWluLXNpbWlsYXJpdHktbGluZXM9NAorCisjIElnbm9yZSBjb21tZW50cyB3aGVuIGNvbXB1dGluZyBzaW1pbGFyaXRpZXMuCitpZ25vcmUtY29tbWVudHM9eWVzCisKKyMgSWdub3JlIGRvY3N0cmluZ3Mgd2hlbiBjb21wdXRpbmcgc2ltaWxhcml0aWVzLgoraWdub3JlLWRvY3N0cmluZ3M9eWVzCisKKworIyBjaGVja3MgZm9yOgorIyAqIHdhcm5pbmcgbm90ZXMgaW4gdGhlIGNvZGUgbGlrZSBGSVhNRSwgWFhYCisjICogUEVQIDI2Mzogc291cmNlIGNvZGUgd2l0aCBub24gYXNjaWkgY2hhcmFjdGVyIGJ1dCBubyBlbmNvZGluZyBkZWNsYXJhdGlvbgorIworW01JU0NFTExBTkVPVVNdCisKKyMgTGlzdCBvZiBub3RlIHRhZ3MgdG8gdGFrZSBpbiBjb25zaWRlcmF0aW9uLCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KK25vdGVzPUZJWE1FLFhYWCxUT0RPCisKKworIyBjaGVja3MgZm9yIDoKKyMgKiB1bmF1dGhvcml6ZWQgY29uc3RydWN0aW9ucworIyAqIHN0cmljdCBpbmRlbnRhdGlvbgorIyAqIGxpbmUgbGVuZ3RoCisjICogdXNlIG9mIDw+IGluc3RlYWQgb2YgIT0KKyMKK1tGT1JNQVRdCisKKyMgTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBvbiBhIHNpbmdsZSBsaW5lLgorbWF4LWxpbmUtbGVuZ3RoPTgwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgaW4gYSBtb2R1bGUKK21heC1tb2R1bGUtbGluZXM9MTAwMAorCisjIFN0cmluZyB1c2VkIGFzIGluZGVudGF0aW9uIHVuaXQuIFRoaXMgaXMgdXN1YWxseSAiICAgICIgKDQgc3BhY2VzKSBvciAiXHQiICgxCisjIHRhYikuICBJbiByZXBvIGl0IGlzIDIgc3BhY2VzLgoraW5kZW50LXN0cmluZz0nICAnCmRpZmYgLS1naXQgYS9jb250cmliL2Zha2VfbGRhcC5wbCBiL2NvbnRyaWIvZmFrZV9sZGFwLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDIzYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYWtlX2xkYXAucGwKQEAgLTAsMCArMSwzMzMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBGYWtlIExEQVAgc2VydmVyIGZvciBHZXJyaXQKKyMgQXV0aG9yOiBPbGl2aWVyIENyb3F1ZXR0ZSA8b2Nyb3F1ZXR0ZUBmcmVlLmZyPgorIyBMYXN0IGNoYW5nZTogMjAxMi0xMS0xMgorIworIyBBYnN0cmFjdDoKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgR2Vycml0IGN1cnJlbnRseSBzdXBwb3J0cyBzZXZlcmFsIGF1dGhlbnRpY2F0aW9uIHNjaGVtZXMsIGJ1dAorIyB1bmZvcnR1bmF0ZWx5IG5vdCB0aGUgbW9zdCBiYXNpYyBvbmUsIGUuZy4gbG9jYWwgYWNjb3VudHMgd2l0aAorIyBsb2NhbCBwYXNzd29yZHMuCisjCisjIEFzIGEgd29ya2Fyb3VuZCwgdGhpcyBzY3JpcHQgaW1wbGVtZW50cyBhIG1pbmltYWwgTERBUCBzZXJ2ZXIKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRoZW50aWNhdGUgYWdhaW5zdCBHZXJyaXQuIFRoZSBpbmZvcm1hdGlvbgorIyByZXF1aXJlZCBieSBHZXJyaXQgcmVsYXRpdmUgdG8gdXNlcnMgKHVzZXIgSUQsIHBhc3N3b3JkLCBkaXNwbGF5CisjIG5hbWUsIGVtYWlsKSBpcyBzdG9yZWQgaW4gYSB0ZXh0IGZpbGUgc2ltaWxhciB0byAvZXRjL3Bhc3N3ZAorIworIworIyBVc2FnZSAoc2VlIGJlbG93IGZvciB0aGUgc2V0dXApCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFRvIGNyZWF0ZSBhIG5ldyBmaWxlIHRvIHN0b3JlIHRoZSB1c2VyIGluZm9ybWF0aW9uOgorIyAgIGZha2UtbGRhcCBlZGl0dXNlciAtLWRhdGFmaWxlIC9wYXRoL2RhdGFmaWxlIC0tdXNlcm5hbWUgbWF4cG93ZXIgXAorIyAgICAgLS1kaXNwbGF5bmFtZSAiTWF4IFBvd2VyIiAtLWVtYWlsIG1heC5wb3dlckBwcm92aWRlci5jb20KKyMKKyMgVG8gbW9kaWZ5IGFuIGV4aXN0aW5nIHVzZXIgKGZvciBpbnN0YW5jZSB0aGUgZW1haWwpOgorIyAgIGZha2UtbGRhcCBlZGl0dXNlciAtLWRhdGFmaWxlIC9wYXRoL2RhdGFmaWxlIC0tdXNlcm5hbWUgb2Nyb3F1ZXR0ZSBcCisjICAgICAtLWVtYWlsIG1heC5wb3dlckBwcm92aWRlcjIuY29tCisjCisjIFRvIHNldCBhIG5ldyBwYXNzd29yZCBmb3IgYW4gZXhpc3RpbmcgdXNlcjoKKyMgICBmYWtlLWxkYXAgZWRpdHVzZXIgLS1kYXRhZmlsZSAvcGF0aC9kYXRhZmlsZSAtLXVzZXJuYW1lIG9jcm9xdWV0dGUgXAorIyAgICAgLS1wYXNzd29yZCAiIgorIworIyBUbyBzdGFydCB0aGUgc2VydmVyOgorIyAgIGZha2UtbGRhcCBzdGFydCAtLWRhdGFmaWxlIC9wYXRoL2RhdGFmaWxlCisjCisjIFRoZSBzZXJ2ZXIgcmVhZHMgdGhlIHVzZXIgZGF0YSBmaWxlIG9uIGVhY2ggbmV3IGNvbm5lY3Rpb24uIEl0J3Mgbm90CisjIHNjYWxhYmxlIGJ1dCBpdCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBmb3IgdGhlIGludGVuZGVkIHVzYWdlCisjIChzbWFsbCB0ZWFtcywgdGVzdGluZywuLi4pCisjCisjCisjIFNldHVwCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgSW5zdGFsbCB0aGUgZGVwZW5kZW5jaWVzCisjCisjICAgSW5zdGFsbCB0aGUgUGVybCBtb2R1bGUgZGVwZW5kZW5jaWVzLiBPbiBEZWJpYW4gYW5kIE1hY1BvcnRzLAorIyAgIGFsbCBtb2R1bGVzIGFyZSBhdmFpbGFibGUgYXMgcGFja2FnZXMsIGV4Y2VwdCBOZXQ6OkxEQVA6OlNlcnZlci4KKyMKKyMgICBEZWJpYW46IGFwdC1nZXQgaW5zdGFsbCBsaWJ0ZXJtLXJlYWRrZXktcGVybAorIworIyAgIFNpbmNlIE5ldDo6TERBUDo6U2VydmVyIGNvbnNpc3RzIG9ubHkgb2Ygb25lIGZpbGUsIHlvdSBjYW4gcHV0IGl0CisjICAgYWxvbmcgdGhlIHNjcmlwdCBpbiBOZXQvTERBUC9TZXJ2ZXIucG0KKyMKKyMgQ3JlYXRlIHRoZSBkYXRhIGZpbGUgd2l0aCB0aGUgZmlyc3QgdXNlciAoc2VlIGFib3ZlKQorIworIyBTdGFydCBhcyB0aGUgc2NyaXB0IGEgc2VydmVyICgic3RhcnQiIGNvbW1hbmQsIHNlZSBhYm92ZSkKKyMKKyMgQ29uZmlndXJlIEdlcnJpdCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKyMKKyMgICBnZXJyaXQuY2Fub25pY2FsV2ViVXJsID0gLi4uICh3b3JrYXJvdW5kIGZvciBhIGtub3duIEdlcnJpdCBidWcpCisjICAgYXV0aC50eXBlID0gTERBUF9CSU5ECisjICAgbGRhcC5zZXJ2ZXIgPSBsZGFwOi8vbG9jYWxob3N0OjEwMzg5CisjICAgbGRhcC5hY2NvdW50QmFzZSA9IG91PVBlb3BsZSxkYz1ub2RvbWFpbgorIyAgIGxkYXAuZ3JvdXBCYXNlID0gb3U9R3JvdXAsZGM9bm9kb21haW4KKyMKKyMgU3RhcnQgR2Vycml0CisjCisjIExvZyBvbiBpbiB0aGUgV2ViIGludGVyZmFjZQorIworIyBJZiB5b3Ugd2FudCB0aGUgZmFrZSBMREFQIHNlcnZlciB0byBzdGFydCBhdCBib290IHRpbWUsIGFkZCBpdCB0bworIyAvZXRjL2luaXR0YWIsIHdpdGggYSBsaW5lIGxpa2U6CisjCisjIGxkMTo2OnJlc3Bhd246c3Ugc29tZXVzZXIgL3BhdGgvZmFrZS1sZGFwIHN0YXJ0IC0tZGF0YWZpbGUgL3BhdGgvZGF0YWZpbGUKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit1c2Ugc3RyaWN0OworCisjIEdsb2JhbCB2YXIgY29udGFpbmluZyB0aGUgb3B0aW9ucyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZToKK215ICVjbWRMaW5lT3B0aW9uczsKKworIyBHbG9iYWwgdmFyIGNvbnRhaW5pbmcgdGhlIHVzZXIgZGF0YSByZWFkIGZyb20gdGhlIGRhdGEgZmlsZToKK215ICV1c2VyRGF0YTsKKworbXkgJGRlZmF1bHRwb3J0ID0gMTAzODk7CisKK3BhY2thZ2UgTXlTZXJ2ZXI7CisKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgTmV0OjpMREFQOjpTZXJ2ZXI7Cit1c2UgTmV0OjpMREFQOjpDb25zdGFudCBxdyhMREFQX1NVQ0NFU1MgTERBUF9JTlZBTElEX0NSRURFTlRJQUxTIExEQVBfT1BFUkFUSU9OU19FUlJPUik7Cit1c2UgSU86OlNvY2tldDsKK3VzZSBJTzo6U2VsZWN0OwordXNlIFRlcm06OlJlYWRLZXk7CisKK3VzZSBHZXRvcHQ6Okxvbmc7CisKK3VzZSBiYXNlICdOZXQ6OkxEQVA6OlNlcnZlcic7CisKK3N1YiBiaW5kIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgKCRyZXFEYXRhLCAkZnVsbFJlcXVlc3QpID0gQF87CisKKyAgcHJpbnQgImJpbmQgY2FsbGVkXG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAxOworICBwcmludCBEdW1wZXIoXEBfKSBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMjsKKyAgbXkgJHNoYTEgPSB1bmRlZjsKKyAgbXkgJHVpZCA9IHVuZGVmOworICBldmFseworICAgICR1aWQgPSAkcmVxRGF0YS0+e25hbWV9OworICAgICRzaGExID0gbWFpbjo6ZW5jcnlwdHB3ZCgkdWlkLCAkcmVxRGF0YS0+e2F1dGhlbnRpY2F0aW9ufS0+e3NpbXBsZX0pCisgIH07CisgIGlmICgkQCkgeworICAgIHdhcm4gJEA7CisgICAgcmV0dXJuKHsKKyAgICAgICAgJ21hdGNoZWRETicgPT4gJycsCisgICAgICAgICdlcnJvck1lc3NhZ2UnID0+ICRALAorICAgICAgICAncmVzdWx0Q29kZScgPT4gTERBUF9PUEVSQVRJT05TX0VSUk9SCisgICAgfSk7CisgIH0KKworICBwcmludCAkc2hhMSAuICJcbiIgaWYgJGNtZExpbmVPcHRpb25ze3ZlcmJvc2V9ID49IDI7CisgIHByaW50IER1bXBlcigkdXNlckRhdGF7JHVpZH0pIC4gIlxuIiBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMjsKKworICBpZiAoIGRlZmluZWQoJHNoYTEpICYmICRzaGExICYmICR1c2VyRGF0YXskdWlkfSAmJiAoICRzaGExIGVxICR1c2VyRGF0YXskdWlkfS0+e3Bhc3N3b3JkfSApICkgeworICAgIHByaW50ICJhdXRoZW50aWNhdGlvbiBvZiAkdWlkIHN1Y2NlZWRlZFxuIiBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMTsKKyAgICByZXR1cm4oeworICAgICAgJ21hdGNoZWRETicgPT4gImRuPSR1aWQsb3U9UGVvcGxlLGRjPW5vZG9tYWluIiwKKyAgICAgICdlcnJvck1lc3NhZ2UnID0+ICcnLAorICAgICAgJ3Jlc3VsdENvZGUnID0+IExEQVBfU1VDQ0VTUworICAgIH0pOworICB9CisgIGVsc2UgeworICAgIHByaW50ICJhdXRoZW50aWNhdGlvbiBvZiAkdWlkIGZhaWxlZFxuIiBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMTsKKyAgICByZXR1cm4oeworICAgICAgJ21hdGNoZWRETicgPT4gJycsCisgICAgICAnZXJyb3JNZXNzYWdlJyA9PiAnJywKKyAgICAgICdyZXN1bHRDb2RlJyA9PiBMREFQX0lOVkFMSURfQ1JFREVOVElBTFMKKyAgICB9KTsKKyAgfQorfQorCitzdWIgc2VhcmNoIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkcmVxRGF0YSwgJGZ1bGxSZXF1ZXN0KSA9IEBfOworICAgIHByaW50ICJzZWFyY2ggY2FsbGVkXG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAxOworICAgIHByaW50IER1bXBlcigkcmVxRGF0YSkgIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAyOworICAgIG15IEBlbnRyaWVzOworICAgIGlmICggJHJlcURhdGEtPntiYXNlT2JqZWN0fSBlcSAnb3U9UGVvcGxlLGRjPW5vZG9tYWluJyApIHsKKyAgICAgICAgbXkgJHVpZCA9ICRyZXFEYXRhLT57ZmlsdGVyfS0+e2VxdWFsaXR5TWF0Y2h9LT57YXNzZXJ0aW9uVmFsdWV9OworICAgICAgICBwdXNoIEBlbnRyaWVzLCBOZXQ6OkxEQVA6OkVudHJ5LT5uZXcgKCAiZG49JHVpZCxvdT1QZW9wbGUsZGM9bm9kb21haW4iLAorICAgICAgICwgJ29iamVjdE5hbWUnPT4iZG49dWlkLG91PVBlb3BsZSxkYz1ub2RvbWFpbiIsICd1aWQnPT4kdWlkLCAnbWFpbCc9PiR1c2VyRGF0YXskdWlkfS0+e2VtYWlsfSwgJ2Rpc3BsYXlOYW1lJz0+JHVzZXJEYXRheyR1aWR9LT57ZGlzcGxheU5hbWV9KTsKKyAgIH0KKyAgIGVsc2lmICggJHJlcURhdGEtPntiYXNlT2JqZWN0fSBlcSAnb3U9R3JvdXAsZGM9bm9kb21haW4nICApIHsKKyAgICAgICAgcHVzaCBAZW50cmllcywgTmV0OjpMREFQOjpFbnRyeS0+bmV3ICggJ2RuPVVzZXJzLG91PUdyb3VwLGRjPW5vZG9tYWluJywKKyAgICAgICAsICdvYmplY3ROYW1lJz0+J2RuPVVzZXJzLG91PUdyb3VwLGRjPW5vZG9tYWluJyk7CisgICB9CisKKyAgICByZXR1cm4geworICAgICAgICAnbWF0Y2hlZEROJyA9PiAnJywKKyAgICAgICAgJ2Vycm9yTWVzc2FnZScgPT4gJycsCisgICAgICAgICdyZXN1bHRDb2RlJyA9PiBMREFQX1NVQ0NFU1MKKyAgICB9LCBAZW50cmllczsKK30KKworCitwYWNrYWdlIG1haW47CisKK3VzZSBEaWdlc3Q6OlNIQTEgIHF3KHNoYTEgc2hhMV9oZXggc2hhMV9iYXNlNjQpOworCitzdWIgZXhpdFdpdGhFcnJvciB7CisgIG15ICRtc2cgPSBzaGlmdDsKKyAgcHJpbnQgU1RERVJSICRtc2cgLiAiXG4iOworICBleGl0KDEpOworfQorCitzdWIgZW5jcnlwdHB3ZCB7CisgIG15ICgkdWlkLCAkcGFzc3dkKSA9IEBfOworICAjIFVzZSB0aGUgdXNlciBpZCB0byBjb21wdXRlIHRoZSBoYXNoLCB0byBhdm9pZCByYWluYm94IHRhYmxlIGF0dGFja3MKKyAgcmV0dXJuIHNoYTFfaGV4KCR1aWQuJHBhc3N3ZCk7Cit9CisKK215ICRyZXN1bHQgPSBHZXRvcHQ6Okxvbmc6OkdldE9wdGlvbnMgKAorICAicG9ydD1pIiAgICAgICAgPT4gXCRjbWRMaW5lT3B0aW9uc3twb3J0fSwKKyAgImRhdGFmaWxlPXMiICAgID0+IFwkY21kTGluZU9wdGlvbnN7ZGF0YWZpbGV9LAorICAiZW1haWw9cyIgICAgICAgPT4gXCRjbWRMaW5lT3B0aW9uc3tlbWFpbH0sCisgICJkaXNwbGF5bmFtZT1zIiA9PiBcJGNtZExpbmVPcHRpb25ze2Rpc3BsYXlOYW1lfSwKKyAgInVzZXJuYW1lPXMiICAgID0+IFwkY21kTGluZU9wdGlvbnN7dXNlck5hbWV9LAorICAicGFzc3dvcmQ9cyIgICAgPT4gXCRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0sCisgICJ2ZXJib3NlPWkiICAgICA9PiBcJGNtZExpbmVPcHRpb25ze3ZlcmJvc2V9LAorKTsKK2V4aXRXaXRoRXJyb3IoIkZhaWxlZCB0byBwYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIikgaWYgISAkcmVzdWx0OworZXhpdFdpdGhFcnJvcigiUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBwYXRoIGZvciB0aGUgZGF0YWZpbGUiKSBpZiAhICRjbWRMaW5lT3B0aW9uc3tkYXRhZmlsZX07CisKK215IEBjb21tYW5kcyA9IHF3KHN0YXJ0IGVkaXR1c2VyKTsKK2lmICggQEFSR1YgIT0gMSB8fCAhIGdyZXAgeyRfIGVxICRBUkdWWzBdfSBAY29tbWFuZHMgKSB7CisgIGV4aXRXaXRoRXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgY29tbWFuZCBhbW9uZzogIiAuIGpvaW4oIiwiLCBAY29tbWFuZHMpKTsKK30KKworbXkgJGNvbW1hbmQgPSAkQVJHVlswXTsKK2lmICggJGNvbW1hbmQgZXEgInN0YXJ0IikgeworICBzdGFydFNlcnZlcigpOworfQorZWxzaWYgKCAkY29tbWFuZCBlcSAiZWRpdHVzZXIiKSB7CisgIGVkaXRVc2VyKCk7Cit9CisKKworc3ViIHN0YXJ0U2VydmVyKCkgeworCisgIG15ICRwb3J0ID0gJGNtZExpbmVPcHRpb25ze3BvcnR9IHx8ICRkZWZhdWx0cG9ydDsKKworICBwcmludCAic3RhcnRpbmcgb24gcG9ydCAkcG9ydFxuIiBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMTsKKworICBteSAkc29jayA9IElPOjpTb2NrZXQ6OklORVQtPm5ldygKKyAgICBMaXN0ZW4gPT4gNSwKKyAgICBQcm90byA9PiAndGNwJywKKyAgICBSZXVzZSA9PiAxLAorICAgIExvY2FsQWRkciA9PiAibG9jYWxob3N0IiwgIyBDb21tZW50IHRoaXMgbGluZSBpZiBHZXJyaXQgZG9lc24ndCBydW4gb24gdGhpcyBob3N0CisgICAgTG9jYWxQb3J0ID0+ICRwb3J0CisgICk7CisKKyAgbXkgJHNlbCA9IElPOjpTZWxlY3QtPm5ldygkc29jayk7CisgIG15ICVIYW5kbGVyczsKKyAgd2hpbGUgKG15IEByZWFkeSA9ICRzZWwtPmNhbl9yZWFkKSB7CisgICAgZm9yZWFjaCBteSAkZmggKEByZWFkeSkgeworICAgICAgaWYgKCRmaCA9PSAkc29jaykgeworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGF0YSBpcyB1cCB0byBkYXRlIG9uIG5ldyBldmVyeSBjb25uZWN0aW9uCisgICAgICAgIHJlYWRVc2VyRGF0YSgpOworCisgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgbmV3IHNvY2tldAorICAgICAgICBteSAkcHNvY2sgPSAkc29jay0+YWNjZXB0OworICAgICAgICAkc2VsLT5hZGQoJHBzb2NrKTsKKyAgICAgICAgJEhhbmRsZXJzeyokcHNvY2t9ID0gTXlTZXJ2ZXItPm5ldygkcHNvY2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgJHJlc3VsdCA9ICRIYW5kbGVyc3sqJGZofS0+aGFuZGxlOworICAgICAgICBpZiAoJHJlc3VsdCkgeworICAgICAgICAgICMgd2UgaGF2ZSBmaW5pc2hlZCB3aXRoIHRoZSBzb2NrZXQKKyAgICAgICAgICAkc2VsLT5yZW1vdmUoJGZoKTsKKyAgICAgICAgICAkZmgtPmNsb3NlOworICAgICAgICAgIGRlbGV0ZSAkSGFuZGxlcnN7KiRmaH07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3ViIHJlYWRVc2VyRGF0YSB7CisgICV1c2VyRGF0YSA9ICgpOworICBvcGVuIChNWUZJTEUsICI8JGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfSIpIHx8IGV4aXRXaXRoRXJyb3IoIkNvdWxkIG5vdCBvcGVuIFwiJGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfVwiIGZvciByZWFkaW5nIik7CisgIHdoaWxlICg8TVlGSUxFPikgeworICAgIGNob21wOworICAgIG15IEBmaWVsZHMgPSBzcGxpdCgvOi8sICRfKTsKKyAgICAkdXNlckRhdGF7JGZpZWxkc1swXX0gPSB7IHBhc3N3b3JkPT4kZmllbGRzWzFdLCBkaXNwbGF5TmFtZT0+JGZpZWxkc1syXSwgZW1haWw9PiRmaWVsZHNbM10gfTsKKyAgfQorICBjbG9zZSAoTVlGSUxFKTsKK30KKworc3ViIHdyaXRlVXNlckRhdGEgeworICBvcGVuIChNWUZJTEUsICI+JGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfSIpIHx8IGV4aXRXaXRoRXJyb3IoIkNvdWxkIG5vdCBvcGVuIFwiJGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfVwiIGZvciB3cml0aW5nIik7CisgIGZvcmVhY2ggbXkgJHVzZXJpZCAoc29ydChrZXlzKCV1c2VyRGF0YSkpKSB7CisgICAgbXkgJHVzZXJJbmZvID0gJHVzZXJEYXRheyR1c2VyaWR9OworICAgIHByaW50IE1ZRklMRSBqb2luKCI6IiwKKyAgICAgICR1c2VyaWQsCisgICAgICAkdXNlckluZm8tPntwYXNzd29yZH0sCisgICAgICAkdXNlckluZm8tPntkaXNwbGF5TmFtZX0sCisgICAgICAkdXNlckluZm8tPntlbWFpbH0KKyAgICAgICkuICJcbiI7CisgIH0KKyAgY2xvc2UgKE1ZRklMRSk7Cit9CisKK3N1YiByZWFkUGFzc3dvcmQgeworICBUZXJtOjpSZWFkS2V5OjpSZWFkTW9kZSgnbm9lY2hvJyk7CisgIG15ICRwYXNzd29yZCA9IFRlcm06OlJlYWRLZXk6OlJlYWRMaW5lKDApOworICBUZXJtOjpSZWFkS2V5OjpSZWFkTW9kZSgnbm9ybWFsJyk7CisgIHByaW50ICJcbiI7CisgIHJldHVybiAkcGFzc3dvcmQ7Cit9CisKK3N1YiByZWFkQW5kQ29uZmlybVBhc3N3b3JkIHsKKyAgcHJpbnQgIlBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQ6ICI7CisgIG15ICRwd2QgPSByZWFkUGFzc3dvcmQoKTsKKyAgcHJpbnQgIlBsZWFzZSByZS1lbnRlciB0aGUgcGFzc3dvcmQ6ICI7CisgIG15ICRwd2RDaGVjayA9IHJlYWRQYXNzd29yZCgpOworICBleGl0V2l0aEVycm9yKCJUaGUgcGFzc3dvcmRzIGFyZSBkaWZmZXJlbnQiKSBpZiAkcHdkIG5lICRwd2RDaGVjazsKKyAgcmV0dXJuICRwd2Q7Cit9CisKK3N1YiBlZGl0VXNlciB7CisgIGV4aXRXaXRoRXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdXNlciBuYW1lIikgaWYgISAkY21kTGluZU9wdGlvbnN7dXNlck5hbWV9OworICBteSAkdXNlck5hbWUgPSAkY21kTGluZU9wdGlvbnN7dXNlck5hbWV9OworCisgIHJlYWRVc2VyRGF0YSgpIGlmIC1yICRjbWRMaW5lT3B0aW9uc3tkYXRhZmlsZX07CisKKyAgbXkgJGVuY3J5cHRlZFBhc3N3b3JkID0gdW5kZWY7CisgIGlmICggISBkZWZpbmVkKCR1c2VyRGF0YXskdXNlck5hbWV9KSApIHsKKyAgICAjIE5ldyB1c2VyCisKKyAgICBleGl0V2l0aEVycm9yKCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGRpc3BsYXkgbmFtZSIpIGlmICEgJGNtZExpbmVPcHRpb25ze2Rpc3BsYXlOYW1lfTsKKyAgICBleGl0V2l0aEVycm9yKCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIikgaWYgISAkY21kTGluZU9wdGlvbnN7ZW1haWx9OworCisgICAgJHVzZXJEYXRheyR1c2VyTmFtZX0gPSB7IH07CisKKyAgICBpZiAoICEgZGVmaW5lZCgkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9KSApIHsKKyAgICAgICMgTm8gcGFzc3dvcmQgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yY2UgcmVhZGluZyBmcm9tIHRlcm1pbmFsLgorICAgICAgJGNtZExpbmVPcHRpb25ze3Bhc3N3b3JkfSA9ICIiOworICAgIH0KKyAgfQorCisgIGlmICggZGVmaW5lZCgkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9KSAmJiAhICRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0gKSB7CisgICAgJGNtZExpbmVPcHRpb25ze3Bhc3N3b3JkfSA9IHJlYWRBbmRDb25maXJtUGFzc3dvcmQoKTsKKyAgICBleGl0V2l0aEVycm9yKCJQbGVhc2UgcHJvdmlkZSBhIG5vbiBlbXB0eSBwYXNzd29yZCIpIGlmICEgJGNtZExpbmVPcHRpb25ze3Bhc3N3b3JkfTsKKyAgfQorCisKKyAgaWYgKCAkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9ICkgeworICAgICRlbmNyeXB0ZWRQYXNzd29yZCA9IGVuY3J5cHRwd2QoJHVzZXJOYW1lLCAkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9KTsKKyAgfQorCisKKyAgJHVzZXJEYXRheyR1c2VyTmFtZX0tPntwYXNzd29yZH0gICAgPSAkZW5jcnlwdGVkUGFzc3dvcmQgaWYgJGVuY3J5cHRlZFBhc3N3b3JkOworICAkdXNlckRhdGF7JHVzZXJOYW1lfS0+e2Rpc3BsYXlOYW1lfSA9ICRjbWRMaW5lT3B0aW9uc3tkaXNwbGF5TmFtZX0gaWYgJGNtZExpbmVPcHRpb25ze2Rpc3BsYXlOYW1lfTsKKyAgJHVzZXJEYXRheyR1c2VyTmFtZX0tPntlbWFpbH0gICAgICAgPSAkY21kTGluZU9wdGlvbnN7ZW1haWx9IGlmICRjbWRMaW5lT3B0aW9uc3tlbWFpbH07CisgICMgcHJpbnQgRGF0YTo6RHVtcGVyOjpEdW1wZXIoXCV1c2VyRGF0YSk7CisKKyAgcHJpbnQgIk5ldyB1c2VyIGRhdGEgZm9yICRjbWRMaW5lT3B0aW9uc3t1c2VyTmFtZX06XG4iOworICBmb3JlYWNoICggc29ydChrZXlzKCV7JHVzZXJEYXRheyR1c2VyTmFtZX19KSkpIHsKKyAgICBwcmludGYgIiAgJS0xNXMgOiAlc1xuIiwgJF8sICR1c2VyRGF0YXskdXNlck5hbWV9LT57JF99CisgIH0KKyAgd3JpdGVVc2VyRGF0YSgpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L2V0Yy9HZXJyaXRTaXRlLmNzcyBiL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L2V0Yy9HZXJyaXRTaXRlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDc2OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aGVtZXMvZGlmZnkvZXRjL0dlcnJpdFNpdGUuY3NzCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2dlcnJpdF90b3BtZW51IHsKKyAgbGVmdDogNjBweDsKKyAgbWFyZ2luLXJpZ2h0OiA2MHB4OworICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyNkaWZmeV9sb2dvIHsKKyAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKKyAgbWFyZ2luLWJvdHRvbTogLTU1cHg7CisgIHBhZGRpbmctbGVmdDogMjBweDsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworICB0b3A6IC00NXB4OworICB3aWR0aDogNjBweDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwgYi9jb250cmliL3RoZW1lcy9kaWZmeS9ldGMvR2Vycml0U2l0ZUhlYWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjRkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9kaWZmeS9ldGMvR2Vycml0U2l0ZUhlYWRlci5odG1sCkBAIC0wLDAgKzEsNSBAQAorPGRpdj4KKyAgPGRpdiBpZD0iZGlmZnlfbG9nbyI+CisgICAgPGltZyB3aWR0aD0iNTAiIGhlaWdodD0iNDYiIHNyYz0ic3RhdGljL2xvZ28ucG5nIi8+CisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9kaWZmeS9zdGF0aWMvbG9nby5wbmcgYi9jb250cmliL3RoZW1lcy9kaWZmeS9zdGF0aWMvbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5YzMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L3N0YXRpYy9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9zcG90aWZ5L2V0Yy9HZXJyaXRTaXRlLmNzcyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvZXRjL0dlcnJpdFNpdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OTQ1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L2V0Yy9HZXJyaXRTaXRlLmNzcwpAQCAtMCwwICsxLDExMyBAQAorI2dlcnJpdF90b3BtZW51IHsKKwlmb250LXNpemU6IDlwdCAhaW1wb3J0YW50OworCXBhZGRpbmctdG9wOiA1cHggIWltcG9ydGFudDsKKwlwYWRkaW5nLWxlZnQ6IDE1cHggIWltcG9ydGFudDsKKwlwYWRkaW5nLXJpZ2h0OiAxNXB4ICFpbXBvcnRhbnQ7CisJYmFja2dyb3VuZDogdXJsKHN0YXRpYy9iYWNrZ3JvdW5kLXNwb3RpZ3JlZW4uanBnKSAhaW1wb3J0YW50OworCWZsb2F0OiBsZWZ0ICFpbXBvcnRhbnQ7CisJbWFyZ2luLWxlZnQ6IDI1MHB4ICFpbXBvcnRhbnQ7CisJbWFyZ2luLXJpZ2h0OiAxNTBweCAhaW1wb3J0YW50OworCWJvcmRlci1yYWRpdXM6IDAgMCAxMHB4IDEwcHggIWltcG9ydGFudDsKKwlwYWRkaW5nLWJvdHRvbTogMTBweCAhaW1wb3J0YW50OworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYWJjNTA2ICFpbXBvcnRhbnQ7CisJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FiYzUwNiAhaW1wb3J0YW50OworCWJvcmRlci1sZWZ0OiAxcHggc29saWQgI2FiYzUwNiAhaW1wb3J0YW50OworfQorCitib2R5LCAuZ3d0LURpYWxvZ0JveCAuZGlhbG9nTWlkZGxlQ2VudGVyIHsKKwliYWNrZ3JvdW5kOiAjRkZGIHVybChzdGF0aWMvYmFja2dyb3VuZC1ncmFkaWVudC5wbmcpIG5vLXJlcGVhdCAhaW1wb3J0YW50OworfQorCisjbG9nby1zcG90aWZ5IHsKKwliYWNrZ3JvdW5kOiB1cmwoc3RhdGljL2xvZ28ucG5nKSBuby1yZXBlYXQ7CisJaGVpZ2h0OiA5OHB4OworCXdpZHRoOiAyMjhweDsKKwltYXJnaW4tbGVmdDogMnB4OworfQorCisjZ2Vycml0X2hlYWRlciB7CisJYmFja2dyb3VuZDogI0ZDRkVFRjsKKwlwYWRkaW5nLWJvdHRvbTogMTBweDsKKwlib3JkZXItYm90dG9tOiBkYXNoZWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7Cit9CisKKyNnZXJyaXRfdG9wbWVudSAuZ3d0LVRleHRCb3ggeworCW1hcmdpbi10b3A6IDE1cHg7CisJd2lkdGg6IDI0MHB4OworfQorCisjZ2Vycml0X3RvcG1lbnUgPiB0YWJsZSB7CisgICAgZmxvYXQ6IGxlZnQ7Cit9CisKKyNnZXJyaXRfdG9wbWVudSA+IHRhYmxlID4gdGJvZHkgPiB0ciA+IHRkOm50aC1jaGlsZCgzKSBhIHsKKwltYXJnaW4tbGVmdDogNXB4OworCWJhY2tncm91bmQtY29sb3I6ICNGRkM7CisJYm9yZGVyLXJhZGl1czogM3B4OworCXBhZGRpbmc6IDVweCA1cHg7CisJYm9yZGVyLXJpZ2h0OiBub25lICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiUGFuZWxCb3R0b20geworCWJhY2tncm91bmQ6ICNGRkMgIWltcG9ydGFudDsKKwlib3JkZXItcmFkaXVzOiAwIDAgM3B4IDNweCAhaW1wb3J0YW50OworCXBhZGRpbmctYm90dG9tOiA2cHggIWltcG9ydGFudDsKKwlwYWRkaW5nLXRvcDogNnB4ICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbSwgLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJSZXN0LCAuZ3d0LVRhYkJhciAuZ3d0LVRhYlBhbmVsQm90dG9tIHsKKwliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OworfQorCisuZ3d0LVRhYkJhckl0ZW0td3JhcHBlciB7CisJYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cit9CisKKyNnZXJyaXRfdG9wbWVudSAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0tc2VsZWN0ZWQgeworCWJhY2tncm91bmQ6ICNGRkMgIWltcG9ydGFudDsKKwlib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMCAhaW1wb3J0YW50OworfQorCisjZ2Vycml0X3RvcG1lbnUgLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJJdGVtLXNlbGVjdGVkOmhvdmVyIHsKKwliYWNrZ3JvdW5kOiAjRkZDICFpbXBvcnRhbnQ7Cit9CisKKyNnZXJyaXRfdG9wbWVudSAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0tc2VsZWN0ZWQ6Zm9jdXMgeworCW91dGxpbmU6IG5vbmUgIWltcG9ydGFudDsKK30KKworI2dlcnJpdF90b3BtZW51ID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQgPiB0YWJsZSB7CisJYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiQmFyIHsKKwlib3JkZXItYm90dG9tOiAxcHggc29saWQgI0UyRTJBRCAhaW1wb3J0YW50OworfQorCisuZ3d0LVRhYkJhckl0ZW0geworCWJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYmEoNzksIDU4LCAwLCAwLjMpICFpbXBvcnRhbnQ7CisJYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiQmFySXRlbTpob3ZlciB7CisJYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpICFpbXBvcnRhbnQ7Cit9CisKK2EsIGE6dmlzaXRlZCB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7CisJY29sb3I6ICMzRjREMDAgIWltcG9ydGFudDsKK30KKworYTpob3ZlciB7CisJY29sb3I6ICM1ZDcyMDAgIWltcG9ydGFudDsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50OworfQorCisuZ3d0LUxhYmVsIHsKK2hlaWdodDogMzBweCAhaW1wb3J0YW50OworbGluZS1oZWlnaHQ6IDMwcHggIWltcG9ydGFudDsKK30KKworI2dlcnJpdF9idG1tZW51ID4gZGl2IHsKKwljb2xvcjogcmdiYSgwLCAwLCAwLCAwLjMpICFpbXBvcnRhbnQ7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aGVtZXMvc3BvdGlmeS9ldGMvR2Vycml0U2l0ZUhlYWRlci5odG1sIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9ldGMvR2Vycml0U2l0ZUhlYWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZjg0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwKQEAgLTAsMCArMSBAQAorPGRpdiBpZD0ibG9nby1zcG90aWZ5Ij48L2Rpdj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9iYWNrZ3JvdW5kLWdyYWRpZW50LnBuZyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2JhY2tncm91bmQtZ3JhZGllbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGYzNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9iYWNrZ3JvdW5kLWdyYWRpZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9iYWNrZ3JvdW5kLXNwb3RpZ3JlZW4uanBnIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9zdGF0aWMvYmFja2dyb3VuZC1zcG90aWdyZWVuLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2M3OTgzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9zdGF0aWMvYmFja2dyb3VuZC1zcG90aWdyZWVuLmpwZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9sb2dvLnBuZyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2xvZ28ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTFmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9sb2dvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb250cmliL3RyaXZpYWxfcmViYXNlLnB5IGIvY29udHJpYi90cml2aWFsX3JlYmFzZS5weQppbmRleCBhNTE0YjRjLi43NzY0NDcwIDEwMDc1NQotLS0gYS9jb250cmliL3RyaXZpYWxfcmViYXNlLnB5CisrKyBiL2NvbnRyaWIvdHJpdmlhbF9yZWJhc2UucHkKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24yLjYKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgogCiAjIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjCkBAIC0yNywxOTYgKzI3LDIyNCBAQAogIyBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCiAjIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCi0jIFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGRldGVjdCB3aGVuIGEgcGF0Y2hzZXQgdXBsb2FkZWQgdG8gR2Vycml0IGlzCi0jICdpZGVudGljYWwnIChkZXRlcm1pbmVkIHZpYSBnaXQtcGF0Y2gtaWQpIGFuZCByZWFwcGx5IHJldmlld3Mgb250byB0aGUgbmV3Ci0jIHBhdGNoc2V0IGZyb20gdGhlIHByZXZpb3VzIHBhdGNoc2V0LgorIiIiIFRoaXMgc2NyaXB0IGlzIGRlc2lnbmVkIHRvIGRldGVjdCB3aGVuIGEgcGF0Y2hzZXQgdXBsb2FkZWQgdG8gR2Vycml0IGlzCisnaWRlbnRpY2FsJyAoZGV0ZXJtaW5lZCB2aWEgZ2l0LXBhdGNoLWlkKSBhbmQgcmVhcHBseSByZXZpZXdzIG9udG8gdGhlIG5ldworcGF0Y2hzZXQgZnJvbSB0aGUgcHJldmlvdXMgcGF0Y2hzZXQuCiAKLSMgR2V0IHVzYWdlIGFuZCBoZWxwIGluZm8gYnkgcnVubmluZzogLi90cml2aWFsX3JlYmFzZS5weSAtLWhlbHAKLSMgRG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaGVyZTogaHR0cHM6Ly93d3cuY29kZWF1cm9yYS5vcmcveHdpa2kvYmluL1FBRVAvR2Vycml0CitHZXQgdXNhZ2UgYW5kIGhlbHAgaW5mbyBieSBydW5uaW5nOiAuL3RyaXZpYWxfcmViYXNlLnB5IC0taGVscAorRG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaGVyZTogaHR0cHM6Ly93d3cuY29kZWF1cm9yYS5vcmcveHdpa2kvYmluL1FBRVAvR2Vycml0CiAKKyIiIgorCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBqc29uCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKK2ltcG9ydCByZQogaW1wb3J0IHN1YnByb2Nlc3MKLWZyb20gc3lzIGltcG9ydCBleGl0CitpbXBvcnQgc3lzCiAKLWNsYXNzIENoZWNrQ2FsbEVycm9yKE9TRXJyb3IpOgotICAiIiJDaGVja0NhbGwoKSByZXR1cm5lZCBub24tMC4iIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGN3ZCwgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnI9Tm9uZSk6Ci0gICAgT1NFcnJvci5fX2luaXRfXyhzZWxmLCBjb21tYW5kLCBjd2QsIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyKQotICAgIHNlbGYuY29tbWFuZCA9IGNvbW1hbmQKLSAgICBzZWxmLmN3ZCA9IGN3ZAotICAgIHNlbGYucmV0Y29kZSA9IHJldGNvZGUKLSAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dAotICAgIHNlbGYuc3RkZXJyID0gc3RkZXJyCitjbGFzcyBUcml2aWFsUmViYXNlOgorICBkZWYgX19pbml0X18oc2VsZik6CisgICAgdXNhZ2UgPSAiJShwcm9nKXMgPHJlcXVpcmVkIG9wdGlvbnM+IFstLXNlcnZlci1wb3J0PVBPUlRdIgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHVzYWdlPXVzYWdlKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tY2hhbmdlLXVybCIsIGRlc3Q9ImNoYW5nZVVybCIsIGhlbHA9IkNoYW5nZSBVUkwiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcHJvamVjdCIsIGhlbHA9IlByb2plY3QgcGF0aCBpbiBHZXJyaXQiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tY29tbWl0IiwgaGVscD0iR2l0IGNvbW1pdC1pc2ggZm9yIHRoaXMgcGF0Y2hzZXQiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tcGF0Y2hzZXQiLCB0eXBlPWludCwgaGVscD0iVGhlIHBhdGNoc2V0IG51bWJlciIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcml2YXRlLWtleS1wYXRoIiwgZGVzdD0icHJpdmF0ZV9rZXlfcGF0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJGdWxsIHBhdGggdG8gR2Vycml0IFNTSCBkYWVtb24ncyBwcml2YXRlIGhvc3Qga2V5IikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXNlcnZlciIsIGRlZmF1bHQ9J2xvY2FsaG9zdCcsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJHZXJyaXQgU1NIIHNlcnZlciBbZGVmYXVsdDogJShkZWZhdWx0KXNdIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXNlcnZlci1wb3J0IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9JzI5NDE4JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBvcnQgdG8gY29ubmVjdCB0byBHZXJyaXQncyBTU0ggZGFlbW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltkZWZhdWx0OiAlKGRlZmF1bHQpc10iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc3NoIiwgZGVmYXVsdD0ic3NoIiwgaGVscD0iU1NIIGV4ZWN1dGFibGUiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc3NoLXBvcnQtZmxhZyIsIGRlc3Q9InNzaF9wb3J0X2ZsYWciLCBkZWZhdWx0PSItcCIsIGhlbHA9IlNTSCBwb3J0IGZsYWciKQogCi1kZWYgQ2hlY2tDYWxsKGNvbW1hbmQsIGN3ZD1Ob25lKToKLSAgIiIiTGlrZSBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoKSBidXQgcmV0dXJucyBzdGRvdXQuCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9rbm93bl9hcmdzKClbMF0KKyAgICBpZiBOb25lIGluIFthcmdzLmNoYW5nZVVybCwgYXJncy5wcm9qZWN0LCBhcmdzLmNvbW1pdCwgYXJncy5wYXRjaHNldF06CisgICAgICBwYXJzZXIuZXJyb3IoIkluY29tcGxldGUgYXJndW1lbnRzIikKKyAgICB0cnk6CisgICAgICBzZWxmLmNoYW5nZUlkID0gcmUuc2VhcmNoKHInXGQrJCcsIGFyZ3MuY2hhbmdlVXJsKS5ncm91cCgpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgcGFyc2VyLmVycm9yKCJJbnZhbGlkIGNoYW5nZUlkIikKKyAgICBzZWxmLnByb2plY3QgPSBhcmdzLnByb2plY3QKKyAgICBzZWxmLmNvbW1pdCA9IGFyZ3MuY29tbWl0CisgICAgc2VsZi5wYXRjaHNldCA9IGFyZ3MucGF0Y2hzZXQKKyAgICBzZWxmLnByaXZhdGVfa2V5X3BhdGggPSBhcmdzLnByaXZhdGVfa2V5X3BhdGgKKyAgICBzZWxmLnNlcnZlciA9IGFyZ3Muc2VydmVyCisgICAgc2VsZi5wb3J0ID0gYXJncy5wb3J0CisgICAgc2VsZi5zc2ggPSBhcmdzLnNzaAorICAgIHNlbGYuc3NoX3BvcnRfZmxhZyA9IGFyZ3Muc3NoX3BvcnRfZmxhZwogCi0gIFdvcmtzIG9uIHB5dGhvbiAyLjQKLSAgIiIiCi0gIHRyeToKLSAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBjd2Q9Y3dkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgIHN0ZF9vdXQsIHN0ZF9lcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKLSAgZXhjZXB0IE9TRXJyb3IsIGU6Ci0gICAgcmFpc2UgQ2hlY2tDYWxsRXJyb3IoY29tbWFuZCwgY3dkLCBlLmVycm5vLCBOb25lKQotICBpZiBwcm9jZXNzLnJldHVybmNvZGU6Ci0gICAgcmFpc2UgQ2hlY2tDYWxsRXJyb3IoY29tbWFuZCwgY3dkLCBwcm9jZXNzLnJldHVybmNvZGUsIHN0ZF9vdXQsIHN0ZF9lcnIpCi0gIHJldHVybiBzdGRfb3V0LCBzdGRfZXJyCisgIGNsYXNzIENoZWNrQ2FsbEVycm9yKE9TRXJyb3IpOgorICAgICIiIkNoZWNrQ2FsbCgpIHJldHVybmVkIG5vbi0wLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBjd2QsIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyPU5vbmUpOgorICAgICAgT1NFcnJvci5fX2luaXRfXyhzZWxmLCBjb21tYW5kLCBjd2QsIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyKQorICAgICAgc2VsZi5jb21tYW5kID0gY29tbWFuZAorICAgICAgc2VsZi5jd2QgPSBjd2QKKyAgICAgIHNlbGYucmV0Y29kZSA9IHJldGNvZGUKKyAgICAgIHNlbGYuc3Rkb3V0ID0gc3Rkb3V0CisgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgogCi1kZWYgR3NxbFF1ZXJ5KHNxbF9xdWVyeSwgc2VydmVyLCBwb3J0KToKLSAgIiIiUnVucyBhIGdlcnJpdCBnc3FsIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSByZXN1bHQiIiIKLSAgZ3NxbF9jbWQgPSBbJ3NzaCcsICctcCcsIHBvcnQsIHNlcnZlciwgJ2dlcnJpdCcsICdnc3FsJywgJy0tZm9ybWF0JywKLSAgICAgICAgICAgICAgJ0pTT04nLCAnLWMnLCBzcWxfcXVlcnldCi0gIHRyeToKLSAgICAoZ3NxbF9vdXQsIGdzcWxfc3RkZXJyKSA9IENoZWNrQ2FsbChnc3FsX2NtZCkKLSAgZXhjZXB0IENoZWNrQ2FsbEVycm9yLCBlOgotICAgIHByaW50ICJyZXR1cm4gY29kZSBpcyAlcyIgJSBlLnJldGNvZGUKLSAgICBwcmludCAic3Rkb3V0IGFuZCBzdGRlcnIgaXNcbiVzJXMiICUgKGUuc3Rkb3V0LCBlLnN0ZGVycikKLSAgICByYWlzZQorICBkZWYgQ2hlY2tDYWxsKHNlbGYsIGNvbW1hbmQsIGN3ZD1Ob25lKToKKyAgICAiIiJMaWtlIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgpIGJ1dCByZXR1cm5zIHN0ZG91dC4KIAotICBuZXdfb3V0ID0gZ3NxbF9vdXQucmVwbGFjZSgnfX1cbicsICd9fVxuc3BsaXQgaGVyZVxuJykKLSAgcmV0dXJuIG5ld19vdXQuc3BsaXQoJ3NwbGl0IGhlcmVcbicpCisgICAgV29ya3Mgb24gcHl0aG9uIDIuNAogCi1kZWYgRmluZFByZXZSZXYoY2hhbmdlSWQsIHBhdGNoc2V0LCBzZXJ2ZXIsIHBvcnQpOgotICAiIiJGaW5kcyB0aGUgcmV2aXNpb24gb2YgdGhlIHByZXZpb3VzIHBhdGNoIHNldCBvbiB0aGUgY2hhbmdlIiIiCi0gIHNxbF9xdWVyeSA9ICgiXCJTRUxFQ1QgcmV2aXNpb24gRlJPTSBwYXRjaF9zZXRzLGNoYW5nZXMgV0hFUkUgIgotICAgICAgICAgICAgICAgInBhdGNoX3NldHMuY2hhbmdlX2lkID0gY2hhbmdlcy5jaGFuZ2VfaWQgQU5EICIKLSAgICAgICAgICAgICAgICJwYXRjaF9zZXRzLnBhdGNoX3NldF9pZCA9ICVzIEFORCAiCi0gICAgICAgICAgICAgICAiY2hhbmdlcy5jaGFuZ2Vfa2V5ID0gXCclc1wnXCIiICUgKChwYXRjaHNldCAtIDEpLCBjaGFuZ2VJZCkpCi0gIHJldmlzaW9ucyA9IEdzcWxRdWVyeShzcWxfcXVlcnksIHNlcnZlciwgcG9ydCkKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihjb21tYW5kLCBjd2Q9Y3dkLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgc3RkX291dCwgc3RkX2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgcmFpc2Ugc2VsZi5DaGVja0NhbGxFcnJvcihjb21tYW5kLCBjd2QsIGUuZXJybm8sIE5vbmUpCisgICAgaWYgcHJvY2Vzcy5yZXR1cm5jb2RlOgorICAgICAgcmFpc2Ugc2VsZi5DaGVja0NhbGxFcnJvcihjb21tYW5kLCBjd2QsIHByb2Nlc3MucmV0dXJuY29kZSwgc3RkX291dCwgc3RkX2VycikKKyAgICByZXR1cm4gc3RkX291dCwgc3RkX2VycgogCi0gIGpzb25fZGljdCA9IGpzb24ubG9hZHMocmV2aXNpb25zWzBdLCBzdHJpY3Q9RmFsc2UpCi0gIHJldHVybiBqc29uX2RpY3RbImNvbHVtbnMiXVsicmV2aXNpb24iXQorICBkZWYgR3NxbFF1ZXJ5KHNlbGYsIHNxbF9xdWVyeSk6CisgICAgIiIiUnVuIGEgZ2Vycml0IGdzcWwgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0LiIiIgorICAgIGdzcWxfY21kID0gW3NlbGYuc3NoLCBzZWxmLnNzaF9wb3J0X2ZsYWcsIHNlbGYucG9ydCwgc2VsZi5zZXJ2ZXIsICdnZXJyaXQnLCAnZ3NxbCcsCisgICAgICAgICAgICAgICAgJy0tZm9ybWF0JywgJ0pTT04nLCAnLWMnLCBzcWxfcXVlcnldCisgICAgdHJ5OgorICAgICAgKGdzcWxfb3V0LCBfZ3NxbF9zdGRlcnIpID0gc2VsZi5DaGVja0NhbGwoZ3NxbF9jbWQpCisgICAgZXhjZXB0IHNlbGYuQ2hlY2tDYWxsRXJyb3IsIGU6CisgICAgICBwcmludCAicmV0dXJuIGNvZGUgaXMgJXMiICUgZS5yZXRjb2RlCisgICAgICBwcmludCAic3Rkb3V0IGFuZCBzdGRlcnIgaXNcbiVzJXMiICUgKGUuc3Rkb3V0LCBlLnN0ZGVycikKKyAgICAgIHJhaXNlCiAKLWRlZiBHZXRBcHByb3ZhbHMoY2hhbmdlSWQsIHBhdGNoc2V0LCBzZXJ2ZXIsIHBvcnQpOgotICAiIiJHZXQgYWxsIHRoZSBhcHByb3ZhbHMgb24gYSBzcGVjaWZpYyBwYXRjaCBzZXQKKyAgICBuZXdfb3V0ID0gZ3NxbF9vdXQucmVwbGFjZSgnfX1cbicsICd9fVxuc3BsaXQgaGVyZVxuJykKKyAgICByZXR1cm4gbmV3X291dC5zcGxpdCgnc3BsaXQgaGVyZVxuJykKIAotICBSZXR1cm5zIGEgbGlzdCBvZiBhcHByb3ZhbCBkaWN0cyIiIgotICBzcWxfcXVlcnkgPSAoIlwiU0VMRUNUIHZhbHVlLGFjY291bnRfaWQsY2F0ZWdvcnlfaWQgRlJPTSBwYXRjaF9zZXRfYXBwcm92YWxzICIKLSAgICAgICAgICAgICAgICJXSEVSRSBwYXRjaF9zZXRfaWQgPSAlcyBBTkQgY2hhbmdlX2lkID0gKFNFTEVDVCBjaGFuZ2VfaWQgRlJPTSAiCi0gICAgICAgICAgICAgICAiY2hhbmdlcyBXSEVSRSBjaGFuZ2Vfa2V5ID0gXCclc1wnKSBBTkQgdmFsdWUgPD4gMFwiIgotICAgICAgICAgICAgICAgJSAoKHBhdGNoc2V0IC0gMSksIGNoYW5nZUlkKSkKLSAgZ3NxbF9vdXQgPSBHc3FsUXVlcnkoc3FsX3F1ZXJ5LCBzZXJ2ZXIsIHBvcnQpCi0gIGFwcHJvdmFscyA9IFtdCi0gIGZvciBqc29uX3N0ciBpbiBnc3FsX291dDoKLSAgICBkaWN0ID0ganNvbi5sb2Fkcyhqc29uX3N0ciwgc3RyaWN0PUZhbHNlKQotICAgIGlmIGRpY3RbInR5cGUiXSA9PSAicm93IjoKLSAgICAgIGFwcHJvdmFscy5hcHBlbmQoZGljdFsiY29sdW1ucyJdKQotICByZXR1cm4gYXBwcm92YWxzCisgIGRlZiBGaW5kUHJldlJldihzZWxmKToKKyAgICAiIiJGaW5kIHRoZSByZXZpc2lvbiBvZiB0aGUgcHJldmlvdXMgcGF0Y2ggc2V0IG9uIHRoZSBjaGFuZ2UuIiIiCisgICAgc3FsX3F1ZXJ5ID0gKCJcIlNFTEVDVCByZXZpc2lvbiBGUk9NIHBhdGNoX3NldHMgV0hFUkUgIgorICAgICAgICAgICAgICAgICAiY2hhbmdlX2lkID0gJXMgQU5EIHBhdGNoX3NldF9pZCA9ICVzXCIiICUKKyAgICAgICAgICAgICAgICAgKHNlbGYuY2hhbmdlSWQsIChzZWxmLnBhdGNoc2V0IC0gMSkpKQorICAgIHJldmlzaW9ucyA9IHNlbGYuR3NxbFF1ZXJ5KHNxbF9xdWVyeSkKIAotZGVmIEdldEVtYWlsRnJvbUFjY3RJZChhY2NvdW50X2lkLCBzZXJ2ZXIsIHBvcnQpOgotICAiIiJSZXR1cm5zIHRoZSBwcmVmZXJyZWQgZW1haWwgYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnRfaWQiIiIKLSAgc3FsX3F1ZXJ5ID0gKCJcIlNFTEVDVCBwcmVmZXJyZWRfZW1haWwgRlJPTSBhY2NvdW50cyBXSEVSRSBhY2NvdW50X2lkID0gJXNcIiIKLSAgICAgICAgICAgICAgICUgYWNjb3VudF9pZCkKLSAgZW1haWxfYWRkciA9IEdzcWxRdWVyeShzcWxfcXVlcnksIHNlcnZlciwgcG9ydCkKKyAgICBqc29uX2RpY3QgPSBqc29uLmxvYWRzKHJldmlzaW9uc1swXSwgc3RyaWN0PUZhbHNlKQorICAgIHJldHVybiBqc29uX2RpY3RbImNvbHVtbnMiXVsicmV2aXNpb24iXQogCi0gIGpzb25fZGljdCA9IGpzb24ubG9hZHMoZW1haWxfYWRkclswXSwgc3RyaWN0PUZhbHNlKQotICByZXR1cm4ganNvbl9kaWN0WyJjb2x1bW5zIl1bInByZWZlcnJlZF9lbWFpbCJdCisgIGRlZiBHZXRBcHByb3ZhbHMoc2VsZik6CisgICAgIiIiR2V0IGFsbCB0aGUgYXBwcm92YWxzIG9uIGEgc3BlY2lmaWMgcGF0Y2ggc2V0LgogCi1kZWYgR2V0UGF0Y2hJZChyZXZpc2lvbik6Ci0gIGdpdF9zaG93X2NtZCA9IFsnZ2l0JywgJ3Nob3cnLCByZXZpc2lvbl0KLSAgcGF0Y2hfaWRfY21kID0gWydnaXQnLCAncGF0Y2gtaWQnXQotICBwYXRjaF9pZF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihwYXRjaF9pZF9jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKLSAgZ2l0X3Nob3dfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oZ2l0X3Nob3dfY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICByZXR1cm4gcGF0Y2hfaWRfcHJvY2Vzcy5jb21tdW5pY2F0ZShnaXRfc2hvd19wcm9jZXNzLmNvbW11bmljYXRlKClbMF0pWzBdCisgICAgUmV0dXJucyBhIGxpc3Qgb2YgYXBwcm92YWwgZGljdHMuCiAKLWRlZiBTdUV4ZWMoc2VydmVyLCBwb3J0LCBwcml2YXRlX2tleSwgYXNfdXNlciwgY21kKToKLSAgc3VleGVjX2NtZCA9IFsnc3NoJywgJy1sJywgIkdlcnJpdCBDb2RlIFJldmlldyIsICctcCcsIHBvcnQsIHNlcnZlciwgJy1pJywKLSAgICAgICAgICAgICAgICBwcml2YXRlX2tleSwgJ3N1ZXhlYycsICctLWFzJywgYXNfdXNlciwgJy0tJywgY21kXQotICBDaGVja0NhbGwoc3VleGVjX2NtZCkKKyAgICAiIiIKKyAgICBzcWxfcXVlcnkgPSAoIlwiU0VMRUNUIHZhbHVlLGFjY291bnRfaWQsY2F0ZWdvcnlfaWQgRlJPTSBwYXRjaF9zZXRfYXBwcm92YWxzICIKKyAgICAgICAgICAgICAgICAgIldIRVJFIGNoYW5nZV9pZCA9ICVzIEFORCBwYXRjaF9zZXRfaWQgPSAlcyBBTkQgdmFsdWUgIT0gMFwiIgorICAgICAgICAgICAgICAgICAlIChzZWxmLmNoYW5nZUlkLCAoc2VsZi5wYXRjaHNldCAtIDEpKSkKKyAgICBnc3FsX291dCA9IHNlbGYuR3NxbFF1ZXJ5KHNxbF9xdWVyeSkKKyAgICBhcHByb3ZhbHMgPSBbXQorICAgIGZvciBqc29uX3N0ciBpbiBnc3FsX291dDoKKyAgICAgIGRhdGEgPSBqc29uLmxvYWRzKGpzb25fc3RyLCBzdHJpY3Q9RmFsc2UpCisgICAgICBpZiBkYXRhWyJ0eXBlIl0gPT0gInJvdyI6CisgICAgICAgIGFwcHJvdmFscy5hcHBlbmQoZGF0YVsiY29sdW1ucyJdKQorICAgIHJldHVybiBhcHByb3ZhbHMKIAotZGVmIERpZmZDb21taXRNZXNzYWdlcyhjb21taXQxLCBjb21taXQyKToKLSAgbG9nX2NtZDEgPSBbJ2dpdCcsICdsb2cnLCAnLS1wcmV0dHk9Zm9ybWF0OiIlYW4gJWFlJW4lcyVuJWIiJywKLSAgICAgICAgICAgICAgY29tbWl0MSArICdeISddCi0gIGNvbW1pdDFfbG9nID0gQ2hlY2tDYWxsKGxvZ19jbWQxKQotICBsb2dfY21kMiA9IFsnZ2l0JywgJ2xvZycsICctLXByZXR0eT1mb3JtYXQ6IiVhbiAlYWUlbiVzJW4lYiInLAotICAgICAgICAgICAgICBjb21taXQyICsgJ14hJ10KLSAgY29tbWl0Ml9sb2cgPSBDaGVja0NhbGwobG9nX2NtZDIpCi0gIGlmIGNvbW1pdDFfbG9nICE9IGNvbW1pdDJfbG9nOgotICAgIHJldHVybiBUcnVlCi0gIHJldHVybiBGYWxzZQorICBkZWYgQXBwZW5kQWNjdEFwcHJvdmFsKHNlbGYsIGFjY291bnRfaWQsIHZhbHVlKToKKyAgICB0cnk6CisgICAgICBuZXd2YWwgPSBzZWxmLmFjY3RfYXBwcm92YWxzW2FjY291bnRfaWRdICsgJyAnICsgdmFsdWUKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICBuZXd2YWwgPSB2YWx1ZQorICAgIHNlbGYuYWNjdF9hcHByb3ZhbHNbYWNjb3VudF9pZF0gPSBuZXd2YWwKIAotZGVmIE1haW4oKToKLSAgc2VydmVyID0gJ2xvY2FsaG9zdCcKLSAgdXNhZ2UgPSAidXNhZ2U6ICVwcm9nIDxyZXF1aXJlZCBvcHRpb25zPiBbLS1zZXJ2ZXItcG9ydD1QT1JUXSIKLSAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPXVzYWdlKQotICBwYXJzZXIuYWRkX29wdGlvbigiLS1jaGFuZ2UiLCBkZXN0PSJjaGFuZ2VJZCIsIGhlbHA9IkNoYW5nZSBpZGVudGlmaWVyIikKLSAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcHJvamVjdCIsIGhlbHA9IlByb2plY3QgcGF0aCBpbiBHZXJyaXQiKQotICBwYXJzZXIuYWRkX29wdGlvbigiLS1jb21taXQiLCBoZWxwPSJHaXQgY29tbWl0LWlzaCBmb3IgdGhpcyBwYXRjaHNldCIpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLXBhdGNoc2V0IiwgdHlwZT0iaW50IiwgaGVscD0iVGhlIHBhdGNoc2V0IG51bWJlciIpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLXByaXZhdGUta2V5LXBhdGgiLCBkZXN0PSJwcml2YXRlX2tleV9wYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgaGVscD0iRnVsbCBwYXRoIHRvIEdlcnJpdCBTU0ggZGFlbW9uJ3MgcHJpdmF0ZSBob3N0IGtleSIpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLXNlcnZlci1wb3J0IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9JzI5NDE4JywKLSAgICAgICAgICAgICAgICAgICAgaGVscD0iUG9ydCB0byBjb25uZWN0IHRvIEdlcnJpdCdzIFNTSCBkYWVtb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJbZGVmYXVsdDogJWRlZmF1bHRdIikKKyAgZGVmIEdldEVtYWlsRnJvbUFjY3RJZChzZWxmLCBhY2NvdW50X2lkKToKKyAgICAiIiJSZXR1cm4gdGhlIHByZWZlcnJlZCBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudF9pZC4iIiIKKyAgICBzcWxfcXVlcnkgPSAoIlwiU0VMRUNUIHByZWZlcnJlZF9lbWFpbCBGUk9NIGFjY291bnRzIFdIRVJFIGFjY291bnRfaWQgPSAlc1wiIgorICAgICAgICAgICAgICAgICAlIGFjY291bnRfaWQpCisgICAgZW1haWxfYWRkciA9IHNlbGYuR3NxbFF1ZXJ5KHNxbF9xdWVyeSkKIAotICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAganNvbl9kaWN0ID0ganNvbi5sb2FkcyhlbWFpbF9hZGRyWzBdLCBzdHJpY3Q9RmFsc2UpCisgICAgcmV0dXJuIGpzb25fZGljdFsiY29sdW1ucyJdWyJwcmVmZXJyZWRfZW1haWwiXQogCi0gIGlmIG5vdCBvcHRpb25zLmNoYW5nZUlkOgotICAgIHBhcnNlci5wcmludF9oZWxwKCkKLSAgICBleGl0KDApCisgIGRlZiBHZXRQYXRjaElkKHNlbGYsIHJldmlzaW9uKToKKyAgICBnaXRfc2hvd19jbWQgPSBbJ2dpdCcsICdzaG93JywgcmV2aXNpb25dCisgICAgcGF0Y2hfaWRfY21kID0gWydnaXQnLCAncGF0Y2gtaWQnXQorICAgIGdpdF9zaG93X3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKGdpdF9zaG93X2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICBwYXRjaF9pZF9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihwYXRjaF9pZF9jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49Z2l0X3Nob3dfcHJvY2Vzcy5zdGRvdXQpCisgICAgcmVzID0gcGF0Y2hfaWRfcHJvY2Vzcy5jb21tdW5pY2F0ZSgpWzBdIG9yICcwJworICAgIHJldHVybiByZXMuc3BsaXQoKVswXQogCi0gIGlmIG9wdGlvbnMucGF0Y2hzZXQgPT0gMToKLSAgICAjIE5vdGhpbmcgdG8gZGV0ZWN0IG9uIGZpcnN0IHBhdGNoc2V0Ci0gICAgZXhpdCgwKQotICBwcmV2X3JldmlzaW9uID0gTm9uZQotICBwcmV2X3JldmlzaW9uID0gRmluZFByZXZSZXYob3B0aW9ucy5jaGFuZ2VJZCwgb3B0aW9ucy5wYXRjaHNldCwgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0KQotICBpZiBub3QgcHJldl9yZXZpc2lvbjoKLSAgICAjIENvdWxkbid0IGZpbmQgYSBwcmV2aW91cyByZXZpc2lvbgotICAgIGV4aXQoMCkKLSAgcHJldl9wYXRjaF9pZCA9IEdldFBhdGNoSWQocHJldl9yZXZpc2lvbikKLSAgY3VyX3BhdGNoX2lkID0gR2V0UGF0Y2hJZChvcHRpb25zLmNvbW1pdCkKLSAgaWYgY3VyX3BhdGNoX2lkLnNwbGl0KClbMF0gIT0gcHJldl9wYXRjaF9pZC5zcGxpdCgpWzBdOgotICAgICMgcGF0Y2gtaWRzIGRvbid0IG1hdGNoCi0gICAgZXhpdCgwKQotICAjIFBhdGNoIGlkcyBtYXRjaC4gVGhpcyBpcyBhIHRyaXZpYWwgcmViYXNlLgotICAjIEluIGFkZGl0aW9uIHRvIHBhdGNoLWlkIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY29tbWl0IG1lc3NhZ2UgY2hhbmdlZC4gTW9zdAotICAjIGFwcHJvdmVycyB3b3VsZCB3YW50IHRvIHJlLXJldmlldyBjaGFuZ2VzIHdoZW4gdGhlIGNvbW1pdCBtZXNzYWdlIGNoYW5nZXMuCi0gIGNoYW5nZWQgPSBEaWZmQ29tbWl0TWVzc2FnZXMocHJldl9yZXZpc2lvbiwgb3B0aW9ucy5jb21taXQpCi0gIGlmIGNoYW5nZWQ6Ci0gICAgIyBJbnNlcnQgYSBjb21tZW50IGludG8gdGhlIGNoYW5nZSBsZXR0aW5nIHRoZSBhcHByb3ZlcnMga25vdyBvbmx5IHRoZQotICAgICMgY29tbWl0IG1lc3NhZ2UgY2hhbmdlZAotICAgIGNvbW1lbnRfbXNnID0gKCJcJy0tbWVzc2FnZT1OZXcgcGF0Y2hzZXQgcGF0Y2gtaWQgbWF0Y2hlcyBwcmV2aW91cyBwYXRjaHNldCIKLSAgICAgICAgICAgICAgICAgICAiLCBidXQgY29tbWl0IG1lc3NhZ2UgaGFzIGNoYW5nZWQuJyIpCi0gICAgY29tbWVudF9jbWQgPSBbJ3NzaCcsICctcCcsIG9wdGlvbnMucG9ydCwgc2VydmVyLCAnZ2Vycml0JywgJ2FwcHJvdmUnLAotICAgICAgICAgICAgICAgICAgICctLXByb2plY3QnLCBvcHRpb25zLnByb2plY3QsIGNvbW1lbnRfbXNnLCBvcHRpb25zLmNvbW1pdF0KLSAgICBDaGVja0NhbGwoY29tbWVudF9jbWQpCi0gICAgZXhpdCgwKQorICBkZWYgU3VFeGVjKHNlbGYsIGFzX3VzZXIsIGNtZCk6CisgICAgc3VleGVjX2NtZCA9IFtzZWxmLnNzaCwgJy1sJywgIkdlcnJpdCBDb2RlIFJldmlldyIsIHNlbGYuc3NoX3BvcnRfZmxhZywgc2VsZi5wb3J0LCBzZWxmLnNlcnZlcl0KKyAgICBpZiBzZWxmLnByaXZhdGVfa2V5X3BhdGg6CisgICAgICBzdWV4ZWNfY21kICs9IFsnLWknLCBzZWxmLnByaXZhdGVfa2V5X3BhdGhdCisgICAgc3VleGVjX2NtZCArPSBbJ3N1ZXhlYycsICctLWFzJywgYXNfdXNlciwgJy0tJywgY21kXQorICAgIHNlbGYuQ2hlY2tDYWxsKHN1ZXhlY19jbWQpCiAKLSAgIyBOZWVkIHRvIGdldCBhbGwgYXBwcm92YWxzIG9uIHByaW9yIHBhdGNoIHNldCwgdGhlbiBzdWV4ZWMgdGhlbSBvbnRvCi0gICMgdGhpcyBwYXRjaHNldC4KLSAgYXBwcm92YWxzID0gR2V0QXBwcm92YWxzKG9wdGlvbnMuY2hhbmdlSWQsIG9wdGlvbnMucGF0Y2hzZXQsIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCkKLSAgZ2Vycml0X2FwcHJvdmVfbXNnID0gKCJcJ0F1dG9tYXRpY2FsbHkgcmUtYWRkZWQgYnkgR2Vycml0IHRyaXZpYWwgcmViYXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3Rpb24gc2NyaXB0LlwnIikKLSAgZm9yIGFwcHJvdmFsIGluIGFwcHJvdmFsczoKLSAgICAjIE5vdGU6IFNpdGVzIHdpdGggZGlmZmVyZW50ICdjb3B5X21pbl9zY29yZScgdmFsdWVzIGluIHRoZQotICAgICMgYXBwcm92YWxfY2F0ZWdvcmllcyBEQiB0YWJsZSBtaWdodCB3YW50IGRpZmZlcmVudCBiZWhhdmlvciBoZXJlLgotICAgICMgQWRkaXRpb25hbCBjYXRlZ29yaWVzIHNob3VsZCBhbHNvIGJlIGFkZGVkIGlmIGRlc2lyZWQuCi0gICAgaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIkNSVlciOgotICAgICAgYXBwcm92ZV9jYXRlZ29yeSA9ICctLWNvZGUtcmV2aWV3JwotICAgIGVsaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIlZSSUYiOgotICAgICAgIyBEb24ndCByZS1hZGQgdmVyaWZpZXMKLSAgICAgICNhcHByb3ZlX2NhdGVnb3J5ID0gJy0tdmVyaWZpZWQnCi0gICAgICBjb250aW51ZQotICAgIGVsaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIlNVQk0iOgotICAgICAgIyBXZSBkb24ndCBjYXJlIGFib3V0IHByZXZpb3VzIHN1Ym1pdCBhdHRlbXB0cwotICAgICAgY29udGludWUKLSAgICBlbHNlOgotICAgICAgcHJpbnQgIlVuc3VwcG9ydGVkIGNhdGVnb3J5OiAlcyIgJSBhcHByb3ZhbAotICAgICAgZXhpdCgwKQorICBkZWYgRGlmZkNvbW1pdE1lc3NhZ2VzKHNlbGYsIHByZXZfY29tbWl0KToKKyAgICBsb2dfY21kMSA9IFsnZ2l0JywgJ2xvZycsICctLXByZXR0eT1mb3JtYXQ6IiVhbiAlYWUlbiVzJW4lYiInLAorICAgICAgICAgICAgICAgIHByZXZfY29tbWl0ICsgJ14hJ10KKyAgICBjb21taXQxX2xvZyA9IHNlbGYuQ2hlY2tDYWxsKGxvZ19jbWQxKQorICAgIGxvZ19jbWQyID0gWydnaXQnLCAnbG9nJywgJy0tcHJldHR5PWZvcm1hdDoiJWFuICVhZSVuJXMlbiViIicsCisgICAgICAgICAgICAgICAgc2VsZi5jb21taXQgKyAnXiEnXQorICAgIGNvbW1pdDJfbG9nID0gc2VsZi5DaGVja0NhbGwobG9nX2NtZDIpCisgICAgaWYgY29tbWl0MV9sb2cgIT0gY29tbWl0Ml9sb2c6CisgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQogCi0gICAgc2NvcmUgPSBhcHByb3ZhbFsidmFsdWUiXQotICAgIGdlcnJpdF9hcHByb3ZlX2NtZCA9IFsnZ2Vycml0JywgJ2FwcHJvdmUnLCAnLS1wcm9qZWN0Jywgb3B0aW9ucy5wcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAnLS1tZXNzYWdlJywgZ2Vycml0X2FwcHJvdmVfbXNnLCBhcHByb3ZlX2NhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSwgb3B0aW9ucy5jb21taXRdCi0gICAgZW1haWxfYWRkciA9IEdldEVtYWlsRnJvbUFjY3RJZChhcHByb3ZhbFsiYWNjb3VudF9pZCJdLCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvcnQpCi0gICAgU3VFeGVjKHNlcnZlciwgb3B0aW9ucy5wb3J0LCBvcHRpb25zLnByaXZhdGVfa2V5X3BhdGgsIGVtYWlsX2FkZHIsCi0gICAgICAgICAgICcgJy5qb2luKGdlcnJpdF9hcHByb3ZlX2NtZCkpCi0gIGV4aXQoMCkKKyAgZGVmIFJ1bihzZWxmKToKKyAgICBpZiBzZWxmLnBhdGNoc2V0ID09IDE6CisgICAgICAjIE5vdGhpbmcgdG8gZGV0ZWN0IG9uIGZpcnN0IHBhdGNoc2V0CisgICAgICByZXR1cm4KKyAgICBwcmV2X3JldmlzaW9uID0gc2VsZi5GaW5kUHJldlJldigpCisgICAgYXNzZXJ0IHByZXZfcmV2aXNpb24sICJQcmV2aW91cyByZXZpc2lvbiBub3QgZm91bmQiCisgICAgcHJldl9wYXRjaF9pZCA9IHNlbGYuR2V0UGF0Y2hJZChwcmV2X3JldmlzaW9uKQorICAgIGN1cl9wYXRjaF9pZCA9IHNlbGYuR2V0UGF0Y2hJZChzZWxmLmNvbW1pdCkKKyAgICBpZiBwcmV2X3BhdGNoX2lkID09ICcwJyBhbmQgY3VyX3BhdGNoX2lkID09ICcwJzoKKyAgICAgIHByaW50ICJjb21taXRzICVzIGFuZCAlcyBhcmUgYm90aCBlbXB0eSBvciBtZXJnZSBjb21taXRzIiAlIChwcmV2X3JldmlzaW9uLCBzZWxmLmNvbW1pdCkKKyAgICAgIHJldHVybgorICAgIGlmIGN1cl9wYXRjaF9pZCAhPSBwcmV2X3BhdGNoX2lkOgorICAgICAgIyBwYXRjaC1pZHMgZG9uJ3QgbWF0Y2gKKyAgICAgIHJldHVybgorICAgICMgUGF0Y2ggaWRzIG1hdGNoLiBUaGlzIGlzIGEgdHJpdmlhbCByZWJhc2UuCisgICAgIyBJbiBhZGRpdGlvbiB0byBwYXRjaC1pZCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlIGNvbW1pdCBtZXNzYWdlIGNoYW5nZWQuIE1vc3QKKyAgICAjIGFwcHJvdmVycyB3b3VsZCB3YW50IHRvIHJlLXJldmlldyBjaGFuZ2VzIHdoZW4gdGhlIGNvbW1pdCBtZXNzYWdlIGNoYW5nZXMuCisgICAgY2hhbmdlZCA9IHNlbGYuRGlmZkNvbW1pdE1lc3NhZ2VzKHByZXZfcmV2aXNpb24pCisgICAgaWYgY2hhbmdlZDoKKyAgICAgICMgSW5zZXJ0IGEgY29tbWVudCBpbnRvIHRoZSBjaGFuZ2UgbGV0dGluZyB0aGUgYXBwcm92ZXJzIGtub3cgb25seSB0aGUKKyAgICAgICMgY29tbWl0IG1lc3NhZ2UgY2hhbmdlZAorICAgICAgY29tbWVudF9tc2cgPSAoIlwnLS1tZXNzYWdlPU5ldyBwYXRjaHNldCBwYXRjaC1pZCBtYXRjaGVzIHByZXZpb3VzIHBhdGNoc2V0IgorICAgICAgICAgICAgICAgICAgICAgIiwgYnV0IGNvbW1pdCBtZXNzYWdlIGhhcyBjaGFuZ2VkLiciKQorICAgICAgY29tbWVudF9jbWQgPSBbc2VsZi5zc2gsIHNlbGYuc3NoX3BvcnRfZmxhZywgc2VsZi5wb3J0LCBzZWxmLnNlcnZlciwgJ2dlcnJpdCcsCisgICAgICAgICAgICAgICAgICAgICAncmV2aWV3JywgJy0tcHJvamVjdCcsIHNlbGYucHJvamVjdCwgY29tbWVudF9tc2csIHNlbGYuY29tbWl0XQorICAgICAgc2VsZi5DaGVja0NhbGwoY29tbWVudF9jbWQpCisgICAgICByZXR1cm4KKworICAgICMgTmVlZCB0byBnZXQgYWxsIGFwcHJvdmFscyBvbiBwcmlvciBwYXRjaCBzZXQsIHRoZW4gc3VleGVjIHRoZW0gb250bworICAgICMgdGhpcyBwYXRjaHNldC4KKyAgICBhcHByb3ZhbHMgPSBzZWxmLkdldEFwcHJvdmFscygpCisgICAgc2VsZi5hY2N0X2FwcHJvdmFscyA9IGRpY3QoKQorICAgIGZvciBhcHByb3ZhbCBpbiBhcHByb3ZhbHM6CisgICAgICAjIE5vdGU6IFNpdGVzIHdpdGggZGlmZmVyZW50ICdjb3B5X21pbl9zY29yZScgdmFsdWVzIGluIHRoZQorICAgICAgIyBhcHByb3ZhbF9jYXRlZ29yaWVzIERCIHRhYmxlIG1pZ2h0IHdhbnQgZGlmZmVyZW50IGJlaGF2aW9yIGhlcmUuCisgICAgICAjIEFkZGl0aW9uYWwgY2F0ZWdvcmllcyBzaG91bGQgYWxzbyBiZSBhZGRlZCBpZiBkZXNpcmVkLgorICAgICAgaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIkNvZGUtUmV2aWV3IiBhbmQgYXBwcm92YWxbJ3ZhbHVlJ10gIT0gJy0yJzoKKyAgICAgICAgc2VsZi5BcHBlbmRBY2N0QXBwcm92YWwoYXBwcm92YWxbJ2FjY291bnRfaWQnXSwgJy0tY29kZS1yZXZpZXcgJXMnICUgYXBwcm92YWxbJ3ZhbHVlJ10pCisgICAgICBlbGlmIGFwcHJvdmFsWyJjYXRlZ29yeV9pZCJdID09ICJWZXJpZmllZCI6CisgICAgICAgICMgRG9uJ3QgcmUtYWRkIHZlcmlmaWVzCisgICAgICAgICMgc2VsZi5BcHBlbmRBY2N0QXBwcm92YWwoYXBwcm92YWxbJ2FjY291bnRfaWQnXSwgJy0tdmVyaWZpZWQgJXMnICUgYXBwcm92YWxbJ3ZhbHVlJ10pCisgICAgICAgIGNvbnRpbnVlCisgICAgICBlbGlmIGFwcHJvdmFsWyJjYXRlZ29yeV9pZCJdID09ICJTVUJNIjoKKyAgICAgICAgIyBXZSBkb24ndCBjYXJlIGFib3V0IHByZXZpb3VzIHN1Ym1pdCBhdHRlbXB0cworICAgICAgICBjb250aW51ZQorICAgICAgZWxzZToKKyAgICAgICAgc2VsZi5BcHBlbmRBY2N0QXBwcm92YWwoYXBwcm92YWxbJ2FjY291bnRfaWQnXSwgJy0tJXMgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcHJvdmFsWydjYXRlZ29yeV9pZCddLmxvd2VyKCkucmVwbGFjZSgnICcsICctJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ZhbFsndmFsdWUnXSkpCisKKyAgICBnZXJyaXRfcmV2aWV3X21zZyA9ICgiXCdBdXRvbWF0aWNhbGx5IHJlLWFkZGVkIGJ5IEdlcnJpdCB0cml2aWFsIHJlYmFzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3Rpb24gc2NyaXB0LlwnIikKKyAgICBmb3IgYWNjdCwgZmxhZ3MgaW4gc2VsZi5hY2N0X2FwcHJvdmFscy5pdGVtcygpOgorICAgICAgZ2Vycml0X3Jldmlld19jbWQgPSBbJ2dlcnJpdCcsICdyZXZpZXcnLCAnLS1wcm9qZWN0Jywgc2VsZi5wcm9qZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLW1lc3NhZ2UnLCBnZXJyaXRfcmV2aWV3X21zZywgZmxhZ3MsIHNlbGYuY29tbWl0XQorICAgICAgZW1haWxfYWRkciA9IHNlbGYuR2V0RW1haWxGcm9tQWNjdElkKGFjY3QpCisgICAgICBzZWxmLlN1RXhlYyhlbWFpbF9hZGRyLCAnICcuam9pbihnZXJyaXRfcmV2aWV3X2NtZCkpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIE1haW4oKQorICB0cnk6CisgICAgVHJpdmlhbFJlYmFzZSgpLlJ1bigpCisgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciwgZToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBlCmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uZ2l0aWdub3JlIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTkxNGFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDcgQEAKKy9iaW4KKy90YXJnZXQKKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy8uc2V0dGluZ3Mvb3JnLm1hdmVuLmlkZS5lY2xpcHNlLnByZWZzCisvLnNldHRpbmdzL29yZy5lY2xpcHNlLm0yZS5jb3JlLnByZWZzCisvZ2Vycml0LWNvbW1vbi5pbWwKZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ5YjFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0wLDAgKzEsMyBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2VuY29kaW5nLy9zcmMvdGVzdC9qYXZhPVVURi04CitlbmNvZGluZy88cHJvamVjdD49VVRGLTgKZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGFkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCkBAIC0wLDAgKzEsMiBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2xpbmUuc2VwYXJhdG9yPVxuCmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3NjViMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMCwwICsxLDI2MyBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fbGluZXNfaW5fY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmpvaW5fd3JhcHBlZF9saW5lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTMKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRkMzRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMCwwICsxLDYwIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCitmb3JtYXR0ZXJfcHJvZmlsZT1fR29vZ2xlIEZvcm1hdAorZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKK29yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Y29tLmdvb2dsZTtjb207anVuaXQ7bmV0O29yZztqYXZhO2phdmF4Oworb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTk5CitvcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9OTkKK29yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KK3NwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK3NwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK3NwX2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9ZmFsc2UKK3NwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPXRydWUKK3NwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPXRydWUKK3NwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitzcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD1mYWxzZQorc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitzcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz10cnVlCitzcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9ZmFsc2UKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitzcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitzcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitzcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK3NwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3BvbS54bWwgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWY4YTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9wb20ueG1sCkBAIC0wLDAgKzEsMTQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmdlcnJpdC1hY2NlcHRhbmNlLXRlc3RzPC9hcnRpZmFjdElkPgorCisgIDxuYW1lPkdlcnJpdCBDb2RlIFJldmlldyAtIEFjY2VwdGFuY2UgVGVzdHM8L25hbWU+CisKKyAgPGRlc2NyaXB0aW9uPgorICAgIEdlcnJpdCBBY2NlcHRhbmNlIFRlc3RzCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1yZXZpZXdkYjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LW1haW48L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LW9wZW5pZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXNzaGQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1odHRwZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBnbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5hY2NlcHRhbmNlPC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgPG5hbWU+IWdlcnJpdC5hY2NlcHRhbmNlLXRlc3RzLnNraXA8L25hbWU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+aW50ZWdyYXRpb24tdGVzdDwvaWQ+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+aW50ZWdyYXRpb24tdGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+dmVyaWZ5PC9pZD4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD52ZXJpZnk8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0Fic3RyYWN0RGFlbW9uVGVzdC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0Fic3RyYWN0RGFlbW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzdiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWJzdHJhY3REYWVtb25UZXN0LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBwcml2YXRlIEdlcnJpdFNlcnZlciBzZXJ2ZXI7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgZmluYWwgdm9pZCBiZWZvcmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc2VydmVyID0gR2Vycml0U2VydmVyLnN0YXJ0KCk7CisgICAgc2VydmVyLmdldFRlc3RJbmplY3RvcigpLmluamVjdE1lbWJlcnModGhpcyk7CisgIH0KKworICBAQWZ0ZXIKKyAgcHVibGljIGZpbmFsIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgc2VydmVyLnN0b3AoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0FjY291bnRDcmVhdG9yLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWNjb3VudENyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZlZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0FjY291bnRDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50U3NoS2V5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50QnlFbWFpbENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoS2V5Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaDsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guS2V5UGFpcjsKKworcHVibGljIGNsYXNzIEFjY291bnRDcmVhdG9yIHsKKworICBwcml2YXRlIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHJldmlld0RiUHJvdmlkZXI7CisgIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOworICBwcml2YXRlIFNzaEtleUNhY2hlIHNzaEtleUNhY2hlOworICBwcml2YXRlIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CisgIHByaXZhdGUgQWNjb3VudEJ5RW1haWxDYWNoZSBieUVtYWlsQ2FjaGU7CisKKyAgQEluamVjdAorICBBY2NvdW50Q3JlYXRvcihTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWEsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwKKyAgICAgIFNzaEtleUNhY2hlIHNzaEtleUNhY2hlLCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAorICAgICAgQWNjb3VudEJ5RW1haWxDYWNoZSBieUVtYWlsQ2FjaGUpIHsKKyAgICByZXZpZXdEYlByb3ZpZGVyID0gc2NoZW1hOworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5zc2hLZXlDYWNoZSA9IHNzaEtleUNhY2hlOworICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOworICAgIHRoaXMuYnlFbWFpbENhY2hlID0gYnlFbWFpbENhY2hlOworICB9CisKKyAgcHVibGljIFRlc3RBY2NvdW50IGNyZWF0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBlbWFpbCwgU3RyaW5nIGZ1bGxOYW1lLAorICAgICAgU3RyaW5nLi4uIGdyb3VwcykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgIFJldmlld0RiIGRiID0gcmV2aWV3RGJQcm92aWRlci5vcGVuKCk7CisgICAgdHJ5IHsKKyAgICAgIEFjY291bnQuSWQgaWQgPSBuZXcgQWNjb3VudC5JZChkYi5uZXh0QWNjb3VudElkKCkpOworICAgICAgS2V5UGFpciBzc2hLZXkgPSBnZW5Tc2hLZXkoKTsKKyAgICAgIEFjY291bnRTc2hLZXkga2V5ID0KKyAgICAgICAgICBuZXcgQWNjb3VudFNzaEtleShuZXcgQWNjb3VudFNzaEtleS5JZChpZCwgMSksIHB1YmxpY0tleShzc2hLZXksIGVtYWlsKSk7CisgICAgICBBY2NvdW50RXh0ZXJuYWxJZCBleHRVc2VyID0KKyAgICAgICAgICBuZXcgQWNjb3VudEV4dGVybmFsSWQoaWQsIG5ldyBBY2NvdW50RXh0ZXJuYWxJZC5LZXkoCisgICAgICAgICAgICAgIEFjY291bnRFeHRlcm5hbElkLlNDSEVNRV9VU0VSTkFNRSwgdXNlcm5hbWUpKTsKKyAgICAgIFN0cmluZyBodHRwUGFzcyA9ICJodHRwLXBhc3MiOworICAgICAgZXh0VXNlci5zZXRQYXNzd29yZChodHRwUGFzcyk7CisgICAgICBkYi5hY2NvdW50RXh0ZXJuYWxJZHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGV4dFVzZXIpKTsKKworICAgICAgaWYgKGVtYWlsICE9IG51bGwpIHsKKyAgICAgICAgQWNjb3VudEV4dGVybmFsSWQgZXh0TWFpbHRvID0gbmV3IEFjY291bnRFeHRlcm5hbElkKGlkLCBnZXRFbWFpbEtleShlbWFpbCkpOworICAgICAgICBleHRNYWlsdG8uc2V0RW1haWxBZGRyZXNzKGVtYWlsKTsKKyAgICAgICAgZGIuYWNjb3VudEV4dGVybmFsSWRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihleHRNYWlsdG8pKTsKKyAgICAgIH0KKworICAgICAgQWNjb3VudCBhID0gbmV3IEFjY291bnQoaWQpOworICAgICAgYS5zZXRGdWxsTmFtZShmdWxsTmFtZSk7CisgICAgICBhLnNldFByZWZlcnJlZEVtYWlsKGVtYWlsKTsKKyAgICAgIGRiLmFjY291bnRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihhKSk7CisKKyAgICAgIGRiLmFjY291bnRTc2hLZXlzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihrZXkpKTsKKworICAgICAgaWYgKGdyb3VwcyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoU3RyaW5nIG4gOiBncm91cHMpIHsKKyAgICAgICAgICBBY2NvdW50R3JvdXAuTmFtZUtleSBrID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KG4pOworICAgICAgICAgIEFjY291bnRHcm91cCBnID0gZ3JvdXBDYWNoZS5nZXQoayk7CisgICAgICAgICAgQWNjb3VudEdyb3VwTWVtYmVyIG0gPQorICAgICAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwTWVtYmVyKG5ldyBBY2NvdW50R3JvdXBNZW1iZXIuS2V5KGlkLCBnLmdldElkKCkpKTsKKyAgICAgICAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgc3NoS2V5Q2FjaGUuZXZpY3QodXNlcm5hbWUpOworICAgICAgYWNjb3VudENhY2hlLmV2aWN0QnlVc2VybmFtZSh1c2VybmFtZSk7CisgICAgICBieUVtYWlsQ2FjaGUuZXZpY3QoZW1haWwpOworCisgICAgICByZXR1cm4gbmV3IFRlc3RBY2NvdW50KGlkLCB1c2VybmFtZSwgZW1haWwsIGZ1bGxOYW1lLCBzc2hLZXksIGh0dHBQYXNzKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVGVzdEFjY291bnQgY3JlYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGdyb3VwKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZSh1c2VybmFtZSwgbnVsbCwgdXNlcm5hbWUsIGdyb3VwKTsKKyAgfQorCisgIHB1YmxpYyBUZXN0QWNjb3VudCBjcmVhdGUoU3RyaW5nIHVzZXJuYW1lKQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZSh1c2VybmFtZSwgbnVsbCwgdXNlcm5hbWUsIChTdHJpbmdbXSkgbnVsbCk7CisgIH0KKworICBwcml2YXRlIEFjY291bnRFeHRlcm5hbElkLktleSBnZXRFbWFpbEtleShTdHJpbmcgZW1haWwpIHsKKyAgICByZXR1cm4gbmV3IEFjY291bnRFeHRlcm5hbElkLktleShBY2NvdW50RXh0ZXJuYWxJZC5TQ0hFTUVfTUFJTFRPLCBlbWFpbCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBLZXlQYWlyIGdlblNzaEtleSgpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKKyAgICBKU2NoIGpzY2ggPSBuZXcgSlNjaCgpOworICAgIHJldHVybiBLZXlQYWlyLmdlbktleVBhaXIoanNjaCwgS2V5UGFpci5SU0EpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHB1YmxpY0tleShLZXlQYWlyIHNzaEtleSwgU3RyaW5nIGNvbW1lbnQpCisgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBzc2hLZXkud3JpdGVQdWJsaWNLZXkob3V0LCBjb21tZW50KTsKKyAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCJBU0NJSSIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvR2NBc3NlcnQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9HY0Fzc2VydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNzI4OWIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0djQXNzZXJ0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHY0Fzc2VydCB7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKworICBASW5qZWN0CisgIHB1YmxpYyBHY0Fzc2VydChHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcikgeworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEhhc1BhY2tGaWxlKFByb2plY3QuTmFtZUtleS4uLiBwcm9qZWN0cykKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBmb3IgKFByb2plY3QuTmFtZUtleSBwIDogcHJvamVjdHMpIHsKKyAgICAgIGFzc2VydFRydWUoIlByb2plY3QgIiArIHAuZ2V0KCkgKyAiIGhhcyBubyBwYWNrIGZpbGVzLiIsCisgICAgICAgICAgZ2V0UGFja0ZpbGVzKHApLmxlbmd0aCA+IDApOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGFzc2VydEhhc05vUGFja0ZpbGUoUHJvamVjdC5OYW1lS2V5Li4uIHByb2plY3RzKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IHAgOiBwcm9qZWN0cykgeworICAgICAgYXNzZXJ0VHJ1ZSgiUHJvamVjdCAiICsgcC5nZXQoKSArICIgaGFzIHBhY2sgZmlsZXMuIiwKKyAgICAgICAgICBnZXRQYWNrRmlsZXMocCkubGVuZ3RoID09IDApOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU3RyaW5nW10gZ2V0UGFja0ZpbGVzKFByb2plY3QuTmFtZUtleSBwKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHApOworICAgIHRyeSB7CisgICAgICBGaWxlIHBhY2tEaXIgPSBuZXcgRmlsZShyZXBvLmdldERpcmVjdG9yeSgpLCAib2JqZWN0cy9wYWNrIik7CisgICAgICByZXR1cm4gcGFja0Rpci5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiLnBhY2siKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9HZXJyaXRTZXJ2ZXIuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9HZXJyaXRTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJhYjZhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0dlcnJpdFNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJyb2tlbkJhcnJpZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLkRhZW1vbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uSW5pdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkZhY3RvcnlNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOworCitjbGFzcyBHZXJyaXRTZXJ2ZXIgeworCisgIC8qKiBSZXR1cm5zIGZ1bGx5IHN0YXJ0ZWQgR2Vycml0IHNlcnZlciAqLworICBzdGF0aWMgR2Vycml0U2VydmVyIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBTdHJpbmcgc2l0ZVBhdGggPSBpbml0U2l0ZSgpOworCisgICAgZmluYWwgQ3ljbGljQmFycmllciBzZXJ2ZXJTdGFydGVkID0gbmV3IEN5Y2xpY0JhcnJpZXIoMik7CisKKyAgICBmaW5hbCBEYWVtb24gZGFlbW9uID0gbmV3IERhZW1vbihuZXcgUnVubmFibGUoKSB7CisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VydmVyU3RhcnRlZC5hd2FpdCgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKEJyb2tlbkJhcnJpZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisKKyAgICBFeGVjdXRvclNlcnZpY2UgZGFlbW9uU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgIGRhZW1vblNlcnZpY2Uuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKKyAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHJjID0gZGFlbW9uLm1haW4obmV3IFN0cmluZ1tdIHsiLWQiLCBzaXRlUGF0aCwgIi0taGVhZGxlc3MiIH0pOworICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIHN0YXJ0IEdlcnJpdCBkYWVtb24uIENoZWNrICIKKyAgICAgICAgICAgICAgKyBzaXRlUGF0aCArICIvbG9ncy9lcnJvcl9sb2ciKTsKKyAgICAgICAgICBzZXJ2ZXJTdGFydGVkLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9OworICAgIH0pOworCisgICAgc2VydmVyU3RhcnRlZC5hd2FpdCgpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2Vycml0IFNlcnZlciBTdGFydGVkIik7CisKKyAgICBJbmplY3RvciBpID0gY3JlYXRlVGVzdEluamVjdG9yKGRhZW1vbik7CisgICAgcmV0dXJuIG5ldyBHZXJyaXRTZXJ2ZXIoaSwgZGFlbW9uLCBkYWVtb25TZXJ2aWNlKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBpbml0U2l0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIERhdGVGb3JtYXQgZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eU1NZGRISG1tc3MiKTsKKyAgICBTdHJpbmcgcGF0aCA9ICJ0YXJnZXQvdGVzdF9zaXRlXyIgKyBkZi5mb3JtYXQobmV3IERhdGUoKSk7CisgICAgSW5pdCBpbml0ID0gbmV3IEluaXQoKTsKKyAgICBpbnQgcmMgPSBpbml0Lm1haW4obmV3IFN0cmluZ1tdIHsiLWQiLCBwYXRoLCAiLS1iYXRjaCIsICItLW5vLWF1dG8tc3RhcnQifSk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZG4ndCBpbml0aWFsaXplIHNpdGUiKTsKKyAgICB9CisgICAgcmV0dXJuIHBhdGg7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJbmplY3RvciBjcmVhdGVUZXN0SW5qZWN0b3IoRGFlbW9uIGRhZW1vbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgSW5qZWN0b3Igc3lzSW5qZWN0b3IgPSBnZXQoZGFlbW9uLCAic3lzSW5qZWN0b3IiKTsKKyAgICBNb2R1bGUgbW9kdWxlID0gbmV3IEZhY3RvcnlNb2R1bGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChBY2NvdW50Q3JlYXRvci5jbGFzcyk7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gc3lzSW5qZWN0b3IuY3JlYXRlQ2hpbGRJbmplY3Rvcihtb2R1bGUpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgc3RhdGljIDxUPiBUIGdldChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGQpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwKKyAgICAgIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgIEZpZWxkIGYgPSBvYmouZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKGZpZWxkKTsKKyAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgcmV0dXJuIChUKSBmLmdldChvYmopOworICB9CisKKyAgcHJpdmF0ZSBEYWVtb24gZGFlbW9uOworICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBkYWVtb25TZXJ2aWNlOworICBwcml2YXRlIEluamVjdG9yIHRlc3RJbmplY3RvcjsKKworICBwcml2YXRlIEdlcnJpdFNlcnZlcihJbmplY3RvciB0ZXN0SW5qZWN0b3IsCisgICAgICBEYWVtb24gZGFlbW9uLCBFeGVjdXRvclNlcnZpY2UgZGFlbW9uU2VydmljZSkgeworICAgIHRoaXMudGVzdEluamVjdG9yID0gdGVzdEluamVjdG9yOworICAgIHRoaXMuZGFlbW9uID0gZGFlbW9uOworICAgIHRoaXMuZGFlbW9uU2VydmljZSA9IGRhZW1vblNlcnZpY2U7CisgIH0KKworICBJbmplY3RvciBnZXRUZXN0SW5qZWN0b3IoKSB7CisgICAgcmV0dXJuIHRlc3RJbmplY3RvcjsKKyAgfQorCisgIHZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIExpZmVjeWNsZU1hbmFnZXIgbWFuYWdlciA9IGdldChkYWVtb24sICJtYW5hZ2VyIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXJyaXQgU2VydmVyIFNodXRkb3duIik7CisgICAgbWFuYWdlci5zdG9wKCk7CisgICAgZGFlbW9uU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgIGRhZW1vblNlcnZpY2UuYXdhaXRUZXJtaW5hdGlvbihMb25nLk1BWF9WQUxVRSwgVGltZVVuaXQuU0VDT05EUyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9SZXN0UmVzcG9uc2UuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9SZXN0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkzNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Jlc3RSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGkuUmVzdEFwaVNlcnZsZXQuSlNPTl9NQUdJQzsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBSZXN0UmVzcG9uc2UgeworCisgIHByaXZhdGUgSHR0cFJlc3BvbnNlIHJlc3BvbnNlOworICBwcml2YXRlIFJlYWRlciByZWFkZXI7CisKKyAgUmVzdFJlc3BvbnNlKEh0dHBSZXNwb25zZSByZXNwb25zZSkgeworICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgfQorCisgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGlmIChyZWFkZXIgPT0gbnVsbCAmJiByZXNwb25zZS5nZXRFbnRpdHkoKSAhPSBudWxsKSB7CisgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzcG9uc2UuZ2V0RW50aXR5KCkuZ2V0Q29udGVudCgpKTsKKyAgICAgIHJlYWRlci5za2lwKEpTT05fTUFHSUMubGVuZ3RoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNvbnN1bWUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVhZGVyIHJlYWRlciA9IGdldFJlYWRlcigpOworICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgd2hpbGUgKHJlYWRlci5yZWFkKCkgIT0gLTEpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICByZXR1cm4gcmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Jlc3RTZXNzaW9uLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvUmVzdFNlc3Npb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY2NTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Jlc3RTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5hdXRoLkF1dGhTY29wZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5Vc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBEZWxldGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBHZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUHV0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuU3RyaW5nRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAubWVzc2FnZS5CYXNpY0hlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAucHJvdG9jb2wuSFRUUDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBSZXN0U2Vzc2lvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBUZXN0QWNjb3VudCBhY2NvdW50OworICBEZWZhdWx0SHR0cENsaWVudCBjbGllbnQ7CisKKyAgcHVibGljIFJlc3RTZXNzaW9uKFRlc3RBY2NvdW50IGFjY291bnQpIHsKKyAgICB0aGlzLmFjY291bnQgPSBhY2NvdW50OworICB9CisKKyAgcHVibGljIFJlc3RSZXNwb25zZSBnZXQoU3RyaW5nIGVuZFBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEh0dHBHZXQgZ2V0ID0gbmV3IEh0dHBHZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hIiArIGVuZFBvaW50KTsKKyAgICByZXR1cm4gbmV3IFJlc3RSZXNwb25zZShnZXRDbGllbnQoKS5leGVjdXRlKGdldCkpOworICB9CisKKyAgcHVibGljIFJlc3RSZXNwb25zZSBwdXQoU3RyaW5nIGVuZFBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBwdXQoZW5kUG9pbnQsIG51bGwpOworICB9CisKKyAgcHVibGljIFJlc3RSZXNwb25zZSBwdXQoU3RyaW5nIGVuZFBvaW50LCBPYmplY3QgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBIdHRwUHV0IHB1dCA9IG5ldyBIdHRwUHV0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvYSIgKyBlbmRQb2ludCk7CisgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgcHV0LmFkZEhlYWRlcihuZXcgQmFzaWNIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgcHV0LnNldEVudGl0eShuZXcgU3RyaW5nRW50aXR5KChuZXcgR3NvbigpKS50b0pzb24oY29udGVudCksIEhUVFAuVVRGXzgpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZXN0UmVzcG9uc2UoZ2V0Q2xpZW50KCkuZXhlY3V0ZShwdXQpKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0UmVzcG9uc2UgcG9zdChTdHJpbmcgZW5kUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHBvc3QoZW5kUG9pbnQsIG51bGwpOworICB9CisKKyAgcHVibGljIFJlc3RSZXNwb25zZSBwb3N0KFN0cmluZyBlbmRQb2ludCwgT2JqZWN0IGNvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EiICsgZW5kUG9pbnQpOworICAgIGlmIChjb250ZW50ICE9IG51bGwpIHsKKyAgICAgIHBvc3QuYWRkSGVhZGVyKG5ldyBCYXNpY0hlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICBwb3N0LnNldEVudGl0eShuZXcgU3RyaW5nRW50aXR5KChuZXcgR3NvbigpKS50b0pzb24oY29udGVudCksIEhUVFAuVVRGXzgpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZXN0UmVzcG9uc2UoZ2V0Q2xpZW50KCkuZXhlY3V0ZShwb3N0KSk7CisgIH0KKworICBwdWJsaWMgUmVzdFJlc3BvbnNlIGRlbGV0ZShTdHJpbmcgZW5kUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSHR0cERlbGV0ZSBkZWxldGUgPSBuZXcgSHR0cERlbGV0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EiICsgZW5kUG9pbnQpOworICAgIHJldHVybiBuZXcgUmVzdFJlc3BvbnNlKGdldENsaWVudCgpLmV4ZWN1dGUoZGVsZXRlKSk7CisgIH0KKworICBwcml2YXRlIERlZmF1bHRIdHRwQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICBpZiAoY2xpZW50ID09IG51bGwpIHsKKyAgICAgIGNsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudCgpOworICAgICAgY2xpZW50LmdldENyZWRlbnRpYWxzUHJvdmlkZXIoKS5zZXRDcmVkZW50aWFscygKKyAgICAgICAgICBuZXcgQXV0aFNjb3BlKCJsb2NhbGhvc3QiLCA4MDgwKSwKKyAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKGFjY291bnQudXNlcm5hbWUsIGFjY291bnQuaHR0cFBhc3N3b3JkKSk7CisgICAgfQorICAgIHJldHVybiBjbGllbnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9Tc2hTZXNzaW9uLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvU3NoU2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTkyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvU3NoU2Vzc2lvbi5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkNoYW5uZWxFeGVjOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZXNzaW9uOworCitwdWJsaWMgY2xhc3MgU3NoU2Vzc2lvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBUZXN0QWNjb3VudCBhY2NvdW50OworICBwcml2YXRlIFNlc3Npb24gc2Vzc2lvbjsKKyAgcHJpdmF0ZSBTdHJpbmcgZXJyb3I7CisKKyAgcHVibGljIFNzaFNlc3Npb24oVGVzdEFjY291bnQgYWNjb3VudCkgeworICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGV4ZWMoU3RyaW5nIGNvbW1hbmQpIHRocm93cyBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgQ2hhbm5lbEV4ZWMgY2hhbm5lbCA9IChDaGFubmVsRXhlYykgZ2V0U2Vzc2lvbigpLm9wZW5DaGFubmVsKCJleGVjIik7CisgICAgdHJ5IHsKKyAgICAgIGNoYW5uZWwuc2V0Q29tbWFuZChjb21tYW5kKTsKKyAgICAgIGNoYW5uZWwuc2V0SW5wdXRTdHJlYW0obnVsbCk7CisgICAgICBJbnB1dFN0cmVhbSBpbiA9IGNoYW5uZWwuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgIGNoYW5uZWwuY29ubmVjdCgpOworCisgICAgICBTY2FubmVyIHMgPSBuZXcgU2Nhbm5lcihjaGFubmVsLmdldEVyclN0cmVhbSgpKS51c2VEZWxpbWl0ZXIoIlxcQSIpOworICAgICAgZXJyb3IgPSAgcy5oYXNOZXh0KCkgPyBzLm5leHQoKSA6IG51bGw7CisKKyAgICAgIHMgPSBuZXcgU2Nhbm5lcihpbikudXNlRGVsaW1pdGVyKCJcXEEiKTsKKyAgICAgIHJldHVybiBzLmhhc05leHQoKSA/IHMubmV4dCgpIDogIiI7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGNoYW5uZWwuZGlzY29ubmVjdCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgeworICAgIHJldHVybiBlcnJvciAhPSBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICBzZXNzaW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgIHNlc3Npb24gPSBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgU2Vzc2lvbiBnZXRTZXNzaW9uKCkgdGhyb3dzIEpTY2hFeGNlcHRpb24geworICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKKyAgICAgIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisgICAgICBqc2NoLmFkZElkZW50aXR5KCJLZXlQYWlyIiwKKyAgICAgICAgICBhY2NvdW50LnByaXZhdGVLZXkoKSwgYWNjb3VudC5zc2hLZXkuZ2V0UHVibGljS2V5QmxvYigpLCBudWxsKTsKKyAgICAgIHNlc3Npb24gPSBqc2NoLmdldFNlc3Npb24oYWNjb3VudC51c2VybmFtZSwgImxvY2FsaG9zdCIsIDI5NDE4KTsKKyAgICAgIHNlc3Npb24uc2V0Q29uZmlnKCJTdHJpY3RIb3N0S2V5Q2hlY2tpbmciLCAibm8iKTsKKyAgICAgIHNlc3Npb24uY29ubmVjdCgpOworICAgIH0KKyAgICByZXR1cm4gc2Vzc2lvbjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgYi5hcHBlbmQoInNzaDovLyIpOworICAgIGIuYXBwZW5kKHNlc3Npb24uZ2V0VXNlck5hbWUoKSk7CisgICAgYi5hcHBlbmQoIkAiKTsKKyAgICBiLmFwcGVuZChzZXNzaW9uLmdldEhvc3QoKSk7CisgICAgYi5hcHBlbmQoIjoiKTsKKyAgICBiLmFwcGVuZChzZXNzaW9uLmdldFBvcnQoKSk7CisgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1N5c3RlbUdyb3Vwc0lULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvU3lzdGVtR3JvdXBzSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWUyMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1N5c3RlbUdyb3Vwc0lULmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEFuIGV4YW1wbGUgdGVzdCB0aGF0IHRlc3RzIHByZXNlbmNlIG9mIHN5c3RlbSBncm91cHMgaW4gYSBuZXdseSBpbml0aWFsaXplZAorICogcmV2aWV3IHNpdGUuCisgKgorICogVGhlIHRlc3Qgc2hvd3MgaG93IHRvIHBlcmZvcm0gdGhlc2UgY2hlY2tzIHZpYSBTU0gsIFJFU1Qgb3IgdXNpbmcgR2Vycml0CisgKiBpbnRlcm5hbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTeXN0ZW1Hcm91cHNJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHJldmlld0RiUHJvdmlkZXI7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIHByb3RlY3RlZCBUZXN0QWNjb3VudCBhZG1pbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQHNhcC5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN5c3RlbUdyb3Vwc0NyZWF0ZWRfc3NoKCkgdGhyb3dzIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBTc2hTZXNzaW9uIHNlc3Npb24gPSBuZXcgU3NoU2Vzc2lvbihhZG1pbik7CisgICAgU3RyaW5nIHJlc3VsdCA9IHNlc3Npb24uZXhlYygiZ2Vycml0IGxzLWdyb3VwcyIpOworICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJBZG1pbmlzdHJhdG9ycyIpKTsKKyAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWlucygiQW5vbnltb3VzIFVzZXJzIikpOworICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJOb24tSW50ZXJhY3RpdmUgVXNlcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIlByb2plY3QgT3duZXJzIikpOworICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJSZWdpc3RlcmVkIFVzZXJzIikpOworICAgIHNlc3Npb24uY2xvc2UoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN5c3RlbUdyb3Vwc0NyZWF0ZWRfcmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCgiL2dyb3Vwcy8iKTsKKyAgICBHc29uIGdzb24gPSBuZXcgR3NvbigpOworICAgIE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4gcmVzdWx0ID0KKyAgICAgICAgZ3Nvbi5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IHJlc3VsdC5rZXlTZXQoKTsKKyAgICBhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJBZG1pbmlzdHJhdG9ycyIpKTsKKyAgICBhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJBbm9ueW1vdXMgVXNlcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiTm9uLUludGVyYWN0aXZlIFVzZXJzIikpOworICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIlByb2plY3QgT3duZXJzIikpOworICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIlJlZ2lzdGVyZWQgVXNlcnMiKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBzeXN0ZW1Hcm91cHNDcmVhdGVkX2ludGVybmFscygpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFJldmlld0RiIGRiID0gcmV2aWV3RGJQcm92aWRlci5vcGVuKCk7CisgICAgdHJ5IHsKKyAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKEFjY291bnRHcm91cCBnIDogZGIuYWNjb3VudEdyb3VwcygpLmFsbCgpKSB7CisgICAgICAgIG5hbWVzLmFkZChnLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgICBhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJBZG1pbmlzdHJhdG9ycyIpKTsKKyAgICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIkFub255bW91cyBVc2VycyIpKTsKKyAgICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIk5vbi1JbnRlcmFjdGl2ZSBVc2VycyIpKTsKKyAgICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIlByb2plY3QgT3duZXJzIikpOworICAgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiUmVnaXN0ZXJlZCBVc2VycyIpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9UZW1wRmlsZVV0aWwuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9UZW1wRmlsZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVlMzYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1RlbXBGaWxlVXRpbC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitwdWJsaWMgY2xhc3MgVGVtcEZpbGVVdGlsIHsKKworICBwcml2YXRlIHN0YXRpYyBpbnQgdGVzdENvdW50OworICBwcml2YXRlIHN0YXRpYyBEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXlNTWRkSEhtbXNzIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVtcCA9IG5ldyBGaWxlKG5ldyBGaWxlKCJ0YXJnZXQiKSwgInRlbXAiKTsKKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlVGVzdEZvbGRlck5hbWUoKSB7CisgICAgcmV0dXJuICJ0ZXN0XyIgKyAoZGYuZm9ybWF0KG5ldyBEYXRlKCkpICsgIl8iICsgKHRlc3RDb3VudCsrKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeSgpIHsKKyAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGNyZWF0ZVVuaXF1ZVRlc3RGb2xkZXJOYW1lKCk7CisgICAgZmluYWwgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wLCBuYW1lKTsKKyAgICBpZiAoIWRpcmVjdG9yeS5ta2RpcnMoKSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImZhaWxlZCB0byBjcmVhdGUgZm9sZGVyICciCisgICAgICAgICAgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyIpOworICAgIH0KKyAgICByZXR1cm4gZGlyZWN0b3J5OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvVGVzdEFjY291bnQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9UZXN0QWNjb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ODY4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvVGVzdEFjY291bnQuamF2YQpAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guS2V5UGFpcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworCisKK3B1YmxpYyBjbGFzcyBUZXN0QWNjb3VudCB7CisgIHB1YmxpYyBmaW5hbCBBY2NvdW50LklkIGlkOworICBwdWJsaWMgZmluYWwgU3RyaW5nIHVzZXJuYW1lOworICBwdWJsaWMgZmluYWwgU3RyaW5nIGVtYWlsOworICBwdWJsaWMgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOworICBwdWJsaWMgZmluYWwgS2V5UGFpciBzc2hLZXk7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaHR0cFBhc3N3b3JkOworCisgIFRlc3RBY2NvdW50KEFjY291bnQuSWQgaWQsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGVtYWlsLCBTdHJpbmcgZnVsbE5hbWUsCisgICAgICBLZXlQYWlyIHNzaEtleSwgU3RyaW5nIGh0dHBQYXNzd29yZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKKyAgICB0aGlzLnNzaEtleSA9IHNzaEtleTsKKyAgICB0aGlzLmh0dHBQYXNzd29yZCA9IGh0dHBQYXNzd29yZDsKKyAgfQorCisgIHB1YmxpYyBieXRlW10gcHJpdmF0ZUtleSgpIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIHNzaEtleS53cml0ZVByaXZhdGVLZXkob3V0KTsKKyAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CisgIH0KKworICBwdWJsaWMgUGVyc29uSWRlbnQgZ2V0SWRlbnQoKSB7CisgICAgcmV0dXJuIG5ldyBQZXJzb25JZGVudCh1c2VybmFtZSwgZW1haWwpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRIdHRwVXJsKCkgeworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgYi5hcHBlbmQoImh0dHA6Ly8iKTsKKyAgICBiLmFwcGVuZCh1c2VybmFtZSk7CisgICAgYi5hcHBlbmQoIjoiKTsKKyAgICBiLmFwcGVuZChodHRwUGFzc3dvcmQpOworICAgIGIuYXBwZW5kKCJAbG9jYWxob3N0OjgwODAiKTsKKyAgICByZXR1cm4gYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvZ2l0L0dpdFV0aWwuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvR2l0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWYzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvZ2l0L0dpdFV0aWwuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5Tc2hTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVtcEZpbGVVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaDsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuQ2xvbmVDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkNvbW1pdENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLlB1c2hDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lk9wZW5Tc2hDb25maWcuSG9zdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZlNwZWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoU2Vzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkNoYW5nZUlkVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworcHVibGljIGNsYXNzIEdpdFV0aWwgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0U3NoKGZpbmFsIFRlc3RBY2NvdW50IGEpIHsKKyAgICBmaW5hbCBQcm9wZXJ0aWVzIGNvbmZpZyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgY29uZmlnLnB1dCgiU3RyaWN0SG9zdEtleUNoZWNraW5nIiwgIm5vIik7CisgICAgSlNjaC5zZXRDb25maWcoY29uZmlnKTsKKworICAgIC8vIHJlZ2lzdGVyIGEgSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5IHRoYXQgYWRkcyB0aGUgcHJpdmF0ZSBrZXkgYXMgaWRlbnRpdHkKKyAgICAvLyB0byB0aGUgSlNjaCBpbnN0YW5jZSBvZiBKR2l0IHNvIHRoYXQgU1NIIGNvbW11bmljYXRpb24gdmlhIEpHaXQgY2FuCisgICAgLy8gc3VjY2VlZAorICAgIFNzaFNlc3Npb25GYWN0b3J5LnNldEluc3RhbmNlKG5ldyBKc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZShIb3N0IGhjLCBTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaW5hbCBKU2NoIGpzY2ggPSBnZXRKU2NoKGhjLCBGUy5ERVRFQ1RFRCk7CisgICAgICAgICAganNjaC5hZGRJZGVudGl0eSgiS2V5UGFpciIsIGEucHJpdmF0ZUtleSgpLAorICAgICAgICAgICAgICBhLnNzaEtleS5nZXRQdWJsaWNLZXlCbG9iKCksIG51bGwpOworICAgICAgICB9IGNhdGNoIChKU2NoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVByb2plY3QoU3NoU2Vzc2lvbiBzLCBTdHJpbmcgbmFtZSkKKyAgICAgIHRocm93cyBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcy5leGVjKCJnZXJyaXQgY3JlYXRlLXByb2plY3QgLS1lbXB0eS1jb21taXQgLS1uYW1lIFwiIiArIG5hbWUgKyAiXCIiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgR2l0IGNsb25lUHJvamVjdChTdHJpbmcgdXJsKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBGaWxlIGdpdERpciA9IFRlbXBGaWxlVXRpbC5jcmVhdGVUZW1wRGlyZWN0b3J5KCk7CisgICAgZmluYWwgQ2xvbmVDb21tYW5kIGNsb25lQ21kID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpOworICAgIGNsb25lQ21kLnNldFVSSSh1cmwpOworICAgIGNsb25lQ21kLnNldERpcmVjdG9yeShnaXREaXIpOworICAgIHJldHVybiBjbG9uZUNtZC5jYWxsKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkKEdpdCBnaXQsIFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkKKyAgICAgIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIGYgPSBuZXcgRmlsZShnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpLmdldFBhcmVudEZpbGUoKSwgcGF0aCk7CisgICAgRmlsZSBwID0gZi5nZXRQYXJlbnRGaWxlKCk7CisgICAgaWYgKCFwLmV4aXN0cygpICYmICFwLm1rZGlycygpKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBjcmVhdGUgZGlyOiAiICsgcC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorICAgIEZpbGVXcml0ZXIgdyA9IG5ldyBGaWxlV3JpdGVyKGYpOworICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcih3KTsKKyAgICB0cnkgeworICAgICAgb3V0LndyaXRlKGNvbnRlbnQpOworICAgIH0gZmluYWxseSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBmaW5hbCBBZGRDb21tYW5kIGFkZENtZCA9IGdpdC5hZGQoKTsKKyAgICBhZGRDbWQuYWRkRmlsZXBhdHRlcm4ocGF0aCk7CisgICAgYWRkQ21kLmNhbGwoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1pdChHaXQgZ2l0LCBQZXJzb25JZGVudCBpLCBTdHJpbmcgbXNnKQorICAgICAgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJldHVybiBjcmVhdGVDb21taXQoZ2l0LCBpLCBtc2csIHRydWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29tbWl0KEdpdCBnaXQsIFBlcnNvbklkZW50IGksIFN0cmluZyBtc2csCisgICAgICBib29sZWFuIGluc2VydENoYW5nZUlkKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgY2hhbmdlSWQgPSBudWxsOworICAgIGlmIChpbnNlcnRDaGFuZ2VJZCkgeworICAgICAgY2hhbmdlSWQgPSBjb21wdXRlQ2hhbmdlSWQoZ2l0LCBpLCBtc2cpOworICAgICAgbXNnID0gQ2hhbmdlSWRVdGlsLmluc2VydElkKG1zZywgY2hhbmdlSWQpOworICAgIH0KKworICAgIGZpbmFsIENvbW1pdENvbW1hbmQgY29tbWl0Q21kID0gZ2l0LmNvbW1pdCgpOworICAgIGNvbW1pdENtZC5zZXRBdXRob3IoaSk7CisgICAgY29tbWl0Q21kLnNldENvbW1pdHRlcihpKTsKKyAgICBjb21taXRDbWQuc2V0TWVzc2FnZShtc2cpOworICAgIGNvbW1pdENtZC5jYWxsKCk7CisKKyAgICByZXR1cm4gY2hhbmdlSWQgIT0gbnVsbCA/ICJJIiArIGNoYW5nZUlkLmdldE5hbWUoKSA6IG51bGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBjb21wdXRlQ2hhbmdlSWQoR2l0IGdpdCwgUGVyc29uSWRlbnQgaSwgU3RyaW5nIG1zZykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGdpdC5nZXRSZXBvc2l0b3J5KCkpOworICAgIHRyeSB7CisgICAgICBSZXZDb21taXQgcGFyZW50ID0KKyAgICAgICAgICBydy5sb29rdXBDb21taXQoZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRSZWYoQ29uc3RhbnRzLkhFQUQpLmdldE9iamVjdElkKCkpOworICAgICAgcmV0dXJuIENoYW5nZUlkVXRpbC5jb21wdXRlQ2hhbmdlSWQocGFyZW50LmdldFRyZWUoKSwgcGFyZW50LmdldElkKCksIGksIGksIG1zZyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJ3LnJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIFB1c2hSZXN1bHQgcHVzaEhlYWQoR2l0IGdpdCwgU3RyaW5nIHJlZikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CisgICAgUHVzaENvbW1hbmQgcHVzaENtZCA9IGdpdC5wdXNoKCk7CisgICAgcHVzaENtZC5zZXRSZWZTcGVjcyhuZXcgUmVmU3BlYygiSEVBRDoiICsgcmVmKSk7CisgICAgSXRlcmFibGU8UHVzaFJlc3VsdD4gciA9IHB1c2hDbWQuY2FsbCgpOworICAgIHJldHVybiBJdGVyYWJsZXMuZ2V0T25seUVsZW1lbnQocik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvUHVzaEZvclJldmlld0lULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvZ2l0L1B1c2hGb3JSZXZpZXdJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDUzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvZ2l0L1B1c2hGb3JSZXZpZXdJVC5qYXZhCkBAIC0wLDAgKzEsMzA5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5hZGQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwuY2xvbmVQcm9qZWN0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLmdpdC5HaXRVdGlsLmNyZWF0ZUNvbW1pdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5jcmVhdGVQcm9qZWN0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLmdpdC5HaXRVdGlsLmluaXRTc2g7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwucHVzaEhlYWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuU3NoU2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QdXNoUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVSZWZVcGRhdGUuU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFB1c2hGb3JSZXZpZXdJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgcHJpdmF0ZSBlbnVtIFByb3RvY29sIHsKKyAgICBTU0gsIEhUVFAKKyAgfQorCisgIEBQYXJhbWV0ZXJzKG5hbWU9InswfSIpCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gZ2V0UGFyYW0oKSB7CisgICAgTGlzdDxPYmplY3RbXT4gcGFyYW1zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yKFByb3RvY29sIHAgOiBQcm90b2NvbC52YWx1ZXMoKSkgeworICAgICAgcGFyYW1zLmFkZChuZXcgT2JqZWN0W10ge3B9KTsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtczsKKyAgfQorCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBASW5qZWN0CisgIHByaXZhdGUgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gcmV2aWV3RGJQcm92aWRlcjsKKworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0OworICBwcml2YXRlIEdpdCBnaXQ7CisgIHByaXZhdGUgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgcHVibGljIFB1c2hGb3JSZXZpZXdJVChQcm90b2NvbCBwKSB7CisgICAgdGhpcy5wcm90b2NvbCA9IHA7CisgIH0KKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPQorICAgICAgICBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisKKyAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QuTmFtZUtleSgicCIpOworICAgIGluaXRTc2goYWRtaW4pOworICAgIFNzaFNlc3Npb24gc3NoU2Vzc2lvbiA9IG5ldyBTc2hTZXNzaW9uKGFkbWluKTsKKyAgICBjcmVhdGVQcm9qZWN0KHNzaFNlc3Npb24sIHByb2plY3QuZ2V0KCkpOworICAgIFN0cmluZyB1cmw7CisgICAgc3dpdGNoIChwcm90b2NvbCkgeworICAgICAgY2FzZSBTU0g6CisgICAgICAgIHVybCA9IHNzaFNlc3Npb24uZ2V0VXJsKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBIVFRQOgorICAgICAgICB1cmwgPSBhZG1pbi5nZXRIdHRwVXJsKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBwcm90b2NvbDogIiArIHByb3RvY29sKTsKKyAgICB9CisgICAgZ2l0ID0gY2xvbmVQcm9qZWN0KHVybCArICIvIiArIHByb2plY3QuZ2V0KCkpOworICAgIHNzaFNlc3Npb24uY2xvc2UoKTsKKworICAgIGRiID0gcmV2aWV3RGJQcm92aWRlci5vcGVuKCk7CisgIH0KKworICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICBkYi5jbG9zZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFB1c2hGb3JNYXN0ZXIoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgUHVzaE9uZUNvbW1pdCBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZm9yL21hc3RlciI7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuTkVXLCBQdXNoT25lQ29tbWl0LlNVQkpFQ1QsIG51bGwpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFB1c2hGb3JNYXN0ZXJXaXRoVG9waWMoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgLy8gc3BlY2lmeSB0b3BpYyBpbiByZWYKKyAgICBQdXNoT25lQ29tbWl0IHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIFN0cmluZyB0b3BpYyA9ICJteS90b3BpYyI7CisgICAgU3RyaW5nIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIvIiArIHRvcGljOworICAgIFB1c2hSZXN1bHQgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRPa1N0YXR1cyhyLCByZWYpOworICAgIGFzc2VydENoYW5nZShwdXNoLmNoYW5nZUlkLCBDaGFuZ2UuU3RhdHVzLk5FVywgUHVzaE9uZUNvbW1pdC5TVUJKRUNULCB0b3BpYyk7CisKKyAgICAvLyBzcGVjaWZ5IHRvcGljIGFzIG9wdGlvbgorICAgIHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIldG9waWM9IiArIHRvcGljOworICAgIHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5ORVcsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwgdG9waWMpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFB1c2hGb3JNYXN0ZXJXaXRoQ2MoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgLy8gY2Mgb25lIHVzZXIKKyAgICBUZXN0QWNjb3VudCB1c2VyID0gYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpOworICAgIFB1c2hPbmVDb21taXQgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgU3RyaW5nIHRvcGljID0gIm15L3RvcGljIjsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZm9yL21hc3Rlci8iICsgdG9waWMgKyAiJWNjPSIgKyB1c2VyLmVtYWlsOworICAgIFB1c2hSZXN1bHQgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRPa1N0YXR1cyhyLCByZWYpOworICAgIGFzc2VydENoYW5nZShwdXNoLmNoYW5nZUlkLCBDaGFuZ2UuU3RhdHVzLk5FVywgUHVzaE9uZUNvbW1pdC5TVUJKRUNULCB0b3BpYyk7CisKKyAgICAvLyBjYyBzZXZlcmFsIHVzZXJzCisgICAgVGVzdEFjY291bnQgdXNlcjIgPQorICAgICAgICBhY2NvdW50cy5jcmVhdGUoImFub3RoZXItdXNlciIsICJhbm90aGVyLnVzZXJAZXhhbXBsZS5jb20iLCAiQW5vdGhlciBVc2VyIik7CisgICAgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgcmVmID0gInJlZnMvZm9yL21hc3Rlci8iICsgdG9waWMgKyAiJWNjPSIgKyBhZG1pbi5lbWFpbCArICIsY2M9IiArIHVzZXIuZW1haWwKKyAgICAgICAgKyAiLGNjPSIgKyB1c2VyMi5lbWFpbDsKKyAgICByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuTkVXLCBQdXNoT25lQ29tbWl0LlNVQkpFQ1QsIHRvcGljKTsKKworICAgIC8vIGNjIG5vbi1leGlzdGluZyB1c2VyCisgICAgU3RyaW5nIG5vbkV4aXN0aW5nRW1haWwgPSAibm9uLmV4aXN0aW5nQGV4YW1wbGUuY29tIjsKKyAgICBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICByZWYgPSAicmVmcy9mb3IvbWFzdGVyLyIgKyB0b3BpYyArICIlY2M9IiArIGFkbWluLmVtYWlsICsgIixjYz0iCisgICAgICAgICsgbm9uRXhpc3RpbmdFbWFpbCArICIsY2M9IiArIHVzZXIuZW1haWw7CisgICAgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRFcnJvclN0YXR1cyhyLCAidXNlciBcIiIgKyBub25FeGlzdGluZ0VtYWlsICsgIlwiIG5vdCBmb3VuZCIsIHJlZik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck1hc3RlcldpdGhSZXZpZXdlcigpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCisgICAgICBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAvLyBhZGQgb25lIHJldmlld2VyCisgICAgVGVzdEFjY291bnQgdXNlciA9IGFjY291bnRzLmNyZWF0ZSgidXNlciIsICJ1c2VyQGV4YW1wbGUuY29tIiwgIlVzZXIiKTsKKyAgICBQdXNoT25lQ29tbWl0IHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIFN0cmluZyB0b3BpYyA9ICJteS90b3BpYyI7CisgICAgU3RyaW5nIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIvIiArIHRvcGljICsgIiVyPSIgKyB1c2VyLmVtYWlsOworICAgIFB1c2hSZXN1bHQgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRPa1N0YXR1cyhyLCByZWYpOworICAgIGFzc2VydENoYW5nZShwdXNoLmNoYW5nZUlkLCBDaGFuZ2UuU3RhdHVzLk5FVywgUHVzaE9uZUNvbW1pdC5TVUJKRUNULAorICAgICAgICB0b3BpYywgdXNlcik7CisKKyAgICAvLyBhZGQgc2V2ZXJhbCByZXZpZXdlcnMKKyAgICBUZXN0QWNjb3VudCB1c2VyMiA9CisgICAgICAgIGFjY291bnRzLmNyZWF0ZSgiYW5vdGhlci11c2VyIiwgImFub3RoZXIudXNlckBleGFtcGxlLmNvbSIsICJBbm90aGVyIFVzZXIiKTsKKyAgICBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICByZWYgPSAicmVmcy9mb3IvbWFzdGVyLyIgKyB0b3BpYyArICIlcj0iICsgYWRtaW4uZW1haWwgKyAiLHI9IiArIHVzZXIuZW1haWwKKyAgICAgICAgKyAiLHI9IiArIHVzZXIyLmVtYWlsOworICAgIHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICAvLyBhZG1pbiBpcyB0aGUgb3duZXIgb2YgdGhlIGNoYW5nZSBhbmQgc2hvdWxkIG5vdCBhcHBlYXIgYXMgcmV2aWV3ZXIKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5ORVcsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwKKyAgICAgICAgdG9waWMsIHVzZXIsIHVzZXIyKTsKKworICAgIC8vIGFkZCBub24tZXhpc3RpbmcgdXNlciBhcyByZXZpZXdlcgorICAgIFN0cmluZyBub25FeGlzdGluZ0VtYWlsID0gIm5vbi5leGlzdGluZ0BleGFtcGxlLmNvbSI7CisgICAgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgcmVmID0gInJlZnMvZm9yL21hc3Rlci8iICsgdG9waWMgKyAiJXI9IiArIGFkbWluLmVtYWlsICsgIixyPSIKKyAgICAgICAgKyBub25FeGlzdGluZ0VtYWlsICsgIixyPSIgKyB1c2VyLmVtYWlsOworICAgIHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0RXJyb3JTdGF0dXMociwgInVzZXIgXCIiICsgbm9uRXhpc3RpbmdFbWFpbCArICJcIiBub3QgZm91bmQiLCByZWYpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdFB1c2hGb3JNYXN0ZXJBc0RyYWZ0KCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAorICAgICAgSU9FeGNlcHRpb24geworICAgIC8vIGNyZWF0ZSBkcmFmdCBieSBwdXNoaW5nIHRvICdyZWZzL2RyYWZ0cy8nCisgICAgUHVzaE9uZUNvbW1pdCBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZHJhZnRzL21hc3RlciI7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuRFJBRlQsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwgbnVsbCk7CisKKyAgICAvLyBjcmVhdGUgZHJhZnQgYnkgdXNpbmcgJ2RyYWZ0JyBvcHRpb24KKyAgICBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICByZWYgPSAicmVmcy9mb3IvbWFzdGVyJWRyYWZ0IjsKKyAgICByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuRFJBRlQsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwgbnVsbCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck5vbkV4aXN0aW5nQnJhbmNoKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFB1c2hPbmVDb21taXQgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgU3RyaW5nIGJyYW5jaE5hbWUgPSAibm9uLWV4aXN0aW5nIjsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZm9yLyIgKyBicmFuY2hOYW1lOworICAgIFB1c2hSZXN1bHQgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRFcnJvclN0YXR1cyhyLCAiYnJhbmNoICIgKyBicmFuY2hOYW1lICsgIiBub3QgZm91bmQiLCByZWYpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydENoYW5nZShTdHJpbmcgY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMgZXhwZWN0ZWRTdGF0dXMsCisgICAgICBTdHJpbmcgZXhwZWN0ZWRTdWJqZWN0LCBTdHJpbmcgZXhwZWN0ZWRUb3BpYywKKyAgICAgIFRlc3RBY2NvdW50Li4uIGV4cGVjdGVkUmV2aWV3ZXJzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2UgYyA9CisgICAgICAgIEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChkYi5jaGFuZ2VzKCkuYnlLZXkobmV3IENoYW5nZS5LZXkoY2hhbmdlSWQpKS50b0xpc3QoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3ViamVjdCwgYy5nZXRTdWJqZWN0KCkpOworICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0YXR1cywgYy5nZXRTdGF0dXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVG9waWMsIFN0cmluZ3MuZW1wdHlUb051bGwoYy5nZXRUb3BpYygpKSk7CisgICAgYXNzZXJ0UmV2aWV3ZXJzKGMsIGV4cGVjdGVkUmV2aWV3ZXJzKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXZpZXdlcnMoQ2hhbmdlIGMsIFRlc3RBY2NvdW50Li4uIGV4cGVjdGVkUmV2aWV3ZXJzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgU2V0PEFjY291bnQuSWQ+IGV4cGVjdGVkUmV2aWV3ZXJJZHMgPQorICAgICAgICBTZXRzLm5ld0hhc2hTZXQoTGlzdHMudHJhbnNmb3JtKEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRSZXZpZXdlcnMpLAorICAgICAgICAgICAgbmV3IEZ1bmN0aW9uPFRlc3RBY2NvdW50LCBBY2NvdW50LklkPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyBBY2NvdW50LklkIGFwcGx5KFRlc3RBY2NvdW50IGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYS5pZDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworCisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldCgKKyAgICAgICAgYy5jdXJyZW50UGF0Y2hTZXRJZCgpKSkgeworICAgICAgYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCByZXZpZXdlciAiICsgcHNhLmdldEFjY291bnRJZCgpLAorICAgICAgICAgIGV4cGVjdGVkUmV2aWV3ZXJJZHMucmVtb3ZlKHBzYS5nZXRBY2NvdW50SWQoKSkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIHJldmlld2VyczogIiArIGV4cGVjdGVkUmV2aWV3ZXJJZHMsCisgICAgICAgIGV4cGVjdGVkUmV2aWV3ZXJJZHMuaXNFbXB0eSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0T2tTdGF0dXMoUHVzaFJlc3VsdCByZXN1bHQsIFN0cmluZyByZWYpIHsKKyAgICBhc3NlcnRTdGF0dXMoU3RhdHVzLk9LLCBudWxsLCByZXN1bHQsIHJlZik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVycm9yU3RhdHVzKFB1c2hSZXN1bHQgcmVzdWx0LAorICAgICAgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSwgU3RyaW5nIHJlZikgeworICAgIGFzc2VydFN0YXR1cyhTdGF0dXMuUkVKRUNURURfT1RIRVJfUkVBU09OLCBleHBlY3RlZE1lc3NhZ2UsIHJlc3VsdCwgcmVmKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0U3RhdHVzKFN0YXR1cyBleHBlY3RlZFN0YXR1cywKKyAgICAgIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UsIFB1c2hSZXN1bHQgcmVzdWx0LCBTdHJpbmcgcmVmKSB7CisgICAgUmVtb3RlUmVmVXBkYXRlIHJlZlVwZGF0ZSA9IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGUocmVmKTsKKyAgICBhc3NlcnRFcXVhbHMocmVmVXBkYXRlLmdldE1lc3NhZ2UoKSArICJcbiIgKyByZXN1bHQuZ2V0TWVzc2FnZXMoKSwKKyAgICAgICAgZXhwZWN0ZWRTdGF0dXMsIHJlZlVwZGF0ZS5nZXRTdGF0dXMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZSwgcmVmVXBkYXRlLmdldE1lc3NhZ2UoKSk7CisgIH0KKworICBwcml2YXRlIGNsYXNzIFB1c2hPbmVDb21taXQgeworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9OQU1FID0gImEudHh0IjsKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfQ09OVEVOVCA9ICJzb21lIGNvbnRlbnQiOworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VCSkVDVCA9ICJ0ZXN0IGNvbW1pdCI7CisgICAgU3RyaW5nIGNoYW5nZUlkOworCisgICAgcHVibGljIFB1c2hSZXN1bHQgdG8oU3RyaW5nIHJlZikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgYWRkKGdpdCwgRklMRV9OQU1FLCBGSUxFX0NPTlRFTlQpOworICAgICAgY2hhbmdlSWQgPSBjcmVhdGVDb21taXQoZ2l0LCBhZG1pbi5nZXRJZGVudCgpLCBTVUJKRUNUKTsKKyAgICAgIHJldHVybiBwdXNoSGVhZChnaXQsIHJlZik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0FjY291bnRBc3NlcnQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEFzc2VydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjY2NjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0FjY291bnRBc3NlcnQuamF2YQpAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LmFjY291bnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50QXNzZXJ0IHsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0QWNjb3VudEluZm8oVGVzdEFjY291bnQgYSwgQWNjb3VudEluZm8gYWkpIHsKKyAgICBhc3NlcnRUcnVlKGEuaWQuZ2V0KCkgPT0gYWkuX2FjY291bnRfaWQpOworICAgIGFzc2VydEVxdWFscyhhLmZ1bGxOYW1lLCBhaS5uYW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoYS5lbWFpbCwgYWkuZW1haWwpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0FjY291bnRJbmZvLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0FjY291bnRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4OGJjNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEluZm8uamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LmFjY291bnQ7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50SW5mbyB7CisgIHB1YmxpYyBJbnRlZ2VyIF9hY2NvdW50X2lkOworICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgIHB1YmxpYyBTdHJpbmcgZW1haWw7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0dldEFjY291bnRJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvYWNjb3VudC9HZXRBY2NvdW50SVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDc1NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvYWNjb3VudC9HZXRBY2NvdW50SVQuamF2YQpAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LmFjY291bnQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LmFjY291bnQuQWNjb3VudEFzc2VydC5hc3NlcnRBY2NvdW50SW5mbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdldEFjY291bnRJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBnZXROb25FeGlzdGluZ0FjY291bnRfTm90Rm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwgc2Vzc2lvbi5nZXQoIi9hY2NvdW50cy9ub24tZXhpc3RpbmciKQorICAgICAgICAuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGdldEFjY291bnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIC8vIGJ5IGZvcm1hdHRlZCBzdHJpbmcKKyAgICB0ZXN0R2V0QWNjb3VudCgiL2FjY291bnRzLyIKKyAgICAgICAgKyBVcmwuZW5jb2RlKGFkbWluLmZ1bGxOYW1lICsgIiA8IiArIGFkbWluLmVtYWlsICsgIj4iKSwgYWRtaW4pOworCisgICAgLy8gYnkgZW1haWwKKyAgICB0ZXN0R2V0QWNjb3VudCgiL2FjY291bnRzLyIgKyBhZG1pbi5lbWFpbCwgYWRtaW4pOworCisgICAgLy8gYnkgZnVsbCBuYW1lCisgICAgdGVzdEdldEFjY291bnQoIi9hY2NvdW50cy8iICsgYWRtaW4uZnVsbE5hbWUsIGFkbWluKTsKKworICAgIC8vIGJ5IGFjY291bnQgSUQKKyAgICB0ZXN0R2V0QWNjb3VudCgiL2FjY291bnRzLyIgKyBhZG1pbi5pZC5nZXQoKSwgYWRtaW4pOworCisgICAgLy8gYnkgdXNlciBuYW1lCisgICAgdGVzdEdldEFjY291bnQoIi9hY2NvdW50cy8iICsgYWRtaW4udXNlcm5hbWUsIGFkbWluKTsKKworICAgIC8vIGJ5ICdzZWxmJworICAgIHRlc3RHZXRBY2NvdW50KCIvYWNjb3VudHMvc2VsZiIsIGFkbWluKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB0ZXN0R2V0QWNjb3VudChTdHJpbmcgdXJsLCBUZXN0QWNjb3VudCBleHBlY3RlZEFjY291bnQpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQodXJsKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIEFjY291bnRJbmZvIGFjY291bnQgPQorICAgICAgICAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgICAgIG5ldyBUeXBlVG9rZW48QWNjb3VudEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRBY2NvdW50SW5mbyhleHBlY3RlZEFjY291bnQsIGFjY291bnQpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9BZGRSZW1vdmVHcm91cE1lbWJlcnNJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvQWRkUmVtb3ZlR3JvdXBNZW1iZXJzSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU0ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvQWRkUmVtb3ZlR3JvdXBNZW1iZXJzSVQuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudC5BY2NvdW50QXNzZXJ0LmFzc2VydEFjY291bnRJbmZvOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBJbmZvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BYnN0cmFjdERhZW1vblRlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BY2NvdW50Q3JlYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBBZGRSZW1vdmVHcm91cE1lbWJlcnNJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiByZXZpZXdEYlByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFJldmlld0RiIGRiOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgICBkYiA9IHJldmlld0RiUHJvdmlkZXIub3BlbigpOworICB9CisKKyAgQEFmdGVyCisgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIGRiLmNsb3NlKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhZGRUb05vbkV4aXN0aW5nR3JvdXBfTm90Rm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwKKyAgICAgICAgUFVUKCIvZ3JvdXBzL25vbi1leGlzdGluZy9tZW1iZXJzL2FkbWluIikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHJlbW92ZUZyb21Ob25FeGlzdGluZ0dyb3VwX05vdEZvdW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19OT1RfRk9VTkQsCisgICAgICAgIERFTEVURSgiL2dyb3Vwcy9ub24tZXhpc3RpbmcvbWVtYmVycy9hZG1pbiIpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFkZFJlbW92ZU1lbWJlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBY2NvdW50IHUgPSBhY2NvdW50cy5jcmVhdGUoInVzZXIiLCAidXNlckBleGFtcGxlLmNvbSIsICJGdWxsIE5hbWUiKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9tZW1iZXJzL3VzZXIiKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19DUkVBVEVELCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgQWNjb3VudEluZm8gYWkgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxBY2NvdW50SW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEFjY291bnRJbmZvKHUsIGFpKTsKKyAgICBhc3NlcnRNZW1iZXJzKCJBZG1pbmlzdHJhdG9ycyIsIGFkbWluLCB1KTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PX0NPTlRFTlQsCisgICAgICAgIERFTEVURSgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9tZW1iZXJzL3VzZXIiKSk7CisgICAgYXNzZXJ0TWVtYmVycygiQWRtaW5pc3RyYXRvcnMiLCBhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhZGRFeGlzdGluZ01lbWJlcl9PSygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssCisgICAgICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9tZW1iZXJzL2FkbWluIikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFkZE11bHRpcGxlTWVtYmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJ1c2VycyIpOworICAgIFRlc3RBY2NvdW50IHUxID0gYWNjb3VudHMuY3JlYXRlKCJ1MSIsICJ1MUBleGFtcGxlLmNvbSIsICJGdWxsIE5hbWUgMSIpOworICAgIFRlc3RBY2NvdW50IHUyID0gYWNjb3VudHMuY3JlYXRlKCJ1MiIsICJ1MkBleGFtcGxlLmNvbSIsICJGdWxsIE5hbWUgMiIpOworICAgIE1lbWJlcnNJbnB1dCBpbnB1dCA9IG5ldyBNZW1iZXJzSW5wdXQoKTsKKyAgICBpbnB1dC5tZW1iZXJzID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIGlucHV0Lm1lbWJlcnMuYWRkKHUxLnVzZXJuYW1lKTsKKyAgICBpbnB1dC5tZW1iZXJzLmFkZCh1Mi51c2VybmFtZSk7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBQT1NUKCIvZ3JvdXBzL3VzZXJzL21lbWJlcnMiLCBpbnB1dCk7CisgICAgTGlzdDxBY2NvdW50SW5mbz4gYWkgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxMaXN0PEFjY291bnRJbmZvPj4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydE1lbWJlcnMoYWksIHUxLCB1Mik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpbmNsdWRlUmVtb3ZlR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBncm91cCgibmV3R3JvdXAiKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvbmV3R3JvdXAiKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19DUkVBVEVELCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgR3JvdXBJbmZvIGkgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxHcm91cEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICByLmNvbnN1bWUoKTsKKyAgICBhc3NlcnRHcm91cEluZm8oZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJuZXdHcm91cCIpKSwgaSk7CisgICAgYXNzZXJ0SW5jbHVkZXMoIkFkbWluaXN0cmF0b3JzIiwgIm5ld0dyb3VwIik7CisKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19OT19DT05URU5ULAorICAgICAgICBERUxFVEUoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzL25ld0dyb3VwIikpOworICAgIGFzc2VydE5vSW5jbHVkZXMoIkFkbWluaXN0cmF0b3JzIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBpbmNsdWRlRXhpc3RpbmdHcm91cF9PSygpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJuZXdHcm91cCIpOworICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvbmV3R3JvdXAiKS5jb25zdW1lKCk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssCisgICAgICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvbmV3R3JvdXAiKS5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYWRkTXVsdGlwbGVJbmNsdWRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJuZXdHcm91cDEiKTsKKyAgICBncm91cCgibmV3R3JvdXAyIik7CisgICAgR3JvdXBzSW5wdXQgaW5wdXQgPSBuZXcgR3JvdXBzSW5wdXQoKTsKKyAgICBpbnB1dC5ncm91cHMgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgaW5wdXQuZ3JvdXBzLmFkZCgibmV3R3JvdXAxIik7CisgICAgaW5wdXQuZ3JvdXBzLmFkZCgibmV3R3JvdXAyIik7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBQT1NUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3VwcyIsIGlucHV0KTsKKyAgICBMaXN0PEdyb3VwSW5mbz4gZ2kgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxMaXN0PEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRJbmNsdWRlcyhnaSwgIm5ld0dyb3VwMSIsICJuZXdHcm91cDIiKTsKKyAgfQorCisgIHByaXZhdGUgUmVzdFJlc3BvbnNlIFBVVChTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHNlc3Npb24ucHV0KGVuZHBvaW50KTsKKyAgfQorCisgIHByaXZhdGUgaW50IERFTEVURShTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmRlbGV0ZShlbmRwb2ludCk7CisgICAgci5jb25zdW1lKCk7CisgICAgcmV0dXJuIHIuZ2V0U3RhdHVzQ29kZSgpOworICB9CisKKyAgcHJpdmF0ZSBSZXN0UmVzcG9uc2UgUE9TVChTdHJpbmcgZW5kUG9pbnQsIE1lbWJlcnNJbnB1dCBtaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc2Vzc2lvbi5wb3N0KGVuZFBvaW50LCBtaSk7CisgIH0KKworICBwcml2YXRlIFJlc3RSZXNwb25zZSBQT1NUKFN0cmluZyBlbmRQb2ludCwgR3JvdXBzSW5wdXQgZ2kpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHNlc3Npb24ucG9zdChlbmRQb2ludCwgZ2kpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdyb3VwKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdyb3VwSW5wdXQgaW4gPSBuZXcgR3JvdXBJbnB1dCgpOworICAgIHNlc3Npb24ucHV0KCIvZ3JvdXBzLyIgKyBuYW1lLCBpbikuY29uc3VtZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydE1lbWJlcnMoU3RyaW5nIGdyb3VwLCBUZXN0QWNjb3VudC4uLiBtZW1iZXJzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGcgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoZ3JvdXApKTsKKyAgICBTZXQ8QWNjb3VudC5JZD4gaWRzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgUmVzdWx0U2V0PEFjY291bnRHcm91cE1lbWJlcj4gYWxsID0KKyAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmJ5R3JvdXAoZy5nZXRJZCgpKTsKKyAgICBmb3IgKEFjY291bnRHcm91cE1lbWJlciBtIDogYWxsKSB7CisgICAgICBpZHMuYWRkKG0uZ2V0QWNjb3VudElkKCkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGlkcy5zaXplKCkgPT0gbWVtYmVycy5sZW5ndGgpOworICAgIGZvciAoVGVzdEFjY291bnQgYSA6IG1lbWJlcnMpIHsKKyAgICAgIGFzc2VydFRydWUoaWRzLmNvbnRhaW5zKGEuaWQpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVtYmVycyhMaXN0PEFjY291bnRJbmZvPiBhaSwgVGVzdEFjY291bnQuLi4gbWVtYmVycykgeworICAgIE1hcDxJbnRlZ2VyLCBBY2NvdW50SW5mbz4gaW5mb0J5SWQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKEFjY291bnRJbmZvIGkgOiBhaSkgeworICAgICAgaW5mb0J5SWQucHV0KGkuX2FjY291bnRfaWQsIGkpOworICAgIH0KKworICAgIGZvciAoVGVzdEFjY291bnQgYSA6IG1lbWJlcnMpIHsKKyAgICAgIEFjY291bnRJbmZvIGkgPSBpbmZvQnlJZC5nZXQoYS5pZC5nZXQoKSk7CisgICAgICBhc3NlcnROb3ROdWxsKGkpOworICAgICAgYXNzZXJ0QWNjb3VudEluZm8oYSwgaSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhhaS5zaXplKCksIG1lbWJlcnMubGVuZ3RoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJbmNsdWRlcyhTdHJpbmcgZ3JvdXAsIFN0cmluZy4uLiBpbmNsdWRlcykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBnID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KGdyb3VwKSk7CisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gYWxsID0KKyAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5ieUdyb3VwKGcuZ2V0SWQoKSk7CisgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIG0gOiBhbGwpIHsKKyAgICAgIGlkcy5hZGQobS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZShpZHMuc2l6ZSgpID09IGluY2x1ZGVzLmxlbmd0aCk7CisgICAgZm9yIChTdHJpbmcgaSA6IGluY2x1ZGVzKSB7CisgICAgICBBY2NvdW50R3JvdXAuVVVJRCBpZCA9IGdyb3VwQ2FjaGUuZ2V0KAorICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShpKSkuZ2V0R3JvdXBVVUlEKCk7CisgICAgICBhc3NlcnRUcnVlKGlkcy5jb250YWlucyhpZCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJbmNsdWRlcyhMaXN0PEdyb3VwSW5mbz4gZ2ksIFN0cmluZy4uLiBpbmNsdWRlcykgeworICAgIE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4gZ3JvdXBzQnlOYW1lID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChHcm91cEluZm8gaSA6IGdpKSB7CisgICAgICBncm91cHNCeU5hbWUucHV0KGkubmFtZSwgaSk7CisgICAgfQorCisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGluY2x1ZGVzKSB7CisgICAgICBHcm91cEluZm8gaSA9IGdyb3Vwc0J5TmFtZS5nZXQobmFtZSk7CisgICAgICBhc3NlcnROb3ROdWxsKGkpOworICAgICAgYXNzZXJ0R3JvdXBJbmZvKGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShuYW1lKSksIGkpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoZ2kuc2l6ZSgpLCBpbmNsdWRlcy5sZW5ndGgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vSW5jbHVkZXMoU3RyaW5nIGdyb3VwKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgZyA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShncm91cCkpOworICAgIEl0ZXJhdG9yPEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGl0ID0KKyAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5ieUdyb3VwKGcuZ2V0SWQoKSkuaXRlcmF0b3IoKTsKKyAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9DcmVhdGVHcm91cElULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9DcmVhdGVHcm91cElULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY0MWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0NyZWF0ZUdyb3VwSVQuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBJbmZvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIENyZWF0ZUdyb3VwSVQgZXh0ZW5kcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBASW5qZWN0CisgIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlR3JvdXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdHcm91cE5hbWUgPSAibmV3R3JvdXAiOworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5wdXQoIi9ncm91cHMvIiArIG5ld0dyb3VwTmFtZSk7CisgICAgR3JvdXBJbmZvIGcgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxHcm91cEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3R3JvdXBOYW1lLCBnLm5hbWUpOworICAgIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShuZXdHcm91cE5hbWUpKTsKKyAgICBhc3NlcnROb3ROdWxsKGdyb3VwKTsKKyAgICBhc3NlcnRHcm91cEluZm8oZ3JvdXAsIGcpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUdyb3VwV2l0aFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdHcm91cE5hbWUgPSAibmV3R3JvdXAiOworICAgIEdyb3VwSW5wdXQgaW4gPSBuZXcgR3JvdXBJbnB1dCgpOworICAgIGluLmRlc2NyaXB0aW9uID0gIlRlc3QgZGVzY3JpcHRpb24iOworICAgIGluLnZpc2libGVfdG9fYWxsID0gdHJ1ZTsKKyAgICBpbi5vd25lcl9pZCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKSkuZ2V0R3JvdXBVVUlEKCkuZ2V0KCk7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL2dyb3Vwcy8iICsgbmV3R3JvdXBOYW1lLCBpbik7CisgICAgR3JvdXBJbmZvIGcgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxHcm91cEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3R3JvdXBOYW1lLCBnLm5hbWUpOworICAgIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShuZXdHcm91cE5hbWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4uZGVzY3JpcHRpb24sIGdyb3VwLmdldERlc2NyaXB0aW9uKCkpOworICAgIGFzc2VydEVxdWFscyhpbi52aXNpYmxlX3RvX2FsbCwgZ3JvdXAuaXNWaXNpYmxlVG9BbGwoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLm93bmVyX2lkLCBncm91cC5nZXRPd25lckdyb3VwVVVJRCgpLmdldCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVHcm91cFdpdGhvdXRDYXBhYmlsaXR5X0ZvcmJpZGRlbigpIHRocm93cyBPcm1FeGNlcHRpb24sCisgICAgICBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgVGVzdEFjY291bnQgdXNlciA9IGFjY291bnRzLmNyZWF0ZSgidXNlciIsICJ1c2VyQGV4YW1wbGUuY29tIiwgIlVzZXIiKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IChuZXcgUmVzdFNlc3Npb24odXNlcikpLnB1dCgiL2dyb3Vwcy9uZXdHcm91cCIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0ZPUkJJRERFTiwgci5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUdyb3VwV2hlbkdyb3VwQWxyZWFkeUV4aXN0c19Db25mbGljdCgpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycyIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NPTkZMSUNULCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dldEdyb3VwSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dldEdyb3VwSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmUzODZkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR2V0R3JvdXBJVC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwLkdyb3VwQXNzZXJ0LmFzc2VydEdyb3VwSW5mbzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHZXRHcm91cElUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJhZG1pbkBleGFtcGxlLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEdldEdyb3VwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgYWRtaW5Hcm91cCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKSk7CisKKyAgICAvLyBieSBVVUlECisgICAgdGVzdEdldEdyb3VwKCIvZ3JvdXBzLyIgKyBhZG1pbkdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpLCBhZG1pbkdyb3VwKTsKKworICAgIC8vIGJ5IG5hbWUKKyAgICB0ZXN0R2V0R3JvdXAoIi9ncm91cHMvIiArIGFkbWluR3JvdXAuZ2V0TmFtZSgpLCBhZG1pbkdyb3VwKTsKKworICAgIC8vIGJ5IGxlZ2FjeSBudW1lcmljIElECisgICAgdGVzdEdldEdyb3VwKCIvZ3JvdXBzLyIgKyBhZG1pbkdyb3VwLmdldElkKCkuZ2V0KCksIGFkbWluR3JvdXApOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRHcm91cChTdHJpbmcgdXJsLCBBY2NvdW50R3JvdXAgZXhwZWN0ZWRHcm91cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KHVybCk7CisgICAgR3JvdXBJbmZvIGdyb3VwID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48R3JvdXBJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0R3JvdXBJbmZvKGV4cGVjdGVkR3JvdXAsIGdyb3VwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBBc3NlcnQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwQXNzZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZDhjNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwQXNzZXJ0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEdyb3VwQXNzZXJ0IHsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0R3JvdXBzKEl0ZXJhYmxlPFN0cmluZz4gZXhwZWN0ZWQsIFNldDxTdHJpbmc+IGFjdHVhbCkgeworICAgIGZvciAoU3RyaW5nIGcgOiBleHBlY3RlZCkgeworICAgICAgYXNzZXJ0VHJ1ZSgibWlzc2luZyBncm91cCAiICsgZywgYWN0dWFsLnJlbW92ZShnKSk7CisgICAgfQorICAgIGFzc2VydFRydWUoInVuZXhwZWN0ZWQgZ3JvdXBzOiAiICsgYWN0dWFsLCBhY3R1YWwuaXNFbXB0eSgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRHcm91cEluZm8oQWNjb3VudEdyb3VwIGdyb3VwLCBHcm91cEluZm8gaW5mbykgeworICAgIGlmIChpbmZvLm5hbWUgIT0gbnVsbCkgeworICAgICAgLy8gJ25hbWUnIGlzIG5vdCBzZXQgaWYgcmV0dXJuZWQgaW4gYSBtYXAKKyAgICAgIGFzc2VydEVxdWFscyhncm91cC5nZXROYW1lKCksIGluZm8ubmFtZSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhncm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKSwgVXJsLmRlY29kZShpbmZvLmlkKSk7CisgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihncm91cC5nZXRJZCgpLmdldCgpKSwgaW5mby5ncm91cF9pZCk7CisgICAgYXNzZXJ0RXF1YWxzKCIjL2FkbWluL2dyb3Vwcy91dWlkLSIgKyBVcmwuZW5jb2RlKGdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpKSwgaW5mby51cmwpOworICAgIGFzc2VydEVxdWFscyhncm91cC5pc1Zpc2libGVUb0FsbCgpLCB0b0Jvb2xlYW4oaW5mby5vcHRpb25zLnZpc2libGVfdG9fYWxsKSk7CisgICAgYXNzZXJ0RXF1YWxzKGdyb3VwLmdldERlc2NyaXB0aW9uKCksIGluZm8uZGVzY3JpcHRpb24pOworICAgIGFzc2VydEVxdWFscyhncm91cC5nZXRPd25lckdyb3VwVVVJRCgpLmdldCgpLCBVcmwuZGVjb2RlKGluZm8ub3duZXJfaWQpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0b0Jvb2xlYW4oQm9vbGVhbiBiKSB7CisgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBJbmZvLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDhmOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBJbmZvLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworcHVibGljIGNsYXNzIEdyb3VwSW5mbyB7CisgIHB1YmxpYyBTdHJpbmcgaWQ7CisgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgcHVibGljIFN0cmluZyB1cmw7CisgIHB1YmxpYyBHcm91cE9wdGlvbnNJbmZvIG9wdGlvbnM7CisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247CisgIHB1YmxpYyBJbnRlZ2VyIGdyb3VwX2lkOworICBwdWJsaWMgU3RyaW5nIG93bmVyX2lkOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBJbnB1dC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODY0ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK3B1YmxpYyBjbGFzcyBHcm91cElucHV0IHsKKyAgU3RyaW5nIGRlc2NyaXB0aW9uOworICBCb29sZWFuIHZpc2libGVfdG9fYWxsOworICBTdHJpbmcgb3duZXJfaWQ7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cE9wdGlvbnNJbmZvLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cE9wdGlvbnNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1N2ZiNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwT3B0aW9uc0luZm8uamF2YQpAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitwdWJsaWMgY2xhc3MgR3JvdXBPcHRpb25zSW5mbyB7CisgIHB1YmxpYyBCb29sZWFuIHZpc2libGVfdG9fYWxsOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBQcm9wZXJ0aWVzSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwUHJvcGVydGllc0lULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMjM2NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwUHJvcGVydGllc0lULmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwLkdyb3VwQXNzZXJ0LnRvQm9vbGVhbjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwLkdyb3VwQXNzZXJ0LmFzc2VydEdyb3VwSW5mbzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR3JvdXBQcm9wZXJ0aWVzSVQgZXh0ZW5kcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBASW5qZWN0CisgIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAuTmFtZUtleSBhZG1pbkdyb3VwTmFtZSA9IG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBTdHJpbmcgdXJsID0gIi9ncm91cHMvIiArIGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXBOYW1lKS5nZXRHcm91cFVVSUQoKS5nZXQoKSArICIvbmFtZSI7CisKKyAgICAvLyBnZXQgbmFtZQorICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQodXJsKTsKKyAgICBTdHJpbmcgbmFtZSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPFN0cmluZz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJBZG1pbmlzdHJhdG9ycyIsIG5hbWUpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gc2V0IG5hbWUgd2l0aCBuYW1lIGNvbmZsaWN0CisgICAgR3JvdXBOYW1lSW5wdXQgaW4gPSBuZXcgR3JvdXBOYW1lSW5wdXQoKTsKKyAgICBpbi5uYW1lID0gIlJlZ2lzdGVyZWQgVXNlcnMiOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19DT05GTElDVCwgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gc2V0IG5hbWUgdG8gc2FtZSBuYW1lCisgICAgaW4gPSBuZXcgR3JvdXBOYW1lSW5wdXQoKTsKKyAgICBpbi5uYW1lID0gIkFkbWluaXN0cmF0b3JzIjsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIC8vIHJlbmFtZQorICAgIGluID0gbmV3IEdyb3VwTmFtZUlucHV0KCk7CisgICAgaW4ubmFtZSA9ICJBZG1pbnMiOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBTdHJpbmcgbmV3TmFtZSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPFN0cmluZz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0Tm90TnVsbChncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoaW4ubmFtZSkpKTsKKyAgICBhc3NlcnROdWxsKGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXBOYW1lKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLm5hbWUsIG5ld05hbWUpOworICAgIHIuY29uc3VtZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEdyb3VwRGVzY3JpcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGFkbWluR3JvdXBOYW1lID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpOworICAgIEFjY291bnRHcm91cCBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIFN0cmluZyB1cmwgPSAiL2dyb3Vwcy8iICsgYWRtaW5Hcm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKSArICIvZGVzY3JpcHRpb24iOworCisgICAgLy8gZ2V0IGRlc2NyaXB0aW9uCisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCh1cmwpOworICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPFN0cmluZz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFkbWluR3JvdXAuZ2V0RGVzY3JpcHRpb24oKSwgZGVzY3JpcHRpb24pOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gc2V0IGRlc2NyaXB0aW9uCisgICAgR3JvdXBEZXNjcmlwdGlvbklucHV0IGluID0gbmV3IEdyb3VwRGVzY3JpcHRpb25JbnB1dCgpOworICAgIGluLmRlc2NyaXB0aW9uID0gIkFsbCB1c2VycyB0aGF0IGNhbiBhZG1pbmlzdHJhdGUgdGhlIEdlcnJpdCBTZXJ2ZXIuIjsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48U3RyaW5nPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4uZGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydEVxdWFscyhpbi5kZXNjcmlwdGlvbiwgYWRtaW5Hcm91cC5nZXREZXNjcmlwdGlvbigpKTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIC8vIGRlbGV0ZSBkZXNjcmlwdGlvbgorICAgIHIgPSBzZXNzaW9uLmRlbGV0ZSh1cmwpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PX0NPTlRFTlQsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydE51bGwoYWRtaW5Hcm91cC5nZXREZXNjcmlwdGlvbigpKTsKKworICAgIC8vIHNldCBkZXNjcmlwdGlvbiB0byBlbXB0eSBzdHJpbmcKKyAgICBpbiA9IG5ldyBHcm91cERlc2NyaXB0aW9uSW5wdXQoKTsKKyAgICBpbi5kZXNjcmlwdGlvbiA9ICIiOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19OT19DT05URU5ULCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYWRtaW5Hcm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXBOYW1lKTsKKyAgICBhc3NlcnROdWxsKGFkbWluR3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBPcHRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAuTmFtZUtleSBhZG1pbkdyb3VwTmFtZSA9IG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBBY2NvdW50R3JvdXAgYWRtaW5Hcm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXBOYW1lKTsKKyAgICBTdHJpbmcgdXJsID0gIi9ncm91cHMvIiArIGFkbWluR3JvdXAuZ2V0R3JvdXBVVUlEKCkuZ2V0KCkgKyAiL29wdGlvbnMiOworCisgICAgLy8gZ2V0IG9wdGlvbnMKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KHVybCk7CisgICAgR3JvdXBPcHRpb25zSW5mbyBvcHRpb25zID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48R3JvdXBPcHRpb25zSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGFkbWluR3JvdXAuaXNWaXNpYmxlVG9BbGwoKSwgdG9Cb29sZWFuKG9wdGlvbnMudmlzaWJsZV90b19hbGwpKTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIC8vIHNldCBvcHRpb25zCisgICAgR3JvdXBPcHRpb25zSW5wdXQgaW4gPSBuZXcgR3JvdXBPcHRpb25zSW5wdXQoKTsKKyAgICBpbi52aXNpYmxlX3RvX2FsbCA9ICFhZG1pbkdyb3VwLmlzVmlzaWJsZVRvQWxsKCk7CisgICAgciA9IHNlc3Npb24ucHV0KHVybCwgaW4pOworICAgIEdyb3VwT3B0aW9uc0luZm8gbmV3T3B0aW9ucyA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwT3B0aW9uc0luZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIGFzc2VydEVxdWFscyhpbi52aXNpYmxlX3RvX2FsbCwgdG9Cb29sZWFuKG5ld09wdGlvbnMudmlzaWJsZV90b19hbGwpKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydEVxdWFscyhpbi52aXNpYmxlX3RvX2FsbCwgYWRtaW5Hcm91cC5pc1Zpc2libGVUb0FsbCgpKTsKKyAgICByLmNvbnN1bWUoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHcm91cE93bmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAuTmFtZUtleSBhZG1pbkdyb3VwTmFtZSA9IG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBBY2NvdW50R3JvdXAgYWRtaW5Hcm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXBOYW1lKTsKKyAgICBTdHJpbmcgdXJsID0gIi9ncm91cHMvIiArIGFkbWluR3JvdXAuZ2V0R3JvdXBVVUlEKCkuZ2V0KCkgKyAiL293bmVyIjsKKworICAgIC8vIGdldCBvd25lcgorICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQodXJsKTsKKyAgICBHcm91cEluZm8gb3B0aW9ucyA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0R3JvdXBJbmZvKGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXAuZ2V0T3duZXJHcm91cFVVSUQoKSksIG9wdGlvbnMpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gc2V0IG93bmVyIGJ5IG5hbWUKKyAgICBHcm91cE93bmVySW5wdXQgaW4gPSBuZXcgR3JvdXBPd25lcklucHV0KCk7CisgICAgaW4ub3duZXIgPSAiUmVnaXN0ZXJlZCBVc2VycyI7CisgICAgciA9IHNlc3Npb24ucHV0KHVybCwgaW4pOworICAgIEdyb3VwSW5mbyBuZXdPd25lciA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLm93bmVyLCBuZXdPd25lci5uYW1lKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydEdyb3VwSW5mbyhncm91cENhY2hlLmdldChhZG1pbkdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkpLCBuZXdPd25lcik7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgb3duZXIgYnkgVVVJRAorICAgIGluID0gbmV3IEdyb3VwT3duZXJJbnB1dCgpOworICAgIGluLm93bmVyID0gYWRtaW5Hcm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKTsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydEVxdWFscyhpbi5vd25lciwgZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cC5nZXRPd25lckdyb3VwVVVJRCgpKS5nZXRHcm91cFVVSUQoKS5nZXQoKSk7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgbm9uIGV4aXN0aW5nIG93bmVyCisgICAgaW4gPSBuZXcgR3JvdXBPd25lcklucHV0KCk7CisgICAgaW4ub3duZXIgPSAiTm9uLUV4aXN0aW5nIEdyb3VwIjsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfVU5QUk9DRVNTQUJMRV9FTlRJVFksIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICByLmNvbnN1bWUoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwTmFtZUlucHV0IHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwRGVzY3JpcHRpb25JbnB1dCB7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JvdXBPcHRpb25zSW5wdXQgeworICAgIEJvb2xlYW4gdmlzaWJsZV90b19hbGw7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcm91cE93bmVySW5wdXQgeworICAgIFN0cmluZyBvd25lcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBzSW5wdXQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3Vwc0lucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZWRhOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3Vwc0lucHV0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR3JvdXBzSW5wdXQgeworICBMaXN0PFN0cmluZz4gZ3JvdXBzOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvTGlzdEdyb3VwSW5jbHVkZXNJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvTGlzdEdyb3VwSW5jbHVkZXNJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2Y0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBJbmNsdWRlc0lULmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db2xsZWN0aW9uczI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BYnN0cmFjdERhZW1vblRlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BY2NvdW50Q3JlYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIExpc3RHcm91cEluY2x1ZGVzSVQgZXh0ZW5kcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBY2NvdW50IGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdE5vbkV4aXN0aW5nR3JvdXBJbmNsdWRlc19Ob3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwKKyAgICAgIHNlc3Npb24uZ2V0KCIvZ3JvdXBzL25vbi1leGlzdGluZy9ncm91cHMvIikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RFbXB0eUdyb3VwSW5jbHVkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRUcnVlKEdFVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvIikuaXNFbXB0eSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3ROb25FbXB0eUdyb3VwSW5jbHVkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBncm91cCgiZ3giLCAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBncm91cCgiZ3kiLCAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBQVVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzL2d4Iik7CisgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9neSIpOworCisgICAgYXNzZXJ0SW5jbHVkZXMoR0VUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy8iKSwgImd4IiwgImd5Iik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBsaXN0T25lSW5jbHVkZU1lbWJlcigpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJneCIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGdyb3VwKCJneSIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvZ3giKTsKKyAgICBQVVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzL2d5Iik7CisKKyAgICBhc3NlcnRFcXVhbHMoR0VUX09ORSgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvZ3giKS5uYW1lLCAiZ3giKTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxHcm91cEluZm8+IEdFVChTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldChlbmRwb2ludCk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICByZXR1cm4gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksCisgICAgICAgIG5ldyBUeXBlVG9rZW48TGlzdDxHcm91cEluZm8+PigpIHt9LmdldFR5cGUoKSk7CisgIH0KKworICBwcml2YXRlIEdyb3VwSW5mbyBHRVRfT05FKFN0cmluZyBlbmRwb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KGVuZHBvaW50KTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIHJldHVybiAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxHcm91cEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBQVVQoU3RyaW5nIGVuZHBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNlc3Npb24ucHV0KGVuZHBvaW50KS5jb25zdW1lKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JvdXAoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckdyb3VwKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEdyb3VwSW5wdXQgaW4gPSBuZXcgR3JvdXBJbnB1dCgpOworICAgIGluLm93bmVyX2lkID0gb3duZXJHcm91cDsKKyAgICBzZXNzaW9uLnB1dCgiL2dyb3Vwcy8iICsgbmFtZSwgaW4pLmNvbnN1bWUoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRJbmNsdWRlcyhMaXN0PEdyb3VwSW5mbz4gaW5jbHVkZXMsIFN0cmluZyBuYW1lLAorICAgICAgU3RyaW5nLi4uIG5hbWVzKSB7CisgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGluY2x1ZGVOYW1lcyA9IENvbGxlY3Rpb25zMi50cmFuc2Zvcm0oaW5jbHVkZXMsCisgICAgICAgIG5ldyBGdW5jdGlvbjxHcm91cEluZm8sIFN0cmluZz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShATnVsbGFibGUgR3JvdXBJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLm5hbWU7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBhc3NlcnRUcnVlKGluY2x1ZGVOYW1lcy5jb250YWlucyhuYW1lKSk7CisgICAgZm9yIChTdHJpbmcgbiA6IG5hbWVzKSB7CisgICAgICBhc3NlcnRUcnVlKGluY2x1ZGVOYW1lcy5jb250YWlucyhuKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhpbmNsdWRlcy5zaXplKCksIG5hbWVzLmxlbmd0aCArIDEpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBNZW1iZXJzSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cE1lbWJlcnNJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWEzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBNZW1iZXJzSVQuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgTGlzdEdyb3VwTWVtYmVyc0lUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUZXN0QWNjb3VudCBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3ROb25FeGlzdGluZ0dyb3VwTWVtYmVyc19Ob3RGb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwKKyAgICAgICAgc2Vzc2lvbi5nZXQoIi9ncm91cHMvbm9uLWV4aXN0aW5nL21lbWJlcnMvIikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RFbXB0eUdyb3VwTWVtYmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJlbXB0eSIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGFzc2VydFRydWUoR0VUKCIvZ3JvdXBzL2VtcHR5L21lbWJlcnMvIikuaXNFbXB0eSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3ROb25FbXB0eUdyb3VwTWVtYmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydE1lbWJlcnMoR0VUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvIiksICJhZG1pbiIpOworCisgICAgYWNjb3VudHMuY3JlYXRlKCJhZG1pbjIiLCAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBhc3NlcnRNZW1iZXJzKEdFVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9tZW1iZXJzLyIpLCAiYWRtaW4iLCAiYWRtaW4yIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBsaXN0T25lR3JvdXBNZW1iZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhHRVRfT05FKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvYWRtaW4iKS5uYW1lLAorICAgICAgICAiYWRtaW4iKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RHcm91cE1lbWJlcnNSZWN1cnNpdmVseSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJneCIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGFjY291bnRzLmNyZWF0ZSgidXgiLCAiZ3giKTsKKworICAgIGdyb3VwKCJneSIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGFjY291bnRzLmNyZWF0ZSgidXkiLCAiZ3kiKTsKKworICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvZ3giKTsKKyAgICBQVVQoIi9ncm91cHMvZ3gvZ3JvdXBzL2d5Iik7CisgICAgYXNzZXJ0TWVtYmVycyhHRVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvbWVtYmVycy8/cmVjdXJzaXZlIiksCisgICAgICAgICJhZG1pbiIsICJ1eCIsICJ1eSIpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEFjY291bnRJbmZvPiBHRVQoU3RyaW5nIGVuZHBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQoZW5kcG9pbnQpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgcmV0dXJuIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPExpc3Q8QWNjb3VudEluZm8+PigpIHt9LmdldFR5cGUoKSk7CisgIH0KKworICBwcml2YXRlIEFjY291bnRJbmZvIEdFVF9PTkUoU3RyaW5nIGVuZHBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQoZW5kcG9pbnQpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgcmV0dXJuIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPEFjY291bnRJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgUFVUKFN0cmluZyBlbmRwb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzZXNzaW9uLnB1dChlbmRwb2ludCkuY29uc3VtZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdyb3VwKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJHcm91cCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR3JvdXBJbnB1dCBpbiA9IG5ldyBHcm91cElucHV0KCk7CisgICAgaW4ub3duZXJfaWQgPSBvd25lckdyb3VwOworICAgIHNlc3Npb24ucHV0KCIvZ3JvdXBzLyIgKyBuYW1lLCBpbikuY29uc3VtZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydE1lbWJlcnMoTGlzdDxBY2NvdW50SW5mbz4gbWVtYmVycywgU3RyaW5nIG5hbWUsCisgICAgICBTdHJpbmcuLi4gbmFtZXMpIHsKKyAgICBDb2xsZWN0aW9uPFN0cmluZz4gbWVtYmVyTmFtZXMgPSBDb2xsZWN0aW9uczIudHJhbnNmb3JtKG1lbWJlcnMsCisgICAgICAgIG5ldyBGdW5jdGlvbjxBY2NvdW50SW5mbywgU3RyaW5nPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KEBOdWxsYWJsZSBBY2NvdW50SW5mbyBpbmZvKSB7CisgICAgICAgICAgICByZXR1cm4gaW5mby5uYW1lOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICBhc3NlcnRUcnVlKG1lbWJlck5hbWVzLmNvbnRhaW5zKG5hbWUpKTsKKyAgICBmb3IgKFN0cmluZyBuIDogbmFtZXMpIHsKKyAgICAgIGFzc2VydFRydWUobWVtYmVyTmFtZXMuY29udGFpbnMobikpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMobWVtYmVycy5zaXplKCksIG5hbWVzLmxlbmd0aCArIDEpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBzSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cHNJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzdjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBzSVQuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBJbmZvOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BYnN0cmFjdERhZW1vblRlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BY2NvdW50Q3JlYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIExpc3RHcm91cHNJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RMaXN0QWxsR3JvdXBzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEl0ZXJhYmxlPFN0cmluZz4gZXhwZWN0ZWRHcm91cHMgPSBJdGVyYWJsZXMudHJhbnNmb3JtKGdyb3VwQ2FjaGUuYWxsKCksCisgICAgICAgIG5ldyBGdW5jdGlvbjxBY2NvdW50R3JvdXAsIFN0cmluZz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgQE51bGxhYmxlCisgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShATnVsbGFibGUgQWNjb3VudEdyb3VwIGdyb3VwKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXAuZ2V0TmFtZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCgiL2dyb3Vwcy8iKTsKKyAgICBNYXA8U3RyaW5nLCBHcm91cEluZm8+IHJlc3VsdCA9CisgICAgICAgIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRHcm91cHMoZXhwZWN0ZWRHcm91cHMsIHJlc3VsdC5rZXlTZXQoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0T25seVZpc2libGVHcm91cHNSZXR1cm5lZCgpIHRocm93cyBPcm1FeGNlcHRpb24sCisgICAgICBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWRHcm91cHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBleHBlY3RlZEdyb3Vwcy5hZGQoIkFub255bW91cyBVc2VycyIpOworICAgIGV4cGVjdGVkR3JvdXBzLmFkZCgiUmVnaXN0ZXJlZCBVc2VycyIpOworICAgIFRlc3RBY2NvdW50IHVzZXIgPSBhY2NvdW50cy5jcmVhdGUoInVzZXIiLCAidXNlckBleGFtcGxlLmNvbSIsICJVc2VyIik7CisgICAgUmVzdFJlc3BvbnNlIHIgPSAobmV3IFJlc3RTZXNzaW9uKHVzZXIpKS5nZXQoIi9ncm91cHMvIik7CisgICAgTWFwPFN0cmluZywgR3JvdXBJbmZvPiByZXN1bHQgPQorICAgICAgICAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBHcm91cEluZm8+PigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0R3JvdXBzKGV4cGVjdGVkR3JvdXBzLCByZXN1bHQua2V5U2V0KCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEFsbEdyb3VwSW5mb0ZpZWxkc1NldENvcnJlY3RseSgpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoIkFkbWluaXN0cmF0b3JzIikpOworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQoIi9ncm91cHMvP3E9IiArIGFkbWluR3JvdXAuZ2V0TmFtZSgpKTsKKyAgICBNYXA8U3RyaW5nLCBHcm91cEluZm8+IHJlc3VsdCA9CisgICAgICAgIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBHcm91cEluZm8gYWRtaW5Hcm91cEluZm8gPSByZXN1bHQuZ2V0KGFkbWluR3JvdXAuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRHcm91cEluZm8oYWRtaW5Hcm91cCwgYWRtaW5Hcm91cEluZm8pOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9NZW1iZXJzSW5wdXQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL01lbWJlcnNJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzc5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9NZW1iZXJzSW5wdXQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNZW1iZXJzSW5wdXQgeworICBMaXN0PFN0cmluZz4gbWVtYmVyczsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvQ3JlYXRlUHJvamVjdElULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L0NyZWF0ZVByb2plY3RJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZmU4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L0NyZWF0ZVByb2plY3RJVC5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3QuUHJvamVjdEFzc2VydC5hc3NlcnRQcm9qZWN0SW5mbzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3QuUHJvamVjdEFzc2VydC5hc3NlcnRQcm9qZWN0T3duZXJzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIENyZWF0ZVByb2plY3RJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdDsKKworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJhZG1pbkBleGFtcGxlLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdQcm9qZWN0TmFtZSA9ICJuZXdQcm9qZWN0IjsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19DUkVBVEVELCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgUHJvamVjdEluZm8gcCA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPFByb2plY3RJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ld1Byb2plY3ROYW1lLCBwLm5hbWUpOworICAgIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGUgPSBwcm9qZWN0Q2FjaGUuZ2V0KG5ldyBQcm9qZWN0Lk5hbWVLZXkobmV3UHJvamVjdE5hbWUpKTsKKyAgICBhc3NlcnROb3ROdWxsKHByb2plY3RTdGF0ZSk7CisgICAgYXNzZXJ0UHJvamVjdEluZm8ocHJvamVjdFN0YXRlLmdldFByb2plY3QoKSwgcCk7CisgICAgYXNzZXJ0SGVhZChuZXdQcm9qZWN0TmFtZSwgInJlZnMvaGVhZHMvbWFzdGVyIik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdFdpdGhOYW1lTWlzbWF0Y2hfQmFkUmVxdWVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLm5hbWUgPSAib3RoZXJOYW1lIjsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvcHJvamVjdHMvc29tZU5hbWUiLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfQkFEX1JFUVVFU1QsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdQcm9qZWN0TmFtZSA9ICJuZXdQcm9qZWN0IjsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4uZGVzY3JpcHRpb24gPSAiVGVzdCBkZXNjcmlwdGlvbiI7CisgICAgaW4uc3VibWl0X3R5cGUgPSBTdWJtaXRUeXBlLkNIRVJSWV9QSUNLOworICAgIGluLnVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgICAgaW4udXNlX3NpZ25lZF9vZmZfYnkgPSBJbmhlcml0YWJsZUJvb2xlYW4uVFJVRTsKKyAgICBpbi51c2VfY29udGVudF9tZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICAgIGluLnJlcXVpcmVfY2hhbmdlX2lkID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzLyIgKyBuZXdQcm9qZWN0TmFtZSwgaW4pOworICAgIFByb2plY3RJbmZvIHAgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxQcm9qZWN0SW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhuZXdQcm9qZWN0TmFtZSwgcC5uYW1lKTsKKyAgICBQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0Q2FjaGUuZ2V0KG5ldyBQcm9qZWN0Lk5hbWVLZXkobmV3UHJvamVjdE5hbWUpKS5nZXRQcm9qZWN0KCk7CisgICAgYXNzZXJ0UHJvamVjdEluZm8ocHJvamVjdCwgcCk7CisgICAgYXNzZXJ0RXF1YWxzKGluLmRlc2NyaXB0aW9uLCBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOworICAgIGFzc2VydEVxdWFscyhpbi5zdWJtaXRfdHlwZSwgcHJvamVjdC5nZXRTdWJtaXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhpbi51c2VfY29udHJpYnV0b3JfYWdyZWVtZW50cywgcHJvamVjdC5nZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnVzZV9zaWduZWRfb2ZmX2J5LCBwcm9qZWN0LmdldFVzZVNpZ25lZE9mZkJ5KCkpOworICAgIGFzc2VydEVxdWFscyhpbi51c2VfY29udGVudF9tZXJnZSwgcHJvamVjdC5nZXRVc2VDb250ZW50TWVyZ2UoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnJlcXVpcmVfY2hhbmdlX2lkLCBwcm9qZWN0LmdldFJlcXVpcmVDaGFuZ2VJRCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDaGlsZFByb2plY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBwYXJlbnROYW1lID0gInBhcmVudCI7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzLyIgKyBwYXJlbnROYW1lKTsKKyAgICByLmNvbnN1bWUoKTsKKyAgICBmaW5hbCBTdHJpbmcgY2hpbGROYW1lID0gImNoaWxkIjsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4ucGFyZW50ID0gcGFyZW50TmFtZTsKKyAgICByID0gc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy8iICsgY2hpbGROYW1lLCBpbik7CisgICAgUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdENhY2hlLmdldChuZXcgUHJvamVjdC5OYW1lS2V5KGNoaWxkTmFtZSkpLmdldFByb2plY3QoKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4ucGFyZW50LCBwcm9qZWN0LmdldFBhcmVudE5hbWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2hpbGRQcm9qZWN0VW5kZXJOb25FeGlzdGluZ1BhcmVudF9VbnByb2Nlc3NhYmxlRW50aXR5KCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLnBhcmVudCA9ICJub24tZXhpc3RpbmctcHJvamVjdCI7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzL2NoaWxkIiwgaW4pOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX1VOUFJPQ0VTU0FCTEVfRU5USVRZLCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdFdpdGhPd25lcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gIm5ld1Byb2plY3QiOworICAgIFByb2plY3RJbnB1dCBpbiA9IG5ldyBQcm9qZWN0SW5wdXQoKTsKKyAgICBpbi5vd25lcnMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoMyk7CisgICAgaW4ub3duZXJzLmFkZCgiQWRtaW5pc3RyYXRvcnMiKTsgLy8gYnkgbmFtZQorICAgIGluLm93bmVycy5hZGQoZ3JvdXBVdWlkKCJSZWdpc3RlcmVkIFVzZXJzIikuZ2V0KCkpOyAvLyBieSBncm91cCBVVUlECisgICAgaW4ub3duZXJzLmFkZChJbnRlZ2VyLnRvU3RyaW5nKGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQW5vbnltb3VzIFVzZXJzIikpCisgICAgICAgIC5nZXRJZCgpLmdldCgpKSk7IC8vIGJ5IGxlZ2FjeSBncm91cCBJRAorICAgIHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lLCBpbik7CisgICAgUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSA9IHByb2plY3RDYWNoZS5nZXQobmV3IFByb2plY3QuTmFtZUtleShuZXdQcm9qZWN0TmFtZSkpOworICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZXhwZWN0ZWRPd25lcklkcyA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUoMyk7CisgICAgZXhwZWN0ZWRPd25lcklkcy5hZGQoZ3JvdXBVdWlkKCJBZG1pbmlzdHJhdG9ycyIpKTsKKyAgICBleHBlY3RlZE93bmVySWRzLmFkZChncm91cFV1aWQoIlJlZ2lzdGVyZWQgVXNlcnMiKSk7CisgICAgZXhwZWN0ZWRPd25lcklkcy5hZGQoZ3JvdXBVdWlkKCJBbm9ueW1vdXMgVXNlcnMiKSk7CisgICAgYXNzZXJ0UHJvamVjdE93bmVycyhleHBlY3RlZE93bmVySWRzLCBwcm9qZWN0U3RhdGUpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3RXaXRoTm9uRXhpc3RpbmdPd25lcl9VbnByb2Nlc3NhYmxlRW50aXR5KCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLm93bmVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIm5vbi1leGlzdGluZy1ncm91cCIpOworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy9uZXdQcm9qZWN0IiwgaW4pOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX1VOUFJPQ0VTU0FCTEVfRU5USVRZLCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGVybWlzc2lvbk9ubHlQcm9qZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSAibmV3UHJvamVjdCI7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLnBlcm1pc3Npb25zX29ubHkgPSB0cnVlOworICAgIHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lLCBpbik7CisgICAgYXNzZXJ0SGVhZChuZXdQcm9qZWN0TmFtZSwgR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdFdpdGhFbXB0eUNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gIm5ld1Byb2plY3QiOworICAgIFByb2plY3RJbnB1dCBpbiA9IG5ldyBQcm9qZWN0SW5wdXQoKTsKKyAgICBpbi5jcmVhdGVfZW1wdHlfY29tbWl0ID0gdHJ1ZTsKKyAgICBzZXNzaW9uLnB1dCgiL3Byb2plY3RzLyIgKyBuZXdQcm9qZWN0TmFtZSwgaW4pOworICAgIGFzc2VydEVtcHR5Q29tbWl0KG5ld1Byb2plY3ROYW1lLCAicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aEJyYW5jaGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSAibmV3UHJvamVjdCI7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLmNyZWF0ZV9lbXB0eV9jb21taXQgPSB0cnVlOworICAgIGluLmJyYW5jaGVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KDMpOworICAgIGluLmJyYW5jaGVzLmFkZCgicmVmcy9oZWFkcy90ZXN0Iik7CisgICAgaW4uYnJhbmNoZXMuYWRkKCJyZWZzL2hlYWRzL21hc3RlciIpOworICAgIGluLmJyYW5jaGVzLmFkZCgicmVsZWFzZSIpOyAvLyB3aXRob3V0ICdyZWZzL2hlYWRzJyBwcmVmaXgKKyAgICBzZXNzaW9uLnB1dCgiL3Byb2plY3RzLyIgKyBuZXdQcm9qZWN0TmFtZSwgaW4pOworICAgIGFzc2VydEhlYWQobmV3UHJvamVjdE5hbWUsICJyZWZzL2hlYWRzL3Rlc3QiKTsKKyAgICBhc3NlcnRFbXB0eUNvbW1pdChuZXdQcm9qZWN0TmFtZSwgInJlZnMvaGVhZHMvdGVzdCIsICJyZWZzL2hlYWRzL21hc3RlciIsCisgICAgICAgICJyZWZzL2hlYWRzL3JlbGVhc2UiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aG91dENhcGFiaWxpdHlfRm9yYmlkZGVuKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUZXN0QWNjb3VudCB1c2VyID0gYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpOworICAgIFJlc3RSZXNwb25zZSByID0gKG5ldyBSZXN0U2Vzc2lvbih1c2VyKSkucHV0KCIvcHJvamVjdHMvbmV3UHJvamVjdCIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0ZPUkJJRERFTiwgci5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3RXaGVuUHJvamVjdEFscmVhZHlFeGlzdHNfQ29uZmxpY3QoKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy9BbGwtUHJvamVjdHMiKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19DT05GTElDVCwgci5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgcHJpdmF0ZSBBY2NvdW50R3JvdXAuVVVJRCBncm91cFV1aWQoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgIHJldHVybiBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoZ3JvdXBOYW1lKSkuZ2V0R3JvdXBVVUlEKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0SGVhZChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBleHBlY3RlZFJlZikKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBnaXQub3BlblJlcG9zaXRvcnkobmV3IFByb2plY3QuTmFtZUtleShwcm9qZWN0TmFtZSkpOworICAgIHRyeSB7CisgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZWYsIHJlcG8uZ2V0UmVmKENvbnN0YW50cy5IRUFEKS5nZXRUYXJnZXQoKQorICAgICAgICAgIC5nZXROYW1lKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICByZXBvLmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEVtcHR5Q29tbWl0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nLi4uIHJlZnMpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeSByZXBvID0gZ2l0Lm9wZW5SZXBvc2l0b3J5KG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdE5hbWUpKTsKKyAgICBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsocmVwbyk7CisgICAgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbyk7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoU3RyaW5nIHJlZiA6IHJlZnMpIHsKKyAgICAgICAgUmV2Q29tbWl0IGNvbW1pdCA9IHJ3Lmxvb2t1cENvbW1pdChyZXBvLmdldFJlZihyZWYpLmdldE9iamVjdElkKCkpOworICAgICAgICBydy5wYXJzZUJvZHkoY29tbWl0KTsKKyAgICAgICAgdHcuYWRkVHJlZShjb21taXQuZ2V0VHJlZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInJlZiAiICsgcmVmICsgIiBoYXMgbm9uIGVtcHR5IGNvbW1pdCIsIHR3Lm5leHQoKSk7CisgICAgICAgIHR3LnJlc2V0KCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHR3LnJlbGVhc2UoKTsKKyAgICAgIHJ3LnJlbGVhc2UoKTsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdElucHV0IHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgcGFyZW50OworICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBib29sZWFuIHBlcm1pc3Npb25zX29ubHk7CisgICAgYm9vbGVhbiBjcmVhdGVfZW1wdHlfY29tbWl0OworICAgIFN1Ym1pdFR5cGUgc3VibWl0X3R5cGU7CisgICAgTGlzdDxTdHJpbmc+IGJyYW5jaGVzOworICAgIExpc3Q8U3RyaW5nPiBvd25lcnM7CisgICAgSW5oZXJpdGFibGVCb29sZWFuIHVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzOworICAgIEluaGVyaXRhYmxlQm9vbGVhbiB1c2Vfc2lnbmVkX29mZl9ieTsKKyAgICBJbmhlcml0YWJsZUJvb2xlYW4gdXNlX2NvbnRlbnRfbWVyZ2U7CisgICAgSW5oZXJpdGFibGVCb29sZWFuIHJlcXVpcmVfY2hhbmdlX2lkOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L0dhcmJhZ2VDb2xsZWN0aW9uSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWM1MmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L0dhcmJhZ2VDb2xsZWN0aW9uSVQuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwuY3JlYXRlUHJvamVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuR2NBc3NlcnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlNzaFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uUXVldWU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3Rpb25JVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uUXVldWUgZ2NRdWV1ZTsKKworICBASW5qZWN0CisgIHByaXZhdGUgR2NBc3NlcnQgZ2NBc3NlcnQ7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0MTsKKyAgcHJpdmF0ZSBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDI7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0KKyAgICAgICAgYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJhZG1pbkBleGFtcGxlLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworCisgICAgU3NoU2Vzc2lvbiBzc2hTZXNzaW9uID0gbmV3IFNzaFNlc3Npb24oYWRtaW4pOworCisgICAgcHJvamVjdDEgPSBuZXcgUHJvamVjdC5OYW1lS2V5KCJwMSIpOworICAgIGNyZWF0ZVByb2plY3Qoc3NoU2Vzc2lvbiwgcHJvamVjdDEuZ2V0KCkpOworCisgICAgcHJvamVjdDIgPSBuZXcgUHJvamVjdC5OYW1lS2V5KCJwMiIpOworICAgIGNyZWF0ZVByb2plY3Qoc3NoU2Vzc2lvbiwgcHJvamVjdDIuZ2V0KCkpOworCisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2NOb25FeGlzdGluZ1Byb2plY3RfTm90Rm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwgUE9TVCgiL3Byb2plY3RzL25vbi1leGlzdGluZy9nYyIpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY05vdEFsbG93ZWRfRm9yYmlkZGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0ZPUkJJRERFTiwKKyAgICAgICAgbmV3IFJlc3RTZXNzaW9uKGFjY291bnRzLmNyZWF0ZSgidXNlciIsICJ1c2VyQGV4YW1wbGUuY29tIiwgIlVzZXIiKSkKKyAgICAgICAgICAgIC5wb3N0KCIvcHJvamVjdHMvIiArIGFsbFByb2plY3RzLmdldCgpICsgIi9nYyIpLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2NPbmVQcm9qZWN0KCkgdGhyb3dzIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCBQT1NUKCIvcHJvamVjdHMvIiArIGFsbFByb2plY3RzLmdldCgpICsgIi9nYyIpKTsKKyAgICBnY0Fzc2VydC5hc3NlcnRIYXNQYWNrRmlsZShhbGxQcm9qZWN0cyk7CisgICAgZ2NBc3NlcnQuYXNzZXJ0SGFzTm9QYWNrRmlsZShwcm9qZWN0MSwgcHJvamVjdDIpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgUE9TVChTdHJpbmcgZW5kUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnBvc3QoZW5kUG9pbnQpOworICAgIHIuY29uc3VtZSgpOworICAgIHJldHVybiByLmdldFN0YXR1c0NvZGUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvcHJvamVjdC9Qcm9qZWN0QXNzZXJ0LmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L1Byb2plY3RBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWNjYmVlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvcHJvamVjdC9Qcm9qZWN0QXNzZXJ0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0QXNzZXJ0IHsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UHJvamVjdEluZm8oUHJvamVjdCBwcm9qZWN0LCBQcm9qZWN0SW5mbyBpbmZvKSB7CisgICAgaWYgKGluZm8ubmFtZSAhPSBudWxsKSB7CisgICAgICAvLyAnbmFtZScgaXMgbm90IHNldCBpZiByZXR1cm5lZCBpbiBhIG1hcAorICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpLCBpbmZvLm5hbWUpOworICAgIH0KKyAgICBhc3NlcnRFcXVhbHMocHJvamVjdC5nZXROYW1lKCksIFVybC5kZWNvZGUoaW5mby5pZCkpOworICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnROYW1lID0gcHJvamVjdC5nZXRQYXJlbnQobmV3IFByb2plY3QuTmFtZUtleSgiQWxsLVByb2plY3RzIikpOworICAgIGFzc2VydEVxdWFscyhwYXJlbnROYW1lICE9IG51bGwgPyBwYXJlbnROYW1lLmdldCgpIDogbnVsbCwgaW5mby5wYXJlbnQpOworICAgIGFzc2VydEVxdWFscyhwcm9qZWN0LmdldERlc2NyaXB0aW9uKCksIFN0cmluZ3MubnVsbFRvRW1wdHkoaW5mby5kZXNjcmlwdGlvbikpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFByb2plY3RPd25lcnMoU2V0PEFjY291bnRHcm91cC5VVUlEPiBleHBlY3RlZE93bmVycywKKyAgICAgIFByb2plY3RTdGF0ZSBzdGF0ZSkgeworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgZyA6IHN0YXRlLmdldE93bmVycygpKSB7CisgICAgICBhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIG93bmVyIGdyb3VwICIgKyBnLCBleHBlY3RlZE93bmVycy5yZW1vdmUoZykpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIG93bmVyIGdyb3VwczogIiArIGV4cGVjdGVkT3duZXJzLAorICAgICAgICBleHBlY3RlZE93bmVycy5pc0VtcHR5KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L1Byb2plY3RJbmZvLmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L1Byb2plY3RJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkZDJkNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvUHJvamVjdEluZm8uamF2YQpAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3Q7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0SW5mbyB7CisgIHB1YmxpYyBTdHJpbmcgaWQ7CisgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgcHVibGljIFN0cmluZyBwYXJlbnQ7CisgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2Uvc3NoL0dhcmJhZ2VDb2xsZWN0aW9uSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9zc2gvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWU3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2Uvc3NoL0dhcmJhZ2VDb2xsZWN0aW9uSVQuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2Uuc3NoOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwuY3JlYXRlUHJvamVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5HY0Fzc2VydDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlNzaFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HYXJiYWdlQ29sbGVjdGlvblJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3Rpb25JVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uLkZhY3RvcnkgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5OworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHYXJiYWdlQ29sbGVjdGlvblF1ZXVlIGdjUXVldWU7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdjQXNzZXJ0IGdjQXNzZXJ0OworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgU3NoU2Vzc2lvbiBzc2hTZXNzaW9uOworICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0MTsKKyAgcHJpdmF0ZSBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDI7CisgIHByaXZhdGUgUHJvamVjdC5OYW1lS2V5IHByb2plY3QzOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9CisgICAgICAgIGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKworICAgIHNzaFNlc3Npb24gPSBuZXcgU3NoU2Vzc2lvbihhZG1pbik7CisKKyAgICBwcm9qZWN0MSA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkoInAxIik7CisgICAgY3JlYXRlUHJvamVjdChzc2hTZXNzaW9uLCBwcm9qZWN0MS5nZXQoKSk7CisKKyAgICBwcm9qZWN0MiA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkoInAyIik7CisgICAgY3JlYXRlUHJvamVjdChzc2hTZXNzaW9uLCBwcm9qZWN0Mi5nZXQoKSk7CisKKyAgICBwcm9qZWN0MyA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkoInAzIik7CisgICAgY3JlYXRlUHJvamVjdChzc2hTZXNzaW9uLCBwcm9qZWN0My5nZXQoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2MoKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFN0cmluZyByZXNwb25zZSA9CisgICAgICAgIHNzaFNlc3Npb24uZXhlYygiZ2Vycml0IGdjIFwiIiArIHByb2plY3QxLmdldCgpICsgIlwiIFwiIgorICAgICAgICAgICAgKyBwcm9qZWN0Mi5nZXQoKSArICJcIiIpOworICAgIGFzc2VydEZhbHNlKHNzaFNlc3Npb24uaGFzRXJyb3IoKSk7CisgICAgYXNzZXJ0Tm9FcnJvcihyZXNwb25zZSk7CisgICAgZ2NBc3NlcnQuYXNzZXJ0SGFzUGFja0ZpbGUocHJvamVjdDEsIHByb2plY3QyKTsKKyAgICBnY0Fzc2VydC5hc3NlcnRIYXNOb1BhY2tGaWxlKGFsbFByb2plY3RzLCBwcm9qZWN0Myk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2NBbGwoKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFN0cmluZyByZXNwb25zZSA9IHNzaFNlc3Npb24uZXhlYygiZ2Vycml0IGdjIC0tYWxsIik7CisgICAgYXNzZXJ0RmFsc2Uoc3NoU2Vzc2lvbi5oYXNFcnJvcigpKTsKKyAgICBhc3NlcnROb0Vycm9yKHJlc3BvbnNlKTsKKyAgICBnY0Fzc2VydC5hc3NlcnRIYXNQYWNrRmlsZShhbGxQcm9qZWN0cywgcHJvamVjdDEsIHByb2plY3QyLCBwcm9qZWN0Myk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2NXaXRob3V0Q2FwYWJpbGl0eV9FcnJvcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAorICAgICAgSlNjaEV4Y2VwdGlvbiB7CisgICAgU3NoU2Vzc2lvbiBzID0gbmV3IFNzaFNlc3Npb24oYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpKTsKKyAgICBzLmV4ZWMoImdlcnJpdCBnYyAtLWFsbCIpOworICAgIGFzc2VydEVycm9yKCJmYXRhbDogdXNlciBkb2VzIG5vdCBoYXZlIFwicnVuR0NcIiBjYXBhYmlsaXR5LiIsIHMuZ2V0RXJyb3IoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2NBbHJlYWR5U2NoZWR1bGVkKCkgeworICAgIGdjUXVldWUuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvamVjdDEpKTsKKyAgICBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCByZXN1bHQgPSBnYXJiYWdlQ29sbGVjdGlvbkZhY3RvcnkuY3JlYXRlKCkucnVuKAorICAgICAgICBBcnJheXMuYXNMaXN0KGFsbFByb2plY3RzLCBwcm9qZWN0MSwgcHJvamVjdDIsIHByb2plY3QzKSk7CisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuaGFzRXJyb3JzKCkpOworICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuZ2V0RXJyb3JzKCkuc2l6ZSgpKTsKKyAgICBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvciBlcnJvciA9IHJlc3VsdC5nZXRFcnJvcnMoKS5nZXQoMCk7CisgICAgYXNzZXJ0RXF1YWxzKEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yLlR5cGUuR0NfQUxSRUFEWV9TQ0hFRFVMRUQsIGVycm9yLmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QxLCBlcnJvci5nZXRQcm9qZWN0TmFtZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRFcnJvcihTdHJpbmcgZXhwZWN0ZWRFcnJvciwgU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZSwgcmVzcG9uc2UuY29udGFpbnMoZXhwZWN0ZWRFcnJvcikpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vRXJyb3IoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UsIHJlc3BvbnNlLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuY29udGFpbnMoImVycm9yIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYW50bHIvcG9tLnhtbCBiL2dlcnJpdC1hbnRsci9wb20ueG1sCmluZGV4IDM0Y2I0NmYuLjMxNGQ4ZDIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1hbnRsci9wb20ueG1sCisrKyBiL2dlcnJpdC1hbnRsci9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtYW50bHI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtYW50bHIvc3JjL21haW4vYW50bHIzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9RdWVyeS5nIGIvZ2Vycml0LWFudGxyL3NyYy9tYWluL2FudGxyMy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvUXVlcnkuZwppbmRleCA3NGI3ODUxLi40MjNhY2I0IDEwMDY0NAotLS0gYS9nZXJyaXQtYW50bHIvc3JjL21haW4vYW50bHIzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9RdWVyeS5nCisrKyBiL2dlcnJpdC1hbnRsci9zcmMvbWFpbi9hbnRscjMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5LmcKQEAgLTE1NSw2ICsxNTUsMTAgQEAKICAgICAgIFN0cmluZyBzID0gJHRleHQ7CiAgICAgICBzZXRUZXh0KHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKSk7CiAgICAgfQorICB8ICd7JyAoIH4oJ3snfCd9JykgKSogJ30nIHsKKyAgICAgIFN0cmluZyBzID0gJHRleHQ7CisgICAgICBzZXRUZXh0KHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKSk7CisgICAgfQogICA7CiAKIFNJTkdMRV9XT1JECmRpZmYgLS1naXQgYS9nZXJyaXQtY2FjaGUtaDIvcG9tLnhtbCBiL2dlcnJpdC1jYWNoZS1oMi9wb20ueG1sCmluZGV4IDRkNDMwM2MuLjFhMjZiMjEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jYWNoZS1oMi9wb20ueG1sCisrKyBiL2dlcnJpdC1jYWNoZS1oMi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtY2FjaGUtaDI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtY2FjaGUtaDIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2FjaGUvaDIvSDJDYWNoZUZhY3RvcnkuamF2YSBiL2dlcnJpdC1jYWNoZS1oMi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jYWNoZS9oMi9IMkNhY2hlRmFjdG9yeS5qYXZhCmluZGV4IDI3ZGEyMGYuLjg1YTA1MWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jYWNoZS1oMi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jYWNoZS9oMi9IMkNhY2hlRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1jYWNoZS1oMi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jYWNoZS9oMi9IMkNhY2hlRmFjdG9yeS5qYXZhCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICB9CiAgIH0KIAotICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyIsICJjYXN0In0pCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgImNhc3QifSkKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyA8SywgVj4gQ2FjaGU8SywgVj4gYnVpbGQoQ2FjaGVCaW5kaW5nPEssIFY+IGRlZikgewogICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghc3RhcnRlZCwgImNhY2hlIG11c3QgYmUgYnVpbHQgYmVmb3JlIHN0YXJ0Iik7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3BvbS54bWwgYi9nZXJyaXQtY29tbW9uL3BvbS54bWwKaW5kZXggOWIzZmU1Zi4uMWRiMzU0OSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9wb20ueG1sCisrKyBiL2dlcnJpdC1jb21tb24vcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KQEAgLTYxLDYgKzYxLDExIEBACiAgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGF0Y2gtamdpdDwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCiAgIDxidWlsZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUGFnZUxpbmtzLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1BhZ2VMaW5rcy5qYXZhCmluZGV4IDJiOWI3MmEuLmJlYWIxZDkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUGFnZUxpbmtzLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9QYWdlTGlua3MuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb247CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlLlN0YXR1czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CkBAIC0zNyw2ICszOCw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUCA9ICJuLHoiOwogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTkUgPSAiLyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RTID0gIi9wcm9qZWN0cy8iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVNIQk9BUkRTID0gIixkYXNoYm9hcmRzLyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX0dST1VQUyA9ICIvYWRtaW4vZ3JvdXBzLyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX0NSRUFURV9HUk9VUCA9ICIvYWRtaW4vY3JlYXRlLWdyb3VwLyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFETUlOX1BST0pFQ1RTID0gIi9hZG1pbi9wcm9qZWN0cy8iOwpAQCAtNTUsMTggKzU4LDI2IEBACiAgICAgcmV0dXJuICIvYy8iICsgcHMuZ2V0UGFyZW50S2V5KCkgKyAiLyIgKyBwcy5nZXQoKTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUHJvamVjdChmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcCkgeworICAgIHJldHVybiBBRE1JTl9QUk9KRUNUUyArIHAuZ2V0KCk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1Byb2plY3RBY2NlZXNzKGZpbmFsIFByb2plY3QuTmFtZUtleSBwKSB7CiAgICAgcmV0dXJuICIvYWRtaW4vcHJvamVjdHMvIiArIHAuZ2V0KCkgKyAiLGFjY2VzcyI7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0FjY291bnRRdWVyeShmaW5hbCBTdHJpbmcgZnVsbG5hbWUpIHsKLSAgICByZXR1cm4gdG9BY2NvdW50UXVlcnkoZnVsbG5hbWUsIFN0YXR1cy5ORVcpOwotICB9Ci0KICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9BY2NvdW50UXVlcnkoU3RyaW5nIGZ1bGxuYW1lLCBTdGF0dXMgc3RhdHVzKSB7CiAgICAgcmV0dXJuIHRvQ2hhbmdlUXVlcnkob3AoIm93bmVyIiwgZnVsbG5hbWUpICsgIiAiICsgc3RhdHVzKHN0YXR1cyksIFRPUCk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0N1c3RvbURhc2hib2FyZChmaW5hbCBTdHJpbmcgcGFyYW1zKSB7CisgICAgcmV0dXJuICIvZGFzaGJvYXJkLz8iICsgcGFyYW1zOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Qcm9qZWN0RGFzaGJvYXJkcyhQcm9qZWN0Lk5hbWVLZXkgcHJvaikgeworICAgIHJldHVybiBBRE1JTl9QUk9KRUNUUyArIHByb2ouZ2V0KCkgKyAiLGRhc2hib2FyZHMiOworICB9CisKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9DaGFuZ2VRdWVyeShmaW5hbCBTdHJpbmcgcXVlcnkpIHsKICAgICByZXR1cm4gdG9DaGFuZ2VRdWVyeShxdWVyeSwgVE9QKTsKICAgfQpAQCAtNzUsMTAgKzg2LDIyIEBACiAgICAgcmV0dXJuICIvcS8iICsgS2V5VXRpbC5lbmNvZGUocXVlcnkpICsgIiwiICsgcGFnZTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUHJvamVjdERhc2hib2FyZChQcm9qZWN0Lk5hbWVLZXkgbmFtZSwgU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIFBST0pFQ1RTICsgbmFtZS5nZXQoKSArIERBU0hCT0FSRFMgKyBpZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2plY3RRdWVyeShQcm9qZWN0Lk5hbWVLZXkgcHJvaikgeworICAgIHJldHVybiBvcCgicHJvamVjdCIsIHByb2ouZ2V0KCkpOworICB9CisKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvamVjdFF1ZXJ5KFByb2plY3QuTmFtZUtleSBwcm9qLCBTdGF0dXMgc3RhdHVzKSB7CiAgICAgICByZXR1cm4gc3RhdHVzKHN0YXR1cykgKyAiICIgKyBvcCgicHJvamVjdCIsIHByb2ouZ2V0KCkpOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Hcm91cChBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgcmV0dXJuIEFETUlOX0dST1VQUyArICJ1dWlkLSIgKyB1dWlkOworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXR1cyhTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgIGNhc2UgQUJBTkRPTkVEOgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9Qcm9qZWN0QWNjZXNzVXRpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9Qcm9qZWN0QWNjZXNzVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTQ3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1Byb2plY3RBY2Nlc3NVdGlsLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgUHJvamVjdEFjY2Vzc1V0aWwgeworICBwdWJsaWMgc3RhdGljIExpc3Q8QWNjZXNzU2VjdGlvbj4gbWVyZ2VTZWN0aW9ucyhmaW5hbCBMaXN0PEFjY2Vzc1NlY3Rpb24+IHNyYykgeworICAgIGZpbmFsIE1hcDxTdHJpbmcsIEFjY2Vzc1NlY3Rpb24+IG1hcCA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgQWNjZXNzU2VjdGlvbj4oKTsKKyAgICBmb3IgKGZpbmFsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiA6IHNyYykgeworICAgICAgaWYgKHNlY3Rpb24uZ2V0UGVybWlzc2lvbnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZpbmFsIEFjY2Vzc1NlY3Rpb24gcHJpb3IgPSBtYXAuZ2V0KHNlY3Rpb24uZ2V0TmFtZSgpKTsKKyAgICAgIGlmIChwcmlvciAhPSBudWxsKSB7CisgICAgICAgIHByaW9yLm1lcmdlRnJvbShzZWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hcC5wdXQoc2VjdGlvbi5nZXROYW1lKCksIHNlY3Rpb24pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBY2Nlc3NTZWN0aW9uPihtYXAudmFsdWVzKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBMaXN0PEFjY2Vzc1NlY3Rpb24+IHJlbW92ZUVtcHR5UGVybWlzc2lvbnNBbmRTZWN0aW9ucygKKyAgICAgIGZpbmFsIExpc3Q8QWNjZXNzU2VjdGlvbj4gc3JjKSB7CisgICAgZmluYWwgU2V0PEFjY2Vzc1NlY3Rpb24+IHNlY3Rpb25zVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxBY2Nlc3NTZWN0aW9uPigpOworICAgIGZvciAoZmluYWwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uIDogc3JjKSB7CisgICAgICBmaW5hbCBTZXQ8UGVybWlzc2lvbj4gcGVybWlzc2lvbnNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0PFBlcm1pc3Npb24+KCk7CisgICAgICBmb3IgKGZpbmFsIFBlcm1pc3Npb24gcGVybWlzc2lvbiA6IHNlY3Rpb24uZ2V0UGVybWlzc2lvbnMoKSkgeworICAgICAgICBpZiAocGVybWlzc2lvbi5nZXRSdWxlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgIHBlcm1pc3Npb25zVG9SZW1vdmUuYWRkKHBlcm1pc3Npb24pOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGZpbmFsIFBlcm1pc3Npb24gcGVybWlzc2lvblRvUmVtb3ZlIDogcGVybWlzc2lvbnNUb1JlbW92ZSkgeworICAgICAgICBzZWN0aW9uLnJlbW92ZShwZXJtaXNzaW9uVG9SZW1vdmUpOworICAgICAgfQorICAgICAgaWYgKHNlY3Rpb24uZ2V0UGVybWlzc2lvbnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2VjdGlvbnNUb1JlbW92ZS5hZGQoc2VjdGlvbik7CisgICAgICB9CisgICAgfQorICAgIGZvciAoZmluYWwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uVG9SZW1vdmUgOiBzZWN0aW9uc1RvUmVtb3ZlKSB7CisgICAgICBzcmMucmVtb3ZlKHNlY3Rpb25Ub1JlbW92ZSk7CisgICAgfQorICAgIHJldHVybiBzcmM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUHJvamVjdFV0aWwuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUHJvamVjdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmJhNDFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9Qcm9qZWN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb247CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0VXRpbCB7CisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwR2l0U3VmZml4KFN0cmluZyBuYW1lKSB7CisgICAgaWYgKG5hbWUuZW5kc1dpdGgoIi5naXQiKSkgeworICAgICAgLy8gQmUgbmljZSBhbmQgZHJvcCB0aGUgdHJhaWxpbmcgIi5naXQiIHN1ZmZpeCwgd2hpY2ggd2UgbmV2ZXIga2VlcAorICAgICAgLy8gaW4gb3VyIGRhdGFiYXNlLCBidXQgY2xpZW50cyBtaWdodCBtaXN0YWtlbmx5IHByb3ZpZGUgYW55d2F5LgorICAgICAgLy8KKyAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNCk7CisgICAgICB3aGlsZSAobmFtZS5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcHJpdmF0ZSBQcm9qZWN0VXRpbCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL1NpZ25Jbk1vZGUuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9TaWduSW5Nb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2N2VkNTYuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL1NpZ25Jbk1vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aDsKLQotcHVibGljIGVudW0gU2lnbkluTW9kZSB7Ci0gIFNJR05fSU4sIExJTktfSURFTlRJWSwgUkVHSVNURVI7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL0Rpc2NvdmVyeVJlc3VsdC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL29wZW5pZC9EaXNjb3ZlcnlSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMjZmYS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL0Rpc2NvdmVyeVJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaXNjb3ZlcnlSZXN1bHQgewotICBwdWJsaWMgc3RhdGljIGVudW0gU3RhdHVzIHsKLSAgICAvKiogUHJvdmlkZXIgd2FzIGRpc2NvdmVyZWQgYW5kIHtAY29kZSBwcm92aWRlclVybH0gaXMgdmFsaWQuICovCi0gICAgVkFMSUQsCi0KLSAgICAvKiogVGhlIGlkZW50aWZpZXIgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCwgYnkgc2l0ZSBjb25maWd1cmF0aW9uLiAqLwotICAgIE5PVF9BTExPV0VELAotCi0gICAgLyoqIElkZW50aWZpZXIgaXNuJ3QgZm9yIGFuIE9wZW5JRCBwcm92aWRlci4gKi8KLSAgICBOT19QUk9WSURFUiwKLQotICAgIC8qKiBUaGUgcHJvdmlkZXIgd2FzIGRpc2NvdmVyZWQsIGJ1dCBzb21ldGhpbmcgZWxzZSBmYWlsZWQuICovCi0gICAgRVJST1I7Ci0gIH0KLQotICBwdWJsaWMgU3RhdHVzIHN0YXR1czsKLSAgcHVibGljIFN0cmluZyBwcm92aWRlclVybDsKLSAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvdmlkZXJBcmdzOwotCi0gIHByb3RlY3RlZCBEaXNjb3ZlcnlSZXN1bHQoKSB7Ci0gIH0KLQotICBwdWJsaWMgRGlzY292ZXJ5UmVzdWx0KGZpbmFsIFN0cmluZyByZWRpcmVjdCwgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBhcmdzKSB7Ci0gICAgc3RhdHVzID0gU3RhdHVzLlZBTElEOwotICAgIHByb3ZpZGVyVXJsID0gcmVkaXJlY3Q7Ci0gICAgcHJvdmlkZXJBcmdzID0gYXJnczsKLSAgfQotCi0gIHB1YmxpYyBEaXNjb3ZlcnlSZXN1bHQoZmluYWwgU3RhdHVzIHMpIHsKLSAgICBzdGF0dXMgPSBzOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL09wZW5JZFByb3ZpZGVyUGF0dGVybi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL29wZW5pZC9PcGVuSWRQcm92aWRlclBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwZDNlYi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL09wZW5JZFByb3ZpZGVyUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKLQotcHVibGljIGNsYXNzIE9wZW5JZFByb3ZpZGVyUGF0dGVybiB7Ci0gIHB1YmxpYyBzdGF0aWMgT3BlbklkUHJvdmlkZXJQYXR0ZXJuIGNyZWF0ZShTdHJpbmcgcGF0dGVybikgewotICAgIE9wZW5JZFByb3ZpZGVyUGF0dGVybiByID0gbmV3IE9wZW5JZFByb3ZpZGVyUGF0dGVybigpOwotICAgIHIucmVnZXggPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoIl4iKSAmJiBwYXR0ZXJuLmVuZHNXaXRoKCIkIik7Ci0gICAgci5wYXR0ZXJuID0gcGF0dGVybjsKLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIHJlZ2V4OwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhdHRlcm47Ci0KLSAgcHJvdGVjdGVkIE9wZW5JZFByb3ZpZGVyUGF0dGVybigpIHsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlkKSB7Ci0gICAgcmV0dXJuIHJlZ2V4ID8gaWQubWF0Y2hlcyhwYXR0ZXJuKSA6IGlkLnN0YXJ0c1dpdGgocGF0dGVybik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEFjY291bnRFeHRlcm5hbElkIGlkKSB7Ci0gICAgcmV0dXJuIG1hdGNoZXMoaWQuZ2V0RXh0ZXJuYWxJZCgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBwYXR0ZXJuOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL09wZW5JZFNlcnZpY2UuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGViYTM0Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQWxsb3dDcm9zc1NpdGVSZXF1ZXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUmVtb3RlSnNvblNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbC5WZXJzaW9uOwotCi1AUnBjSW1wbCh2ZXJzaW9uID0gVmVyc2lvbi5WMl8wKQotcHVibGljIGludGVyZmFjZSBPcGVuSWRTZXJ2aWNlIGV4dGVuZHMgUmVtb3RlSnNvblNlcnZpY2UgewotICBAQWxsb3dDcm9zc1NpdGVSZXF1ZXN0Ci0gIHZvaWQgZGlzY292ZXIoU3RyaW5nIG9wZW5pZElkZW50aWZpZXIsIFNpZ25Jbk1vZGUgbW9kZSwKLSAgICAgIGJvb2xlYW4gcmVtZW1iZXIsIFN0cmluZyByZXR1cm5Ub2tlbiwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8RGlzY292ZXJ5UmVzdWx0PiBjYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvdXNlcnBhc3MvTG9naW5SZXN1bHQuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Mb2dpblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODljZGQyLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Mb2dpblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotCi1wdWJsaWMgY2xhc3MgTG9naW5SZXN1bHQgewotICBwdWJsaWMgYm9vbGVhbiBzdWNjZXNzOwotICBwdWJsaWMgYm9vbGVhbiBpc05ldzsKLQotICBwcm90ZWN0ZWQgQXV0aFR5cGUgYXV0aFR5cGU7Ci0gIHByb3RlY3RlZCBFcnJvciBlcnJvcjsKLQotICBwcm90ZWN0ZWQgTG9naW5SZXN1bHQoKSB7Ci0gIH0KLQotICBwdWJsaWMgTG9naW5SZXN1bHQoZmluYWwgQXV0aFR5cGUgYXV0aFR5cGUpIHsKLSAgICB0aGlzLmF1dGhUeXBlID0gYXV0aFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQXV0aFR5cGUgZ2V0QXV0aFR5cGUoKSB7Ci0gICAgcmV0dXJuIGF1dGhUeXBlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RXJyb3IoZmluYWwgRXJyb3IgZXJyb3IpIHsKLSAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gICAgc3VjY2VzcyA9IGVycm9yID09IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgRXJyb3IgZ2V0RXJyb3IoKSB7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBlbnVtIEVycm9yIHsKLSAgICAvKiogVXNlcm5hbWUgb3IgcGFzc3dvcmQgYXJlIGludmFsaWQgKi8KLSAgICBJTlZBTElEX0xPR0lOLAotCi0gICAgLyoqIFRoZSBhdXRoZW50aWNhdGlvbiBzZXJ2ZXIgaXMgdW5hdmFpbGFibGUgb3IgdGhlIHF1ZXJ5IHRvIGl0IHRpbWVkIG91dCAqLwotICAgIEFVVEhFTlRJQ0FUSU9OX1VOQVZBSUxBQkxFCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Vc2VyUGFzc0F1dGhTZXJ2aWNlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvdXNlcnBhc3MvVXNlclBhc3NBdXRoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM2ZDIzLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Vc2VyUGFzc0F1dGhTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3M7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXVkaXQuQXVkaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQWxsb3dDcm9zc1NpdGVSZXF1ZXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUmVtb3RlSnNvblNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbC5WZXJzaW9uOwotCi1AUnBjSW1wbCh2ZXJzaW9uID0gVmVyc2lvbi5WMl8wKQotcHVibGljIGludGVyZmFjZSBVc2VyUGFzc0F1dGhTZXJ2aWNlIGV4dGVuZHMgUmVtb3RlSnNvblNlcnZpY2UgewotICBAQXVkaXQoYWN0aW9uID0gInNpZ24gaW4iLCBvYmZ1c2NhdGU9ezF9KQotICBAQWxsb3dDcm9zc1NpdGVSZXF1ZXN0Ci0gIHZvaWQgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLAotICAgICAgQXN5bmNDYWxsYmFjazxMb2dpblJlc3VsdD4gY2FsbGJhY2spOwotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9jaGFuZ2VzL0xpc3RDaGFuZ2VzT3B0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2NoYW5nZXMvTGlzdENoYW5nZXNPcHRpb24uamF2YQppbmRleCBhNWFiODUxLi4zZDA4ZDA2IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2NoYW5nZXMvTGlzdENoYW5nZXNPcHRpb24uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2NoYW5nZXMvTGlzdENoYW5nZXNPcHRpb24uamF2YQpAQCAtMTksNiArMTksNyBAQAogLyoqIE91dHB1dCBvcHRpb25zIGF2YWlsYWJsZSB3aGVuIHVzaW5nIHtAY29kZSAvY2hhbmdlcy99IFJQQ3MuICovCiBwdWJsaWMgZW51bSBMaXN0Q2hhbmdlc09wdGlvbiB7CiAgIExBQkVMUygwKSwKKyAgREVUQUlMRURfTEFCRUxTKDgpLAogCiAgIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IG9mIHRoZSBjaGFuZ2UuICovCiAgIENVUlJFTlRfUkVWSVNJT04oMSksCkBAIC0zMCw3ICszMSwxMCBAQAogCiAgIC8qKiBJZiBhIHBhdGNoIHNldCBpcyBpbmNsdWRlZCwgaW5jbHVkZSB0aGUgZmlsZXMgb2YgdGhlIHBhdGNoIHNldC4gKi8KICAgQ1VSUkVOVF9GSUxFUyg1KSwKLSAgQUxMX0ZJTEVTKDYpOworICBBTExfRklMRVMoNiksCisKKyAgLyoqIElmIGFjY291bnRzIGFyZSBpbmNsdWRlZCwgaW5jbHVkZSBkZXRhaWxlZCBhY2NvdW50IGluZm8uICovCisgIERFVEFJTEVEX0FDQ09VTlRTKDcpOwogCiAgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOwogCkBAIC00MiwxMCArNDYsNiBAQAogICAgIHJldHVybiB2YWx1ZTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZXNPcHRpb24gZnJvbVZhbHVlKGludCB2YWx1ZSkgewotICAgIHJldHVybiBMaXN0Q2hhbmdlc09wdGlvbi52YWx1ZXMoKVt2YWx1ZV07Ci0gIH0KLQogICBwdWJsaWMgc3RhdGljIEVudW1TZXQ8TGlzdENoYW5nZXNPcHRpb24+IGZyb21CaXRzKGludCB2KSB7CiAgICAgRW51bVNldDxMaXN0Q2hhbmdlc09wdGlvbj4gciA9IEVudW1TZXQubm9uZU9mKExpc3RDaGFuZ2VzT3B0aW9uLmNsYXNzKTsKICAgICBmb3IgKExpc3RDaGFuZ2VzT3B0aW9uIG8gOiBMaXN0Q2hhbmdlc09wdGlvbi52YWx1ZXMoKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FjY291bnREYXNoYm9hcmRJbmZvLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudERhc2hib2FyZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTAwYi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudERhc2hib2FyZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBTdW1tYXJ5IGluZm9ybWF0aW9uIG5lZWRlZCB0byBkaXNwbGF5IGFuIGFjY291bnQgZGFzaGJvYXJkLiAqLwotcHVibGljIGNsYXNzIEFjY291bnREYXNoYm9hcmRJbmZvIHsKLSAgcHJvdGVjdGVkIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHM7Ci0gIHByb3RlY3RlZCBBY2NvdW50LklkIG93bmVyOwotICBwcm90ZWN0ZWQgTGlzdDxDaGFuZ2VJbmZvPiBieU93bmVyOwotICBwcm90ZWN0ZWQgTGlzdDxDaGFuZ2VJbmZvPiBmb3JSZXZpZXc7Ci0gIHByb3RlY3RlZCBMaXN0PENoYW5nZUluZm8+IGNsb3NlZDsKLQotICBwcm90ZWN0ZWQgQWNjb3VudERhc2hib2FyZEluZm8oKSB7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudERhc2hib2FyZEluZm8oZmluYWwgQWNjb3VudC5JZCBmb3JVc2VyKSB7Ci0gICAgb3duZXIgPSBmb3JVc2VyOwotICB9Ci0KLSAgcHVibGljIEFjY291bnRJbmZvQ2FjaGUgZ2V0QWNjb3VudHMoKSB7Ci0gICAgcmV0dXJuIGFjY291bnRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWNjb3VudHMoZmluYWwgQWNjb3VudEluZm9DYWNoZSBhYykgewotICAgIGFjY291bnRzID0gYWM7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudC5JZCBnZXRPd25lcigpIHsKLSAgICByZXR1cm4gb3duZXI7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxDaGFuZ2VJbmZvPiBnZXRCeU93bmVyKCkgewotICAgIHJldHVybiBieU93bmVyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QnlPd25lcihMaXN0PENoYW5nZUluZm8+IGMpIHsKLSAgICBieU93bmVyID0gYzsKLSAgfQotCi0gIHB1YmxpYyBMaXN0PENoYW5nZUluZm8+IGdldEZvclJldmlldygpIHsKLSAgICByZXR1cm4gZm9yUmV2aWV3OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Rm9yUmV2aWV3KExpc3Q8Q2hhbmdlSW5mbz4gYykgewotICAgIGZvclJldmlldyA9IGM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxDaGFuZ2VJbmZvPiBnZXRDbG9zZWQoKSB7Ci0gICAgcmV0dXJuIGNsb3NlZDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENsb3NlZChMaXN0PENoYW5nZUluZm8+IGMpIHsKLSAgICBjbG9zZWQgPSBjOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudFNlY3VyaXR5LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudFNlY3VyaXR5LmphdmEKaW5kZXggYWEyMTJmOS4uYzJkMDNhYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FjY291bnRTZWN1cml0eS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BY2NvdW50U2VjdXJpdHkuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25JblJlcXVpcmVkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50U3NoS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Db250YWN0SW5mb3JtYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwpAQCAtNjEsOSArNjAsNiBAQAogICBAU2lnbkluUmVxdWlyZWQKICAgdm9pZCBteUV4dGVybmFsSWRzKEFzeW5jQ2FsbGJhY2s8TGlzdDxBY2NvdW50RXh0ZXJuYWxJZD4+IGNhbGxiYWNrKTsKIAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBteUdyb3VwcyhBc3luY0NhbGxiYWNrPExpc3Q8QWNjb3VudEdyb3VwPj4gY2FsbGJhY2spOwotCiAgIEBBdWRpdAogICBAU2lnbkluUmVxdWlyZWQKICAgdm9pZCBkZWxldGVFeHRlcm5hbElkcyhTZXQ8QWNjb3VudEV4dGVybmFsSWQuS2V5PiBrZXlzLApkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FkZEJyYW5jaFJlc3VsdC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FkZEJyYW5jaFJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTUyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWRkQnJhbmNoUmVzdWx0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitwdWJsaWMgY2xhc3MgQWRkQnJhbmNoUmVzdWx0IHsKKyAgcHJvdGVjdGVkIExpc3RCcmFuY2hlc1Jlc3VsdCBsaXN0QnJhbmNoZXNSZXN1bHQ7CisgIHByb3RlY3RlZCBFcnJvciBlcnJvcjsKKworICBwcm90ZWN0ZWQgQWRkQnJhbmNoUmVzdWx0KCkgeworICB9CisKKyAgcHVibGljIEFkZEJyYW5jaFJlc3VsdChmaW5hbCBFcnJvciBlcnJvcikgeworICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKKyAgfQorCisgIHB1YmxpYyBBZGRCcmFuY2hSZXN1bHQoZmluYWwgTGlzdEJyYW5jaGVzUmVzdWx0IGxpc3RCcmFuY2hlc1Jlc3VsdCkgeworICAgIHRoaXMubGlzdEJyYW5jaGVzUmVzdWx0ID0gbGlzdEJyYW5jaGVzUmVzdWx0OworICB9CisKKyAgcHVibGljIExpc3RCcmFuY2hlc1Jlc3VsdCBnZXRMaXN0QnJhbmNoZXNSZXN1bHQoKSB7CisgICAgcmV0dXJuIGxpc3RCcmFuY2hlc1Jlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgeworICAgIHJldHVybiBlcnJvciAhPSBudWxsOworICB9CisKKyAgcHVibGljIEVycm9yIGdldEVycm9yKCkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3IgeworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKKyAgICAgIC8qKiBUaGUgYnJhbmNoIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgdGhlIGdpdmVuIGJyYW5jaCBuYW1lIGlzIGludmFsaWQuICovCisgICAgICBJTlZBTElEX05BTUUsCisKKyAgICAgIC8qKiBUaGUgYnJhbmNoIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgdGhlIGdpdmVuIHJldmlzaW9uIGlzIGludmFsaWQuICovCisgICAgICBJTlZBTElEX1JFVklTSU9OLAorCisgICAgICAvKioKKyAgICAgICAqIFRoZSBicmFuY2ggY2Fubm90IGJlIGNyZWF0ZWQgdW5kZXIgdGhlIGdpdmVuIHJlZm5hbWUgcHJlZml4IChlLmcKKyAgICAgICAqIGJyYW5jaGVzIGNhbm5vdCBiZSBjcmVhdGVkIHVuZGVyIG1hZ2ljIHJlZm5hbWUgcHJlZml4ZXMpLgorICAgICAgICovCisgICAgICBCUkFOQ0hfQ1JFQVRJT05fTk9UX0FMTE9XRURfVU5ERVJfUkVGTkFNRV9QUkVGSVgsCisKKyAgICAgIC8qKiBUaGUgYnJhbmNoIHRoYXQgc2hvdWxkIGJlIGNyZWF0ZWQgZXhpc3RzIGFscmVhZHkuICovCisgICAgICBCUkFOQ0hfQUxSRUFEWV9FWElTVFMsCisKKyAgICAgIC8qKgorICAgICAgICogVGhlIGJyYW5jaCBjYW5ub3QgYmUgY3JlYXRlZCBiZWNhdXNlIGl0IGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nCisgICAgICAgKiBicmFuY2ggKGJyYW5jaGVzIGNhbm5vdCBiZSBuZXN0ZWQpLgorICAgICAgICovCisgICAgICBCUkFOQ0hfQ1JFQVRJT05fQ09ORkxJQ1QKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVHlwZSB0eXBlOworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVmbmFtZTsKKworICAgIHByb3RlY3RlZCBFcnJvcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXJyb3IoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICB0aGlzKHR5cGUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBFcnJvcihmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyByZWZuYW1lKSB7CisgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgdGhpcy5yZWZuYW1lID0gcmVmbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZWZuYW1lKCkgeworICAgICAgcmV0dXJuIHJlZm5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiB0eXBlICsgIiAiICsgcmVmbmFtZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbERldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsRGV0YWlsLmphdmEKaW5kZXggM2Q0MzhmMi4uMzZhOTgxNCAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsRGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsRGV0YWlsLmphdmEKQEAgLTE1LDM4ICsxNSw0MSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogCi1pbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIEFwcHJvdmFsRGV0YWlsIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEFwcHJvdmFsRGV0YWlsPiBTT1JUID0KLSAgICAgIG5ldyBDb21wYXJhdG9yPEFwcHJvdmFsRGV0YWlsPigpIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEFwcHJvdmFsRGV0YWlsIG8xLCBmaW5hbCBBcHByb3ZhbERldGFpbCBvMikgewotICAgICAgICAgIGludCBjbXA7Ci0gICAgICAgICAgY21wID0gbzIuaGFzTm9uWmVybyAtIG8xLmhhc05vblplcm87Ci0gICAgICAgICAgaWYgKGNtcCAhPSAwKSByZXR1cm4gY21wOwotICAgICAgICAgIHJldHVybiBvMS5zb3J0T3JkZXIuY29tcGFyZVRvKG8yLnNvcnRPcmRlcik7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0KLSAgc3RhdGljIGZpbmFsIFRpbWVzdGFtcCBFR18wID0gbmV3IFRpbWVzdGFtcCgwKTsKLSAgc3RhdGljIGZpbmFsIFRpbWVzdGFtcCBFR19EID0gbmV3IFRpbWVzdGFtcChMb25nLk1BWF9WQUxVRSk7CisgIHB1YmxpYyBzdGF0aWMgTGlzdDxBcHByb3ZhbERldGFpbD4gc29ydChDb2xsZWN0aW9uPEFwcHJvdmFsRGV0YWlsPiBhZHMsCisgICAgICBmaW5hbCBpbnQgb3duZXIpIHsKKyAgICBMaXN0PEFwcHJvdmFsRGV0YWlsPiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsRGV0YWlsPihhZHMpOworICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkLCBuZXcgQ29tcGFyYXRvcjxBcHByb3ZhbERldGFpbD4oKSB7CisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQXBwcm92YWxEZXRhaWwgbzEsIEFwcHJvdmFsRGV0YWlsIG8yKSB7CisgICAgICAgIGludCBieU93bmVyID0gKG8yLmFjY291bnQuZ2V0KCkgPT0gb3duZXIgPyAxIDogMCkKKyAgICAgICAgICAgIC0gKG8xLmFjY291bnQuZ2V0KCkgPT0gb3duZXIgPyAxIDogMCk7CisgICAgICAgIHJldHVybiBieU93bmVyICE9IDAgPyBieU93bmVyIDogKG8xLmhhc05vblplcm8gLSBvMi5oYXNOb25aZXJvKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gc29ydGVkOworICB9CiAKICAgcHJvdGVjdGVkIEFjY291bnQuSWQgYWNjb3VudDsKICAgcHJvdGVjdGVkIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmU7CisgIHByaXZhdGUgU2V0PFN0cmluZz4gdm90YWJsZTsKIAogICBwcml2YXRlIHRyYW5zaWVudCBTZXQ8U3RyaW5nPiBhcHByb3ZlZDsKICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PFN0cmluZz4gcmVqZWN0ZWQ7CisgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIEludGVnZXI+IHZhbHVlczsKICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGhhc05vblplcm87Ci0gIHByaXZhdGUgdHJhbnNpZW50IFRpbWVzdGFtcCBzb3J0T3JkZXIgPSBFR19EOwogCiAgIHByb3RlY3RlZCBBcHByb3ZhbERldGFpbCgpIHsKICAgfQpAQCAtNjgsNDEgKzcxLDEyIEBACiAgICAgY2FuUmVtb3ZlID0gcmVtb3ZlYWJsZTsKICAgfQogCi0gIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGdldFBhdGNoU2V0QXBwcm92YWxzKCkgewotICAgIHJldHVybiBhcHByb3ZhbHM7Ci0gIH0KLQotICBwdWJsaWMgUGF0Y2hTZXRBcHByb3ZhbCBnZXRQYXRjaFNldEFwcHJvdmFsKEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0ZWdvcnkpIHsKLSAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogYXBwcm92YWxzKSB7Ci0gICAgICBpZiAocHNhLmdldENhdGVnb3J5SWQoKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgIHJldHVybiBwc2E7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc29ydEZpcnN0KCkgewotICAgIGhhc05vblplcm8gPSAxOwotICAgIHNvcnRPcmRlciA9IEFwcHJvdmFsRGV0YWlsLkVHXzA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGQoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSkgewotICAgIGFwcHJvdmFscy5hZGQoY2EpOwotCi0gICAgZmluYWwgVGltZXN0YW1wIGcgPSBjYS5nZXRHcmFudGVkKCk7Ci0gICAgaWYgKGcgIT0gbnVsbCAmJiBnLmNvbXBhcmVUbyhzb3J0T3JkZXIpIDwgMCkgewotICAgICAgc29ydE9yZGVyID0gZzsKLSAgICB9Ci0gICAgaWYgKGNhLmdldFZhbHVlKCkgIT0gMCkgewotICAgICAgaGFzTm9uWmVybyA9IDE7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHZvaWQgYXBwcm92ZWQoU3RyaW5nIGxhYmVsKSB7CiAgICAgaWYgKGFwcHJvdmVkID09IG51bGwpIHsKICAgICAgIGFwcHJvdmVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgIH0KICAgICBhcHByb3ZlZC5hZGQobGFiZWwpOworICAgIGhhc05vblplcm8gPSAxOwogICB9CiAKICAgcHVibGljIHZvaWQgcmVqZWN0ZWQoU3RyaW5nIGxhYmVsKSB7CkBAIC0xMTAsNiArODQsMjQgQEAKICAgICAgIHJlamVjdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgIH0KICAgICByZWplY3RlZC5hZGQobGFiZWwpOworICAgIGhhc05vblplcm8gPSAxOworICB9CisKKyAgcHVibGljIHZvaWQgdm90YWJsZShTdHJpbmcgbGFiZWwpIHsKKyAgICBpZiAodm90YWJsZSA9PSBudWxsKSB7CisgICAgICB2b3RhYmxlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIH0KKyAgICB2b3RhYmxlLmFkZChsYWJlbCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWx1ZShTdHJpbmcgbGFiZWwsIGludCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIH0KKyAgICB2YWx1ZXMucHV0KGxhYmVsLCB2YWx1ZSk7CisgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgIGhhc05vblplcm8gPSAxOworICAgIH0KICAgfQogCiAgIHB1YmxpYyBib29sZWFuIGlzQXBwcm92ZWQoU3RyaW5nIGxhYmVsKSB7CkBAIC0xMTksNCArMTExLDE2IEBACiAgIHB1YmxpYyBib29sZWFuIGlzUmVqZWN0ZWQoU3RyaW5nIGxhYmVsKSB7CiAgICAgcmV0dXJuIHJlamVjdGVkICE9IG51bGwgJiYgcmVqZWN0ZWQuY29udGFpbnMobGFiZWwpOwogICB9CisKKyAgcHVibGljIGJvb2xlYW4gY2FuVm90ZShTdHJpbmcgbGFiZWwpIHsKKyAgICByZXR1cm4gdm90YWJsZSAhPSBudWxsICYmIHZvdGFibGUuY29udGFpbnMobGFiZWwpOworICB9CisKKyAgcHVibGljIGludCBnZXRWYWx1ZShTdHJpbmcgbGFiZWwpIHsKKyAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBJbnRlZ2VyIHYgPSB2YWx1ZXMuZ2V0KGxhYmVsKTsKKyAgICByZXR1cm4gdiAhPSBudWxsID8gdiA6IDA7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnkuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljOWQ2Ny4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxTdW1tYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogU3VtbWFyaXplcyB0aGUgYXBwcm92YWxzIChvciBuZWdhdGl2ZSBhcHByb3ZhbHMpIGZvciBhIHBhdGNoIHNldC4KLSAqIFRoaXMgd2lsbCB0eXBpY2FsbHkgY29udGFpbiB6ZXJvIG9yIG9uZSBhcHByb3ZhbHMgZm9yIGVhY2gKLSAqIGNhdGVnb3J5LCB3aXRoIGFsbCBvZiB0aGUgYXBwcm92YWxzIGNvbWluZyBmcm9tIGEgc2luZ2xlIHBhdGNoIHNldC4KLSAqLwotcHVibGljIGNsYXNzIEFwcHJvdmFsU3VtbWFyeSB7Ci0gIHByb3RlY3RlZCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbFN1bW1hcnkoKSB7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxTdW1tYXJ5KGZpbmFsIEl0ZXJhYmxlPFBhdGNoU2V0QXBwcm92YWw+IGxpc3QpIHsKLSAgICBhcHByb3ZhbHMgPSBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPigpOwotICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhIDogbGlzdCkgewotICAgICAgYXBwcm92YWxzLnB1dChhLmdldENhdGVnb3J5SWQoKSwgYSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiBnZXRBcHByb3ZhbE1hcCgpIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGFwcHJvdmFscyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnlTZXQuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnlTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxMTA4NS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxTdW1tYXJ5U2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBDb250YWlucyBhIHNldCBvZiBBcHByb3ZhbFN1bW1hcnkgb2JqZWN0cywga2V5ZWQgYnkgdGhlIGNoYW5nZSBpZAotICogZnJvbSB3aGljaCB0aGV5IHdlcmUgZGVyaXZlZC4KLSAqLwotcHVibGljIGNsYXNzIEFwcHJvdmFsU3VtbWFyeVNldCB7Ci0gIHByb3RlY3RlZCBBY2NvdW50SW5mb0NhY2hlIGFjY291bnRzOwotCi0gIHByb3RlY3RlZCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IHN1bW1hcmllczsKLQotICBwcm90ZWN0ZWQgQXBwcm92YWxTdW1tYXJ5U2V0KCkgewotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsU3VtbWFyeVNldChmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjY3RzLAotICAgICAgZmluYWwgTWFwPENoYW5nZS5JZCwgQXBwcm92YWxTdW1tYXJ5PiBtYXApIHsKLSAgICBhY2NvdW50cyA9IGFjY3RzOwotCi0gICAgc3VtbWFyaWVzID0gbmV3IEhhc2hNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+KCk7Ci0gICAgc3VtbWFyaWVzLnB1dEFsbChtYXApOwotICB9Ci0KLSAgcHVibGljIEFjY291bnRJbmZvQ2FjaGUgZ2V0QWNjb3VudEluZm9DYWNoZSgpIHsKLSAgICByZXR1cm4gYWNjb3VudHM7Ci0gIH0KLQotICBwdWJsaWMgTWFwPENoYW5nZS5JZCwgQXBwcm92YWxTdW1tYXJ5PiBnZXRTdW1tYXJ5TWFwKCkgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoc3VtbWFyaWVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsVHlwZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNiOTFjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIEFwcHJvdmFsVHlwZSB7Ci0gIHByb3RlY3RlZCBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5OwotICBwcm90ZWN0ZWQgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHVlczsKLSAgcHJvdGVjdGVkIHNob3J0IG1heE5lZ2F0aXZlOwotICBwcm90ZWN0ZWQgc2hvcnQgbWF4UG9zaXRpdmU7Ci0KLSAgcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxJbnRlZ2VyPiBpbnRMaXN0OwotICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U2hvcnQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gYnlWYWx1ZTsKLQotICBwcm90ZWN0ZWQgQXBwcm92YWxUeXBlKCkgewotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsVHlwZShmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGFjLAotICAgICAgZmluYWwgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHVlTGlzdCkgewotICAgIGNhdGVnb3J5ID0gYWM7Ci0gICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+KHZhbHVlTGlzdCk7Ci0gICAgQ29sbGVjdGlvbnMuc29ydCh2YWx1ZXMsIG5ldyBDb21wYXJhdG9yPEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4oKSB7Ci0gICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQXBwcm92YWxDYXRlZ29yeVZhbHVlIG8xLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgbzIpIHsKLSAgICAgICAgcmV0dXJuIG8xLmdldFZhbHVlKCkgLSBvMi5nZXRWYWx1ZSgpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgbWF4TmVnYXRpdmUgPSBTaG9ydC5NSU5fVkFMVUU7Ci0gICAgbWF4UG9zaXRpdmUgPSBTaG9ydC5NQVhfVkFMVUU7Ci0gICAgaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0gICAgICBpZiAodmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpIDwgMCkgewotICAgICAgICBtYXhOZWdhdGl2ZSA9IHZhbHVlcy5nZXQoMCkuZ2V0VmFsdWUoKTsKLSAgICAgIH0KLSAgICAgIGlmICh2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKS5nZXRWYWx1ZSgpID4gMCkgewotICAgICAgICBtYXhQb3NpdGl2ZSA9IHZhbHVlcy5nZXQodmFsdWVzLnNpemUoKSAtIDEpLmdldFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgdGhlIGxhYmVsIG5hbWUgdG8gcHJlLWNvbXB1dGUgc28gd2UgZG9uJ3QgaGF2ZSBkYXRhIHJhY2UgY29uZGl0aW9ucy4KLSAgICBnZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5OwotICB9Ci0KLSAgcHVibGljIExpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPiBnZXRWYWx1ZXMoKSB7Ci0gICAgcmV0dXJuIHZhbHVlczsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgZ2V0TWluKCkgewotICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlcy5nZXQoMCk7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGdldE1heCgpIHsKLSAgICBpZiAodmFsdWVzLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2ID0gdmFsdWVzLmdldCh2YWx1ZXMuc2l6ZSgpIC0gMSk7Ci0gICAgcmV0dXJuIHYuZ2V0VmFsdWUoKSA+IDAgPyB2IDogbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzTWF4TmVnYXRpdmUoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSkgewotICAgIHJldHVybiBtYXhOZWdhdGl2ZSA9PSBjYS5nZXRWYWx1ZSgpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNNYXhQb3NpdGl2ZShmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhKSB7Ci0gICAgcmV0dXJuIG1heFBvc2l0aXZlID09IGNhLmdldFZhbHVlKCk7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGdldFZhbHVlKGZpbmFsIHNob3J0IHZhbHVlKSB7Ci0gICAgaW5pdEJ5VmFsdWUoKTsKLSAgICByZXR1cm4gYnlWYWx1ZS5nZXQodmFsdWUpOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBnZXRWYWx1ZShmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhKSB7Ci0gICAgaW5pdEJ5VmFsdWUoKTsKLSAgICByZXR1cm4gYnlWYWx1ZS5nZXQoY2EuZ2V0VmFsdWUoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdEJ5VmFsdWUoKSB7Ci0gICAgaWYgKGJ5VmFsdWUgPT0gbnVsbCkgewotICAgICAgYnlWYWx1ZSA9IG5ldyBIYXNoTWFwPFNob3J0LCBBcHByb3ZhbENhdGVnb3J5VmFsdWU+KCk7Ci0gICAgICBmb3IgKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBhY3YgOiB2YWx1ZXMpIHsKLSAgICAgICAgYnlWYWx1ZS5wdXQoYWN2LmdldFZhbHVlKCksIGFjdik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0VmFsdWVzQXNMaXN0KCkgewotICAgIGlmIChpbnRMaXN0ID09IG51bGwpIHsKLSAgICAgIGludExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KHZhbHVlcy5zaXplKCkpOwotICAgICAgZm9yIChBcHByb3ZhbENhdGVnb3J5VmFsdWUgYWN2IDogdmFsdWVzKSB7Ci0gICAgICAgIGludExpc3QuYWRkKEludGVnZXIudmFsdWVPZihhY3YuZ2V0VmFsdWUoKSkpOwotICAgICAgfQotICAgICAgQ29sbGVjdGlvbnMuc29ydChpbnRMaXN0KTsKLSAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoaW50TGlzdCk7Ci0gICAgfQotICAgIHJldHVybiBpbnRMaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxUeXBlcy5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlMzJkMS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQXBwcm92YWxUeXBlcyB7Ci0gIHByb3RlY3RlZCBMaXN0PEFwcHJvdmFsVHlwZT4gYXBwcm92YWxUeXBlczsKLSAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsVHlwZT4gYnlJZDsKLSAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZywgQXBwcm92YWxUeXBlPiBieUxhYmVsOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbFR5cGVzKCkgewotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsVHlwZXMoZmluYWwgTGlzdDxBcHByb3ZhbFR5cGU+IGFwcHJvdmFscykgewotICAgIGFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbHM7Ci0gICAgYnlDYXRlZ29yeSgpOwotICB9Ci0KLSAgcHVibGljIExpc3Q8QXBwcm92YWxUeXBlPiBnZXRBcHByb3ZhbFR5cGVzKCkgewotICAgIHJldHVybiBhcHByb3ZhbFR5cGVzOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsVHlwZSBieUlkKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgaWQpIHsKLSAgICByZXR1cm4gYnlDYXRlZ29yeSgpLmdldChpZCk7Ci0gIH0KLQotICBwcml2YXRlIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbFR5cGU+IGJ5Q2F0ZWdvcnkoKSB7Ci0gICAgaWYgKGJ5SWQgPT0gbnVsbCkgewotICAgICAgYnlJZCA9IG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsVHlwZT4oKTsKLSAgICAgIGlmIChhcHByb3ZhbFR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgdCA6IGFwcHJvdmFsVHlwZXMpIHsKLSAgICAgICAgICBieUlkLnB1dCh0LmdldENhdGVnb3J5KCkuZ2V0SWQoKSwgdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ5SWQ7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxUeXBlIGJ5TGFiZWwoU3RyaW5nIGxhYmVsTmFtZSkgewotICAgIHJldHVybiBieUxhYmVsKCkuZ2V0KGxhYmVsTmFtZS50b0xvd2VyQ2FzZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgTWFwPFN0cmluZywgQXBwcm92YWxUeXBlPiBieUxhYmVsKCkgewotICAgIGlmIChieUxhYmVsID09IG51bGwpIHsKLSAgICAgIGJ5TGFiZWwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFwcHJvdmFsVHlwZT4oKTsKLSAgICAgIGlmIChhcHByb3ZhbFR5cGVzICE9IG51bGwpIHsKLSAgICAgICAgZm9yIChBcHByb3ZhbFR5cGUgdCA6IGFwcHJvdmFsVHlwZXMpIHsKLSAgICAgICAgICBieUxhYmVsLnB1dCh0LmdldENhdGVnb3J5KCkuZ2V0TGFiZWxOYW1lKCkudG9Mb3dlckNhc2UoKSwgdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ5TGFiZWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VEZXRhaWwuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VEZXRhaWwuamF2YQppbmRleCA3NGQxOTYyLi43YWMyMWRiIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlRGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZURldGFpbC5qYXZhCkBAIC0xNywxMCArMTcsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKiBEZXRhaWwgbmVjZXNzYXJ5IHRvIGRpc3BsYXkgYSBjaGFuZ2UuICovCkBAIC0yOCw2ICsyNiw3IEBACiAgIHByb3RlY3RlZCBBY2NvdW50SW5mb0NhY2hlIGFjY291bnRzOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3NBbm9ueW1vdXM7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhbkFiYW5kb247CisgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXRDb21taXRNZXNzYWdlOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5QdWJsaXNoOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZWJhc2U7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlc3RvcmU7CkBAIC0zOCwxMyArMzcsMTUgQEAKICAgcHJvdGVjdGVkIExpc3Q8Q2hhbmdlSW5mbz4gZGVwZW5kc09uOwogICBwcm90ZWN0ZWQgTGlzdDxDaGFuZ2VJbmZvPiBuZWVkZWRCeTsKICAgcHJvdGVjdGVkIExpc3Q8UGF0Y2hTZXQ+IHBhdGNoU2V0czsKLSAgcHJvdGVjdGVkIExpc3Q8QXBwcm92YWxEZXRhaWw+IGFwcHJvdmFsczsKICAgcHJvdGVjdGVkIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzOworICBwcm90ZWN0ZWQgUHJvamVjdC5TdWJtaXRUeXBlIHN1Ym1pdFR5cGU7CisgIHByb3RlY3RlZCBTdWJtaXRUeXBlUmVjb3JkIHN1Ym1pdFR5cGVSZWNvcmQ7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblN1Ym1pdDsKICAgcHJvdGVjdGVkIExpc3Q8Q2hhbmdlTWVzc2FnZT4gbWVzc2FnZXM7CiAgIHByb3RlY3RlZCBQYXRjaFNldC5JZCBjdXJyZW50UGF0Y2hTZXRJZDsKICAgcHJvdGVjdGVkIFBhdGNoU2V0RGV0YWlsIGN1cnJlbnREZXRhaWw7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQ7CisgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXRUb3BpY05hbWU7CiAKICAgcHVibGljIENoYW5nZURldGFpbCgpIHsKICAgfQpAQCAtNzMsNiArNzQsMTQgQEAKICAgICBjYW5BYmFuZG9uID0gYTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGNhbkVkaXRDb21taXRNZXNzYWdlKCkgeworICAgIHJldHVybiBjYW5FZGl0Q29tbWl0TWVzc2FnZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENhbkVkaXRDb21taXRNZXNzYWdlKGZpbmFsIGJvb2xlYW4gYSkgeworICAgIGNhbkVkaXRDb21taXRNZXNzYWdlID0gYTsKKyAgfQorCiAgIHB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2goKSB7CiAgICAgcmV0dXJuIGNhblB1Ymxpc2g7CiAgIH0KQEAgLTEyMSw2ICsxMzAsMTQgQEAKICAgICBjYW5EZWxldGVEcmFmdCA9IGE7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiBjYW5FZGl0VG9waWNOYW1lKCkgeworICAgIHJldHVybiBjYW5FZGl0VG9waWNOYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2FuRWRpdFRvcGljTmFtZShib29sZWFuIGEpIHsKKyAgICBjYW5FZGl0VG9waWNOYW1lID0gYTsKKyAgfQorCiAgIHB1YmxpYyBDaGFuZ2UgZ2V0Q2hhbmdlKCkgewogICAgIHJldHVybiBjaGFuZ2U7CiAgIH0KQEAgLTE3MCwxNSArMTg3LDYgQEAKICAgICBwYXRjaFNldHMgPSBzOwogICB9CiAKLSAgcHVibGljIExpc3Q8QXBwcm92YWxEZXRhaWw+IGdldEFwcHJvdmFscygpIHsKLSAgICByZXR1cm4gYXBwcm92YWxzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXBwcm92YWxzKENvbGxlY3Rpb248QXBwcm92YWxEZXRhaWw+IGxpc3QpIHsKLSAgICBhcHByb3ZhbHMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsRGV0YWlsPihsaXN0KTsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KGFwcHJvdmFscywgQXBwcm92YWxEZXRhaWwuU09SVCk7Ci0gIH0KLQogICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRSZWNvcmRzKExpc3Q8U3VibWl0UmVjb3JkPiBhbGwpIHsKICAgICBzdWJtaXRSZWNvcmRzID0gYWxsOwogICB9CkBAIC0xODcsNiArMTk1LDE0IEBACiAgICAgcmV0dXJuIHN1Ym1pdFJlY29yZHM7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRUeXBlUmVjb3JkKFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgeworICAgIHRoaXMuc3VibWl0VHlwZVJlY29yZCA9IHN1Ym1pdFR5cGVSZWNvcmQ7CisgIH0KKworICBwdWJsaWMgU3VibWl0VHlwZVJlY29yZCBnZXRTdWJtaXRUeXBlUmVjb3JkKCkgeworICAgIHJldHVybiBzdWJtaXRUeXBlUmVjb3JkOworICB9CisKICAgcHVibGljIGJvb2xlYW4gaXNDdXJyZW50UGF0Y2hTZXQoZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CiAgICAgcmV0dXJuIGN1cnJlbnRQYXRjaFNldElkICE9IG51bGwKICAgICAgICAgJiYgZGV0YWlsLmdldFBhdGNoU2V0KCkuZ2V0SWQoKS5lcXVhbHMoY3VycmVudFBhdGNoU2V0SWQpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZUluZm8uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VJbmZvLmphdmEKaW5kZXggMzkxZDYxNS4uZjJlODMzZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZUluZm8uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlSW5mby5qYXZhCkBAIC01MCw3ICs1MCw3IEBACiAgICAgbGFzdFVwZGF0ZWRPbiA9IGMuZ2V0TGFzdFVwZGF0ZWRPbigpOwogICAgIHNvcnRLZXkgPSBjLmdldFNvcnRLZXkoKTsKICAgICBwYXRjaFNldElkID0gcGF0Y2hJZDsKLSAgICBsYXRlc3QgPSBwYXRjaFNldElkID09IG51bGwgfHwgYy5jdXJyUGF0Y2hTZXRJZCgpLmVxdWFscyhwYXRjaFNldElkKTsKKyAgICBsYXRlc3QgPSBwYXRjaFNldElkID09IG51bGwgfHwgcGF0Y2hTZXRJZC5lcXVhbHMoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKICAgfQogCiAgIHB1YmxpYyBDaGFuZ2VJbmZvKGZpbmFsIENoYW5nZSBjKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlTWFuYWdlU2VydmljZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZU1hbmFnZVNlcnZpY2UuamF2YQppbmRleCA0ZWY2YjNlLi5kMGU1MTU0IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlTWFuYWdlU2VydmljZS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VNYW5hZ2VTZXJ2aWNlLmphdmEKQEAgLTI3LDIyICsyNyw4IEBACiBwdWJsaWMgaW50ZXJmYWNlIENoYW5nZU1hbmFnZVNlcnZpY2UgZXh0ZW5kcyBSZW1vdGVKc29uU2VydmljZSB7CiAgIEBBdWRpdAogICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBzdWJtaXQoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgYWJhbmRvbkNoYW5nZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHJldmVydENoYW5nZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHJlc3RvcmVDaGFuZ2UoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spOworICB2b2lkIGNyZWF0ZU5ld1BhdGNoU2V0KGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIFN0cmluZyBuZXdDb21taXRNZXNzYWdlLAorICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKTsKIAogICBAQXVkaXQKICAgQFNpZ25JblJlcXVpcmVkCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ29tbWVudERldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NvbW1lbnREZXRhaWwuamF2YQppbmRleCAwZTA3OWIzLi4zY2IzZjA1IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ29tbWVudERldGFpbC5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Db21tZW50RGV0YWlsLmphdmEKQEAgLTg5LDkgKzg5LDYgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGdldEZvckEoZmluYWwgaW50IGxpbmVOYnIpIHsKLSAgICBpZiAobGluZU5iciA9PSAwKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQogICAgIGlmIChmb3JBID09IG51bGwpIHsKICAgICAgIGZvckEgPSBpbmRleChhKTsKICAgICB9CkBAIC05OSw5ICs5Niw2IEBACiAgIH0KIAogICBwdWJsaWMgTGlzdDxQYXRjaExpbmVDb21tZW50PiBnZXRGb3JCKGZpbmFsIGludCBsaW5lTmJyKSB7Ci0gICAgaWYgKGxpbmVOYnIgPT0gMCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KICAgICBpZiAoZm9yQiA9PSBudWxsKSB7CiAgICAgICBmb3JCID0gaW5kZXgoYik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YyODNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQgeworICBwcm90ZWN0ZWQgTGlzdDxFcnJvcj4gZXJyb3JzOworCisgIHB1YmxpYyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCgpIHsKKyAgICBlcnJvcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZEVycm9yKEVycm9yIGUpIHsKKyAgICBlcnJvcnMuYWRkKGUpOworICB9CisKKyAgcHVibGljIExpc3Q8RXJyb3I+IGdldEVycm9ycygpIHsKKyAgICByZXR1cm4gZXJyb3JzOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKCkgeworICAgIHJldHVybiAhZXJyb3JzLmlzRW1wdHkoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3IgeworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKKyAgICAgIC8qKiBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCBmb3IgdGhpcyBwcm9qZWN0ICovCisgICAgICBHQ19BTFJFQURZX1NDSEVEVUxFRCwKKworICAgICAgLyoqIFRoZSByZXBvc2l0b3J5IHdhcyBub3QgZm91bmQuICovCisgICAgICBSRVBPU0lUT1JZX05PVF9GT1VORCwKKworICAgICAgLyoqIFRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZhaWxlZC4gKi8KKyAgICAgIEdDX0ZBSUxFRAorICAgIH0KKworICAgIHByb3RlY3RlZCBUeXBlIHR5cGU7CisgICAgcHJvdGVjdGVkIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKKworICAgIHByb3RlY3RlZCBFcnJvcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRXJyb3IoVHlwZSB0eXBlLCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUpIHsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0Lk5hbWVLZXkgZ2V0UHJvamVjdE5hbWUoKSB7CisgICAgICByZXR1cm4gcHJvamVjdE5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBiLmFwcGVuZCh0eXBlKTsKKyAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsKSB7CisgICAgICAgIGIuYXBwZW5kKCIgIikuYXBwZW5kKHByb2plY3ROYW1lKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2Vycml0Q29uZmlnLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2Vycml0Q29uZmlnLmphdmEKaW5kZXggN2MxNjEyOS4uMTZiOTlkYyAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dlcnJpdENvbmZpZy5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HZXJyaXRDb25maWcuamF2YQpAQCAtMTQsNyArMTQsNiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFByb3ZpZGVyUGF0dGVybjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudC5GaWVsZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRDb21tYW5kOwpAQCAtMjgsMTAgKzI3LDkgQEAKIAogcHVibGljIGNsYXNzIEdlcnJpdENvbmZpZyBpbXBsZW1lbnRzIENsb25lYWJsZSB7CiAgIHByb3RlY3RlZCBTdHJpbmcgcmVnaXN0ZXJVcmw7CisgIHByb3RlY3RlZCBTdHJpbmcgcmVnaXN0ZXJUZXh0OwogICBwcm90ZWN0ZWQgU3RyaW5nIGh0dHBQYXNzd29yZFVybDsKICAgcHJvdGVjdGVkIFN0cmluZyByZXBvcnRCdWdVcmw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgb3BlbklkU3NvVXJsOwotICBwcm90ZWN0ZWQgTGlzdDxPcGVuSWRQcm92aWRlclBhdHRlcm4+IGFsbG93ZWRPcGVuSURzOwogCiAgIHByb3RlY3RlZCBHaXR3ZWJDb25maWcgZ2l0d2ViOwogICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250cmlidXRvckFncmVlbWVudHM7CkBAIC00NSwxMiArNDMsMTIgQEAKICAgcHJvdGVjdGVkIFN0cmluZyBzc2hkQWRkcmVzczsKICAgcHJvdGVjdGVkIFN0cmluZyBlZGl0RnVsbE5hbWVVcmw7CiAgIHByb3RlY3RlZCBQcm9qZWN0Lk5hbWVLZXkgd2lsZFByb2plY3Q7Ci0gIHByb3RlY3RlZCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXM7CiAgIHByb3RlY3RlZCBTZXQ8QWNjb3VudC5GaWVsZE5hbWU+IGVkaXRhYmxlQWNjb3VudEZpZWxkczsKICAgcHJvdGVjdGVkIExpc3Q8UmVnZXhGaW5kUmVwbGFjZT4gY29tbWVudExpbmtzOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBkb2N1bWVudGF0aW9uQXZhaWxhYmxlOwogICBwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0Q2hhbmdlTWVyZ2U7CiAgIHByb3RlY3RlZCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZTsKKyAgcHJvdGVjdGVkIGludCBzdWdnZXN0RnJvbTsKIAogICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdGVyVXJsKCkgewogICAgIHJldHVybiByZWdpc3RlclVybDsKQEAgLTYwLDYgKzU4LDE0IEBACiAgICAgcmVnaXN0ZXJVcmwgPSB1OwogICB9CiAKKyAgcHVibGljIFN0cmluZyBnZXRSZWdpc3RlclRleHQoKSB7CisgICAgcmV0dXJuIHJlZ2lzdGVyVGV4dDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFJlZ2lzdGVyVGV4dChmaW5hbCBTdHJpbmcgdCkgeworICAgIHJlZ2lzdGVyVGV4dCA9IHQ7CisgIH0KKwogICBwdWJsaWMgU3RyaW5nIGdldFJlcG9ydEJ1Z1VybCgpIHsKICAgICByZXR1cm4gcmVwb3J0QnVnVXJsOwogICB9CkBAIC04NCwyMiArOTAsNiBAQAogICAgIGh0dHBQYXNzd29yZFVybCA9IHVybDsKICAgfQogCi0gIHB1YmxpYyBTdHJpbmcgZ2V0T3BlbklkU3NvVXJsKCkgewotICAgICAgcmV0dXJuIG9wZW5JZFNzb1VybDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9wZW5JZFNzb1VybChmaW5hbCBTdHJpbmcgdSkgewotICAgIG9wZW5JZFNzb1VybCA9IHU7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxPcGVuSWRQcm92aWRlclBhdHRlcm4+IGdldEFsbG93ZWRPcGVuSURzKCkgewotICAgIHJldHVybiBhbGxvd2VkT3BlbklEczsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRPcGVuSURzKExpc3Q8T3BlbklkUHJvdmlkZXJQYXR0ZXJuPiBsKSB7Ci0gICAgYWxsb3dlZE9wZW5JRHMgPSBsOwotICB9Ci0KICAgcHVibGljIEF1dGhUeXBlIGdldEF1dGhUeXBlKCkgewogICAgIHJldHVybiBhdXRoVHlwZTsKICAgfQpAQCAtMTg2LDE0ICsxNzYsNiBAQAogICAgIHdpbGRQcm9qZWN0ID0gd3A7CiAgIH0KIAotICBwdWJsaWMgQXBwcm92YWxUeXBlcyBnZXRBcHByb3ZhbFR5cGVzKCkgewotICAgIHJldHVybiBhcHByb3ZhbFR5cGVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXBwcm92YWxUeXBlcyhmaW5hbCBBcHByb3ZhbFR5cGVzIGF0KSB7Ci0gICAgYXBwcm92YWxUeXBlcyA9IGF0OwotICB9Ci0KICAgcHVibGljIGJvb2xlYW4gY2FuRWRpdChmaW5hbCBBY2NvdW50LkZpZWxkTmFtZSBmKSB7CiAgICAgcmV0dXJuIGVkaXRhYmxlQWNjb3VudEZpZWxkcy5jb250YWlucyhmKTsKICAgfQpAQCAtMjM4LDYgKzIyMCwxNCBAQAogICAgIHRoaXMuYW5vbnltb3VzQ293YXJkTmFtZSA9IGFub255bW91c0Nvd2FyZE5hbWU7CiAgIH0KIAorICBwdWJsaWMgaW50IGdldFN1Z2dlc3RGcm9tKCkgeworICAgIHJldHVybiBzdWdnZXN0RnJvbTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFN1Z2dlc3RGcm9tKGZpbmFsIGludCBzdWdnZXN0RnJvbSkgeworICAgIHRoaXMuc3VnZ2VzdEZyb20gPSBzdWdnZXN0RnJvbTsKKyAgfQorCiAgIHB1YmxpYyBib29sZWFuIHNpdGVIYXNVc2VybmFtZXMoKSB7CiAgICAgaWYgKGdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuQ1VTVE9NX0VYVEVOU0lPTgogICAgICAgICAmJiBnZXRIdHRwUGFzc3dvcmRVcmwoKSAhPSBudWxsCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2l0V2ViVHlwZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dpdFdlYlR5cGUuamF2YQppbmRleCAwZTJlNTBkLi4zNTgwNzc0IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2l0V2ViVHlwZS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HaXRXZWJUeXBlLmphdmEKQEAgLTM2LDEwICszNiwxMCBAQAogICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJjZ2l0IikpIHsKICAgICAgIHR5cGUgPSBuZXcgR2l0V2ViVHlwZSgpOwogICAgICAgdHlwZS5zZXRMaW5rTmFtZSgiY2dpdCIpOwotICAgICAgdHlwZS5zZXRQcm9qZWN0KCIke3Byb2plY3R9L3N1bW1hcnkiKTsKLSAgICAgIHR5cGUuc2V0UmV2aXNpb24oIiR7cHJvamVjdH0vY29tbWl0Lz9pZD0ke2NvbW1pdH0iKTsKLSAgICAgIHR5cGUuc2V0QnJhbmNoKCIke3Byb2plY3R9L2xvZy8/aD0ke2JyYW5jaH0iKTsKLSAgICAgIHR5cGUuc2V0RmlsZUhpc3RvcnkoIiR7cHJvamVjdH0vbG9nLyR7ZmlsZX0/aD0ke2JyYW5jaH0iKTsKKyAgICAgIHR5cGUuc2V0UHJvamVjdCgiJHtwcm9qZWN0fS5naXQvc3VtbWFyeSIpOworICAgICAgdHlwZS5zZXRSZXZpc2lvbigiJHtwcm9qZWN0fS5naXQvY29tbWl0Lz9pZD0ke2NvbW1pdH0iKTsKKyAgICAgIHR5cGUuc2V0QnJhbmNoKCIke3Byb2plY3R9LmdpdC9sb2cvP2g9JHticmFuY2h9Iik7CisgICAgICB0eXBlLnNldEZpbGVIaXN0b3J5KCIke3Byb2plY3R9LmdpdC9sb2cvJHtmaWxlfT9oPSR7YnJhbmNofSIpOwogCiAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImN1c3RvbSIpKSB7CiAgICAgICB0eXBlID0gbmV3IEdpdFdlYlR5cGUoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HbG9iYWxDYXBhYmlsaXR5LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2xvYmFsQ2FwYWJpbGl0eS5qYXZhCmluZGV4IDgxZDRmYzkuLjdkYjY5MWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HbG9iYWxDYXBhYmlsaXR5LmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dsb2JhbENhcGFiaWxpdHkuamF2YQpAQCAtMjEsNiArMjEsOSBAQAogCiAvKiogU2VydmVyIHdpZGUgY2FwYWJpbGl0aWVzLiBSZXByZXNlbnRlZCBhcyB7QGxpbmsgUGVybWlzc2lvbn0gb2JqZWN0cy4gKi8KIHB1YmxpYyBjbGFzcyBHbG9iYWxDYXBhYmlsaXR5IHsKKyAgLyoqIEFiaWxpdHkgdG8gYWNjZXNzIHRoZSBkYXRhYmFzZSAod2l0aCBnc3FsKS4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0RBVEFCQVNFID0gImFjY2Vzc0RhdGFiYXNlIjsKKwogICAvKioKICAgICogRGVub3RlcyB0aGUgc2VydmVyJ3MgYWRtaW5pc3RyYXRvcnMuCiAgICAqIDxwPgpAQCAtMjgsNyArMzEsNyBAQAogICAgKiBoYXMgdGhpcyBjYXBhYmlsaXR5IGNhbiBwZXJmb3JtIGFsbW9zdCBhbnkgb3RoZXIgYWN0aW9uLCBvciBjYW4gZ3JhbnQKICAgICogdGhlbXNlbHZlcyB0aGUgcG93ZXIgdG8gcGVyZm9ybSBhbnkgb3RoZXIgYWN0aW9uIG9uIHRoZSBzaXRlLiBNb3N0IG9mCiAgICAqIHRoZSBvdGhlciBjYXBhYmlsaXRpZXMgYW5kIHBlcm1pc3Npb25zIGZhbGwtYmFjayB0byB0aGUgcHJlZGljYXRlCi0gICAqICJPUiB1c2VyIGhhcyBjYXBhYmxpdHkgQURNSU5JU1RSQVRFX1NFUlZFUiIuCisgICAqICJPUiB1c2VyIGhhcyBjYXBhYmlsaXR5IEFETUlOSVNUUkFURV9TRVJWRVIiLgogICAgKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5JU1RSQVRFX1NFUlZFUiA9ICJhZG1pbmlzdHJhdGVTZXJ2ZXIiOwogCkBAIC02NCw2ICs2Nyw5IEBACiAgIC8qKiBNYXhpbXVtIHJlc3VsdCBsaW1pdCBwZXIgZXhlY3V0ZWQgcXVlcnkuICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0xJTUlUID0gInF1ZXJ5TGltaXQiOwogCisgIC8qKiBDYW4gcnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fR0MgPSAicnVuR0MiOworCiAgIC8qKiBGb3JjZWZ1bGx5IHJlc3RhcnQgcmVwbGljYXRpb24gdG8gYW55IGNvbmZpZ3VyZWQgZGVzdGluYXRpb24uICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1JFUExJQ0FUSU9OID0gInN0YXJ0UmVwbGljYXRpb24iOwogCkBAIC04MSw2ICs4Nyw3IEBACiAKICAgc3RhdGljIHsKICAgICBOQU1FU19BTEwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBOQU1FU19BTEwuYWRkKEFDQ0VTU19EQVRBQkFTRSk7CiAgICAgTkFNRVNfQUxMLmFkZChBRE1JTklTVFJBVEVfU0VSVkVSKTsKICAgICBOQU1FU19BTEwuYWRkKENSRUFURV9BQ0NPVU5UKTsKICAgICBOQU1FU19BTEwuYWRkKENSRUFURV9HUk9VUCk7CkBAIC05MCw2ICs5Nyw3IEBACiAgICAgTkFNRVNfQUxMLmFkZChLSUxMX1RBU0spOwogICAgIE5BTUVTX0FMTC5hZGQoUFJJT1JJVFkpOwogICAgIE5BTUVTX0FMTC5hZGQoUVVFUllfTElNSVQpOworICAgIE5BTUVTX0FMTC5hZGQoUlVOX0dDKTsKICAgICBOQU1FU19BTEwuYWRkKFNUQVJUX1JFUExJQ0FUSU9OKTsKICAgICBOQU1FU19BTEwuYWRkKFZJRVdfQ0FDSEVTKTsKICAgICBOQU1FU19BTEwuYWRkKFZJRVdfQ09OTkVDVElPTlMpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwQWRtaW5TZXJ2aWNlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBBZG1pblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiN2ZhMi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBBZG1pblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdWRpdC5BdWRpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5SZXF1aXJlZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUmVtb3RlSnNvblNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGwuVmVyc2lvbjsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLUBScGNJbXBsKHZlcnNpb24gPSBWZXJzaW9uLlYyXzApCi1wdWJsaWMgaW50ZXJmYWNlIEdyb3VwQWRtaW5TZXJ2aWNlIGV4dGVuZHMgUmVtb3RlSnNvblNlcnZpY2UgewotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgdmlzaWJsZUdyb3VwcyhBc3luY0NhbGxiYWNrPEdyb3VwTGlzdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBjcmVhdGVHcm91cChTdHJpbmcgbmV3TmFtZSwgQXN5bmNDYWxsYmFjazxBY2NvdW50R3JvdXAuSWQ+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgZ3JvdXBEZXRhaWwoQWNjb3VudEdyb3VwLklkIGdyb3VwSWQsIEFjY291bnRHcm91cC5VVUlEIHV1aWQsCi0gICAgICBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGNoYW5nZUdyb3VwRGVzY3JpcHRpb24oQWNjb3VudEdyb3VwLklkIGdyb3VwSWQsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBjaGFuZ2VHcm91cE9wdGlvbnMoQWNjb3VudEdyb3VwLklkIGdyb3VwSWQsIEdyb3VwT3B0aW9ucyBncm91cE9wdGlvbnMsCi0gICAgICBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgY2hhbmdlR3JvdXBPd25lcihBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgU3RyaW5nIG5ld093bmVyTmFtZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCByZW5hbWVHcm91cChBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgU3RyaW5nIG5ld05hbWUsCi0gICAgICBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGNoYW5nZUdyb3VwVHlwZShBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQWNjb3VudEdyb3VwLlR5cGUgbmV3VHlwZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBhZGRHcm91cE1lbWJlcihBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgU3RyaW5nIG5hbWVPckVtYWlsLAotICAgICAgQXN5bmNDYWxsYmFjazxHcm91cERldGFpbD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBhZGRHcm91cEluY2x1ZGUoQWNjb3VudEdyb3VwLklkIGdyb3VwSWQsIFN0cmluZyBncm91cE5hbWUsCi0gICAgICBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGRlbGV0ZUdyb3VwTWVtYmVycyhBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIFNldDxBY2NvdW50R3JvdXBNZW1iZXIuS2V5PiBrZXlzLCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgZGVsZXRlR3JvdXBJbmNsdWRlcyhBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIFNldDxBY2NvdW50R3JvdXBJbmNsdWRlLktleT4ga2V5cywgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBEZXNjcmlwdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGVzY3JpcHRpb24uamF2YQppbmRleCA4MjhiZjI0Li5jY2Q1MGZjIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBEZXNjcmlwdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9uLmphdmEKQEAgLTE2LDYgKzE2LDggQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiAvKioKICAqIEdyb3VwIG1ldGhvZHMgZXhwb3NlZCBieSB0aGUgR3JvdXBCYWNrZW5kLgogICovCkBAIC0zMCw4ICszMiwyMSBAQAogICAgIC8qKiBAcmV0dXJuIHRoZSBub24tbnVsbCBuYW1lIG9mIHRoZSBncm91cC4gKi8KICAgICBTdHJpbmcgZ2V0TmFtZSgpOwogCi0gICAgLyoqIEByZXR1cm4gd2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgYWNjb3VudHMuICovCi0gICAgYm9vbGVhbiBpc1Zpc2libGVUb0FsbCgpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gb3B0aW9uYWwgZW1haWwgYWRkcmVzcyB0byBzZW5kIHRvIHRoZSBncm91cCdzIG1lbWJlcnMuIElmCisgICAgICogICAgICAgICBwcm92aWRlZCwgR2Vycml0IHdpbGwgdXNlIHRoaXMgZW1haWwgYWRkcmVzcyB0byBzZW5kCisgICAgICogICAgICAgICBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byB0aGUgZ3JvdXAuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBvcHRpb25hbCBVUkwgdG8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyb3VwLiBUeXBpY2FsbHkgYSBVUkwgdG8gYQorICAgICAqICAgICAgICAgd2ViIHBhZ2UgdGhhdCBwZXJtaXRzIHVzZXJzIHRvIGFwcGx5IHRvIGpvaW4gdGhlIGdyb3VwLCBvciBtYW5hZ2UKKyAgICAgKiAgICAgICAgIHRoZWlyIG1lbWJlcnNoaXAuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldFVybCgpOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBEZXNjcmlwdGlvbnMuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9ucy5qYXZhCmluZGV4IGUwYmM3ZDguLmY5ODY2MDAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9ucy5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9ucy5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwpAQCAtNDQsMTMgKzQ1LDIwIEBACiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlVG9BbGwoKSB7Ci0gICAgICAgIHJldHVybiBncm91cC5pc1Zpc2libGVUb0FsbCgpOworICAgICAgcHVibGljIEFjY291bnRHcm91cCBnZXRBY2NvdW50R3JvdXAoKSB7CisgICAgICAgIHJldHVybiBncm91cDsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgQWNjb3VudEdyb3VwIGdldEFjY291bnRHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgQE51bGxhYmxlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgQE51bGxhYmxlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuICIjIiArIFBhZ2VMaW5rcy50b0dyb3VwKGdldEdyb3VwVVVJRCgpKTsKICAgICAgIH0KICAgICB9OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBEZXRhaWwuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERldGFpbC5qYXZhCmluZGV4IDAxYzc5ODUuLjBkMmJlNTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERldGFpbC5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERldGFpbC5qYXZhCkBAIC0xNSwxNyArMTUsMTYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGNsYXNzIEdyb3VwRGV0YWlsIHsKICAgcHVibGljIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHM7Ci0gIHB1YmxpYyBHcm91cEluZm9DYWNoZSBncm91cHM7CiAgIHB1YmxpYyBBY2NvdW50R3JvdXAgZ3JvdXA7CiAgIHB1YmxpYyBMaXN0PEFjY291bnRHcm91cE1lbWJlcj4gbWVtYmVyczsKLSAgcHVibGljIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZT4gaW5jbHVkZXM7CisgIHB1YmxpYyBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGluY2x1ZGVzOwogICBwdWJsaWMgR3JvdXBSZWZlcmVuY2Ugb3duZXJHcm91cDsKICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5OwogCkBAIC0zNiwxMCArMzUsNiBAQAogICAgIGFjY291bnRzID0gYzsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldEdyb3VwcyhHcm91cEluZm9DYWNoZSBjKSB7Ci0gICAgZ3JvdXBzID0gYzsKLSAgfQotCiAgIHB1YmxpYyB2b2lkIHNldEdyb3VwKEFjY291bnRHcm91cCBnKSB7CiAgICAgZ3JvdXAgPSBnOwogICB9CkBAIC00OCw3ICs0Myw3IEBACiAgICAgbWVtYmVycyA9IG07CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhMaXN0PEFjY291bnRHcm91cEluY2x1ZGU+IGkpIHsKKyAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBpKSB7CiAgICAgaW5jbHVkZXMgPSBpOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm8uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm8uamF2YQppbmRleCA1NDdhNWY0Li4xYWNkZDlhIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBJbmZvLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mby5qYXZhCkBAIC0xOCw5ICsxOCwxMCBAQAogCiAvKiogU3VtbWFyeSBpbmZvcm1hdGlvbiBhYm91dCBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfSwgZm9yIHNpbXBsZSB0YWJ1bGFyIGRpc3BsYXlzLiAqLwogcHVibGljIGNsYXNzIEdyb3VwSW5mbyB7Ci0gIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuSWQgaWQ7CisgIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkOwogICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CiAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247CisgIHByb3RlY3RlZCBTdHJpbmcgdXJsOwogCiAgIHByb3RlY3RlZCBHcm91cEluZm8oKSB7CiAgIH0KQEAgLTMyLDggKzMzLDggQEAKICAgICogbG9va3VwIGhhcyBmYWlsZWQgYW5kIGEgc3RhbGUgZ3JvdXAgaWQgaGFzIGJlZW4gZGlzY292ZXJlZCBpbiB0aGUgZGF0YQogICAgKiBzdG9yZS4KICAgICovCi0gIHB1YmxpYyBHcm91cEluZm8oZmluYWwgQWNjb3VudEdyb3VwLklkIGlkKSB7Ci0gICAgdGhpcy5pZCA9IGlkOworICBwdWJsaWMgR3JvdXBJbmZvKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICB0aGlzLnV1aWQgPSB1dWlkOwogICB9CiAKICAgLyoqCkBAIC00MSwxNSArNDIsMjAgQEAKICAgICoKICAgICogQHBhcmFtIGEgdGhlIGRhdGEgc3RvcmUgcmVjb3JkIGhvbGRpbmcgdGhlIHNwZWNpZmljIGdyb3VwIGRldGFpbHMuCiAgICAqLwotICBwdWJsaWMgR3JvdXBJbmZvKGZpbmFsIEFjY291bnRHcm91cCBhKSB7Ci0gICAgaWQgPSBhLmdldElkKCk7CisgIHB1YmxpYyBHcm91cEluZm8oR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBhKSB7CisgICAgdXVpZCA9IGEuZ2V0R3JvdXBVVUlEKCk7CiAgICAgbmFtZSA9IGEuZ2V0TmFtZSgpOwotICAgIGRlc2NyaXB0aW9uID0gYS5nZXREZXNjcmlwdGlvbigpOworICAgIHVybCA9IGEuZ2V0VXJsKCk7CisKKyAgICBpZiAoYSBpbnN0YW5jZW9mIEdyb3VwRGVzY3JpcHRpb24uSW50ZXJuYWwpIHsKKyAgICAgIEFjY291bnRHcm91cCBncm91cCA9ICgoR3JvdXBEZXNjcmlwdGlvbi5JbnRlcm5hbCkgYSkuZ2V0QWNjb3VudEdyb3VwKCk7CisgICAgICBkZXNjcmlwdGlvbiA9IGdyb3VwLmdldERlc2NyaXB0aW9uKCk7CisgICAgfQogICB9CiAKICAgLyoqIEByZXR1cm4gdGhlIHVuaXF1ZSBsb2NhbCBpZCBvZiB0aGUgZ3JvdXAgKi8KLSAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRJZCgpIHsKLSAgICByZXR1cm4gaWQ7CisgIHB1YmxpYyBBY2NvdW50R3JvdXAuVVVJRCBnZXRJZCgpIHsKKyAgICByZXR1cm4gdXVpZDsKICAgfQogCiAgIC8qKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBncm91cDsgbnVsbCBpZiBub3Qgc3VwcGxpZWQgKi8KQEAgLTYxLDQgKzY3LDggQEAKICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKICAgICByZXR1cm4gZGVzY3JpcHRpb247CiAgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICByZXR1cm4gdXJsOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBJbmZvQ2FjaGUuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm9DYWNoZS5qYXZhCmluZGV4IDZhNWRkNWMuLjA4NTk3M2MgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm9DYWNoZS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm9DYWNoZS5qYXZhCkBAIC0zMywxMyArMzMsMTMgQEAKICAgICByZXR1cm4gRU1QVFk7CiAgIH0KIAotICBwcm90ZWN0ZWQgTWFwPEFjY291bnRHcm91cC5JZCwgR3JvdXBJbmZvPiBncm91cHM7CisgIHByb3RlY3RlZCBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEdyb3VwSW5mbz4gZ3JvdXBzOwogCiAgIHByb3RlY3RlZCBHcm91cEluZm9DYWNoZSgpIHsKICAgfQogCiAgIHB1YmxpYyBHcm91cEluZm9DYWNoZShmaW5hbCBJdGVyYWJsZTxHcm91cEluZm8+IGxpc3QpIHsKLSAgICBncm91cHMgPSBuZXcgSGFzaE1hcDxBY2NvdW50R3JvdXAuSWQsIEdyb3VwSW5mbz4oKTsKKyAgICBncm91cHMgPSBuZXcgSGFzaE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgR3JvdXBJbmZvPigpOwogICAgIGZvciAoZmluYWwgR3JvdXBJbmZvIGdpIDogbGlzdCkgewogICAgICAgZ3JvdXBzLnB1dChnaS5nZXRJZCgpLCBnaSk7CiAgICAgfQpAQCAtNTgsMTUgKzU4LDE1IEBACiAgICAqIEBwYXJhbSBpZCB0aGUgaWQgZGVzaXJlZC4KICAgICogQHJldHVybiBpbmZvIGJsb2NrIGZvciB0aGUgZ3JvdXAuCiAgICAqLwotICBwdWJsaWMgR3JvdXBJbmZvIGdldChmaW5hbCBBY2NvdW50R3JvdXAuSWQgaWQpIHsKLSAgICBpZiAoaWQgPT0gbnVsbCkgeworICBwdWJsaWMgR3JvdXBJbmZvIGdldChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgaWYgKHV1aWQgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCi0gICAgR3JvdXBJbmZvIHIgPSBncm91cHMuZ2V0KGlkKTsKKyAgICBHcm91cEluZm8gciA9IGdyb3Vwcy5nZXQodXVpZCk7CiAgICAgaWYgKHIgPT0gbnVsbCkgewotICAgICAgciA9IG5ldyBHcm91cEluZm8oaWQpOwotICAgICAgZ3JvdXBzLnB1dChpZCwgcik7CisgICAgICByID0gbmV3IEdyb3VwSW5mbyh1dWlkKTsKKyAgICAgIGdyb3Vwcy5wdXQodXVpZCwgcik7CiAgICAgfQogICAgIHJldHVybiByOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBMaXN0LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDk1Y2QuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgR3JvdXBMaXN0IHsKLSAgcHJvdGVjdGVkIExpc3Q8QWNjb3VudEdyb3VwPiBncm91cHM7Ci0gIHByb3RlY3RlZCBib29sZWFuIGNhbkNyZWF0ZUdyb3VwOwotCi0gIHByb3RlY3RlZCBHcm91cExpc3QoKSB7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXBMaXN0KGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwPiBncm91cHMsIGZpbmFsIGJvb2xlYW4gY2FuQ3JlYXRlR3JvdXApIHsKLSAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKLSAgICB0aGlzLmNhbkNyZWF0ZUdyb3VwID0gY2FuQ3JlYXRlR3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXA+IGdldEdyb3VwcygpIHsKLSAgICByZXR1cm4gZ3JvdXBzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R3JvdXBzKExpc3Q8QWNjb3VudEdyb3VwPiBncm91cHMpIHsKLSAgICB0aGlzLmdyb3VwcyA9IGdyb3VwczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzQ2FuQ3JlYXRlR3JvdXAoKSB7Ci0gICAgcmV0dXJuIGNhbkNyZWF0ZUdyb3VwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2FuQ3JlYXRlR3JvdXAoYm9vbGVhbiBzZXQpIHsKLSAgICBjYW5DcmVhdGVHcm91cCA9IHNldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwT3B0aW9ucy5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVkNzgxLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci0KLS8qKgotICogT3B0aW9ucyBmb3IgYW4ge0BsaW5rIEFjY291bnRHcm91cH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cE9wdGlvbnMgewotCi0gIHByaXZhdGUgYm9vbGVhbiB2aXNpYmxlVG9BbGw7Ci0KLSAgcHJvdGVjdGVkIEdyb3VwT3B0aW9ucygpIHsKLSAgfQotCi0gIHB1YmxpYyBHcm91cE9wdGlvbnMoZmluYWwgYm9vbGVhbiB2aXNpYmxlVG9BbGwpIHsKLSAgICB0aGlzLnZpc2libGVUb0FsbCA9IHZpc2libGVUb0FsbDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZVRvQWxsKCkgewotICAgIHJldHVybiB2aXNpYmxlVG9BbGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Ib3N0UGFnZURhdGEuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Ib3N0UGFnZURhdGEuamF2YQppbmRleCBmOTkxZjRjLi5mMDE0ZjVmIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvSG9zdFBhZ2VEYXRhLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0hvc3RQYWdlRGF0YS5qYXZhCkBAIC0xNywxMyArMTcsMTYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudERpZmZQcmVmZXJlbmNlOwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIC8qKiBEYXRhIHNlbnQgYXMgcGFydCBvZiB0aGUgaG9zdCBwYWdlLCB0byBib290c3RyYXAgdGhlIFVJLiAqLwogcHVibGljIGNsYXNzIEhvc3RQYWdlRGF0YSB7CiAgIHB1YmxpYyBBY2NvdW50IGFjY291bnQ7CiAgIHB1YmxpYyBBY2NvdW50RGlmZlByZWZlcmVuY2UgYWNjb3VudERpZmZQcmVmOwotICBwdWJsaWMgU3RyaW5nIHhzcmZUb2tlbjsKKyAgcHVibGljIFN0cmluZyB4R2Vycml0QXV0aDsKICAgcHVibGljIEdlcnJpdENvbmZpZyBjb25maWc7CiAgIHB1YmxpYyBUaGVtZSB0aGVtZTsKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBwbHVnaW5zOwogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhlbWUgewogICAgIHB1YmxpYyBTdHJpbmcgYmFja2dyb3VuZENvbG9yOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0xhYmVsVHlwZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0xhYmVsVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDk4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlLmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsLkxhYmVsSWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTGFiZWxUeXBlIHsKKyAgcHVibGljIHN0YXRpYyBMYWJlbFR5cGUgd2l0aERlZmF1bHRWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICBjaGVja05hbWUobmFtZSk7CisgICAgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PExhYmVsVmFsdWU+KDIpOworICAgIHZhbHVlcy5hZGQobmV3IExhYmVsVmFsdWUoKHNob3J0KSAwLCAiUmVqZWN0ZWQiKSk7CisgICAgdmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIDEsICJBcHByb3ZlZCIpKTsKKyAgICByZXR1cm4gbmV3IExhYmVsVHlwZShuYW1lLCB2YWx1ZXMpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShTdHJpbmcgbmFtZSkgeworICAgIGlmICgiU1VCTSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICJSZXNlcnZlZCBsYWJlbCBuYW1lIFwiIiArIG5hbWUgKyAiXCIiKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGNoYXIgYyA9IG5hbWUuY2hhckF0KGkpOworICAgICAgaWYgKCEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fAorICAgICAgICAgICAgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgICAgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgICAgYyA9PSAnLScpKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAiSWxsZWdhbCBsYWJlbCBuYW1lIFwiIiArIG5hbWUgKyAiXCIiKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0QWJicmV2aWF0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgU3RyaW5nQnVpbGRlciBhYmJyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgYWJici5hcHBlbmQoYyk7CisgICAgICB9CisgICAgfQorICAgIGlmIChhYmJyLmxlbmd0aCgpID09IDApIHsKKyAgICAgIGFiYnIuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkpOworICAgIH0KKyAgICByZXR1cm4gYWJici50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxMYWJlbFZhbHVlPiBzb3J0VmFsdWVzKExpc3Q8TGFiZWxWYWx1ZT4gdmFsdWVzKSB7CisgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxMYWJlbFZhbHVlPih2YWx1ZXMpOworICAgIGlmICh2YWx1ZXMuc2l6ZSgpIDw9IDEpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHZhbHVlcyk7CisgICAgfQorICAgIENvbGxlY3Rpb25zLnNvcnQodmFsdWVzLCBuZXcgQ29tcGFyYXRvcjxMYWJlbFZhbHVlPigpIHsKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShMYWJlbFZhbHVlIG8xLCBMYWJlbFZhbHVlIG8yKSB7CisgICAgICAgIHJldHVybiBvMS5nZXRWYWx1ZSgpIC0gbzIuZ2V0VmFsdWUoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBzaG9ydCBtaW4gPSB2YWx1ZXMuZ2V0KDApLmdldFZhbHVlKCk7CisgICAgc2hvcnQgbWF4ID0gdmFsdWVzLmdldCh2YWx1ZXMuc2l6ZSgpIC0gMSkuZ2V0VmFsdWUoKTsKKyAgICBzaG9ydCB2ID0gbWluOworICAgIHNob3J0IGkgPSAwOworICAgIExpc3Q8TGFiZWxWYWx1ZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxMYWJlbFZhbHVlPihtYXggLSBtaW4gKyAxKTsKKyAgICAvLyBGaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyB3aXRoIGVtcHR5IHRleHQuCisgICAgd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7CisgICAgICB3aGlsZSAodiA8IHZhbHVlcy5nZXQoaSkuZ2V0VmFsdWUoKSkgeworICAgICAgICByZXN1bHQuYWRkKG5ldyBMYWJlbFZhbHVlKHYrKywgIiIpKTsKKyAgICAgIH0KKyAgICAgIHYrKzsKKyAgICAgIHJlc3VsdC5hZGQodmFsdWVzLmdldChpKyspKTsKKyAgICB9CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKKyAgfQorCisgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKworICBwcm90ZWN0ZWQgU3RyaW5nIGFiYnJldmlhdGVkTmFtZTsKKyAgcHJvdGVjdGVkIFN0cmluZyBmdW5jdGlvbk5hbWU7CisgIHByb3RlY3RlZCBib29sZWFuIGNvcHlNaW5TY29yZTsKKworICBwcm90ZWN0ZWQgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXM7CisgIHByb3RlY3RlZCBzaG9ydCBtYXhOZWdhdGl2ZTsKKyAgcHJvdGVjdGVkIHNob3J0IG1heFBvc2l0aXZlOworCisgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gY2FuT3ZlcnJpZGU7CisgIHByaXZhdGUgdHJhbnNpZW50IExpc3Q8SW50ZWdlcj4gaW50TGlzdDsKKyAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFNob3J0LCBMYWJlbFZhbHVlPiBieVZhbHVlOworCisgIHByb3RlY3RlZCBMYWJlbFR5cGUoKSB7CisgIH0KKworICBwdWJsaWMgTGFiZWxUeXBlKFN0cmluZyBuYW1lLCBMaXN0PExhYmVsVmFsdWU+IHZhbHVlTGlzdCkgeworICAgIHRoaXMubmFtZSA9IGNoZWNrTmFtZShuYW1lKTsKKyAgICBjYW5PdmVycmlkZSA9IHRydWU7CisgICAgdmFsdWVzID0gc29ydFZhbHVlcyh2YWx1ZUxpc3QpOworCisgICAgYWJicmV2aWF0ZWROYW1lID0gZGVmYXVsdEFiYnJldmlhdGlvbihuYW1lKTsKKyAgICBmdW5jdGlvbk5hbWUgPSAiTWF4V2l0aEJsb2NrIjsKKworICAgIG1heE5lZ2F0aXZlID0gU2hvcnQuTUlOX1ZBTFVFOworICAgIG1heFBvc2l0aXZlID0gU2hvcnQuTUFYX1ZBTFVFOworICAgIGlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgeworICAgICAgaWYgKHZhbHVlcy5nZXQoMCkuZ2V0VmFsdWUoKSA8IDApIHsKKyAgICAgICAgbWF4TmVnYXRpdmUgPSB2YWx1ZXMuZ2V0KDApLmdldFZhbHVlKCk7CisgICAgICB9CisgICAgICBpZiAodmFsdWVzLmdldCh2YWx1ZXMuc2l6ZSgpIC0gMSkuZ2V0VmFsdWUoKSA+IDApIHsKKyAgICAgICAgbWF4UG9zaXRpdmUgPSB2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKS5nZXRWYWx1ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoUGF0Y2hTZXRBcHByb3ZhbCBwc2EpIHsKKyAgICByZXR1cm4gcHNhLmdldExhYmVsSWQoKS5nZXQoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRBYmJyZXZpYXRlZE5hbWUoKSB7CisgICAgcmV0dXJuIGFiYnJldmlhdGVkTmFtZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGVkTmFtZShTdHJpbmcgYWJicmV2aWF0ZWROYW1lKSB7CisgICAgdGhpcy5hYmJyZXZpYXRlZE5hbWUgPSBhYmJyZXZpYXRlZE5hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZSgpIHsKKyAgICByZXR1cm4gZnVuY3Rpb25OYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RnVuY3Rpb25OYW1lKFN0cmluZyBmdW5jdGlvbk5hbWUpIHsKKyAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNhbk92ZXJyaWRlKCkgeworICAgIHJldHVybiBjYW5PdmVycmlkZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENhbk92ZXJyaWRlKGJvb2xlYW4gY2FuT3ZlcnJpZGUpIHsKKyAgICB0aGlzLmNhbk92ZXJyaWRlID0gY2FuT3ZlcnJpZGU7CisgIH0KKworICBwdWJsaWMgTGlzdDxMYWJlbFZhbHVlPiBnZXRWYWx1ZXMoKSB7CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFZhbHVlIGdldE1pbigpIHsKKyAgICBpZiAodmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZXMuZ2V0KDApOworICB9CisKKyAgcHVibGljIExhYmVsVmFsdWUgZ2V0TWF4KCkgeworICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgZmluYWwgTGFiZWxWYWx1ZSB2ID0gdmFsdWVzLmdldCh2YWx1ZXMuc2l6ZSgpIC0gMSk7CisgICAgcmV0dXJuIHYuZ2V0VmFsdWUoKSA+IDAgPyB2IDogbnVsbDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzQ29weU1pblNjb3JlKCkgeworICAgIHJldHVybiBjb3B5TWluU2NvcmU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDb3B5TWluU2NvcmUoYm9vbGVhbiBjb3B5TWluU2NvcmUpIHsKKyAgICB0aGlzLmNvcHlNaW5TY29yZSA9IGNvcHlNaW5TY29yZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzTWF4TmVnYXRpdmUoUGF0Y2hTZXRBcHByb3ZhbCBjYSkgeworICAgIHJldHVybiBtYXhOZWdhdGl2ZSA9PSBjYS5nZXRWYWx1ZSgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNNYXhQb3NpdGl2ZShQYXRjaFNldEFwcHJvdmFsIGNhKSB7CisgICAgcmV0dXJuIG1heFBvc2l0aXZlID09IGNhLmdldFZhbHVlKCk7CisgIH0KKworICBwdWJsaWMgTGFiZWxWYWx1ZSBnZXRWYWx1ZShzaG9ydCB2YWx1ZSkgeworICAgIGluaXRCeVZhbHVlKCk7CisgICAgcmV0dXJuIGJ5VmFsdWUuZ2V0KHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFZhbHVlIGdldFZhbHVlKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EpIHsKKyAgICBpbml0QnlWYWx1ZSgpOworICAgIHJldHVybiBieVZhbHVlLmdldChjYS5nZXRWYWx1ZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0QnlWYWx1ZSgpIHsKKyAgICBpZiAoYnlWYWx1ZSA9PSBudWxsKSB7CisgICAgICBieVZhbHVlID0gbmV3IEhhc2hNYXA8U2hvcnQsIExhYmVsVmFsdWU+KCk7CisgICAgICBmb3IgKGZpbmFsIExhYmVsVmFsdWUgdiA6IHZhbHVlcykgeworICAgICAgICBieVZhbHVlLnB1dCh2LmdldFZhbHVlKCksIHYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBMaXN0PEludGVnZXI+IGdldFZhbHVlc0FzTGlzdCgpIHsKKyAgICBpZiAoaW50TGlzdCA9PSBudWxsKSB7CisgICAgICBpbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPih2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIGZvciAoTGFiZWxWYWx1ZSB2IDogdmFsdWVzKSB7CisgICAgICAgIGludExpc3QuYWRkKEludGVnZXIudmFsdWVPZih2LmdldFZhbHVlKCkpKTsKKyAgICAgIH0KKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoaW50TGlzdCk7CisgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGludExpc3QpOworICAgIH0KKyAgICByZXR1cm4gaW50TGlzdDsKKyAgfQorCisgIHB1YmxpYyBMYWJlbElkIGdldExhYmVsSWQoKSB7CisgICAgcmV0dXJuIG5ldyBMYWJlbElkKG5hbWUpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUpLmFwcGVuZCgnWycpOworICAgIExhYmVsVmFsdWUgbWluID0gZ2V0TWluKCk7CisgICAgTGFiZWxWYWx1ZSBtYXggPSBnZXRNYXgoKTsKKyAgICBpZiAobWluICE9IG51bGwgJiYgbWF4ICE9IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZChuZXcgUGVybWlzc2lvblJhbmdlKFBlcm1pc3Npb24uZm9yTGFiZWwobmFtZSksIG1pbi5nZXRWYWx1ZSgpLAorICAgICAgICAgIG1heC5nZXRWYWx1ZSgpKS50b1N0cmluZygpLnRyaW0oKSk7CisgICAgfSBlbHNlIGlmIChtaW4gIT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKG1pbi5mb3JtYXRWYWx1ZSgpLnRyaW0oKSk7CisgICAgfSBlbHNlIGlmIChtYXggIT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKG1heC5mb3JtYXRWYWx1ZSgpLnRyaW0oKSk7CisgICAgfQorICAgIHNiLmFwcGVuZCgnXScpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlcy5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0xhYmVsVHlwZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGE0NWE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0xhYmVsVHlwZXMuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBMYWJlbFR5cGVzIHsKKyAgcHJvdGVjdGVkIExpc3Q8TGFiZWxUeXBlPiBsYWJlbFR5cGVzOworICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGJ5TGFiZWw7CisgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIEludGVnZXI+IHBvc2l0aW9uczsKKworICBwcm90ZWN0ZWQgTGFiZWxUeXBlcygpIHsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFR5cGVzKGZpbmFsIExpc3Q8PyBleHRlbmRzIExhYmVsVHlwZT4gYXBwcm92YWxzKSB7CisgICAgbGFiZWxUeXBlcyA9CisgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDxMYWJlbFR5cGU+KGFwcHJvdmFscykpOworICB9CisKKyAgcHVibGljIExpc3Q8TGFiZWxUeXBlPiBnZXRMYWJlbFR5cGVzKCkgeworICAgIHJldHVybiBsYWJlbFR5cGVzOworICB9CisKKyAgcHVibGljIExhYmVsVHlwZSBieUxhYmVsKExhYmVsSWQgbGFiZWxJZCkgeworICAgIHJldHVybiBieUxhYmVsKCkuZ2V0KGxhYmVsSWQuZ2V0KCkudG9Mb3dlckNhc2UoKSk7CisgIH0KKworICBwdWJsaWMgTGFiZWxUeXBlIGJ5TGFiZWwoU3RyaW5nIGxhYmVsTmFtZSkgeworICAgIHJldHVybiBieUxhYmVsKCkuZ2V0KGxhYmVsTmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGFiZWxUeXBlPiBieUxhYmVsKCkgeworICAgIGlmIChieUxhYmVsID09IG51bGwpIHsKKyAgICAgIGJ5TGFiZWwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExhYmVsVHlwZT4oKTsKKyAgICAgIGlmIChsYWJlbFR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChMYWJlbFR5cGUgdCA6IGxhYmVsVHlwZXMpIHsKKyAgICAgICAgICBieUxhYmVsLnB1dCh0LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLCB0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnlMYWJlbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBsYWJlbFR5cGVzLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgQ29tcGFyYXRvcjxTdHJpbmc+IG5hbWVDb21wYXJhdG9yKCkgeworICAgIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHBvc2l0aW9ucyA9IHBvc2l0aW9ucygpOworICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGxlZnQsIFN0cmluZyByaWdodCkgeworICAgICAgICBpbnQgbHAgPSBwb3NpdGlvbihsZWZ0KTsKKyAgICAgICAgaW50IHJwID0gcG9zaXRpb24ocmlnaHQpOworICAgICAgICBpbnQgY21wID0gbHAgLSBycDsKKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgY21wID0gbGVmdC5jb21wYXJlVG8ocmlnaHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbXA7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgIEludGVnZXIgcCA9IHBvc2l0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIHJldHVybiBwICE9IG51bGwgPyBwIDogcG9zaXRpb25zLnNpemUoKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBwb3NpdGlvbnMoKSB7CisgICAgaWYgKHBvc2l0aW9ucyA9PSBudWxsKSB7CisgICAgICBwb3NpdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICBpZiAobGFiZWxUeXBlcyAhPSBudWxsKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChMYWJlbFR5cGUgdCA6IGxhYmVsVHlwZXMpIHsKKyAgICAgICAgICBwb3NpdGlvbnMucHV0KHQuZ2V0TmFtZSgpLCBpKyspOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwb3NpdGlvbnM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9MYWJlbFZhbHVlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMjllMDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKKworcHVibGljIGNsYXNzIExhYmVsVmFsdWUgeworICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRWYWx1ZShzaG9ydCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgIHJldHVybiBTaG9ydC50b1N0cmluZyh2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICByZXR1cm4gIiAwIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIrIiArIFNob3J0LnRvU3RyaW5nKHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgc2hvcnQgdmFsdWU7CisgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKKworICBwdWJsaWMgTGFiZWxWYWx1ZShzaG9ydCB2YWx1ZSwgU3RyaW5nIHRleHQpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgfQorCisgIHByb3RlY3RlZCBMYWJlbFZhbHVlKCkgeworICB9CisKKyAgcHVibGljIHNob3J0IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICByZXR1cm4gdGV4dDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZm9ybWF0VmFsdWUoKSB7CisgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZm9ybWF0KCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmb3JtYXRWYWx1ZSgpKTsKKyAgICBpZiAoIXRleHQuaXNFbXB0eSgpKSB7CisgICAgICBzYi5hcHBlbmQoJyAnKS5hcHBlbmQodGV4dCk7CisgICAgfQorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIGZvcm1hdCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hEZXRhaWxTZXJ2aWNlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hEZXRhaWxTZXJ2aWNlLmphdmEKaW5kZXggOTFlY2I5Mi4uNWIyMzRjNzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaERldGFpbFNlcnZpY2UuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hEZXRhaWxTZXJ2aWNlLmphdmEKQEAgLTE2LDIyICsxNiwxNSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1ZGl0LkF1ZGl0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25JblJlcXVpcmVkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RGlmZlByZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoLktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5SZW1vdGVKc29uU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbC5WZXJzaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKIEBScGNJbXBsKHZlcnNpb24gPSBWZXJzaW9uLlYyXzApCiBwdWJsaWMgaW50ZXJmYWNlIFBhdGNoRGV0YWlsU2VydmljZSBleHRlbmRzIFJlbW90ZUpzb25TZXJ2aWNlIHsKQEAgLTY0LDMzICs1Nyw0IEBACiAgIEBBdWRpdAogICBAU2lnbkluUmVxdWlyZWQKICAgdm9pZCBkZWxldGVEcmFmdFBhdGNoU2V0KFBhdGNoU2V0LklkIHBzaWQsIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHB1Ymxpc2hDb21tZW50cyhQYXRjaFNldC5JZCBwc2lkLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFscywKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBhZGRSZXZpZXdlcnMoQ2hhbmdlLklkIGlkLCBMaXN0PFN0cmluZz4gcmV2aWV3ZXJzLCBib29sZWFuIGNvbmZpcm1lZCwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8UmV2aWV3ZXJSZXN1bHQ+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgcmVtb3ZlUmV2aWV3ZXIoQ2hhbmdlLklkIGlkLCBBY2NvdW50LklkIHJldmlld2VySWQsCi0gICAgICBBc3luY0NhbGxiYWNrPFJldmlld2VyUmVzdWx0PiBjYWxsYmFjayk7Ci0KLSAgdm9pZCB1c2VyQXBwcm92YWxzKFNldDxDaGFuZ2UuSWQ+IGNpZHMsIEFjY291bnQuSWQgYWlkLAotICAgICAgQXN5bmNDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+IGNhbGxiYWNrKTsKLQotICB2b2lkIHN0cm9uZ2VzdEFwcHJvdmFscyhTZXQ8Q2hhbmdlLklkPiBjaWRzLAotICAgICAgQXN5bmNDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+IGNhbGxiYWNrKTsKLQotICAvKioKLSAgICogVXBkYXRlIHRoZSByZXZpZXdlZCBzdGF0dXMgZm9yIHRoZSBwYXRjaC4KLSAgICovCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoS2V5IHBhdGNoS2V5LCBib29sZWFuIHJldmlld2VkLCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaFNjcmlwdC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2NyaXB0LmphdmEKaW5kZXggMjMwOGI3Ny4uZmVjYmI3NiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2NyaXB0LmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2NyaXB0LmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKICAgcHJvdGVjdGVkIGJvb2xlYW4gaHVnZUZpbGU7CiAgIHByb3RlY3RlZCBib29sZWFuIGludHJhbGluZURpZmZlcmVuY2U7CiAgIHByb3RlY3RlZCBib29sZWFuIGludHJhbGluZUZhaWx1cmU7CisgIHByb3RlY3RlZCBib29sZWFuIGludHJhbGluZVRpbWVvdXQ7CiAKICAgcHVibGljIFBhdGNoU2NyaXB0KGZpbmFsIENoYW5nZS5LZXkgY2ssIGZpbmFsIENoYW5nZVR5cGUgY3QsIGZpbmFsIFN0cmluZyBvbiwKICAgICAgIGZpbmFsIFN0cmluZyBubiwgZmluYWwgRmlsZU1vZGUgb20sIGZpbmFsIEZpbGVNb2RlIG5tLApAQCAtNjAsNyArNjEsNyBAQAogICAgICAgZmluYWwgU3BhcnNlRmlsZUNvbnRlbnQgY2EsIGZpbmFsIFNwYXJzZUZpbGVDb250ZW50IGNiLAogICAgICAgZmluYWwgTGlzdDxFZGl0PiBlLCBmaW5hbCBEaXNwbGF5TWV0aG9kIG1hLCBmaW5hbCBEaXNwbGF5TWV0aG9kIG1iLAogICAgICAgZmluYWwgQ29tbWVudERldGFpbCBjZCwgZmluYWwgTGlzdDxQYXRjaD4gaGlzdCwgZmluYWwgYm9vbGVhbiBoZiwKLSAgICAgIGZpbmFsIGJvb2xlYW4gaWQsIGZpbmFsIGJvb2xlYW4gaWRmKSB7CisgICAgICBmaW5hbCBib29sZWFuIGlkLCBmaW5hbCBib29sZWFuIGlkZiwgZmluYWwgYm9vbGVhbiBpZHQpIHsKICAgICBjaGFuZ2VJZCA9IGNrOwogICAgIGNoYW5nZVR5cGUgPSBjdDsKICAgICBvbGROYW1lID0gb247CkBAIC03OSw2ICs4MCw3IEBACiAgICAgaHVnZUZpbGUgPSBoZjsKICAgICBpbnRyYWxpbmVEaWZmZXJlbmNlID0gaWQ7CiAgICAgaW50cmFsaW5lRmFpbHVyZSA9IGlkZjsKKyAgICBpbnRyYWxpbmVUaW1lb3V0ID0gaWR0OwogICB9CiAKICAgcHJvdGVjdGVkIFBhdGNoU2NyaXB0KCkgewpAQCAtMTUyLDYgKzE1NCwxMCBAQAogICAgIHJldHVybiBpbnRyYWxpbmVGYWlsdXJlOwogICB9CiAKKyAgcHVibGljIGJvb2xlYW4gaGFzSW50cmFsaW5lVGltZW91dCgpIHsKKyAgICByZXR1cm4gaW50cmFsaW5lVGltZW91dDsKKyAgfQorCiAgIHB1YmxpYyBib29sZWFuIGlzRXhwYW5kQWxsQ29tbWVudHMoKSB7CiAgICAgcmV0dXJuIGRpZmZQcmVmcy5pc0V4cGFuZEFsbENvbW1lbnRzKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaFNldFB1Ymxpc2hEZXRhaWwuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaFNldFB1Ymxpc2hEZXRhaWwuamF2YQppbmRleCAzYzVjNjg4Li5hOWI2MzM1IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hTZXRQdWJsaXNoRGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2V0UHVibGlzaERldGFpbC5qYXZhCkBAIC0xNCwxNSArMTQsMTAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgUGF0Y2hTZXRQdWJsaXNoRGV0YWlsIHsKQEAgLTMwLDQzICsyNSwxNiBAQAogICBwcm90ZWN0ZWQgUGF0Y2hTZXRJbmZvIHBhdGNoU2V0SW5mbzsKICAgcHJvdGVjdGVkIENoYW5nZSBjaGFuZ2U7CiAgIHByb3RlY3RlZCBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGRyYWZ0czsKLSAgcHJvdGVjdGVkIExpc3Q8UGVybWlzc2lvblJhbmdlPiBsYWJlbHM7Ci0gIHByb3RlY3RlZCBMaXN0PEFwcHJvdmFsRGV0YWlsPiBhcHByb3ZhbHM7CiAgIHByb3RlY3RlZCBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVjb3JkczsKLSAgcHJvdGVjdGVkIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZ2l2ZW47CisgIHByb3RlY3RlZCBTdWJtaXRUeXBlUmVjb3JkIHN1Ym1pdFR5cGVSZWNvcmQ7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblN1Ym1pdDsKIAotICBwdWJsaWMgTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IGdldExhYmVscygpIHsKLSAgICByZXR1cm4gbGFiZWxzOworICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRUeXBlUmVjb3JkKFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgeworICAgIHRoaXMuc3VibWl0VHlwZVJlY29yZCA9IHN1Ym1pdFR5cGVSZWNvcmQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRMYWJlbHMoTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IGxhYmVscykgewotICAgIHRoaXMubGFiZWxzID0gbGFiZWxzOwotICB9Ci0KLSAgcHVibGljIExpc3Q8QXBwcm92YWxEZXRhaWw+IGdldEFwcHJvdmFscygpIHsKLSAgICByZXR1cm4gYXBwcm92YWxzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QXBwcm92YWxzKENvbGxlY3Rpb248QXBwcm92YWxEZXRhaWw+IGxpc3QpIHsKLSAgICBhcHByb3ZhbHMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsRGV0YWlsPihsaXN0KTsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KGFwcHJvdmFscywgQXBwcm92YWxEZXRhaWwuU09SVCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRSZWNvcmRzKExpc3Q8U3VibWl0UmVjb3JkPiBhbGwpIHsKLSAgICBzdWJtaXRSZWNvcmRzID0gYWxsOwotICB9Ci0KLSAgcHVibGljIExpc3Q8U3VibWl0UmVjb3JkPiBnZXRTdWJtaXRSZWNvcmRzKCkgewotICAgIHJldHVybiBzdWJtaXRSZWNvcmRzOwotICB9Ci0KLSAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZ2V0R2l2ZW4oKSB7Ci0gICAgcmV0dXJuIGdpdmVuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0R2l2ZW4oTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBnaXZlbikgewotICAgIHRoaXMuZ2l2ZW4gPSBnaXZlbjsKKyAgcHVibGljIFN1Ym1pdFR5cGVSZWNvcmQgZ2V0U3VibWl0VHlwZVJlY29yZCgpIHsKKyAgICByZXR1cm4gc3VibWl0VHlwZVJlY29yZDsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldEFjY291bnRzKEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHMpIHsKQEAgLTEwNSwyNCArNzMsNiBAQAogICAgIHJldHVybiBkcmFmdHM7CiAgIH0KIAotICBwdWJsaWMgUGVybWlzc2lvblJhbmdlIGdldFJhbmdlKGZpbmFsIFN0cmluZyBwZXJtaXNzaW9uTmFtZSkgewotICAgIGZvciAoUGVybWlzc2lvblJhbmdlIHMgOiBsYWJlbHMpIHsKLSAgICAgIGlmIChzLmdldE5hbWUoKS5lcXVhbHMocGVybWlzc2lvbk5hbWUpKSB7Ci0gICAgICAgIHJldHVybiBzOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBQYXRjaFNldEFwcHJvdmFsIGdldENoYW5nZUFwcHJvdmFsKEFwcHJvdmFsQ2F0ZWdvcnkuSWQgaWQpIHsKLSAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGdpdmVuKSB7Ci0gICAgICBpZiAoYS5nZXRDYXRlZ29yeUlkKCkuZXF1YWxzKGlkKSkgewotICAgICAgICByZXR1cm4gYTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQogICBwdWJsaWMgYm9vbGVhbiBjYW5TdWJtaXQoKSB7CiAgICAgcmV0dXJuIGNhblN1Ym1pdDsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb24uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uLmphdmEKaW5kZXggZmQ0MDg4OC4uMDU4NTY1MSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb24uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGVybWlzc2lvbi5qYXZhCkBAIC0yMywxNyArMjMsMjMgQEAKIHB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQZXJtaXNzaW9uPiB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQU5ET04gPSAiYWJhbmRvbiI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURSA9ICJjcmVhdGUiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRFJBRlRTID0gImRlbGV0ZURyYWZ0cyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfVE9QSUNfTkFNRSA9ICJlZGl0VG9waWNOYW1lIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR0VfQVVUSE9SID0gImZvcmdlQXV0aG9yIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR0VfQ09NTUlUVEVSID0gImZvcmdlQ29tbWl0dGVyIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR0VfU0VSVkVSID0gImZvcmdlU2VydmVyQXNDb21taXR0ZXIiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbC0iOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05FUiA9ICJvd25lciI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfRFJBRlRTID0gInB1Ymxpc2hEcmFmdHMiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVNIID0gInB1c2giOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVNIX01FUkdFID0gInB1c2hNZXJnZSI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0hfVEFHID0gInB1c2hUYWciOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVVNIX1NJR05FRF9UQUcgPSAicHVzaFNpZ25lZFRhZyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUQgPSAicmVhZCI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQkFTRSA9ICJyZWJhc2UiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfUkVWSUVXRVIgPSAicmVtb3ZlUmV2aWV3ZXIiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJNSVQgPSAic3VibWl0IjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19EUkFGVFMgPSAidmlld0RyYWZ0cyI7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IE5BTUVTX0xDOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbGFiZWxJbmRleDsKQEAgLTUwLDkgKzU2LDE1IEBACiAgICAgTkFNRVNfTEMuYWRkKFBVU0gudG9Mb3dlckNhc2UoKSk7CiAgICAgTkFNRVNfTEMuYWRkKFBVU0hfTUVSR0UudG9Mb3dlckNhc2UoKSk7CiAgICAgTkFNRVNfTEMuYWRkKFBVU0hfVEFHLnRvTG93ZXJDYXNlKCkpOworICAgIE5BTUVTX0xDLmFkZChQVVNIX1NJR05FRF9UQUcudG9Mb3dlckNhc2UoKSk7CiAgICAgTkFNRVNfTEMuYWRkKExBQkVMLnRvTG93ZXJDYXNlKCkpOwogICAgIE5BTUVTX0xDLmFkZChSRUJBU0UudG9Mb3dlckNhc2UoKSk7CisgICAgTkFNRVNfTEMuYWRkKFJFTU9WRV9SRVZJRVdFUi50b0xvd2VyQ2FzZSgpKTsKICAgICBOQU1FU19MQy5hZGQoU1VCTUlULnRvTG93ZXJDYXNlKCkpOworICAgIE5BTUVTX0xDLmFkZChWSUVXX0RSQUZUUy50b0xvd2VyQ2FzZSgpKTsKKyAgICBOQU1FU19MQy5hZGQoRURJVF9UT1BJQ19OQU1FLnRvTG93ZXJDYXNlKCkpOworICAgIE5BTUVTX0xDLmFkZChERUxFVEVfRFJBRlRTLnRvTG93ZXJDYXNlKCkpOworICAgIE5BTUVTX0xDLmFkZChQVUJMSVNIX0RSQUZUUy50b0xvd2VyQ2FzZSgpKTsKIAogICAgIGxhYmVsSW5kZXggPSBOQU1FU19MQy5pbmRleE9mKFBlcm1pc3Npb24uTEFCRUwpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGVybWlzc2lvblJ1bGUuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uUnVsZS5qYXZhCmluZGV4IDU5NjAxNjUuLmE3YTY2YjEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uUnVsZS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uUnVsZS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBQZXJtaXNzaW9uUnVsZSBpbXBsZW1lbnRzIENvbXBhcmFibGU8UGVybWlzc2lvblJ1bGU+IHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfUFVTSCA9ICJGb3JjZSBQdXNoIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfRURJVCA9ICJGb3JjZSBFZGl0IjsKICAgcHVibGljIHN0YXRpYyBlbnVtIEFjdGlvbiB7CiAgICAgQUxMT1csIERFTlksIEJMT0NLLAogCkBAIC0yNTEsNyArMjUyLDcgQEAKICAgICByZXR1cm4gcnVsZTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGludCBwYXJzZUludChTdHJpbmcgdmFsdWUpIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgcGFyc2VJbnQoU3RyaW5nIHZhbHVlKSB7CiAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIisiKSkgewogICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBY2Nlc3MuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0QWNjZXNzLmphdmEKaW5kZXggMTg5Mzg0My4uOTA0YzVjNyAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBY2Nlc3MuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdEFjY2Vzcy5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBvd25lck9mOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbmZpZ1Zpc2libGU7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblVwbG9hZDsKKyAgcHJvdGVjdGVkIExhYmVsVHlwZXMgbGFiZWxUeXBlczsKIAogICBwdWJsaWMgUHJvamVjdEFjY2VzcygpIHsKICAgfQpAQCAtMTAzLDQgKzEwNCwxMiBAQAogICBwdWJsaWMgdm9pZCBzZXRDYW5VcGxvYWQoYm9vbGVhbiBjYW5VcGxvYWQpIHsKICAgICB0aGlzLmNhblVwbG9hZCA9IGNhblVwbG9hZDsKICAgfQorCisgIHB1YmxpYyBMYWJlbFR5cGVzIGdldExhYmVsVHlwZXMoKSB7CisgICAgcmV0dXJuIGxhYmVsVHlwZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRMYWJlbFR5cGVzKExhYmVsVHlwZXMgbGFiZWxUeXBlcykgeworICAgIHRoaXMubGFiZWxUeXBlcyA9IGxhYmVsVHlwZXM7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0QWRtaW5TZXJ2aWNlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdEFkbWluU2VydmljZS5qYXZhCmluZGV4IDEzYzBhNDguLjA2Mzg5MDYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0QWRtaW5TZXJ2aWNlLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBZG1pblNlcnZpY2UuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJlbW90ZUpzb25TZXJ2aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsLlZlcnNpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTM1LDEyICszNCw2IEBACiAgIHZvaWQgcHJvamVjdERldGFpbChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsCiAgICAgICBBc3luY0NhbGxiYWNrPFByb2plY3REZXRhaWw+IGNhbGxiYWNrKTsKIAotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgY3JlYXRlTmV3UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwYXJlbnROYW1lLAotICAgICAgYm9vbGVhbiBlbXB0eUNvbW1pdCwgYm9vbGVhbiBwZXJtaXNzaW9uc09ubHksCi0gICAgICBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKTsKLQogICB2b2lkIHByb2plY3RBY2Nlc3MoUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAogICAgICAgQXN5bmNDYWxsYmFjazxQcm9qZWN0QWNjZXNzPiBjYWxsYmFjayk7CiAKQEAgLTY2LDcgKzU5LDcgQEAKICAgQEF1ZGl0CiAgIEBTaWduSW5SZXF1aXJlZAogICB2b2lkIGFkZEJyYW5jaChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsIFN0cmluZyBicmFuY2hOYW1lLAotICAgICAgU3RyaW5nIHN0YXJ0aW5nUmV2aXNpb24sIEFzeW5jQ2FsbGJhY2s8TGlzdEJyYW5jaGVzUmVzdWx0PiBjYWxsYmFjayk7CisgICAgICBTdHJpbmcgc3RhcnRpbmdSZXZpc2lvbiwgQXN5bmNDYWxsYmFjazxBZGRCcmFuY2hSZXN1bHQ+IGNhbGxiYWNrKTsKIAogICBAQXVkaXQKICAgQFNpZ25JblJlcXVpcmVkCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdERldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3REZXRhaWwuamF2YQppbmRleCAxZDg4Y2Y4Li4xZTc1ODliIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdERldGFpbC5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0RGV0YWlsLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Jbmhlcml0ZWRCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogCiBwdWJsaWMgY2xhc3MgUHJvamVjdERldGFpbCB7CkBAIC0yNCw2ICsyNSwxMCBAQAogICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnlBY2Nlc3M7CiAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeVN0YXRlOwogICBwdWJsaWMgYm9vbGVhbiBpc1Blcm1pc3Npb25Pbmx5OworICBwdWJsaWMgSW5oZXJpdGVkQm9vbGVhbiB1c2VDb250cmlidXRvckFncmVlbWVudHM7CisgIHB1YmxpYyBJbmhlcml0ZWRCb29sZWFuIHVzZVNpZ25lZE9mZkJ5OworICBwdWJsaWMgSW5oZXJpdGVkQm9vbGVhbiB1c2VDb250ZW50TWVyZ2U7CisgIHB1YmxpYyBJbmhlcml0ZWRCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRDsKIAogICBwdWJsaWMgUHJvamVjdERldGFpbCgpIHsKICAgfQpAQCAtNTUsNCArNjAsMjAgQEAKICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbk9ubHkoZmluYWwgYm9vbGVhbiBpcG8pIHsKICAgICBpc1Blcm1pc3Npb25Pbmx5ID0gaXBvOwogICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gdWNhKSB7CisgICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzID0gdWNhOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXNlU2lnbmVkT2ZmQnkoZmluYWwgSW5oZXJpdGVkQm9vbGVhbiB1c29iKSB7CisgICAgdXNlU2lnbmVkT2ZmQnkgPSB1c29iOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VXNlQ29udGVudE1lcmdlKGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gdWNtKSB7CisgICAgdXNlQ29udGVudE1lcmdlID0gdWNtOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UmVxdWlyZUNoYW5nZUlEKGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gcmNpZCkgeworICAgIHJlcXVpcmVDaGFuZ2VJRCA9IHJjaWQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZWZDb25maWdTZWN0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUmVmQ29uZmlnU2VjdGlvbi5qYXZhCmluZGV4IDgxMGU5MDYuLmY3NDA0NjQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZWZDb25maWdTZWN0aW9uLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1JlZkNvbmZpZ1NlY3Rpb24uamF2YQpAQCAtMjEsOSArMjEsNiBAQAogICAvKiogUGF0dGVybiB0aGF0IG1hdGNoZXMgYWxsIGJyYW5jaGVzIGluIGEgcHJvamVjdC4gKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRFMgPSAicmVmcy9oZWFkcy8qIjsKIAotICAvKiogQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYSBwcm9qZWN0IHtAY29kZSByZWZzL21ldGEvY29uZmlnfSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfQ09ORklHID0gInJlZnMvbWV0YS9jb25maWciOwotCiAgIC8qKiBQcmVmaXggdGhhdCB0cmlnZ2VycyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLiAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9QUkVGSVggPSAiXiI7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZXZpZXdSZXN1bHQuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZXZpZXdSZXN1bHQuamF2YQppbmRleCBjMGJmODE4Li4xYzg3YzcxIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUmV2aWV3UmVzdWx0LmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Jldmlld1Jlc3VsdC5qYXZhCkBAIC04Miw3ICs4MiwxMCBAQAogICAgICAgR0lUX0VSUk9SLAogCiAgICAgICAvKiogVGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBkb2VzIG5vdCBleGlzdCAqLwotICAgICAgREVTVF9CUkFOQ0hfTk9UX0ZPVU5ECisgICAgICBERVNUX0JSQU5DSF9OT1RfRk9VTkQsCisKKyAgICAgIC8qKiBOb3QgcGVybWl0dGVkIHRvIGVkaXQgdGhlIHRvcGljIG5hbWUgKi8KKyAgICAgIEVESVRfVE9QSUNfTkFNRV9OT1RfUEVSTUlUVEVECiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFR5cGUgdHlwZTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9TdWJtaXRUeXBlUmVjb3JkLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvU3VibWl0VHlwZVJlY29yZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZWE3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvU3VibWl0VHlwZVJlY29yZC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworCisvKioKKyAqIERlc2NyaWJlcyB0aGUgc3VibWl0IHR5cGUgZm9yIGEgY2hhbmdlLgorICovCitwdWJsaWMgY2xhc3MgU3VibWl0VHlwZVJlY29yZCB7CisgIHB1YmxpYyBzdGF0aWMgZW51bSBTdGF0dXMgeworICAgIC8qKiBUaGUgdHlwZSB3YXMgY29tcHV0ZWQgc3VjY2Vzc2Z1bGx5ICovCisgICAgT0ssCisKKyAgICAvKiogQW4gaW50ZXJuYWwgc2VydmVyIGVycm9yIG9jY3VycmVkIHByZXZlbnRpbmcgY29tcHV0YXRpb24uCisgICAgICogPHA+CisgICAgICogQWRkaXRpb25hbCBkZXRhaWwgbWF5IGJlIGF2YWlsYWJsZSBpbiB7QGxpbmsgU3VibWl0VHlwZVJlY29yZCNlcnJvck1lc3NhZ2V9CisgICAgICovCisgICAgUlVMRV9FUlJPUgorICB9CisKKyAgcHVibGljIHN0YXRpYyBTdWJtaXRUeXBlUmVjb3JkIE9LKFByb2plY3QuU3VibWl0VHlwZSB0eXBlKSB7CisgICAgU3VibWl0VHlwZVJlY29yZCByID0gbmV3IFN1Ym1pdFR5cGVSZWNvcmQoKTsKKyAgICByLnN0YXR1cyA9IFN0YXR1cy5PSzsKKyAgICByLnR5cGUgPSB0eXBlOworICAgIHJldHVybiByOworICB9CisKKyAgcHVibGljIFN0YXR1cyBzdGF0dXM7CisgIHB1YmxpYyBQcm9qZWN0LlN1Ym1pdFR5cGUgdHlwZTsKKyAgcHVibGljIFN0cmluZyBlcnJvck1lc3NhZ2U7CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBzYi5hcHBlbmQoc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1cy5SVUxFX0VSUk9SICYmIGVycm9yTWVzc2FnZSAhPSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoJygnKS5hcHBlbmQoZXJyb3JNZXNzYWdlKS5hcHBlbmQoIikiKTsKKyAgICB9CisgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCdbJyk7CisgICAgICBzYi5hcHBlbmQodHlwZS5uYW1lKCkpOworICAgICAgc2IuYXBwZW5kKCddJyk7CisgICAgfQorICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9FbWFpbEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvRW1haWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzUzMzVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvRW1haWxFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9yczsKKworcHVibGljIGNsYXNzIEVtYWlsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJNYWlsIEVycm9yOiAiOworCisgIHB1YmxpYyBFbWFpbEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIoTUVTU0FHRSArIG1zZyk7CisgIH0KKworICBwdWJsaWMgRW1haWxFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHdoeSkgeworICAgIHN1cGVyKE1FU1NBR0UgKyBtc2csIHdoeSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL05hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLmphdmEKaW5kZXggYTJkNDg3Yi4uZWEyMGUyZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLmphdmEKQEAgLTE4LDkgKzE4LDkgQEAKIHB1YmxpYyBjbGFzcyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIk5hbWUgQWxyZWFkeSBVc2VkIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJOYW1lIEFscmVhZHkgVXNlZDogIjsKIAotICBwdWJsaWMgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKE1FU1NBR0UpOworICBwdWJsaWMgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgc3VwZXIoTUVTU0FHRSArIG5hbWUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9Ob1N1Y2hFbnRpdHlFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhCmluZGV4IGM0N2NmMDcuLjE4MjljOGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhCkBAIC0yMyw0ICsyMyw4IEBACiAgIHB1YmxpYyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSB7CiAgICAgc3VwZXIoTUVTU0FHRSk7CiAgIH0KKworICBwdWJsaWMgTm9TdWNoRW50aXR5RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24uamF2YQppbmRleCA3NjUyMGFhLi4wZmFmNDk4IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbi5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9yczsKIAotLyoqIEluZGljYXRzIHRoZSB1c2VyIGNhbm5vdCBwZXJmb3JtIHRoaXMgdGFzay4gKi8KKy8qKiBJbmRpY2F0ZXMgdGhlIHVzZXIgY2Fubm90IHBlcmZvcm0gdGhpcyB0YXNrLiAqLwogcHVibGljIGNsYXNzIFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9ncm91cHMvTGlzdEdyb3Vwc09wdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9ncm91cHMvTGlzdEdyb3Vwc09wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTdmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2dyb3Vwcy9MaXN0R3JvdXBzT3B0aW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5ncm91cHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworCisvKiogT3V0cHV0IG9wdGlvbnMgYXZhaWxhYmxlIHdoZW4gdXNpbmcge0Bjb2RlIC9ncm91cHMvfSBSUENzLiAqLworcHVibGljIGVudW0gTGlzdEdyb3Vwc09wdGlvbiB7CisgIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gb24gdGhlIGRpcmVjdCBncm91cCBtZW1iZXJzLiAqLworICBNRU1CRVJTKDApLAorCisgIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gb24gdGhlIGRpcmVjdGx5IGluY2x1ZGVkIGdyb3Vwcy4gKi8KKyAgSU5DTFVERVMoMSk7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKyAgcHJpdmF0ZSBMaXN0R3JvdXBzT3B0aW9uKGludCB2KSB7CisgICAgdGhpcy52YWx1ZSA9IHY7CisgIH0KKworICBwdWJsaWMgaW50IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRW51bVNldDxMaXN0R3JvdXBzT3B0aW9uPiBmcm9tQml0cyhpbnQgdikgeworICAgIEVudW1TZXQ8TGlzdEdyb3Vwc09wdGlvbj4gciA9IEVudW1TZXQubm9uZU9mKExpc3RHcm91cHNPcHRpb24uY2xhc3MpOworICAgIGZvciAoTGlzdEdyb3Vwc09wdGlvbiBvIDogTGlzdEdyb3Vwc09wdGlvbi52YWx1ZXMoKSkgeworICAgICAgaWYgKCh2ICYgKDEgPDwgby52YWx1ZSkpICE9IDApIHsKKyAgICAgICAgci5hZGQobyk7CisgICAgICAgIHYgJj0gfigxIDw8IG8udmFsdWUpOworICAgICAgfQorICAgICAgaWYgKHYgPT0gMCkgeworICAgICAgICByZXR1cm4gcjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biAiICsgSW50ZWdlci50b0hleFN0cmluZyh2KSk7CisgICAgfQorICAgIHJldHVybiByOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgdG9CaXRzKEVudW1TZXQ8TGlzdEdyb3Vwc09wdGlvbj4gc2V0KSB7CisgICAgaW50IHIgPSAwOworICAgIGZvciAoTGlzdEdyb3Vwc09wdGlvbiBvIDogc2V0KSB7CisgICAgICByIHw9IDEgPDwgby52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2dlcnJpdC1leHRlbnNpb24tYXBpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCA0NzA5NDJkLi45NDFmYjMxIDEwMDY0NAotLS0gYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC03LDYgKzcsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3BvbS54bWwgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9wb20ueG1sCmluZGV4IGZmNjcyZDUuLjEwODBlZDEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3BvbS54bWwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LWV4dGVuc2lvbi1hcGk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvZXZlbnRzL0dpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL2V2ZW50cy9HaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuamF2YQppbmRleCA0Mzg1MDBkLi4yOTExZGVkIDEwMDY0NAotLS0gYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvZXZlbnRzL0dpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5qYXZhCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLmphdmEKQEAgLTIzLDYgKzIzLDggQEAKIHB1YmxpYyBpbnRlcmZhY2UgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyIHsKICAgcHVibGljIGludGVyZmFjZSBVcGRhdGUgewogICAgIFN0cmluZyBnZXRSZWZOYW1lKCk7CisgICAgU3RyaW5nIGdldE9sZE9iamVjdElkKCk7CisgICAgU3RyaW5nIGdldE5ld09iamVjdElkKCk7CiAgIH0KIAogICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50IHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY0l0ZW0uamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY0l0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFkYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbS5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TY29wZXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYmluZGVyLkxpbmtlZEJpbmRpbmdCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnV0aWwuUHJvdmlkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnV0aWwuVHlwZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCisvKioKKyAqIEEgc2luZ2xlIGl0ZW0gdGhhdCBjYW4gYmUgbW9kaWZpZWQgYXMgcGx1Z2lucyByZWxvYWQuCisgKiA8cD4KKyAqIER5bmFtaWNJdGVtcyBhcmUgYWx3YXlzIG1hcHBlZCBhcyBzaW5nbGV0b25zIGluIEd1aWNlLiBJdGVtcyBzdG9yZSBhIFByb3ZpZGVyCisgKiBpbnRlcm5hbGx5LCBhbmQgcmVzb2x2ZSB0aGUgcHJvdmlkZXIgdG8gYW4gaW5zdGFuY2Ugb24gZGVtYW5kLiBUaGlzIGVuYWJsZXMKKyAqIHJlZ2lzdHJhdGlvbnMgdG8gZGVjaWRlIGJldHdlZW4gc2luZ2xldG9uIGFuZCBub24tc2luZ2xldG9uIG1lbWJlcnMuIElmCisgKiBtdWx0aXBsZSBwbHVnaW5zIHRyeSB0byBwcm92aWRlIHRoZSBzYW1lIFByb3ZpZGVyLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICovCitwdWJsaWMgY2xhc3MgRHluYW1pY0l0ZW08VD4geworICAvKiogUGFpciBvZiBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBhbmQgcGx1Z2luIHByb3ZpZGluZyBpdC4gKi8KKyAgc3RhdGljIGNsYXNzIE5hbWVkUHJvdmlkZXI8VD4geworICAgIGZpbmFsIFByb3ZpZGVyPFQ+IGltcGw7CisgICAgZmluYWwgU3RyaW5nIHBsdWdpbk5hbWU7CisKKyAgICBOYW1lZFByb3ZpZGVyKFByb3ZpZGVyPFQ+IHByb3ZpZGVyLCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgICAgdGhpcy5pbXBsID0gcHJvdmlkZXI7CisgICAgICB0aGlzLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEZWNsYXJlIGEgc2luZ2xldG9uIHtAY29kZSBEeW5hbWljSXRlbTxUPn0gd2l0aCBhIGJpbmRlci4KKyAgICogPHA+CisgICAqIEl0ZW1zIG11c3QgYmUgZGVmaW5lZCBpbiBhIEd1aWNlIG1vZHVsZSBiZWZvcmUgdGhleSBjYW4gYmUgYm91bmQ6CisgICAqIDxwcmU+CisgICAqICAgRHluYW1pY0l0ZW0uaXRlbU9mKGJpbmRlcigpLCBJbnRlcmZhY2UuY2xhc3MpOworICAgKiAgIER5bmFtaWNJdGVtLmJpbmQoYmluZGVyKCksIEludGVyZmFjZS5jbGFzcykudG8oSW1wbC5jbGFzcyk7CisgICAqIDwvcHJlPgorICAgKgorICAgKiBAcGFyYW0gYmluZGVyIGEgbmV3IGJpbmRlciBjcmVhdGVkIGluIHRoZSBtb2R1bGUuCisgICAqIEBwYXJhbSBtZW1iZXIgdHlwZSBvZiBlbnRyeSB0byBzdG9yZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgaXRlbU9mKEJpbmRlciBiaW5kZXIsIENsYXNzPFQ+IG1lbWJlcikgeworICAgIGl0ZW1PZihiaW5kZXIsIFR5cGVMaXRlcmFsLmdldChtZW1iZXIpKTsKKyAgfQorCisgIC8qKgorICAgKiBEZWNsYXJlIGEgc2luZ2xldG9uIHtAY29kZSBEeW5hbWljSXRlbTxUPn0gd2l0aCBhIGJpbmRlci4KKyAgICogPHA+CisgICAqIEl0ZW1zIG11c3QgYmUgZGVmaW5lZCBpbiBhIEd1aWNlIG1vZHVsZSBiZWZvcmUgdGhleSBjYW4gYmUgYm91bmQ6CisgICAqIDxwcmU+CisgICAqICAgRHluYW1pY1NldC5pdGVtT2YoYmluZGVyKCksIG5ldyBUeXBlTGl0ZXJhbDxUaGluZzxGb28+PigpIHt9KTsKKyAgICogPC9wcmU+CisgICAqCisgICAqIEBwYXJhbSBiaW5kZXIgYSBuZXcgYmluZGVyIGNyZWF0ZWQgaW4gdGhlIG1vZHVsZS4KKyAgICogQHBhcmFtIG1lbWJlciB0eXBlIG9mIGVudHJ5IHRvIHN0b3JlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBpdGVtT2YoQmluZGVyIGJpbmRlciwgVHlwZUxpdGVyYWw8VD4gbWVtYmVyKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgS2V5PER5bmFtaWNJdGVtPFQ+PiBrZXkgPSAoS2V5PER5bmFtaWNJdGVtPFQ+PikgS2V5LmdldCgKKyAgICAgICAgVHlwZXMubmV3UGFyYW1ldGVyaXplZFR5cGUoRHluYW1pY0l0ZW0uY2xhc3MsIG1lbWJlci5nZXRUeXBlKCkpKTsKKyAgICBiaW5kZXIuYmluZChrZXkpCisgICAgICAudG9Qcm92aWRlcihuZXcgRHluYW1pY0l0ZW1Qcm92aWRlcjxUPihtZW1iZXIsIGtleSkpCisgICAgICAuaW4oU2NvcGVzLlNJTkdMRVRPTik7CisgIH0KKworICAvKioKKyAgICogQmluZCBvbmUgaW1wbGVtZW50YXRpb24gYXMgdGhlIGl0ZW0gdXNpbmcgYSB1bmlxdWUgYW5ub3RhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIGJpbmRlciBhIG5ldyBiaW5kZXIgY3JlYXRlZCBpbiB0aGUgbW9kdWxlLgorICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIGVudHJ5IHRvIHN0b3JlLgorICAgKiBAcmV0dXJuIGEgYmluZGVyIHRvIGNvbnRpbnVlIGNvbmZpZ3VyaW5nIHRoZSBuZXcgaXRlbS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgPFQ+IExpbmtlZEJpbmRpbmdCdWlsZGVyPFQ+IGJpbmQoQmluZGVyIGJpbmRlciwgQ2xhc3M8VD4gdHlwZSkgeworICAgIHJldHVybiBiaW5kKGJpbmRlciwgVHlwZUxpdGVyYWwuZ2V0KHR5cGUpKTsKKyAgfQorCisgIC8qKgorICAgKiBCaW5kIG9uZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgaXRlbS4KKyAgICoKKyAgICogQHBhcmFtIGJpbmRlciBhIG5ldyBiaW5kZXIgY3JlYXRlZCBpbiB0aGUgbW9kdWxlLgorICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIGVudHJ5IHRvIHN0b3JlLgorICAgKiBAcmV0dXJuIGEgYmluZGVyIHRvIGNvbnRpbnVlIGNvbmZpZ3VyaW5nIHRoZSBuZXcgaXRlbS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgPFQ+IExpbmtlZEJpbmRpbmdCdWlsZGVyPFQ+IGJpbmQoQmluZGVyIGJpbmRlciwKKyAgICAgIFR5cGVMaXRlcmFsPFQ+IHR5cGUpIHsKKyAgICByZXR1cm4gYmluZGVyLmJpbmQodHlwZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEtleTxEeW5hbWljSXRlbTxUPj4ga2V5OworICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxOYW1lZFByb3ZpZGVyPFQ+PiByZWY7CisKKyAgRHluYW1pY0l0ZW0oS2V5PER5bmFtaWNJdGVtPFQ+PiBrZXksIFByb3ZpZGVyPFQ+IHByb3ZpZGVyLCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIE5hbWVkUHJvdmlkZXI8VD4gaW4gPSBudWxsOworICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICBpbiA9IG5ldyBOYW1lZFByb3ZpZGVyPFQ+KHByb3ZpZGVyLCBwbHVnaW5OYW1lKTsKKyAgICB9CisgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgdGhpcy5yZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPE5hbWVkUHJvdmlkZXI8VD4+KGluKTsKKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgaXRlbSwgb3IgbnVsbC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgY29uZmlndXJlZCBpdGVtIGluc3RhbmNlOyBudWxsIGlmIG5vIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuCisgICAqICAgICAgICAgYm91bmQgdG8gdGhlIGl0ZW0uIFRoaXMgaXMgY29tbW9uIGlmIG5vIHBsdWdpbiByZWdpc3RlcmVkIGFuCisgICAqICAgICAgICAgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB0eXBlLgorICAgKi8KKyAgcHVibGljIFQgZ2V0KCkgeworICAgIE5hbWVkUHJvdmlkZXI8VD4gaXRlbSA9IHJlZi5nZXQoKTsKKyAgICByZXR1cm4gaXRlbSAhPSBudWxsID8gaXRlbS5pbXBsLmdldCgpIDogbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGVsZW1lbnQgdG8gcHJvdmlkZS4KKyAgICoKKyAgICogQHBhcmFtIGl0ZW0gdGhlIGl0ZW0gdG8gdXNlLiBNdXN0IG5vdCBiZSBudWxsLgorICAgKiBAcGFyYW0gcGx1Z2luTmFtZSB0aGUgbmFtZSBvZiB0aGUgcGx1Z2luIHByb3ZpZGluZyB0aGUgaXRlbS4KKyAgICogQHJldHVybiBoYW5kbGUgdG8gcmVtb3ZlIHRoZSBpdGVtIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS4KKyAgICovCisgIHB1YmxpYyBSZWdpc3RyYXRpb25IYW5kbGUgc2V0KFQgaXRlbSwgU3RyaW5nIHBsdWdpbk5hbWUpIHsKKyAgICByZXR1cm4gc2V0KFByb3ZpZGVycy5vZihpdGVtKSwgcGx1Z2luTmFtZSk7CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBlbGVtZW50IHRvIHByb3ZpZGUuCisgICAqCisgICAqIEBwYXJhbSBpbXBsIHRoZSBpdGVtIHRvIGFkZCB0byB0aGUgY29sbGVjdGlvbi4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICogQHBhcmFtIHBsdWdpbk5hbWUgbmFtZSBvZiB0aGUgc291cmNlIHByb3ZpZGluZyB0aGUgaW1wbGVtZW50YXRpb24uCisgICAqIEByZXR1cm4gaGFuZGxlIHRvIHJlbW92ZSB0aGUgaXRlbSBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuCisgICAqLworICBwdWJsaWMgUmVnaXN0cmF0aW9uSGFuZGxlIHNldChQcm92aWRlcjxUPiBpbXBsLCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIGZpbmFsIE5hbWVkUHJvdmlkZXI8VD4gaXRlbSA9IG5ldyBOYW1lZFByb3ZpZGVyPFQ+KGltcGwsIHBsdWdpbk5hbWUpOworICAgIHdoaWxlICghcmVmLmNvbXBhcmVBbmRTZXQobnVsbCwgaXRlbSkpIHsKKyAgICAgIE5hbWVkUHJvdmlkZXI8VD4gb2xkID0gcmVmLmdldCgpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICIlcyBhbHJlYWR5IHByb3ZpZGVkIGJ5ICVzLCBpZ25vcmluZyBwbHVnaW4gJXMiLAorICAgICAgICAgICAga2V5LmdldFR5cGVMaXRlcmFsKCksIG9sZC5wbHVnaW5OYW1lLCBwbHVnaW5OYW1lKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uSGFuZGxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHJlZi5jb21wYXJlQW5kU2V0KGl0ZW0sIG51bGwpOworICAgICAgfQorICAgIH07CisgIH0KKworICAvKioKKyAgICogU2V0IHRoZSBlbGVtZW50IHRoYXQgbWF5IGJlIGhvdC1yZXBsYWNlYWJsZSBpbiB0aGUgZnV0dXJlLgorICAgKgorICAgKiBAcGFyYW0ga2V5IHVuaXF1ZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBpdGVtJ3MgR3VpY2UgYmluZGluZy4gVGhpcyBjYW4gYmUKKyAgICogICAgICAgIGxhdGVyIG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJhdGlvbiBoYW5kbGUgdG8gZmFjaWxpdGF0ZSBtYXRjaGluZworICAgKiAgICAgICAgd2l0aCB0aGUgbmV3IGVxdWl2YWxlbnQgaW5zdGFuY2UgZHVyaW5nIGEgaG90IHJlbG9hZC4KKyAgICogQHBhcmFtIGltcGwgdGhlIGl0ZW0gdG8gc2V0IGFzIG91ciB2YWx1ZSByaWdodCBub3cuIE11c3Qgbm90IGJlIG51bGwuCisgICAqIEBwYXJhbSBwbHVnaW5OYW1lIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gcHJvdmlkaW5nIHRoZSBpdGVtLgorICAgKiBAcmV0dXJuIGEgaGFuZGxlIHRoYXQgY2FuIHJlbW92ZSB0aGlzIGl0ZW0gbGF0ZXIsIG9yIGhvdC1zd2FwIHRoZSBpdGVtLgorICAgKi8KKyAgcHVibGljIFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8VD4gc2V0KEtleTxUPiBrZXksIFByb3ZpZGVyPFQ+IGltcGwsCisgICAgICBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIGZpbmFsIE5hbWVkUHJvdmlkZXI8VD4gaXRlbSA9IG5ldyBOYW1lZFByb3ZpZGVyPFQ+KGltcGwsIHBsdWdpbk5hbWUpOworICAgIHdoaWxlICghcmVmLmNvbXBhcmVBbmRTZXQobnVsbCwgaXRlbSkpIHsKKyAgICAgIE5hbWVkUHJvdmlkZXI8VD4gb2xkID0gcmVmLmdldCgpOworICAgICAgaWYgKG9sZCAhPSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICIlcyBhbHJlYWR5IHByb3ZpZGVkIGJ5ICVzLCBpZ25vcmluZyBwbHVnaW4gJXMiLAorICAgICAgICAgICAgdGhpcy5rZXkuZ2V0VHlwZUxpdGVyYWwoKSwgb2xkLnBsdWdpbk5hbWUsIHBsdWdpbk5hbWUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZWxvYWRhYmxlSGFuZGxlKGtleSwgaXRlbSk7CisgIH0KKworICBwcml2YXRlIGNsYXNzIFJlbG9hZGFibGVIYW5kbGUgaW1wbGVtZW50cyBSZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlPFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIEtleTxUPiBrZXk7CisgICAgcHJpdmF0ZSBmaW5hbCBOYW1lZFByb3ZpZGVyPFQ+IGl0ZW07CisKKyAgICBSZWxvYWRhYmxlSGFuZGxlKEtleTxUPiBrZXksIE5hbWVkUHJvdmlkZXI8VD4gaXRlbSkgeworICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICB0aGlzLml0ZW0gPSBpdGVtOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBLZXk8VD4gZ2V0S2V5KCkgeworICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICByZWYuY29tcGFyZUFuZFNldChpdGVtLCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVsb2FkYWJsZUhhbmRsZSByZXBsYWNlKEtleTxUPiBuZXdLZXksIFByb3ZpZGVyPFQ+IG5ld0l0ZW0pIHsKKyAgICAgIE5hbWVkUHJvdmlkZXI8VD4gbiA9IG5ldyBOYW1lZFByb3ZpZGVyPFQ+KG5ld0l0ZW0sIGl0ZW0ucGx1Z2luTmFtZSk7CisgICAgICBpZiAocmVmLmNvbXBhcmVBbmRTZXQoaXRlbSwgbikpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWxvYWRhYmxlSGFuZGxlKG5ld0tleSwgbik7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY0l0ZW1Qcm92aWRlci5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NGVlNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY0l0ZW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgRHluYW1pY0l0ZW1Qcm92aWRlcjxUPiBpbXBsZW1lbnRzIFByb3ZpZGVyPER5bmFtaWNJdGVtPFQ+PiB7CisgIHByaXZhdGUgZmluYWwgVHlwZUxpdGVyYWw8VD4gdHlwZTsKKyAgcHJpdmF0ZSBmaW5hbCBLZXk8RHluYW1pY0l0ZW08VD4+IGtleTsKKworICBASW5qZWN0CisgIHByaXZhdGUgSW5qZWN0b3IgaW5qZWN0b3I7CisKKyAgRHluYW1pY0l0ZW1Qcm92aWRlcihUeXBlTGl0ZXJhbDxUPiB0eXBlLCBLZXk8RHluYW1pY0l0ZW08VD4+IGtleSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5rZXkgPSBrZXk7CisgIH0KKworICBwdWJsaWMgRHluYW1pY0l0ZW08VD4gZ2V0KCkgeworICAgIHJldHVybiBuZXcgRHluYW1pY0l0ZW08VD4oa2V5LCBmaW5kKGluamVjdG9yLCB0eXBlKSwgImdlcnJpdCIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFByb3ZpZGVyPFQ+IGZpbmQoSW5qZWN0b3Igc3JjLCBUeXBlTGl0ZXJhbDxUPiB0eXBlKSB7CisgICAgTGlzdDxCaW5kaW5nPFQ+PiBiaW5kaW5ncyA9IHNyYy5maW5kQmluZGluZ3NCeVR5cGUodHlwZSk7CisgICAgaWYgKGJpbmRpbmdzICE9IG51bGwgJiYgYmluZGluZ3Muc2l6ZSgpID09IDEpIHsKKyAgICAgIHJldHVybiBiaW5kaW5ncy5nZXQoMCkuZ2V0UHJvdmlkZXIoKTsKKyAgICB9IGVsc2UgaWYgKGJpbmRpbmdzICE9IG51bGwgJiYgYmluZGluZ3Muc2l6ZSgpID4gMSkgeworICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAiTXVsdGlwbGUgcHJvdmlkZXJzIGJvdW5kIGZvciBEeW5hbWljSXRlbTwlcz5cbiIKKyAgICAgICAgKyAiVGhpcyBpcyBub3QgYWxsb3dlZDsgY2hlY2sgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLiIsCisgICAgICAgIHR5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL0R5bmFtaWNTZXRQcm92aWRlci5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljU2V0UHJvdmlkZXIuamF2YQppbmRleCA2YzIxNTUzLi4yMWZhMWI4IDEwMDY0NAotLS0gYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL0R5bmFtaWNTZXRQcm92aWRlci5qYXZhCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY1NldFByb3ZpZGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5pbnRlcm5hbC5VbmlxdWVBbm5vdGF0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMjcsOCArMjYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGNsYXNzIER5bmFtaWNTZXRQcm92aWRlcjxUPiBpbXBsZW1lbnRzIFByb3ZpZGVyPER5bmFtaWNTZXQ8VD4+IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gVU5JUVVFX0FOTk9UQVRJT04gPQotICAgICAgVW5pcXVlQW5ub3RhdGlvbnMuY3JlYXRlKCkuZ2V0Q2xhc3MoKTsKICAgcHJpdmF0ZSBmaW5hbCBUeXBlTGl0ZXJhbDxUPiB0eXBlOwogCiAgIEBJbmplY3QKZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMuamF2YQppbmRleCA2NmRkNDVkLi44YmM1N2FiIDEwMDY0NAotLS0gYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL1ByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzLmphdmEKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcy5qYXZhCkBAIC0zMCw2ICszMCwyMiBAQAogCiAvKiogPGI+RE8gTk9UIFVTRTwvYj4gKi8KIHB1YmxpYyBjbGFzcyBQcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcyB7CisgIHB1YmxpYyBzdGF0aWMgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gZHluYW1pY0l0ZW1zT2YoSW5qZWN0b3Igc3JjKSB7CisgICAgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gbSA9IG5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxLZXk8Pz4sIEJpbmRpbmc8Pz4+IGUgOiBzcmMuZ2V0QmluZGluZ3MoKS5lbnRyeVNldCgpKSB7CisgICAgICBUeXBlTGl0ZXJhbDw/PiB0eXBlID0gZS5nZXRLZXkoKS5nZXRUeXBlTGl0ZXJhbCgpOworICAgICAgaWYgKHR5cGUuZ2V0UmF3VHlwZSgpID09IER5bmFtaWNJdGVtLmNsYXNzKSB7CisgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHAgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGUuZ2V0VHlwZSgpOworICAgICAgICBtLnB1dChUeXBlTGl0ZXJhbC5nZXQocC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF0pLAorICAgICAgICAgICAgKER5bmFtaWNJdGVtPD8+KSBlLmdldFZhbHVlKCkuZ2V0UHJvdmlkZXIoKS5nZXQoKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChtLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobSk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY1NldDw/Pj4gZHluYW1pY1NldHNPZihJbmplY3RvciBzcmMpIHsKICAgICBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNTZXQ8Pz4+IG0gPSBuZXdIYXNoTWFwKCk7CiAgICAgZm9yIChNYXAuRW50cnk8S2V5PD8+LCBCaW5kaW5nPD8+PiBlIDogc3JjLmdldEJpbmRpbmdzKCkuZW50cnlTZXQoKSkgewpAQCAtNjIsNiArNzgsMzggQEAKICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG0pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBMaXN0PFJlZ2lzdHJhdGlvbkhhbmRsZT4gYXR0YWNoSXRlbXMoCisgICAgICBJbmplY3RvciBzcmMsCisgICAgICBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNJdGVtPD8+PiBpdGVtcywgU3RyaW5nIHBsdWdpbk5hbWUpIHsKKyAgICBpZiAoc3JjID09IG51bGwgfHwgaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICBMaXN0PFJlZ2lzdHJhdGlvbkhhbmRsZT4gaGFuZGxlcyA9IG5ldyBBcnJheUxpc3Q8UmVnaXN0cmF0aW9uSGFuZGxlPig0KTsKKyAgICB0cnkgeworICAgICAgZm9yIChNYXAuRW50cnk8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNJdGVtPD8+PiBlIDogaXRlbXMuZW50cnlTZXQoKSkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgVHlwZUxpdGVyYWw8T2JqZWN0PiB0eXBlID0gKFR5cGVMaXRlcmFsPE9iamVjdD4pIGUuZ2V0S2V5KCk7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIER5bmFtaWNJdGVtPE9iamVjdD4gaXRlbSA9IChEeW5hbWljSXRlbTxPYmplY3Q+KSBlLmdldFZhbHVlKCk7CisKKyAgICAgICAgZm9yIChCaW5kaW5nPE9iamVjdD4gYiA6IGJpbmRpbmdzKHNyYywgdHlwZSkpIHsKKyAgICAgICAgICBpZiAoYi5nZXRLZXkoKS5nZXRBbm5vdGF0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlcy5hZGQoaXRlbS5zZXQoYi5nZXRLZXkoKSwgYi5nZXRQcm92aWRlcigpLCBwbHVnaW5OYW1lKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICByZW1vdmUoaGFuZGxlcyk7CisgICAgICB0aHJvdyBlOworICAgIH0gY2F0Y2ggKEVycm9yIGUpIHsKKyAgICAgIHJlbW92ZShoYW5kbGVzKTsKKyAgICAgIHRocm93IGU7CisgICAgfQorICAgIHJldHVybiBoYW5kbGVzOworICB9CisKICAgcHVibGljIHN0YXRpYyBMaXN0PFJlZ2lzdHJhdGlvbkhhbmRsZT4gYXR0YWNoU2V0cygKICAgICAgIEluamVjdG9yIHNyYywKICAgICAgIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY1NldDw/Pj4gc2V0cykgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQWNjZXB0c0NyZWF0ZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQWNjZXB0c0NyZWF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmYyODEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzQ3JlYXRlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBPcHRpb25hbCBpbnRlcmZhY2UgZm9yIHtAbGluayBSZXN0Q29sbGVjdGlvbn0uCisgKiA8cD4KKyAqIENvbGxlY3Rpb25zIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGNhbiBhY2NlcHQgYSB7QGNvZGUgUFVUfSBvcgorICoge0Bjb2RlIFBPU1R9IHdoZW4gdGhlIHBhcnNlIG1ldGhvZCB0aHJvd3Mge0BsaW5rIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb259LgorICovCitwdWJsaWMgaW50ZXJmYWNlIEFjY2VwdHNDcmVhdGU8UCBleHRlbmRzIFJlc3RSZXNvdXJjZT4geworICAvKioKKyAgICogSGFuZGxlIGNyZWF0aW9uIG9mIGEgY2hpbGQgcmVzb3VyY2UuCisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbGxlY3Rpb24gaGFuZGxlLgorICAgKiBAcGFyYW0gaWQgaWQgb2YgdGhlIHJlc291cmNlIGJlaW5nIGNyZWF0ZWQuCisgICAqIEByZXR1cm4gYSB2aWV3IHRvIHBlcmZvcm0gdGhlIGNyZWF0aW9uLiBUaGUgY3JlYXRlIG1ldGhvZCBtdXN0IGVtYmVkIHRoZSBpZAorICAgKiAgICAgICAgIGludG8gdGhlIG5ld2x5IHJldHVybmVkIHZpZXcgb2JqZWN0LCBhcyBpdCB3aWxsIG5vdCBiZSBwYXNzZWQuCisgICAqIEB0aHJvd3MgUmVzdEFwaUV4Y2VwdGlvbiB0aGUgdmlldyBjYW5ub3QgYmUgY29uc3RydWN0ZWQuCisgICAqLworICA8ST4gUmVzdE1vZGlmeVZpZXc8UCwgST4gY3JlYXRlKFAgcGFyZW50LCBJZFN0cmluZyBpZCkgdGhyb3dzIFJlc3RBcGlFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzUG9zdC5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQWNjZXB0c1Bvc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzBlYTgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQWNjZXB0c1Bvc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIE9wdGlvbmFsIGludGVyZmFjZSBmb3Ige0BsaW5rIFJlc3RDb2xsZWN0aW9ufS4KKyAqIDxwPgorICogQ29sbGVjdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIGFjY2VwdCBhIHtAY29kZSBQT1NUfSBkaXJlY3RseQorICogb24gdGhlIGNvbGxlY3Rpb24gaXRzZWxmIHdoZW4gbm8gaWQgd2FzIGdpdmVuIGluIHRoZSBwYXRoLiBUaGlzIGludGVyZmFjZSBpcworICogaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIFRvcExldmVsUmVzb3VyY2UgY29sbGVjdGlvbnMuIE5lc3RlZCBjb2xsZWN0aW9ucworICogb2Z0ZW4gYmluZCBQT1NUIG9uIHRoZSBwYXJlbnQgY29sbGVjdGlvbiB0byB0aGUgdmlldyBpbXBsZW1lbnRhdGlvbiBoYW5kbGluZworICogdGhlIGluc2VydGlvbiBvZiBhIG5ldyBtZW1iZXIuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXB0c1Bvc3Q8UCBleHRlbmRzIFJlc3RSZXNvdXJjZT4geworICAvKioKKyAgICogSGFuZGxlIGNyZWF0aW9uIG9mIGEgY2hpbGQgcmVzb3VyY2UgYnkgUE9TVCBvbiB0aGUgY29sbGVjdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29sbGVjdGlvbiBoYW5kbGUuCisgICAqIEByZXR1cm4gYSB2aWV3IHRvIHBlcmZvcm0gdGhlIGNyZWF0aW9uLiBUaGUgaWQgb2YgdGhlIG5ld2x5IGNyZWF0ZWQKKyAgICogICAgICAgICByZXNvdXJjZSBzaG91bGQgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBpbnB1dCBib2R5LgorICAgKiBAdGhyb3dzIFJlc3RBcGlFeGNlcHRpb24gdGhlIHZpZXcgY2Fubm90IGJlIGNvbnN0cnVjdGVkLgorICAgKi8KKyAgPEk+IFJlc3RNb2RpZnlWaWV3PFAsIEk+IHBvc3QoUCBwYXJlbnQpIHRocm93cyBSZXN0QXBpRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQXV0aEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQXV0aEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNGNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BdXRoRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIENhbGxlciBjYW5ub3QgcGVyZm9ybSB0aGUgcmVxdWVzdCBvcGVyYXRpb24gKEhUVFAgNDAzIEZvcmJpZGRlbikuICovCitwdWJsaWMgY2xhc3MgQXV0aEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKiogQHBhcmFtIG1zZyBtZXNzYWdlIHRvIHJldHVybiB0byB0aGUgY2xpZW50LiAqLworICBwdWJsaWMgQXV0aEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQmFkUmVxdWVzdEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQmFkUmVxdWVzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTljMWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9CYWRSZXF1ZXN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIFJlcXVlc3QgY291bGQgbm90IGJlIHBhcnNlZCBhcyBzZW50IChIVFRQIDQwMCBCYWQgUmVxdWVzdCkuICovCitwdWJsaWMgY2xhc3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKiogQHBhcmFtIG1zZyBlcnJvciB0ZXh0IGZvciBjbGllbnQgZGVzY3JpYmluZyBob3cgcmVxdWVzdCBpcyBiYWQuICovCisgIHB1YmxpYyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9CaW5hcnlSZXN1bHQuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0JpbmFyeVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ODAxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9CaW5hcnlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CisKKy8qKgorICogV3JhcHBlciBhcm91bmQgYSBub24tSlNPTiByZXN1bHQgZnJvbSBhIHtAbGluayBSZXN0Vmlld30uCisgKiA8cD4KKyAqIFZpZXdzIG1heSByZXR1cm4gdGhpcyB0eXBlIHRvIHNpZ25hbCB0aGV5IHdhbnQgdGhlIHNlcnZlciBnbHVlIHRvIHdyaXRlIHJhdworICogZGF0YSB0byB0aGUgY2xpZW50LCBpbnN0ZWFkIG9mIGF0dGVtcHRpbmcgYXV0b21hdGljIGNvbnZlcnNpb24gdG8gSlNPTi4gVGhlCisgKiBjcmVhdGUgZm9ybSBpcyBvdmVybG9hZGVkIHRvIGhhbmRsZSBwbGFpbiB0ZXh0IGZyb20gYSBTdHJpbmcsIG9yIGJpbmFyeSBkYXRhCisgKiBmcm9tIGEge0Bjb2RlIGJ5dGVbXX0gb3Ige0Bjb2RlIElucHV0U3RlYW19LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5UmVzdWx0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKyAgLyoqIERlZmF1bHQgTUlNRSB0eXBlIGZvciB1bmtub3duIGJpbmFyeSBkYXRhLiAqLworICBzdGF0aWMgZmluYWwgU3RyaW5nIE9DVEVUX1NUUkVBTSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworCisgIC8qKiBQcm9kdWNlIGEgVVRGLTggZW5jb2RlZCByZXN1bHQgZnJvbSBhIHN0cmluZy4gKi8KKyAgcHVibGljIHN0YXRpYyBCaW5hcnlSZXN1bHQgY3JlYXRlKFN0cmluZyBkYXRhKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBjcmVhdGUoZGF0YS5nZXRCeXRlcygiVVRGLTgiKSkKKyAgICAgICAgLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpWTSBkb2VzIG5vdCBzdXBwb3J0IFVURi04IiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqIFByb2R1Y2UgYW4ge0Bjb2RlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbX0gcmVzdWx0IGZyb20gYSBieXRlIGFycmF5LiAqLworICBwdWJsaWMgc3RhdGljIEJpbmFyeVJlc3VsdCBjcmVhdGUoYnl0ZVtdIGRhdGEpIHsKKyAgICByZXR1cm4gbmV3IEFycmF5KGRhdGEpOworICB9CisKKyAgLyoqCisgICAqIFByb2R1Y2UgYW4ge0Bjb2RlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbX0gb2YgdW5rbm93biBsZW5ndGggYnkgY29weWluZworICAgKiB0aGUgSW5wdXRTdHJlYW0gdW50aWwgRU9GLiBUaGUgc2VydmVyIGdsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoaXMKKyAgICogc3RyZWFtIHdoZW4gY29weWluZyBpcyBjb21wbGV0ZS4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQmluYXJ5UmVzdWx0IGNyZWF0ZShJbnB1dFN0cmVhbSBkYXRhKSB7CisgICAgcmV0dXJuIG5ldyBTdHJlYW0oZGF0YSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZSA9IE9DVEVUX1NUUkVBTTsKKyAgcHJpdmF0ZSBTdHJpbmcgY2hhcmFjdGVyRW5jb2Rpbmc7CisgIHByaXZhdGUgbG9uZyBjb250ZW50TGVuZ3RoID0gLTE7CisgIHByaXZhdGUgYm9vbGVhbiBnemlwID0gdHJ1ZTsKKworICAvKiogQHJldHVybiB0aGUgTUlNRSB0eXBlIG9mIHRoZSByZXN1bHQsIGZvciBIVFRQIGNsaWVudHMuICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgU3RyaW5nIGVuYyA9IGdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgaWYgKGVuYyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gY29udGVudFR5cGUgKyAiOyBjaGFyc2V0PSIgKyBlbmM7CisgICAgfQorICAgIHJldHVybiBjb250ZW50VHlwZTsKKyAgfQorCisgIC8qKiBTZXQgdGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVzdWx0LCBhbmQgcmV0dXJuIHtAY29kZSB0aGlzfS4gKi8KKyAgcHVibGljIEJpbmFyeVJlc3VsdCBzZXRDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgIT0gbnVsbCA/IGNvbnRlbnRUeXBlIDogT0NURVRfU1RSRUFNOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqIEdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nOyBudWxsIGlmIG5vdCBrbm93bi4gKi8KKyAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICByZXR1cm4gY2hhcmFjdGVyRW5jb2Rpbmc7CisgIH0KKworICAvKiogU2V0IHRoZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZW5jb2RlIHRleHQgZGF0YSBhbmQgcmV0dXJuIHtAY29kZSB0aGlzfS4gKi8KKyAgcHVibGljIEJpbmFyeVJlc3VsdCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICBjaGFyYWN0ZXJFbmNvZGluZyA9IGVuY29kaW5nOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqIEByZXR1cm4gbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSByZXN1bHQ7IC0xIGlmIG5vdCBrbm93bi4gKi8KKyAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICByZXR1cm4gY29udGVudExlbmd0aDsKKyAgfQorCisgIC8qKiBTZXQgdGhlIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSByZXN1bHQ7IC0xIGlmIG5vdCBrbm93bi4gKi8KKyAgcHVibGljIEJpbmFyeVJlc3VsdCBzZXRDb250ZW50TGVuZ3RoKGxvbmcgbGVuKSB7CisgICAgdGhpcy5jb250ZW50TGVuZ3RoID0gbGVuOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlc3VsdCBjYW4gYmUgZ3ppcCBjb21wcmVzc2VkIHRvIGNsaWVudHMuICovCisgIHB1YmxpYyBib29sZWFuIGNhbkd6aXAoKSB7CisgICAgcmV0dXJuIGd6aXA7CisgIH0KKworICAvKiogRGlzYWJsZSBnemlwIGNvbXByZXNzaW9uIGZvciBhbHJlYWR5IGNvbXByZXNzZWQgcmVzcG9uc2VzLiAqLworICBwdWJsaWMgQmluYXJ5UmVzdWx0IGRpc2FibGVHemlwKCkgeworICAgIHRoaXMuZ3ppcCA9IGZhbHNlOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIG9yIGNvcHkgdGhlIHJlc3VsdCBvbnRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIG9zIHN0cmVhbSB0byB3cml0ZSByZXN1bHQgZGF0YSBvbnRvLiBUaGlzIHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBieQorICAgKiAgICAgICAgdGhlIGNhbGxlciBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSBwcm9kdWNlZCwgb3IgdGhlIE91dHB1dFN0cmVhbQorICAgKiAgICAgICAgIHtAY29kZSBvc30gdGhyb3dzIGFueSBJT0V4Y2VwdGlvbiBkdXJpbmcgYSB3cml0ZSBvciBmbHVzaCBjYWxsLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAvKiogQ2xvc2UgdGhlIHJlc3VsdCBhbmQgcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGl0IGhvbGRzLiAqLworICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBpZiAoZ2V0Q29udGVudExlbmd0aCgpID49IDApIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJCaW5hcnlSZXN1bHRbQ29udGVudC1UeXBlOiAlcywgQ29udGVudC1MZW5ndGg6ICVkXSIsCisgICAgICAgICAgZ2V0Q29udGVudFR5cGUoKSwgZ2V0Q29udGVudExlbmd0aCgpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCisgICAgICAgICJCaW5hcnlSZXN1bHRbQ29udGVudC1UeXBlOiAlcywgQ29udGVudC1MZW5ndGg6IHVua25vd25dIiwKKyAgICAgICAgZ2V0Q29udGVudFR5cGUoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcnJheSBleHRlbmRzIEJpbmFyeVJlc3VsdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gZGF0YTsKKworICAgIEFycmF5KGJ5dGVbXSBkYXRhKSB7CisgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgc2V0Q29udGVudExlbmd0aChkYXRhLmxlbmd0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBvcy53cml0ZShkYXRhKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJlYW0gZXh0ZW5kcyBCaW5hcnlSZXN1bHQgeworICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc3JjOworCisgICAgU3RyZWFtKElucHV0U3RyZWFtIHNyYykgeworICAgICAgdGhpcy5zcmMgPSBzcmM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzQwOTZdOworICAgICAgaW50IG47CisgICAgICB3aGlsZSAoMCA8IChuID0gc3JjLnJlYWQodG1wKSkpIHsKKyAgICAgICAgZHN0LndyaXRlKHRtcCwgMCwgbik7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgc3JjLmNsb3NlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9DaGlsZENvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0NoaWxkQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYWQ5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9DaGlsZENvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisKKy8qKgorICogTmVzdGVkIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc3RSZXNvdXJjZX1zIGJlbG93IGEgcGFyZW50LgorICoKKyAqIEBwYXJhbSA8UD4gdHlwZSBvZiB0aGUgcGFyZW50IHJlc291cmNlLgorICogQHBhcmFtIDxDPiB0eXBlIG9mIHJlc291cmNlIG9wZXJhdGVkIG9uIGJ5IGVhY2ggdmlldy4KKyAqLworcHVibGljIGludGVyZmFjZSBDaGlsZENvbGxlY3Rpb248UCBleHRlbmRzIFJlc3RSZXNvdXJjZSwgQyBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgICBleHRlbmRzIFJlc3RWaWV3PFA+LCBSZXN0Q29sbGVjdGlvbjxQLCBDPiB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9EZWZhdWx0SW5wdXQuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0RlZmF1bHRJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzQyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9EZWZhdWx0SW5wdXQuamF2YQpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqIEFwcGxpZWQgdG8gYSBTdHJpbmcgZmllbGQgdG8gaW5kaWNhdGUgdGhlIGRlZmF1bHQgaW5wdXQgcGFyYW1ldGVyLiAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRGVmYXVsdElucHV0IHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0lkU3RyaW5nLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9JZFN0cmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODc0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9JZFN0cmluZy5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKgorICogUmVzb3VyY2UgaWRlbnRpZmllciBzcGxpdCBvdXQgZnJvbSBhIFVSTC4KKyAqIDxwPgorICogSWRlbnRpZmllcnMgYXJlIFVSTCBlbmNvZGVkIGFuZCB1c3VhbGx5IG5lZWQgdG8gYmUgZGVjb2RlZC4KKyAqLworcHVibGljIGNsYXNzIElkU3RyaW5nIHsKKyAgLyoqIENvbnN0cnVjdCBhbiBpZGVudGlmaWVyIGZyb20gYW4gYWxyZWFkeSBlbmNvZGVkIHN0cmluZy4gKi8KKyAgcHVibGljIHN0YXRpYyBJZFN0cmluZyBmcm9tVXJsKFN0cmluZyBpZCkgeworICAgIHJldHVybiBuZXcgSWRTdHJpbmcoaWQpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJsRW5jb2RlZDsKKworICBwcml2YXRlIElkU3RyaW5nKFN0cmluZyBzKSB7CisgICAgdXJsRW5jb2RlZCA9IHM7CisgIH0KKworICAvKiogQHJldHVybiB0aGUgZGVjb2RlZCB2YWx1ZSBvZiB0aGUgc3RyaW5nLiAqLworICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICByZXR1cm4gVXJsLmRlY29kZSh1cmxFbmNvZGVkKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyB0aGUgZW1wdHkgc3RyaW5nLiAqLworICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgIHJldHVybiB1cmxFbmNvZGVkLmlzRW1wdHkoKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBVUkwgZW5jb2Rpbmcgc3VwcGxpZWQgYnkgdGhlIGNsaWVudC4gKi8KKyAgcHVibGljIFN0cmluZyBlbmNvZGVkKCkgeworICAgIHJldHVybiB1cmxFbmNvZGVkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIHVybEVuY29kZWQuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgSWRTdHJpbmcpIHsKKyAgICAgIHJldHVybiB1cmxFbmNvZGVkLmVxdWFscygoKElkU3RyaW5nKSBvdGhlcikudXJsRW5jb2RlZCk7CisgICAgfSBlbHNlIGlmIChvdGhlciBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgcmV0dXJuIHVybEVuY29kZWQuZXF1YWxzKG90aGVyKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIGVuY29kZWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMGZkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIE1ldGhvZCBpcyBub3QgYWNjZXB0YWJsZSBvbiB0aGUgcmVzb3VyY2UgKEhUVFAgNDA1IE1ldGhvZCBOb3QgQWxsb3dlZCkuICovCitwdWJsaWMgY2xhc3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1ByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMDRjOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1ByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKgorICogUmVzb3VyY2Ugc3RhdGUgZG9lcyBub3QgbWF0Y2ggcmVxdWVzdCBzdGF0ZSAoSFRUUCA0MTIgUHJlY29uZGl0aW9uIGZhaWxlZCkuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVjb25kaXRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSZXN0QXBpRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKKyAgfQorCisgIC8qKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQgZGVzY3JpYmluZyB0aGUgZXJyb3IuICovCisgIHB1YmxpYyBQcmVjb25kaXRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1B1dElucHV0LmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9QdXRJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDYyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9QdXRJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKworLyoqIFJhdyBkYXRhIHN0cmVhbSBzdXBwbGllZCBieSB0aGUgYm9keSBvZiBhIFBVVC4gKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHV0SW5wdXQgeworICBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKKyAgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCk7CisgIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmQ4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBSZXNvdXJjZSBzdGF0ZSBkb2VzIG5vdCBwZXJtaXQgcmVxdWVzdGVkIG9wZXJhdGlvbiAoSFRUUCA0MDkgQ29uZmxpY3QpLgorICogPHA+CisgKiB7QGxpbmsgUmVzdE1vZGlmeVZpZXd9IGltcGxlbWVudGF0aW9ucyBtYXkgZmFpbCB3aXRoIHRoaXMgZXhjZXB0aW9uIHdoZW4gdGhlCisgKiBuYW1lZCByZXNvdXJjZSBkb2VzIG5vdCBwZXJtaXQgdGhlIG1vZGlmaWNhdGlvbiB0byB0YWtlIHBsYWNlIGF0IHRoaXMgdGltZS4KKyAqIEFuIGV4YW1wbGUgdXNlIGlzIHRyeWluZyB0byBhYmFuZG9uIGEgY2hhbmdlIHRoYXQgaXMgYWxyZWFkeSBtZXJnZWQuIFRoZQorICogY2hhbmdlIGNhbm5vdCBiZSBhYmFuZG9uZWQgb25jZSBtZXJnZWQgc28gYW4gb3BlcmF0aW9uIHdvdWxkIHRocm93LgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKiogQHBhcmFtIG1zZyBtZXNzYWdlIHRvIHJldHVybiB0byB0aGUgY2xpZW50IGRlc2NyaWJpbmcgdGhlIGVycm9yLiAqLworICBwdWJsaWMgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODkxYzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIE5hbWVkIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IChIVFRQIDQwNCBOb3QgRm91bmQpLiAqLworcHVibGljIGNsYXNzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBSZXN0QXBpRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoqIFJlcXVlc3RlZCByZXNvdXJjZSBpcyBub3QgZm91bmQsIGZhaWxpbmcgcG9ydGlvbiBub3Qgc3BlY2lmaWVkLiAqLworICBwdWJsaWMgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpIHsKKyAgfQorCisgIC8qKiBAcGFyYW0gaWQgcG9ydGlvbiBvZiB0aGUgcmVzb3VyY2UgVVJJIHRoYXQgZG9lcyBub3QgZXhpc3QuICovCisgIHB1YmxpYyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBpZCkgeworICAgIHN1cGVyKGlkKTsKKyAgfQorCisgIC8qKiBAcGFyYW0gaWQgcG9ydGlvbiBvZiB0aGUgcmVzb3VyY2UgVVJJIHRoYXQgZG9lcyBub3QgZXhpc3QuICovCisgIHB1YmxpYyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKElkU3RyaW5nIGlkKSB7CisgICAgc3VwZXIoaWQuZ2V0KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNwb25zZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIFNwZWNpYWwgcmV0dXJuIHZhbHVlIHRvIG1lYW4gc3BlY2lmaWMgSFRUUCBzdGF0dXMgY29kZXMgaW4gYSBSRVNUIEFQSS4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNwb25zZTxUPiB7CisgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMifSkKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzcG9uc2UgTk9ORSA9IG5ldyBOb25lKCk7CisKKyAgLyoqIEhUVFAgMjAwIE9LOiBwb2ludGxlc3Mgd3JhcHBlciBmb3IgdHlwZSBzYWZldHkuICovCisgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3BvbnNlPFQ+IG9rKFQgdmFsdWUpIHsKKyAgICByZXR1cm4gbmV3IEltcGw8VD4oMjAwLCB2YWx1ZSk7CisgIH0KKworICAvKiogSFRUUCAyMDEgQ3JlYXRlZDogdHlwaWNhbGx5IHVzZWQgd2hlbiBhIG5ldyByZXNvdXJjZSBpcyBtYWRlLiAqLworICBwdWJsaWMgc3RhdGljIDxUPiBSZXNwb25zZTxUPiBjcmVhdGVkKFQgdmFsdWUpIHsKKyAgICByZXR1cm4gbmV3IEltcGw8VD4oMjAxLCB2YWx1ZSk7CisgIH0KKworICAvKiogSFRUUCAyMDQgTm8gQ29udGVudDogdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcmVzb3VyY2UgaXMgZGVsZXRlZC4gKi8KKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3BvbnNlPFQ+IG5vbmUoKSB7CisgICAgcmV0dXJuIE5PTkU7CisgIH0KKworICAvKiogSFRUUCAzMDIgRm91bmQ6IHRlbXBvcmFyeSByZWRpcmVjdCB0byBhbm90aGVyIFVSTC4gKi8KKyAgcHVibGljIHN0YXRpYyBSZWRpcmVjdCByZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbmV3IFJlZGlyZWN0KGxvY2F0aW9uKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgInJhd3R5cGVzIn0pCisgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdW53cmFwKFQgb2JqKSB7CisgICAgd2hpbGUgKG9iaiBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CisgICAgICBvYmogPSAoVCkgKChSZXNwb25zZSkgb2JqKS52YWx1ZSgpOworICAgIH0KKyAgICByZXR1cm4gb2JqOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IGludCBzdGF0dXNDb2RlKCk7CisgIHB1YmxpYyBhYnN0cmFjdCBUIHZhbHVlKCk7CisgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdG9TdHJpbmcoKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbXBsPFQ+IGV4dGVuZHMgUmVzcG9uc2U8VD4geworICAgIHByaXZhdGUgZmluYWwgaW50IHN0YXR1c0NvZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBUIHZhbHVlOworCisgICAgcHJpdmF0ZSBJbXBsKGludCBzYywgVCB2YWwpIHsKKyAgICAgIHN0YXR1c0NvZGUgPSBzYzsKKyAgICAgIHZhbHVlID0gdmFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc3RhdHVzQ29kZSgpIHsKKyAgICAgIHJldHVybiBzdGF0dXNDb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHZhbHVlKCkgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gIlsiICsgc3RhdHVzQ29kZSgpICsgIl0gIiArIHZhbHVlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9uZSBleHRlbmRzIFJlc3BvbnNlPE9iamVjdD4geworICAgIHByaXZhdGUgTm9uZSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHN0YXR1c0NvZGUoKSB7CisgICAgICByZXR1cm4gMjA0OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgdmFsdWUoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuICJbMjA0IE5vIENvbnRlbnRdIE5vbmUiOworICAgIH0KKyAgfQorCisgIC8qKiBBbiBIVFRQIHJlZGlyZWN0IHRvIGFub3RoZXIgbG9jYXRpb24uICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVkaXJlY3QgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2F0aW9uOworCisgICAgcHJpdmF0ZSBSZWRpcmVjdChTdHJpbmcgdXJsKSB7CisgICAgICB0aGlzLmxvY2F0aW9uID0gdXJsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbG9jYXRpb24oKSB7CisgICAgICByZXR1cm4gbG9jYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBsb2NhdGlvbi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBSZWRpcmVjdAorICAgICAgICAmJiAoKFJlZGlyZWN0KSBvKS5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWzMwMiBSZWRpcmVjdF0gJXMiLCBsb2NhdGlvbik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0QXBpRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0QXBpRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkMjdjZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RBcGlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogUm9vdCBleGNlcHRpb24gdHlwZSBmb3IgSlNPTiBBUEkgZmFpbHVyZXMuICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzdEFwaUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBSZXN0QXBpRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIFJlc3RBcGlFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KKworICBwdWJsaWMgUmVzdEFwaUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdEFwaU1vZHVsZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdEFwaU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTBlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0QXBpTW9kdWxlLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYmluZGVyLkxpbmtlZEJpbmRpbmdCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmJpbmRlci5TY29wZWRCaW5kaW5nQnVpbGRlcjsKKworLyoqIEd1aWNlIERTTCBmb3IgYmluZGluZyB7QGxpbmsgUmVzdFZpZXd9IGltcGxlbWVudGF0aW9ucy4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXN0QXBpTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiR0VUIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVUID0gIlBVVCI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJERUxFVEUiOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUID0gIlBPU1QiOworCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgUmVhZFZpZXdCaW5kZXI8Uj4gZ2V0KFR5cGVMaXRlcmFsPFJlc3RWaWV3PFI+PiB2aWV3VHlwZSkgeworICAgIHJldHVybiBuZXcgUmVhZFZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgR0VULCAiLyIpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBwdXQoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlKSB7CisgICAgcmV0dXJuIG5ldyBNb2RpZnlWaWV3QmluZGVyPFI+KHZpZXcodmlld1R5cGUsIFBVVCwgIi8iKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIE1vZGlmeVZpZXdCaW5kZXI8Uj4gcG9zdChUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUpIHsKKyAgICByZXR1cm4gbmV3IE1vZGlmeVZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgUE9TVCwgIi8iKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIE1vZGlmeVZpZXdCaW5kZXI8Uj4gZGVsZXRlKFR5cGVMaXRlcmFsPFJlc3RWaWV3PFI+PiB2aWV3VHlwZSkgeworICAgIHJldHVybiBuZXcgTW9kaWZ5Vmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBERUxFVEUsICIvIikpOworICB9CisKKyAgcHJvdGVjdGVkIDxSIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICBSZWFkVmlld0JpbmRlcjxSPiBnZXQoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBuZXcgUmVhZFZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgR0VULCBuYW1lKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIE1vZGlmeVZpZXdCaW5kZXI8Uj4gcHV0KFR5cGVMaXRlcmFsPFJlc3RWaWV3PFI+PiB2aWV3VHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gbmV3IE1vZGlmeVZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgUFVULCBuYW1lKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIE1vZGlmeVZpZXdCaW5kZXI8Uj4gcG9zdChUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5ldyBNb2RpZnlWaWV3QmluZGVyPFI+KHZpZXcodmlld1R5cGUsIFBPU1QsIG5hbWUpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBkZWxldGUoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBuZXcgTW9kaWZ5Vmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBERUxFVEUsIG5hbWUpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UCBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgQ2hpbGRDb2xsZWN0aW9uQmluZGVyPFA+IGNoaWxkKFR5cGVMaXRlcmFsPFJlc3RWaWV3PFA+PiB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBuZXcgQ2hpbGRDb2xsZWN0aW9uQmluZGVyPFA+KHZpZXcodHlwZSwgR0VULCBuYW1lKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIExpbmtlZEJpbmRpbmdCdWlsZGVyPFJlc3RWaWV3PFI+PiB2aWV3KAorICAgICAgVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlLAorICAgICAgU3RyaW5nIG1ldGhvZCwKKyAgICAgIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGJpbmQodmlld1R5cGUpLmFubm90YXRlZFdpdGgoZXhwb3J0KG1ldGhvZCwgbmFtZSkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRXhwb3J0IGV4cG9ydChTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbmFtZSkgeworICAgIGlmIChuYW1lLmxlbmd0aCgpID4gMSAmJiBuYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgLy8gVmlld3MgbWF5IGJlIGJvdW5kIGFzICIvIiB0byBtZWFuIHRoZSByZXNvdXJjZSBpdHNlbGYsIG9yCisgICAgICAvLyBhcyAic3RhdHVzIiBhcyBpbiAiL3R5cGUve2lkfS9zdGF0dXMiLiBEb24ndCBiaW5kICIvc3RhdHVzIgorICAgICAgLy8gaWYgdGhlIGNhbGxlciBhc2tlZCBmb3IgdGhhdCwgYmluZCB3aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cy4KKyAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgICB9CisgICAgcmV0dXJuIEV4cG9ydHMubmFtZWQobWV0aG9kICsgIi4iICsgbmFtZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRWaWV3QmluZGVyPFAgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+IHsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEJpbmRpbmdCdWlsZGVyPFJlc3RWaWV3PFA+PiBiaW5kZXI7CisKKyAgICBwcml2YXRlIFJlYWRWaWV3QmluZGVyKExpbmtlZEJpbmRpbmdCdWlsZGVyPFJlc3RWaWV3PFA+PiBiaW5kZXIpIHsKKyAgICAgIHRoaXMuYmluZGVyID0gYmluZGVyOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RSZWFkVmlldzxQPj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0byhDbGFzczxUPiBpbXBsKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvKGltcGwpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RSZWFkVmlldzxQPj4KKyAgICB2b2lkIHRvSW5zdGFuY2UoVCBpbXBsKSB7CisgICAgICBiaW5kZXIudG9JbnN0YW5jZShpbXBsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBSZXN0UmVhZFZpZXc8UD4+CisgICAgU2NvcGVkQmluZGluZ0J1aWxkZXIgdG9Qcm92aWRlcihDbGFzczw/IGV4dGVuZHMgUHJvdmlkZXI8PyBleHRlbmRzIFQ+PiBwcm92aWRlclR5cGUpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG9Qcm92aWRlcihwcm92aWRlclR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RSZWFkVmlldzxQPj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0b1Byb3ZpZGVyKFByb3ZpZGVyPD8gZXh0ZW5kcyBUPiBwcm92aWRlcikgeworICAgICAgcmV0dXJuIGJpbmRlci50b1Byb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGlmeVZpZXdCaW5kZXI8UCBleHRlbmRzIFJlc3RSZXNvdXJjZT4geworICAgIHByaXZhdGUgZmluYWwgTGlua2VkQmluZGluZ0J1aWxkZXI8UmVzdFZpZXc8UD4+IGJpbmRlcjsKKworICAgIHByaXZhdGUgTW9kaWZ5Vmlld0JpbmRlcihMaW5rZWRCaW5kaW5nQnVpbGRlcjxSZXN0VmlldzxQPj4gYmluZGVyKSB7CisgICAgICB0aGlzLmJpbmRlciA9IGJpbmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBSZXN0TW9kaWZ5VmlldzxQLCA/Pj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0byhDbGFzczxUPiBpbXBsKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvKGltcGwpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RNb2RpZnlWaWV3PFAsID8+PgorICAgIHZvaWQgdG9JbnN0YW5jZShUIGltcGwpIHsKKyAgICAgIGJpbmRlci50b0luc3RhbmNlKGltcGwpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RNb2RpZnlWaWV3PFAsID8+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvUHJvdmlkZXIoQ2xhc3M8PyBleHRlbmRzIFByb3ZpZGVyPD8gZXh0ZW5kcyBUPj4gcHJvdmlkZXJUeXBlKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvUHJvdmlkZXIocHJvdmlkZXJUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBSZXN0TW9kaWZ5VmlldzxQLCA/Pj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0b1Byb3ZpZGVyKFByb3ZpZGVyPD8gZXh0ZW5kcyBUPiBwcm92aWRlcikgeworICAgICAgcmV0dXJuIGJpbmRlci50b1Byb3ZpZGVyKHByb3ZpZGVyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIENoaWxkQ29sbGVjdGlvbkJpbmRlcjxQIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCaW5kaW5nQnVpbGRlcjxSZXN0VmlldzxQPj4gYmluZGVyOworCisgICAgcHJpdmF0ZSBDaGlsZENvbGxlY3Rpb25CaW5kZXIoTGlua2VkQmluZGluZ0J1aWxkZXI8UmVzdFZpZXc8UD4+IGJpbmRlcikgeworICAgICAgdGhpcy5iaW5kZXIgPSBiaW5kZXI7CisgICAgfQorCisgICAgcHVibGljIDxDIGV4dGVuZHMgUmVzdFJlc291cmNlLCBUIGV4dGVuZHMgQ2hpbGRDb2xsZWN0aW9uPFAsIEM+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvKENsYXNzPFQ+IGltcGwpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG8oaW1wbCk7CisgICAgfQorCisgICAgcHVibGljIDxDIGV4dGVuZHMgUmVzdFJlc291cmNlLCBUIGV4dGVuZHMgQ2hpbGRDb2xsZWN0aW9uPFAsIEM+PgorICAgIHZvaWQgdG9JbnN0YW5jZShUIGltcGwpIHsKKyAgICAgIGJpbmRlci50b0luc3RhbmNlKGltcGwpOworICAgIH0KKworICAgIHB1YmxpYyA8QyBleHRlbmRzIFJlc3RSZXNvdXJjZSwgVCBleHRlbmRzIENoaWxkQ29sbGVjdGlvbjxQLCBDPj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0b1Byb3ZpZGVyKENsYXNzPD8gZXh0ZW5kcyBQcm92aWRlcjw/IGV4dGVuZHMgVD4+IHByb3ZpZGVyVHlwZSkgeworICAgICAgcmV0dXJuIGJpbmRlci50b1Byb3ZpZGVyKHByb3ZpZGVyVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIDxDIGV4dGVuZHMgUmVzdFJlc291cmNlLCBUIGV4dGVuZHMgQ2hpbGRDb2xsZWN0aW9uPFAsIEM+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvUHJvdmlkZXIoUHJvdmlkZXI8PyBleHRlbmRzIFQ+IHByb3ZpZGVyKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvUHJvdmlkZXIocHJvdmlkZXIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdENvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkMGRiZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyBhY2Nlc3NpYmxlIHRocm91Z2ggYSBSRVNUIEFQSS4KKyAqIDxwPgorICogVG8gYnVpbGQgYSBjb2xsZWN0aW9uIGRlY2xhcmUgYSByZXNvdXJjZSwgdGhlIG1hcCBpbiBhIG1vZHVsZSwgYW5kIHRoZQorICogY29sbGVjdGlvbiBpdHNlbGYgYWNjZXB0aW5nIHRoZSBtYXA6CisgKgorICogPHByZT4KKyAqIHB1YmxpYyBjbGFzcyBNeVJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAqICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbCZsdDtSZXN0VmlldyZsdDtNeVJlc291cmNlJmd0OyZndDsgTVlfS0lORCA9CisgKiAgICAgICBuZXcgVHlwZUxpdGVyYWwmbHQ7UmVzdFZpZXcmbHQ7TXlSZXNvdXJjZSZndDsmZ3Q7KCkge307CisgKiB9CisgKgorICogcHVibGljIGNsYXNzIE15TW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworICogICAmIzA2NDtPdmVycmlkZQorICogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgKiAgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgTXlSZXNvdXJjZS5NWV9LSU5EKTsKKyAqCisgKiAgICAgZ2V0KE15UmVzb3VyY2UuTVlfS0lORCwgJnF1b3Q7YWN0aW9uJnF1b3Q7KS50byhNeUFjdGlvbi5jbGFzcyk7CisgKiAgIH0KKyAqIH0KKyAqCisgKiBwdWJsaWMgY2xhc3MgTXlDb2xsZWN0aW9uIGV4dGVuZHMgUmVzdENvbGxlY3Rpb24mbHQ7VG9wTGV2ZWxSZXNvdXJjZSwgTXlSZXNvdXJjZSZndDsgeworICogICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXAmbHQ7UmVzdFZpZXcmbHQ7TXlSZXNvdXJjZSZndDsmZ3Q7IHZpZXdzOworICoKKyAqICAgJiMwNjQ7SW5qZWN0CisgKiAgIE15Q29sbGVjdGlvbihEeW5hbWljTWFwJmx0O1Jlc3RWaWV3Jmx0O015UmVzb3VyY2UmZ3Q7Jmd0OyB2aWV3cykgeworICogICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAqICAgfQorICoKKyAqICAgcHVibGljIER5bmFtaWNNYXAmbHQ7UmVzdFZpZXcmbHQ7TXlSZXNvdXJjZSZndDsmZ3Q7IHZpZXdzKCkgeworICogICAgIHJldHVybiB2aWV3czsKKyAqICAgfQorICogfQorICogPC9wcmU+CisgKgorICogPHA+CisgKiBUbyBidWlsZCBhIG5lc3RlZCBjb2xsZWN0aW9uLCBpbXBsZW1lbnQge0BsaW5rIENoaWxkQ29sbGVjdGlvbn0uCisgKgorICogQHBhcmFtIDxQPiB0eXBlIG9mIHRoZSBwYXJlbnQgcmVzb3VyY2UuIEZvciBhIHRvcCBsZXZlbCBjb2xsZWN0aW9uIHRoaXMKKyAqICAgICAgICBzaG91bGQgYWx3YXlzIGJlIHtAbGluayBUb3BMZXZlbFJlc291cmNlfS4KKyAqIEBwYXJhbSA8Uj4gdHlwZSBvZiByZXNvdXJjZSBvcGVyYXRlZCBvbiBieSBlYWNoIHZpZXcuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdENvbGxlY3Rpb248UCBleHRlbmRzIFJlc3RSZXNvdXJjZSwgUiBleHRlbmRzIFJlc3RSZXNvdXJjZT4geworICAvKioKKyAgICogQ3JlYXRlIGEgdmlldyB0byBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgY29sbGVjdGlvbi4KKyAgICogPHA+CisgICAqIFRoZSByZXR1cm5lZCB2aWV3IHNob3VsZCBhY2NlcHQgdGhlIHBhcmVudCB0eXBlIHRvIHNjb3BlIHRoZSBzZWFyY2gsIGFuZAorICAgKiBtYXkgd2FudCB0byB0YWtlIGEgInEiIHBhcmFtZXRlciBvcHRpb24gdG8gbmFycm93IHRoZSByZXN1bHRzLgorICAgKgorICAgKiBAcmV0dXJuIHZpZXcgdG8gbGlzdCB0aGUgY29sbGVjdGlvbi4KKyAgICogQHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGNhbm5vdCBiZSBsaXN0ZWQuCisgICAqIEB0aHJvd3MgQXV0aEV4Y2VwdGlvbiBpZiB0aGUgY29sbGVjdGlvbiByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4KKyAgICovCisgIFJlc3RWaWV3PFA+IGxpc3QoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUGFyc2UgYSBwYXRoIGNvbXBvbmVudCBpbnRvIGEgcmVzb3VyY2UgaGFuZGxlLgorICAgKgorICAgKiBAcGFyYW0gcGFyZW50IHRoZSBoYW5kbGUgdG8gdGhlIGNvbGxlY3Rpb24uCisgICAqIEBwYXJhbSBpZCBzdHJpbmcgaWRlbnRpZmllciBzdXBwbGllZCBieSB0aGUgY2xpZW50LiBJbiBhIFVSTCBzdWNoIGFzCisgICAqICAgICAgICB7QGNvZGUgL2NoYW5nZXMvMTIzNC9hYmFuZG9ufSB0aGlzIHN0cmluZyBpcyB7QGNvZGUgIjEyMzQifS4KKyAgICogQHJldHVybiBhIHJlc291cmNlIGhhbmRsZSBmb3IgdGhlIGlkZW50aWZpZWQgb2JqZWN0LgorICAgKiBAdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdCwgb3IgdGhlIGNhbGxlcgorICAgKiAgICAgICAgIGlzIG5vdCBwZXJtaXR0ZWQgdG8ga25vdyBpZiB0aGUgcmVzb3VyY2UgZXhpc3RzLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGUgaW1wbGVtZW50YXRpb24gaGFkIGFueSBlcnJvcnMgY29udmVydGluZyB0byBhCisgICAqICAgICAgICAgcmVzb3VyY2UgaGFuZGxlLiBUaGlzIHJlc3VsdHMgaW4gYW4gSFRUUCA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yLgorICAgKi8KKyAgUiBwYXJzZShQIHBhcmVudCwgSWRTdHJpbmcgaWQpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBFeGNlcHRpb247CisKKyAgLyoqCisgICAqIEdldCB0aGUgdmlld3MgdGhhdCBzdXBwb3J0IHRoaXMgY29sbGVjdGlvbi4KKyAgICogPHA+CisgICAqIFdpdGhpbiBhIHJlc291cmNlIHRoZSB2aWV3cyBhcmUgYWNjZXNzZWQgYXMge0Bjb2RlIFJFU09VUkNFL3BsdWdpbn52aWV3fS4KKyAgICoKKyAgICogQHJldHVybiBtYXAgb2Ygdmlld3MuCisgICAqLworICBEeW5hbWljTWFwPFJlc3RWaWV3PFI+PiB2aWV3cygpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdE1vZGlmeVZpZXcuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RNb2RpZnlWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhMDI3OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RNb2RpZnlWaWV3LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBSZXN0VmlldyB0aGF0IHN1cHBvcnRzIGFjY2VwdGluZyBpbnB1dCBhbmQgY2hhbmdpbmcgYSByZXNvdXJjZS4KKyAqIDxwPgorICogVGhlIGlucHV0IG11c3QgYmUgc3VwcGxpZWQgYXMgSlNPTiBhcyB0aGUgYm9keSBvZiB0aGUgSFRUUCByZXF1ZXN0LiBNb2RpZnkKKyAqIHZpZXdzIGNhbiBiZSBpbnZva2VkIGJ5IGFueSBIVFRQIG1ldGhvZCB0aGF0IGlzIG5vdCB7QGNvZGUgR0VUfSwgd2hpY2gKKyAqIGluY2x1ZGVzIHtAY29kZSBQT1NUfSwge0Bjb2RlIFBVVH0sIHtAY29kZSBERUxFVEV9LgorICoKKyAqIEBwYXJhbSA8Uj4gdHlwZSBvZiB0aGUgcmVzb3VyY2UgdGhlIHZpZXcgbW9kaWZpZXMuCisgKiBAcGFyYW0gPEk+IHR5cGUgb2YgaW5wdXQgdGhlIEpTT04gcGFyc2VyIHdpbGwgcGFyc2UgdGhlIGlucHV0IGludG8uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdE1vZGlmeVZpZXc8UiBleHRlbmRzIFJlc3RSZXNvdXJjZSwgST4gZXh0ZW5kcyBSZXN0VmlldzxSPiB7CisgIC8qKgorICAgKiBQcm9jZXNzIHRoZSB2aWV3IG9wZXJhdGlvbiBieSBhbHRlcmluZyB0aGUgcmVzb3VyY2UuCisgICAqCisgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSB0byBtb2RpZnkuCisgICAqIEBwYXJhbSBpbnB1dCBpbnB1dCBhZnRlciBwYXJzaW5nIGZyb20gcmVxdWVzdC4KKyAgICogQHJldHVybiByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQuIFVzZSB7QGxpbmsgQmluYXJ5UmVzdWx0fSB0byBhdm9pZAorICAgKiAgICAgICAgIGF1dG9tYXRpYyBjb252ZXJzaW9uIHRvIEpTT04uCisgICAqIEB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB0aGUgY2xpZW50IGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWNjZXNzIHRoaXMgdmlldy4KKyAgICogQHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHRoZSByZXF1ZXN0IHdhcyBpbmNvcnJlY3RseSBzcGVjaWZpZWQgYW5kCisgICAqICAgICAgICAgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyB2aWV3LgorICAgKiBAdGhyb3dzIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gdGhlIHJlc291cmNlIHN0YXRlIGRvZXMgbm90IHBlcm1pdCB0aGlzCisgICAqICAgICAgICAgdmlldyB0byBtYWtlIHRoZSBjaGFuZ2VzIGF0IHRoaXMgdGltZS4KKyAgICogQHRocm93cyBFeGNlcHRpb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aWV3IGZhaWxlZC4gVGhlIGV4Y2VwdGlvbiB3aWxsCisgICAqICAgICAgICAgYmUgbG9nZ2VkIGFuZCBIVFRQIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3Igd2lsbCBiZSByZXR1cm5lZCB0bworICAgKiAgICAgICAgIHRoZSBjbGllbnQuCisgICAqLworICBPYmplY3QgYXBwbHkoUiByZXNvdXJjZSwgSSBpbnB1dCkgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0UmVhZFZpZXcuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZWFkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzI1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0UmVhZFZpZXcuamF2YQpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIFJlc3RWaWV3IHRvIHJlYWQgYSByZXNvdXJjZSB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqCisgKiBAcGFyYW0gPFI+IHR5cGUgb2YgcmVzb3VyY2UgdGhlIHZpZXcgcmVhZHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzdFJlYWRWaWV3PFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+IGV4dGVuZHMgUmVzdFZpZXc8Uj4geworICAvKioKKyAgICogUHJvY2VzcyB0aGUgdmlldyBvcGVyYXRpb24gYnkgcmVhZGluZyBmcm9tIHRoZSByZXNvdXJjZS4KKyAgICoKKyAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRvIG1vZGlmeS4KKyAgICogQHJldHVybiByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQuIFVzZSB7QGxpbmsgQmluYXJ5UmVzdWx0fSB0byBhdm9pZAorICAgKiAgICAgICAgIGF1dG9tYXRpYyBjb252ZXJzaW9uIHRvIEpTT04uCisgICAqIEB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB0aGUgY2xpZW50IGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWNjZXNzIHRoaXMgdmlldy4KKyAgICogQHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHRoZSByZXF1ZXN0IHdhcyBpbmNvcnJlY3RseSBzcGVjaWZpZWQgYW5kCisgICAqICAgICAgICAgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyB2aWV3LgorICAgKiBAdGhyb3dzIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gdGhlIHJlc291cmNlIHN0YXRlIGRvZXMgbm90IHBlcm1pdCB0aGlzCisgICAqICAgICAgICAgdmlldyB0byBtYWtlIHRoZSBjaGFuZ2VzIGF0IHRoaXMgdGltZS4KKyAgICogQHRocm93cyBFeGNlcHRpb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aWV3IGZhaWxlZC4gVGhlIGV4Y2VwdGlvbiB3aWxsCisgICAqICAgICAgICAgYmUgbG9nZ2VkIGFuZCBIVFRQIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3Igd2lsbCBiZSByZXR1cm5lZCB0bworICAgKiAgICAgICAgIHRoZSBjbGllbnQuCisgICAqLworICBPYmplY3QgYXBwbHkoUiByZXNvdXJjZSkgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0UmVzb3VyY2UuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2M2E1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIEdlbmVyaWMgcmVzb3VyY2UgaGFuZGxlIGRlZmluaW5nIGFyZ3VtZW50cyB0byB2aWV3cy4KKyAqIDxwPgorICogUmVzb3VyY2UgaGFuZGxlIHJldHVybmVkIGJ5IHtAbGluayBSZXN0Q29sbGVjdGlvbn0gYW5kIHBhc3NlZCB0byBhCisgKiB7QGxpbmsgUmVzdFZpZXd9IHN1Y2ggYXMge0BsaW5rIFJlc3RSZWFkVmlld30gb3Ige0BsaW5rIFJlc3RNb2RpZnlWaWV3fS4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0UmVzb3VyY2UgeworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdFZpZXcuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZGYzNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RWaWV3LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBBbnkgdHlwZSBvZiB2aWV3LCBzZWUge0BsaW5rIFJlc3RSZWFkVmlld30gZm9yIHJlYWRzLCB7QGxpbmsgUmVzdE1vZGlmeVZpZXd9CisgKiBmb3IgdXBkYXRlcywgYW5kIHtAbGluayBSZXN0Q29sbGVjdGlvbn0gZm9yIG5lc3RlZCBjb2xsZWN0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0VmlldzxSIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9TdHJlYW1pbmdSZXNwb25zZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvU3RyZWFtaW5nUmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZiOTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvU3RyZWFtaW5nUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworcHVibGljIGludGVyZmFjZSBTdHJlYW1pbmdSZXNwb25zZSB7CisgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKTsKKyAgcHVibGljIHZvaWQgc3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1RvcExldmVsUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1RvcExldmVsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRkMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVG9wTGV2ZWxSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGh0ZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogU3BlY2lhbCBtYXJrZXIgcmVzb3VyY2UgbmFtaW5nIHRoZSB0b3AtbGV2ZWwgb2YgYSBSRVNUIHNwYWNlLiAqLworcHVibGljIGNsYXNzIFRvcExldmVsUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFRvcExldmVsUmVzb3VyY2UgSU5TVEFOQ0UgPSBuZXcgVG9wTGV2ZWxSZXNvdXJjZSgpOworCisgIHByaXZhdGUgVG9wTGV2ZWxSZXNvdXJjZSgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzY5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqIFJlc291cmNlIHJlZmVyZW5jZWQgaW4gdGhlIHJlcXVlc3QgYm9keSBpcyBub3QgZm91bmQgKEhUVFAgNDIyIFVucHJvY2Vzc2FibGUgRW50aXR5KS4gKi8KK3B1YmxpYyBjbGFzcyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIGV4dGVuZHMgUmVzdEFwaUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKFN0cmluZyBtc2cpICB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVXJsLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VcmwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjRkOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVXJsLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CisKKy8qKiBVUkwgcmVsYXRlZCB1dGlsaXR5IGZ1bmN0aW9ucy4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVcmwgeworICAvKioKKyAgICogRW5jb2RlIGEgcGF0aCBzZWdtZW50LCBlc2NhcGluZyBjaGFyYWN0ZXJzIG5vdCB2YWxpZCBmb3IgYSBVUkwuCisgICAqIDxwPgorICAgKiBUaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIG5vdCBlc2NhcGVkOgorICAgKiA8dWw+CisgICAqIDxsaT57QGNvZGUgYS4ueiwgQS4uWiwgMC4uOX0KKyAgICogPGxpPntAY29kZSAuIC0gKiBffQorICAgKiA8L3VsPgorICAgKiA8cD4KKyAgICogJyAnIChzcGFjZSkgaXMgZW5jb2RlZCBhcyAnKycuCisgICAqIDxwPgorICAgKiBBbGwgb3RoZXIgY2hhcmFjdGVycyAoaW5jbHVkaW5nICcvJykgYXJlIGNvbnZlcnRlZCB0byB0aGUgdHJpcGxldCAiJXh5IgorICAgKiB3aGVyZSAieHkiIGlzIHRoZSBoZXggcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJhY3RlciBpbiBVVEYtOC4KKyAgICoKKyAgICogQHBhcmFtIGNvbXBvbmVudCBhIHN0cmluZyBjb250YWluaW5nIHRleHQgdG8gZW5jb2RlLgorICAgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggYWxsIGludmFsaWQgVVJMIGNoYXJhY3RlcnMgZXNjYXBlZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShTdHJpbmcgY29tcG9uZW50KSB7CisgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gVVJMRW5jb2Rlci5lbmNvZGUoY29tcG9uZW50LCAiVVRGLTgiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIG11c3Qgc3VwcG9ydCBVVEYtOCIsIGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8qKiBEZWNvZGUgYSBVUkwgZW5jb2RlZCBzdHJpbmcsIGUuZy4gZnJvbSB7QGNvZGUgIiUyRiJ9IHRvIHtAY29kZSAiLyJ9LiAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHN0cikgeworICAgIGlmIChzdHIgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHN0ciwgIlVURi04Iik7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpWTSBtdXN0IHN1cHBvcnQgVVRGLTgiLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIFVybCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL0d3dFBsdWdpbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL0d3dFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDFhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvR3d0UGx1Z2luLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMud2VidWk7CisKKy8qKiBDb25maWd1cmVzIGEgd2ViIFVJIHBsdWdpbiBjb21waWxlZCB1c2luZyBHV1QuICovCitwdWJsaWMgY2xhc3MgR3d0UGx1Z2luIGV4dGVuZHMgV2ViVWlQbHVnaW4geworICBwcml2YXRlIGZpbmFsIFN0cmluZyBtb2R1bGVOYW1lOworCisgIC8qKgorICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBuYW1lIG9mIEdXVCBtb2R1bGUuIFRoZSByZXNvdXJjZQorICAgKiAgICAgICAge0Bjb2RlIHN0YXRpYy8kTU9EVUxFLyRNT0RVTEUubm9jYWNoZS5qc30gd2lsbCBiZSB1c2VkLgorICAgKi8KKyAgcHVibGljIEd3dFBsdWdpbihTdHJpbmcgbW9kdWxlTmFtZSkgeworICAgIHRoaXMubW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRKYXZhU2NyaXB0UmVzb3VyY2VQYXRoKCkgeworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJzdGF0aWMvJXMvJXMubm9jYWNoZS5qcyIsIG1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvSmF2YVNjcmlwdFBsdWdpbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL0phdmFTY3JpcHRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWE0ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL0phdmFTY3JpcHRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aTsKKworLyoqIENvbmZpZ3VyZXMgYSB3ZWIgVUkgcGx1Z2luIHdyaXR0ZW4gdXNpbmcgSmF2YVNjcmlwdC4gKi8KK3B1YmxpYyBjbGFzcyBKYXZhU2NyaXB0UGx1Z2luIGV4dGVuZHMgV2ViVWlQbHVnaW4geworICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKKworICAvKioKKyAgICogQHBhcmFtIGZpbGVOYW1lIG9mIEphdmFTY3JpcHQgc291cmNlIGZpbGUgdW5kZXIge0Bjb2RlIHN0YXRpYy99CisgICAqICAgICAgICBzdWJkaXJlY3Rvcnkgd2l0aGluIHRoZSBwbHVnaW4ncyBKQVIuCisgICAqLworICBwdWJsaWMgSmF2YVNjcmlwdFBsdWdpbihTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRKYXZhU2NyaXB0UmVzb3VyY2VQYXRoKCkgeworICAgIHJldHVybiAic3RhdGljLyIgKyBmaWxlTmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL1dlYlVpUGx1Z2luLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvV2ViVWlQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QxOTgxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3dlYnVpL1dlYlVpUGx1Z2luLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMud2VidWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4dGVuc2lvblBvaW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUGx1Z2luTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKKy8qKgorICogU3BlY2lmaWVzIEphdmFTY3JpcHQgdG8gZHluYW1pY2FsbHkgbG9hZCBpbnRvIHRoZSB3ZWIgVUkuCisgKiA8cD4KKyAqIFRvIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXIgKGluc3RlYWQgb2Ygd3JpdGluZyBhIEd1aWNlIG1vZHVsZSksIGRlY2xhcmUgdGhlCisgKiBpbnRlbnRpb24gd2l0aCB7QGNvZGUgQExpc3Rlbn0sIGV4dGVuZCB0aGUgY29ycmVjdCBjbGFzcyBhbmQgZGVmaW5lIGEKKyAqIGNvbnN0cnVjdG9yIHRvIGNvbmZpZ3VyZSB0aGUgY29ycmVjdCByZXNvdXJjZToKKyAqCisgKiA8cHJlPgorICogJiMwNjQ7TGlzdGVuCisgKiBjbGFzcyBNeUpzIGV4dGVuZHMgSmF2YVNjcmlwdFBsdWdpbiB7CisgKiAgIE15SnMoKSB7CisgKiAgICAgc3VwZXIoJnF1b3Q7aGVsbG8uanMmcXVvdDspOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAc2VlIEd3dFBsdWdpbgorICogQHNlZSBKYXZhU2NyaXB0UGx1Z2luCisgKi8KK0BFeHRlbnNpb25Qb2ludAorcHVibGljIGFic3RyYWN0IGNsYXNzIFdlYlVpUGx1Z2luIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBHd3RQbHVnaW4gZ3d0KFN0cmluZyBtb2R1bGVOYW1lKSB7CisgICAgcmV0dXJuIG5ldyBHd3RQbHVnaW4obW9kdWxlTmFtZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFTY3JpcHRQbHVnaW4ganMoU3RyaW5nIHNjcmlwdE5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEphdmFTY3JpcHRQbHVnaW4oc2NyaXB0TmFtZSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBwbHVnaW5OYW1lOworCisgIC8qKiBAcmV0dXJuIGluc3RhbGxlZCBuYW1lIG9mIHRoZSBwbHVnaW4gdGhhdCBwcm92aWRlcyB0aGlzIFVJIGZlYXR1cmUuICAqLworICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFBsdWdpbk5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbk5hbWU7CisgIH0KKworICBASW5qZWN0CisgIHZvaWQgc2V0UGx1Z2luTmFtZShAUGx1Z2luTmFtZSBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIHRoaXMucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7CisgIH0KKworICAvKiogQHJldHVybiBwYXRoIHRvIGluaXRpYWxpemF0aW9uIHNjcmlwdCB3aXRoaW4gdGhlIHBsdWdpbidzIEpBUi4gKi8KKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRKYXZhU2NyaXB0UmVzb3VyY2VQYXRoKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldEphdmFTY3JpcHRSZXNvdXJjZVBhdGgoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dGRlYnVnL3BvbS54bWwgYi9nZXJyaXQtZ3d0ZGVidWcvcG9tLnhtbAppbmRleCAwMWI5M2E2Li45NDJmNTA3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0ZGVidWcvcG9tLnhtbAorKysgYi9nZXJyaXQtZ3d0ZGVidWcvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LWd3dGRlYnVnPC9hcnRpZmFjdElkPgpAQCAtMzQsMTEgKzM0LDYgQEAKIAogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nd3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5nd3QtZGV2PC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtZ3d0dWk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CkBAIC03MywxNCArNjgsMTIgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmJjcHJvdi1qZGsxNTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5iY3BnLWpkazE1PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTQwPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAKQEAgLTk2LDUgKzg5LDEyIEBACiAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgPCEtLSBXb3JrYXJvdW5kIGZvciBvdmVyd3JpdGluZyBvdXIgZGVwZW5kZW5jaWVzIChsaWtlIGFyZ3M0aikgYnkgYWRkaXRpb25hbAorICAgICAgY2xhc3NlcyBwdXQgaW4gZ3d0LWRldi5qYXIgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd3dC1kZXY8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9wb20ueG1sIGIvZ2Vycml0LWd3dHVpL3BvbS54bWwKaW5kZXggYjMyOTFkMS4uOGQ4MDdhNSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3BvbS54bWwKKysrIGIvZ2Vycml0LWd3dHVpL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1nd3R1aTwvYXJ0aWZhY3RJZD4KQEAgLTIwMiwxNiArMjAyLDMyIEBACiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG1vZHVsZT4ke0dlcnJpdEd3dFVJLmJyb3dzZXJUeXBlfTwvbW9kdWxlPgotICAgICAgICAgIDxleHRyYUp2bUFyZ3M+LVhteDUxMm08L2V4dHJhSnZtQXJncz4KLSAgICAgICAgICA8Y29tcGlsZVJlcG9ydD4ke2d3dC5jb21waWxlUmVwb3J0fTwvY29tcGlsZVJlcG9ydD4KLSAgICAgICAgICA8ZGlzYWJsZUNsYXNzTWV0YWRhdGE+dHJ1ZTwvZGlzYWJsZUNsYXNzTWV0YWRhdGE+Ci0gICAgICAgICAgPGRpc2FibGVDYXN0Q2hlY2tpbmc+dHJ1ZTwvZGlzYWJsZUNhc3RDaGVja2luZz4KLSAgICAgICAgICA8ZHJhZnRDb21waWxlPiR7R2Vycml0R3d0VUkuZHJhZnRDb21waWxlfTwvZHJhZnRDb21waWxlPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+b3B0aW1pemVkPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8bW9kdWxlPiR7R2Vycml0R3d0VUkuYnJvd3NlclR5cGV9PC9tb2R1bGU+CisgICAgICAgICAgICAgIDxleHRyYUp2bUFyZ3M+LVhteDUxMm08L2V4dHJhSnZtQXJncz4KKyAgICAgICAgICAgICAgPGNvbXBpbGVSZXBvcnQ+JHtnd3QuY29tcGlsZVJlcG9ydH08L2NvbXBpbGVSZXBvcnQ+CisgICAgICAgICAgICAgIDxkaXNhYmxlQ2xhc3NNZXRhZGF0YT50cnVlPC9kaXNhYmxlQ2xhc3NNZXRhZGF0YT4KKyAgICAgICAgICAgICAgPGRpc2FibGVDYXN0Q2hlY2tpbmc+dHJ1ZTwvZGlzYWJsZUNhc3RDaGVja2luZz4KKyAgICAgICAgICAgICAgPGRyYWZ0Q29tcGlsZT4ke0dlcnJpdEd3dFVJLmRyYWZ0Q29tcGlsZX08L2RyYWZ0Q29tcGlsZT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kZWJ1ZzwvaWQ+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHN0eWxlPlBSRVRUWTwvc3R5bGU+CisgICAgICAgICAgICAgIDxtb2R1bGU+JHtHZXJyaXRHd3RVSS5icm93c2VyVHlwZX08L21vZHVsZT4KKyAgICAgICAgICAgICAgPGV4dHJhSnZtQXJncz4tWG14NTEybTwvZXh0cmFKdm1BcmdzPgorICAgICAgICAgICAgICA8ZGlzYWJsZUNsYXNzTWV0YWRhdGE+dHJ1ZTwvZGlzYWJsZUNsYXNzTWV0YWRhdGE+CisgICAgICAgICAgICAgIDxkaXNhYmxlUnVuQXN5bmM+dHJ1ZTwvZGlzYWJsZVJ1bkFzeW5jPgorICAgICAgICAgICAgICA8ZHJhZnRDb21waWxlPnRydWU8L2RyYWZ0Q29tcGlsZT4KKyAgICAgICAgICAgICAgPHdlYmFwcERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfV9kYmc8L3dlYmFwcERpcmVjdG9yeT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KICAgICAgICAgICAgIDwvZ29hbHM+CkBAIC0yMzIsNyArMjQ4LDggQEAKICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICA8dGFyZ2V0PgogICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkc3QiIGxvY2F0aW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHAiIGxvY2F0aW9uPSIke2RzdH0vZ2Vycml0Ii8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRiZyIgbG9jYXRpb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9X2RiZyIvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHAiIGxvY2F0aW9uPSIke2RzdH0vZ2Vycml0X3VpIi8+CiAKICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke2FwcH0iLz4KICAgICAgICAgICAgICAgICA8YXBwbHkgZXhlY3V0YWJsZT0iZ3ppcCIgYWRkc291cmNlZmlsZT0iZmFsc2UiPgpAQCAtMjQ3LDYgKzI2NCwxNiBAQAogICAgICAgICAgICAgICAgICAgICA8b3V0cHV0bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IioiIHRvPSIke2FwcH0vKi5neiIvPgogICAgICAgICAgICAgICAgICAgPC9yZWRpcmVjdG9yPgogICAgICAgICAgICAgICAgIDwvYXBwbHk+CisKKyAgICAgICAgICAgICAgICA8Y29weSBmaWxlPSIke2RiZ30vZ2Vycml0X3VpL2dlcnJpdF91aS5ub2NhY2hlLmpzIgorICAgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0iJHthcHB9L2dlcnJpdF9kYmcubm9jYWNoZS5qcyIvPgorICAgICAgICAgICAgICAgIDxjb3B5IHRvZGlyPSIke2FwcH0iIG92ZXJ3cml0ZT0iZmFsc2UiPgorICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2RiZ30vZ2Vycml0X3VpIj4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouY3NzIi8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImRlZmVycmVkanMvKiovKi5qcyIvPgorICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDwvY29weT4KICAgICAgICAgICAgICAgPC90YXJnZXQ+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPC9leGVjdXRpb24+CkBAIC0yNTcsNyArMjg0LDcgQEAKICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8cGFja2FnaW5nRXhjbHVkZXM+V0VCLUlORi9jbGFzc2VzLyoqLFdFQi1JTkYvbGliLyoqPC9wYWNrYWdpbmdFeGNsdWRlcz4KKyAgICAgICAgICA8cGFja2FnaW5nRXhjbHVkZXM+V0VCLUlORi9jbGFzc2VzLyoqLFdFQi1JTkYvZGVwbG95LyoqLFdFQi1JTkYvbGliLyoqPC9wYWNrYWdpbmdFeGNsdWRlcz4KICAgICAgICAgICA8YXR0YWNoQ2xhc3Nlcz50cnVlPC9hdHRhY2hDbGFzc2VzPgogICAgICAgICAgIDxhcmNoaXZlPgogICAgICAgICAgICAgPGFkZE1hdmVuRGVzY3JpcHRvcj5mYWxzZTwvYWRkTWF2ZW5EZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUkuZ3d0LnhtbCBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJLmd3dC54bWwKaW5kZXggODU1NWM3NS4uNWZkYzViYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUkuZ3d0LnhtbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSS5nd3QueG1sCkBAIC0xMyw3ICsxMyw3IEBACiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08bW9kdWxlIHJlbmFtZS10bz0iZ2Vycml0Ij4KKzxtb2R1bGUgcmVuYW1lLXRvPSJnZXJyaXRfdWkiPgogICA8aW5oZXJpdHMgbmFtZT0nY29tLmdvb2dsZS5nd3QuZWRpdG9yLkVkaXRvcicvPgogICA8aW5oZXJpdHMgbmFtZT0nY29tLmdvb2dsZS5nd3QudXNlci5Vc2VyJy8+CiAgIDxpbmhlcml0cyBuYW1lPSdjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuUmVzb3VyY2VzJy8+CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSWdlY2tvMV84Lmd3dC54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSWdlY2tvMV84Lmd3dC54bWwKaW5kZXggZDFhOWZlNC4uZDdlODM1ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUlnZWNrbzFfOC5nd3QueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJZ2Vja28xXzguZ3d0LnhtbApAQCAtMTMsNyArMTMsNyBAQAogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPG1vZHVsZSByZW5hbWUtdG89ImdlcnJpdCI+Cis8bW9kdWxlIHJlbmFtZS10bz0iZ2Vycml0X3VpIj4KICAgPGluaGVyaXRzIG5hbWU9J2NvbS5nb29nbGUuZ2Vycml0LkdlcnJpdEd3dFVJJy8+CiAgIDxzZXQtcHJvcGVydHkgbmFtZT0idXNlci5hZ2VudCIgdmFsdWU9ImdlY2tvMV84IiAvPgogICA8c2V0LXByb3BlcnR5IG5hbWU9ImxvY2FsZSIgdmFsdWU9ImRlZmF1bHQiIC8+CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSXNhZmFyaS5nd3QueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUlzYWZhcmkuZ3d0LnhtbAppbmRleCA3NjU1YzFmLi44OGJlYTg0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSXNhZmFyaS5nd3QueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJc2FmYXJpLmd3dC54bWwKQEAgLTEzLDcgKzEzLDcgQEAKICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxtb2R1bGUgcmVuYW1lLXRvPSJnZXJyaXQiPgorPG1vZHVsZSByZW5hbWUtdG89ImdlcnJpdF91aSI+CiAgIDxpbmhlcml0cyBuYW1lPSdjb20uZ29vZ2xlLmdlcnJpdC5HZXJyaXRHd3RVSScvPgogICA8c2V0LXByb3BlcnR5IG5hbWU9InVzZXIuYWdlbnQiIHZhbHVlPSJzYWZhcmkiIC8+CiAgIDxzZXQtcHJvcGVydHkgbmFtZT0ibG9jYWxlIiB2YWx1ZT0iZGVmYXVsdCIgLz4KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9BdmF0YXJJbWFnZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0F2YXRhckltYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1OTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9BdmF0YXJJbWFnZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5FcnJvckV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRXJyb3JIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOworCitwdWJsaWMgY2xhc3MgQXZhdGFySW1hZ2UgZXh0ZW5kcyBJbWFnZSB7CisKKyAgLyoqIEEgZGVmYXVsdCBzaXplZCBhdmF0YXIgaW1hZ2UuICovCisgIHB1YmxpYyBBdmF0YXJJbWFnZShBY2NvdW50LklkIGFjY291bnQpIHsKKyAgICB0aGlzKGFjY291bnQsIDApOworICB9CisKKyAgLyoqCisgICAqIEFuIGF2YXRhciBpbWFnZSBmb3IgdGhlIGdpdmVuIGFjY291bnQgdXNpbmcgdGhlIHJlcXVlc3RlZCBzaXplLgorICAgKgorICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgYWNjb3VudCBpbiB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZAorICAgKiBAcGFyYW0gc2l6ZSBBIHJlcXVlc3RlZCBzaXplLiBOb3RlIHRoYXQgdGhlIHNpemUgY2FuIGJlIGlnbm9yZWQgZGVwZW5kaW5nCisgICAqICAgICAgICBvbiB0aGUgYXZhdGFyIHByb3ZpZGVyLiBBIHNpemUgPD0gMCBpbmRpY2F0ZXMgdG8gbGV0IHRoZSBwcm92aWRlcgorICAgKiAgICAgICAgZGVjaWRlIGEgZGVmYXVsdCBzaXplLgorICAgKi8KKyAgcHVibGljIEF2YXRhckltYWdlKEFjY291bnQuSWQgYWNjb3VudCwgaW50IHNpemUpIHsKKyAgICBzdXBlcih1cmwoYWNjb3VudCwgc2l6ZSkpOworCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAvLyBJZiB0aGUgcHJvdmlkZXIgZG9lcyBub3QgcmVzaXplIHRoZSBpbWFnZSwgZm9yY2UgaXQgaW4gdGhlIGJyb3dzZXIuCisgICAgICBzZXRTaXplKHNpemUgKyAicHgiLCBzaXplICsgInB4Iik7CisgICAgfQorCisgICAgYWRkRXJyb3JIYW5kbGVyKG5ldyBFcnJvckhhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXJyb3JFdmVudCBldmVudCkgeworICAgICAgICAvLyBXZSBnb3QgYSA0MDQsIGRvbid0IGJvdGhlciBzaG93aW5nIHRoZSBpbWFnZS4gRWl0aGVyIHRoZSB1c2VyIGRvZXNuJ3QKKyAgICAgICAgLy8gaGF2ZSBhbiBhdmF0YXIgb3IgdGhlcmUgaXMgbm8gYXZhdGFyIHByb3ZpZGVyIHBsdWdpbiBpbnN0YWxsZWQuCisgICAgICAgIHNldFZpc2libGUoZmFsc2UpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVybChBY2NvdW50LklkIGlkLCBpbnQgc2l6ZSkgeworICAgIFN0cmluZyB1OworICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpICYmIGlkLmVxdWFscyhHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRJZCgpKSkgeworICAgICAgdSA9ICJzZWxmIjsKKyAgICB9IGVsc2UgeworICAgICAgdSA9IGlkLnRvU3RyaW5nKCk7CisgICAgfQorICAgIFJlc3RBcGkgYXBpID0gbmV3IFJlc3RBcGkoIi9hY2NvdW50cy8iKS5pZCh1KS52aWV3KCJhdmF0YXIiKTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIGFwaS5hZGRQYXJhbWV0ZXIoInMiLCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGFwaS51cmwoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0N1cnJlbnRVc2VyUG9wdXBQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0N1cnJlbnRVc2VyUG9wdXBQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODNmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUJpbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlGaWVsZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkudXNlci5jbGllbnQuUGx1Z2luU2FmZVBvcHVwUGFuZWw7CisKK3B1YmxpYyBjbGFzcyBDdXJyZW50VXNlclBvcHVwUGFuZWwgZXh0ZW5kcyBQbHVnaW5TYWZlUG9wdXBQYW5lbCB7CisgIGludGVyZmFjZSBCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxXaWRnZXQsIEN1cnJlbnRVc2VyUG9wdXBQYW5lbD4geworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmluZGVyIGJpbmRlciA9IEdXVC5jcmVhdGUoQmluZGVyLmNsYXNzKTsKKworICBAVWlGaWVsZChwcm92aWRlZCA9IHRydWUpCisgIEF2YXRhckltYWdlIGF2YXRhcjsKKyAgQFVpRmllbGQKKyAgTGFiZWwgdXNlck5hbWU7CisgIEBVaUZpZWxkCisgIExhYmVsIHVzZXJFbWFpbDsKKyAgQFVpRmllbGQKKyAgQW5jaG9yIGxvZ291dDsKKyAgQFVpRmllbGQKKyAgQW5jaG9yIHNldHRpbmdzOworCisgIHB1YmxpYyBDdXJyZW50VXNlclBvcHVwUGFuZWwoQWNjb3VudCBhY2NvdW50LCBib29sZWFuIGNhbkxvZ091dCkgeworICAgIHN1cGVyKC8qIGF1dG8gaGlkZSAqL3RydWUsIC8qIG1vZGFsICovZmFsc2UpOworICAgIGF2YXRhciA9IG5ldyBBdmF0YXJJbWFnZShhY2NvdW50LmdldElkKCksIDEwMCk7CisgICAgc2V0V2lkZ2V0KGJpbmRlci5jcmVhdGVBbmRCaW5kVWkodGhpcykpOworICAgIC8vIFdlIG11c3Qgc2hvdyBhbmQgdGhlbiBoaWRlIHRoaXMgcG9wdXAgc28gdGhhdCBpdCBpcyBwYXJ0IG9mIHRoZSBET00uCisgICAgLy8gT3RoZXJ3aXNlIHRoZSBpbWFnZSBkb2VzIG5vdCBnZXQgYW55IGV2ZW50cy4gIENhbGxpbmcgaGlkZSgpIHdvdWxkCisgICAgLy8gcmVtb3ZlIGl0IGZyb20gdGhlIERPTSBzbyB3ZSB1c2Ugc2V0VmlzaWJsZShmYWxzZSkgaW5zdGVhZC4KKyAgICBzaG93KCk7CisgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkudXNlckluZm9Qb3B1cCgpKTsKKyAgICBpZiAoYWNjb3VudC5nZXRGdWxsTmFtZSgpICE9IG51bGwpIHsKKyAgICAgIHVzZXJOYW1lLnNldFRleHQoYWNjb3VudC5nZXRGdWxsTmFtZSgpKTsKKyAgICB9CisgICAgaWYgKGFjY291bnQuZ2V0UHJlZmVycmVkRW1haWwoKSAhPSBudWxsKSB7CisgICAgICB1c2VyRW1haWwuc2V0VGV4dChhY2NvdW50LmdldFByZWZlcnJlZEVtYWlsKCkpOworICAgIH0KKyAgICBpZiAoY2FuTG9nT3V0KSB7CisgICAgICBsb2dvdXQuc2V0SHJlZihHZXJyaXQuc2VsZlJlZGlyZWN0KCIvbG9nb3V0IikpOworICAgIH0gZWxzZSB7CisgICAgICBsb2dvdXQuc2V0VmlzaWJsZShmYWxzZSk7CisgICAgfQorICAgIHNldHRpbmdzLnNldEhyZWYoR2Vycml0LnNlbGZSZWRpcmVjdChQYWdlTGlua3MuU0VUVElOR1MpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0N1cnJlbnRVc2VyUG9wdXBQYW5lbC51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLnVpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGI1Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0N1cnJlbnRVc2VyUG9wdXBQYW5lbC51aS54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIHVpOlVpQmluZGVyIFNZU1RFTSAiaHR0cDovL2RsLmdvb2dsZS5jb20vZ3d0L0RURC94aHRtbC5lbnQiPgorPHVpOlVpQmluZGVyIHhtbG5zOnVpPSd1cm46dWk6Y29tLmdvb2dsZS5nd3QudWliaW5kZXInCisgIHhtbG5zOmc9J3VybjppbXBvcnQ6Y29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWknCisgIHhtbG5zOmdlcnJpdD0ndXJuOmltcG9ydDpjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQnPgorICA8dWk6d2l0aCBmaWVsZD0nY29uc3RhbnRzJyB0eXBlPSdjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0Q29uc3RhbnRzJy8+CisKKyAgPHVpOnN0eWxlPgorICAgIC5wYW5lbCB7CisgICAgICBwYWRkaW5nOiA4cHg7CisgICAgfQorICAgIC5hdmF0YXIgeworICAgICAgcGFkZGluZy1yaWdodDogNHB4OworICAgICAgd2lkdGg6IDEwMHB4OworICAgICAgaGVpZ2h0OiAxMDBweDsKKyAgICB9CisgICAgLmluZm9DZWxsIHsKKyAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgfQorICAgIC51c2VyTmFtZSB7CisgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICB9CisgICAgLmVtYWlsIHsKKyAgICAgIHBhZGRpbmctYm90dG9tOiA2cHg7CisgICAgfQorICAgIC5sb2dvdXQgeworICAgICAgcGFkZGluZy1sZWZ0OiAxNnB4OworICAgICAgZmxvYXQ6IHJpZ2h0OworICAgIH0KKyAgPC91aTpzdHlsZT4KKworICA8ZzpIVE1MUGFuZWwgc3R5bGVOYW1lPSd7c3R5bGUucGFuZWx9Jz4KKyAgICA8dGFibGU+PHRyPjx0ZD4KKyAgICAgIDxnZXJyaXQ6QXZhdGFySW1hZ2UgdWk6ZmllbGQ9J2F2YXRhcicgc3R5bGVOYW1lPSd7c3R5bGUuYXZhdGFyfScgLz4KKyAgICA8L3RkPjx0ZCBjbGFzcz0ne3N0eWxlLmluZm9DZWxsfSc+CisgICAgICA8ZzpMYWJlbCB1aTpmaWVsZD0ndXNlck5hbWUnIHN0eWxlTmFtZT0ie3N0eWxlLnVzZXJOYW1lfSIgLz4KKyAgICAgIDxnOkxhYmVsIHVpOmZpZWxkPSd1c2VyRW1haWwnIHN0eWxlTmFtZT0ie3N0eWxlLmVtYWlsfSIgLz4KKyAgICA8L3RkPjwvdHI+PC90YWJsZT4KKyAgICA8ZzpBbmNob3IgdWk6ZmllbGQ9J3NldHRpbmdzJz4KKyAgICAgIDx1aTp0ZXh0IGZyb209J3tjb25zdGFudHMubWVudVNldHRpbmdzfScgLz4KKyAgICA8L2c6QW5jaG9yPgorICAgIDxnOkFuY2hvciB1aTpmaWVsZD0nbG9nb3V0JyBzdHlsZU5hbWU9IntzdHlsZS5sb2dvdXR9Ij4KKyAgICAgIDx1aTp0ZXh0IGZyb209J3tjb25zdGFudHMubWVudVNpZ25PdXR9JyAvPgorICAgIDwvZzpBbmNob3I+CisgIDwvZzpIVE1MUGFuZWw+Cis8L3VpOlVpQmluZGVyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9EaXNwYXRjaGVyLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRGlzcGF0Y2hlci5qYXZhCmluZGV4IGFlZmFkMjcuLmM4YjFlNDggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9EaXNwYXRjaGVyLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0Rpc3BhdGNoZXIuamF2YQpAQCAtMTcsOSArMTcsMTEgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9DUkVBVEVfR1JPVVA7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fQ1JFQVRFX1BST0pFQ1Q7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fR1JPVVBTOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLkFETUlOX1BST0pFQ1RTOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLkFETUlOX1BMVUdJTlM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fUFJPSkVDVFM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuREFTSEJPQVJEUzsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5NSU5FOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLlBST0pFQ1RTOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLlJFR0lTVEVSOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLlNFVFRJTkdTOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLlNFVFRJTkdTX0FHUkVFTUVOVFM7CkBAIC01NCwyNCArNTYsMjYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUGx1Z2luTGlzdFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUHJvamVjdEFjY2Vzc1NjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUHJvamVjdEJyYW5jaGVzU2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0RGFzaGJvYXJkc1NjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUHJvamVjdEluZm9TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlByb2plY3RMaXN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0U2NyZWVuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5VdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZC5PcGVuSWRTaWduSW5EaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgudXNlcnBhc3MuVXNlclBhc3NTaWduSW5EaWFsb2c7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQWNjb3VudERhc2hib2FyZFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DaGFuZ2VTY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ3VzdG9tRGFzaGJvYXJkU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlBhdGNoVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUHJvamVjdERhc2hib2FyZFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5QdWJsaXNoQ29tbWVudFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5RdWVyeVNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZGFzaGJvYXJkcy5EYXNoYm9hcmRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kYXNoYm9hcmRzLkRhc2hib2FyZExpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cEFwaTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwSW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluTW9kZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldERldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwpAQCAtODEsNiArODUsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5SdW5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKQEAgLTEzNywxNiArMTQyLDIwIEBACiAgICAgcmV0dXJuICIvYWRtaW4vZ3JvdXBzLyIgKyBpZC50b1N0cmluZygpICsgIiwiICsgcGFuZWw7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0dyb3VwKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKLSAgICByZXR1cm4gIi9hZG1pbi9ncm91cHMvdXVpZC0iICsgdXVpZC50b1N0cmluZygpOworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0dyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICByZXR1cm4gUGFnZUxpbmtzLnRvR3JvdXAodXVpZCk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0dyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQsIFN0cmluZyBwYW5lbCkgewotICAgIHJldHVybiAiL2FkbWluL2dyb3Vwcy91dWlkLSIgKyB1dWlkLnRvU3RyaW5nKCkgKyAiLCIgKyBwYW5lbDsKKyAgICByZXR1cm4gdG9Hcm91cCh1dWlkKSArICIsIiArIHBhbmVsOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Qcm9qZWN0KFByb2plY3QuTmFtZUtleSBuKSB7CisgICAgcmV0dXJuIHRvUHJvamVjdEFkbWluKG4sIFByb2plY3RTY3JlZW4uZ2V0U2F2ZWRQYW5lbCgpKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUHJvamVjdEFkbWluKFByb2plY3QuTmFtZUtleSBuLCBTdHJpbmcgcGFuZWwpIHsKLSAgICBpZiAoUHJvamVjdFNjcmVlbi5JTkZPLmVxdWFscyhwYW5lbCkpIHsKKyAgICBpZiAocGFuZWwgPT0gbnVsbCB8fCBQcm9qZWN0U2NyZWVuLklORk8uZXF1YWxzKHBhbmVsKSkgewogICAgICAgcmV0dXJuICIvYWRtaW4vcHJvamVjdHMvIiArIG4udG9TdHJpbmcoKTsKICAgICB9CiAgICAgcmV0dXJuICIvYWRtaW4vcHJvamVjdHMvIiArIG4udG9TdHJpbmcoKSArICIsIiArIHBhbmVsOwpAQCAtMTg2LDYgKzE5NSw5IEBACiAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgiL2Rhc2hib2FyZC8iLCB0b2tlbikpIHsKICAgICAgIGRhc2hib2FyZCh0b2tlbik7CiAKKyAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KFBST0pFQ1RTLCB0b2tlbikpIHsKKyAgICAgIHByb2plY3RzKHRva2VuKTsKKwogICAgIH0gZWxzZSBpZiAobWF0Y2hFeGFjdChTRVRUSU5HUywgdG9rZW4pIC8vCiAgICAgICAgIHx8IG1hdGNoUHJlZml4KCIvc2V0dGluZ3MvIiwgdG9rZW4pIC8vCiAgICAgICAgIHx8IG1hdGNoRXhhY3QoInJlZ2lzdGVyIiwgdG9rZW4pIC8vCkBAIC0zODQsNiArMzk2LDUyIEBACiAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvamVjdHMoZmluYWwgU3RyaW5nIHRva2VuKSB7CisgICAgU3RyaW5nIHJlc3QgPSBza2lwKHRva2VuKTsKKyAgICBpbnQgYyA9IHJlc3QuaW5kZXhPZihEQVNIQk9BUkRTKTsKKyAgICBpZiAoMCA8PSBjKSB7CisgICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdCA9IFVSTC5kZWNvZGVQYXRoU2VnbWVudChyZXN0LnN1YnN0cmluZygwLCBjKSk7CisgICAgICByZXN0ID0gcmVzdC5zdWJzdHJpbmcoYyk7CisgICAgICBpZiAobWF0Y2hQcmVmaXgoREFTSEJPQVJEUywgcmVzdCkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhc2hib2FyZElkID0gc2tpcChyZXN0KTsKKyAgICAgICAgR2Vycml0Q2FsbGJhY2s8RGFzaGJvYXJkSW5mbz4gY2IgPSBuZXcgR2Vycml0Q2FsbGJhY2s8RGFzaGJvYXJkSW5mbz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKERhc2hib2FyZEluZm8gcmVzdWx0KSB7CisgICAgICAgICAgICBpZiAobWF0Y2hQcmVmaXgoIi9kYXNoYm9hcmQvIiwgcmVzdWx0LnVybCgpKSkgeworICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1zID0gc2tpcChyZXN1bHQudXJsKCkpLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgUHJvamVjdERhc2hib2FyZFNjcmVlbiBkYXNoID0gbmV3IFByb2plY3REYXNoYm9hcmRTY3JlZW4oCisgICAgICAgICAgICAgICAgICBuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3QpLCBwYXJhbXMpOworICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgZGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICAgIGlmICgiZGVmYXVsdCIuZXF1YWxzKGRhc2hib2FyZElkKSAmJiBSZXN0QXBpLmlzTm90Rm91bmQoY2F1Z2h0KSkgeworICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheShQYWdlTGlua3MudG9DaGFuZ2VRdWVyeSgKKyAgICAgICAgICAgICAgICAgIFBhZ2VMaW5rcy5wcm9qZWN0UXVlcnkobmV3IFByb2plY3QuTmFtZUtleShwcm9qZWN0KSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCJkZWZhdWx0Ii5lcXVhbHMoZGFzaGJvYXJkSWQpKSB7CisgICAgICAgICAgRGFzaGJvYXJkTGlzdC5nZXREZWZhdWx0KG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdCksIGNiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYyA9IGRhc2hib2FyZElkLmluZGV4T2YoIjoiKTsKKyAgICAgICAgaWYgKDAgPD0gYykgeworICAgICAgICAgIGZpbmFsIFN0cmluZyByZWYgPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoZGFzaGJvYXJkSWQuc3Vic3RyaW5nKDAsIGMpKTsKKyAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IFVSTC5kZWNvZGVRdWVyeVN0cmluZyhkYXNoYm9hcmRJZC5zdWJzdHJpbmcoYyArIDEpKTsKKyAgICAgICAgICBEYXNoYm9hcmRMaXN0LmdldChuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3QpLCByZWYgKyAiOiIgKyBwYXRoLCBjYik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKKyAgfQorCiAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hhbmdlKGZpbmFsIFN0cmluZyB0b2tlbikgewogICAgIFN0cmluZyByZXN0ID0gc2tpcCh0b2tlbik7CiAgICAgaW50IGMgPSByZXN0Lmxhc3RJbmRleE9mKCcsJyk7CkBAIC01NzIsMzAgKzYzMCw2IEBACiAgICAgICAgIGlmIChtYXRjaFByZWZpeCgiL1ZFLyIsIHRva2VuKSB8fCBtYXRjaFByZWZpeCgiVkUsIiwgdG9rZW4pKQogICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGVFbWFpbFNjcmVlbihza2lwKHRva2VuKSk7CiAKLSAgICAgICAgaWYgKG1hdGNoUHJlZml4KCIvU2lnbkluRmFpbHVyZSwiLCB0b2tlbikpIHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcmdzID0gc2tpcCh0b2tlbikuc3BsaXQoIiwiKTsKLSAgICAgICAgICBmaW5hbCBTaWduSW5Nb2RlIG1vZGUgPSBTaWduSW5Nb2RlLnZhbHVlT2YoYXJnc1swXSk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IEtleVV0aWwuZGVjb2RlKGFyZ3NbMV0pOwotICAgICAgICAgIGZpbmFsIFN0cmluZyB0byA9IE1JTkU7Ci0gICAgICAgICAgc3dpdGNoIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXV0aFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBPUEVOSUQ6Ci0gICAgICAgICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2cobW9kZSwgdG8sIG1zZykuY2VudGVyKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMREFQOgotICAgICAgICAgICAgY2FzZSBMREFQX0JJTkQ6Ci0gICAgICAgICAgICAgIG5ldyBVc2VyUGFzc1NpZ25JbkRpYWxvZyh0bywgbXNnKS5jZW50ZXIoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJR05fSU46Ci0gICAgICAgICAgICAgIHJldHVybiBRdWVyeVNjcmVlbi5mb3JRdWVyeSgic3RhdHVzOm9wZW4iKTsKLSAgICAgICAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICAgICAgICByZXR1cm4gbmV3IE15SWRlbnRpdGllc1NjcmVlbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtYXRjaEV4YWN0KFNFVFRJTkdTX05FV19BR1JFRU1FTlQsIHRva2VuKSkKICAgICAgICAgICByZXR1cm4gbmV3IE5ld0FncmVlbWVudFNjcmVlbigpOwogCkBAIC02MTYsMTQgKzY1MCwzNiBAQAogICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBuZXcgR3JvdXBMaXN0U2NyZWVuKCkpOwogCiAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoIi9hZG1pbi9ncm91cHMvIiwgdG9rZW4pKSB7Ci0gICAgICAgICAgZ3JvdXAoKTsKKyAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNraXAodG9rZW4pOworICAgICAgICAgIGlmIChyZXN0LnN0YXJ0c1dpdGgoIj8iKSkgeworICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBHcm91cExpc3RTY3JlZW4ocmVzdC5zdWJzdHJpbmcoMSkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3JvdXAoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgiL2FkbWluL2dyb3VwcyIsIHRva2VuKSkgeworICAgICAgICAgIFN0cmluZyByZXN0ID0gc2tpcCh0b2tlbik7CisgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IEdyb3VwTGlzdFNjcmVlbihyZXN0LnN1YnN0cmluZygxKSkpOworICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoRXhhY3QoQURNSU5fUFJPSkVDVFMsIHRva2VuKQogICAgICAgICAgICAgfHwgbWF0Y2hFeGFjdCgiL2FkbWluL3Byb2plY3RzIiwgdG9rZW4pKSB7CiAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBQcm9qZWN0TGlzdFNjcmVlbigpKTsKIAogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KCIvYWRtaW4vcHJvamVjdHMvIiwgdG9rZW4pKSB7Ci0gICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIHNlbGVjdFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNraXAodG9rZW4pOworICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBuZXcgUHJvamVjdExpc3RTY3JlZW4ocmVzdC5zdWJzdHJpbmcoMSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBzZWxlY3RQcm9qZWN0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoIi9hZG1pbi9wcm9qZWN0cyIsIHRva2VuKSkgeworICAgICAgICAgIFN0cmluZyByZXN0ID0gc2tpcCh0b2tlbik7CisgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IFByb2plY3RMaXN0U2NyZWVuKHJlc3Quc3Vic3RyaW5nKDEpKSk7CisgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoQURNSU5fUExVR0lOUywgdG9rZW4pCiAgICAgICAgICAgICB8fCBtYXRjaEV4YWN0KCIvYWRtaW4vcGx1Z2lucyIsIHRva2VuKSkgewpAQCAtNjQ0LDI3ICs3MDAsMjYgQEAKIAogICAgICAgcHJpdmF0ZSB2b2lkIGdyb3VwKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgcGFuZWw7Ci0gICAgICAgIEFjY291bnRHcm91cC5JZCBncm91cElkID0gbnVsbDsKLSAgICAgICAgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlEID0gbnVsbDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwOwogCiAgICAgICAgIGlmIChtYXRjaFByZWZpeCgiL2FkbWluL2dyb3Vwcy91dWlkLSIsIHRva2VuKSkgewogICAgICAgICAgIFN0cmluZyBwID0gc2tpcCh0b2tlbik7CiAgICAgICAgICAgaW50IGMgPSBwLmluZGV4T2YoJywnKTsKICAgICAgICAgICBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwVVVJRCA9IEFjY291bnRHcm91cC5VVUlELnBhcnNlKHApOworICAgICAgICAgICAgZ3JvdXAgPSBwOwogICAgICAgICAgICAgcGFuZWwgPSBudWxsOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncm91cFVVSUQgPSBBY2NvdW50R3JvdXAuVVVJRC5wYXJzZShwLnN1YnN0cmluZygwLCBjKSk7CisgICAgICAgICAgICBncm91cCA9IHAuc3Vic3RyaW5nKDAsIGMpOwogICAgICAgICAgICAgcGFuZWwgPSBwLnN1YnN0cmluZyhjICsgMSk7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KCIvYWRtaW4vZ3JvdXBzLyIsIHRva2VuKSkgewogICAgICAgICAgIFN0cmluZyBwID0gc2tpcCh0b2tlbik7CiAgICAgICAgICAgaW50IGMgPSBwLmluZGV4T2YoJywnKTsKICAgICAgICAgICBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSBBY2NvdW50R3JvdXAuSWQucGFyc2UocCk7CisgICAgICAgICAgICBncm91cCA9IHA7CiAgICAgICAgICAgICBwYW5lbCA9IG51bGw7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSBBY2NvdW50R3JvdXAuSWQucGFyc2UocC5zdWJzdHJpbmcoMCwgYykpOworICAgICAgICAgICAgZ3JvdXAgPSBwLnN1YnN0cmluZygwLCBjKTsKICAgICAgICAgICAgIHBhbmVsID0gcC5zdWJzdHJpbmcoYyArIDEpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MiwzNyArNzI3LDMzIEBACiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMuZ3JvdXBEZXRhaWwoZ3JvdXBJZCwgZ3JvdXBVVUlELAotICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgICAgICAgICAgICAgIGlmIChwYW5lbCA9PSBudWxsIHx8IHBhbmVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgLy8gVGhlIHRva2VuIGRvZXMgbm90IHNheSB3aGljaCBncm91cCBzY3JlZW4gc2hvdWxkIGJlIHNob3duLAotICAgICAgICAgICAgICAgICAgLy8gYXMgZGVmYXVsdCBmb3IgaW50ZXJuYWwgZ3JvdXBzIHNob3cgdGhlIG1lbWJlcnMsIGFzIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyBzaG93IHRoZSBpbmZvIHNjcmVlbiAoc2luY2UKLSAgICAgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUKLSAgICAgICAgICAgICAgICAgIC8vIHNob3duIGluIHRoZSB3ZWIgVUkpLgotICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgIGlmIChncm91cERldGFpbC5ncm91cC5nZXRUeXBlKCkgPT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpIHsKLSAgICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZ3JvdXBEZXRhaWwsIHRva2VuKSk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b0dyb3VwKGdyb3VwRGV0YWlsLmdyb3VwLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50R3JvdXBTY3JlZW4uSU5GTyksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihncm91cERldGFpbCwgdG9rZW4pKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFjY291bnRHcm91cFNjcmVlbi5JTkZPLmVxdWFscyhwYW5lbCkpIHsKLSAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmZvU2NyZWVuKGdyb3VwRGV0YWlsLCB0b2tlbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMuZXF1YWxzKHBhbmVsKSkgewotICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZ3JvdXBEZXRhaWwsIHRva2VuKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIEdyb3VwQXBpLmdldEdyb3VwRGV0YWlsKGdyb3VwLCBuZXcgR2Vycml0Q2FsbGJhY2s8R3JvdXBJbmZvPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoR3JvdXBJbmZvIGdyb3VwKSB7CisgICAgICAgICAgICBpZiAocGFuZWwgPT0gbnVsbCB8fCBwYW5lbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHRva2VuIGRvZXMgbm90IHNheSB3aGljaCBncm91cCBzY3JlZW4gc2hvdWxkIGJlIHNob3duLAorICAgICAgICAgICAgICAvLyBhcyBkZWZhdWx0IGZvciBpbnRlcm5hbCBncm91cHMgc2hvdyB0aGUgbWVtYmVycywgYXMgZGVmYXVsdAorICAgICAgICAgICAgICAvLyBmb3IgZXh0ZXJuYWwgYW5kIHN5c3RlbSBncm91cHMgc2hvdyB0aGUgaW5mbyBzY3JlZW4gKHNpbmNlCisgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgLy8gc2hvd24gaW4gdGhlIHdlYiBVSSkuCisgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgIGlmIChBY2NvdW50R3JvdXAuaXNJbnRlcm5hbEdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKQorICAgICAgICAgICAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSkgeworICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCBBY2NvdW50R3JvdXBTY3JlZW4uTUVNQkVSUyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuKGdyb3VwLCB0b2tlbikpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCBBY2NvdW50R3JvdXBTY3JlZW4uSU5GTyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmZvU2NyZWVuKGdyb3VwLCB0b2tlbikpOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQWNjb3VudEdyb3VwU2NyZWVuLklORk8uZXF1YWxzKHBhbmVsKSkgeworICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IEFjY291bnRHcm91cEluZm9TY3JlZW4oZ3JvdXAsIHRva2VuKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFjY291bnRHcm91cFNjcmVlbi5NRU1CRVJTLmVxdWFscyhwYW5lbCkpIHsKKyAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuKGdyb3VwLCB0b2tlbikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgfQogCiAgICAgICBwcml2YXRlIFNjcmVlbiBzZWxlY3RQcm9qZWN0KCkgewpAQCAtNzI5LDYgKzc4MCwxMCBAQAogICAgICAgICAgIGlmIChQcm9qZWN0U2NyZWVuLkFDQ0VTUy5lcXVhbHMocGFuZWwpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFByb2plY3RBY2Nlc3NTY3JlZW4oayk7CiAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKFByb2plY3RTY3JlZW4uREFTSEJPQVJEUy5lcXVhbHMocGFuZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb2plY3REYXNoYm9hcmRzU2NyZWVuKGspOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kU2NyZWVuKCk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRXJyb3JEaWFsb2cuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCmluZGV4IDEzYmJhMTIuLjNhZGVjOGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCkBAIC0xNCwxMSArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5ScGNDb25zdGFudHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXNwb25zZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5TdGF0dXNDb2RlRXhjZXB0aW9uOwpAQCAtMTA0LDM0ICsxMDYsNTQgQEAKICAgcHVibGljIEVycm9yRGlhbG9nKGZpbmFsIFRocm93YWJsZSB3aGF0KSB7CiAgICAgdGhpcygpOwogCi0gICAgU3RyaW5nIGNuOwotICAgIGlmICh3aGF0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbikgewotICAgICAgY24gPSBScGNDb25zdGFudHMuQy5lcnJvclJlbW90ZUpzb25FeGNlcHRpb24oKTsKKyAgICBTdHJpbmcgaGRyOworICAgIFN0cmluZyBtc2c7CiAKLSAgICB9IGVsc2UgaWYgKHdoYXQgaW5zdGFuY2VvZiBTdGF0dXNDb2RlRXhjZXB0aW9uKSB7Ci0gICAgICBjbiA9IFJwY0NvbnN0YW50cy5DLmVycm9yU2VydmVyVW5hdmFpbGFibGUoKTsKKyAgICBpZiAod2hhdCBpbnN0YW5jZW9mIFN0YXR1c0NvZGVFeGNlcHRpb24pIHsKKyAgICAgIFN0YXR1c0NvZGVFeGNlcHRpb24gc2MgPSAoU3RhdHVzQ29kZUV4Y2VwdGlvbikgd2hhdDsKKyAgICAgIGlmIChSZXN0QXBpLmlzRXhwZWN0ZWQoc2MuZ2V0U3RhdHVzQ29kZSgpKSkgeworICAgICAgICBoZHIgPSBudWxsOworICAgICAgICBtc2cgPSBzYy5nZXRFbmNvZGVkUmVzcG9uc2UoKTsKKyAgICAgIH0gZWxzZSBpZiAoc2MuZ2V0U3RhdHVzQ29kZSgpID09IFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikgeworICAgICAgICBoZHIgPSBudWxsOworICAgICAgICBtc2cgPSB3aGF0LmdldE1lc3NhZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhkciA9IFJwY0NvbnN0YW50cy5DLmVycm9yU2VydmVyVW5hdmFpbGFibGUoKTsKKyAgICAgICAgbXNnID0gd2hhdC5nZXRNZXNzYWdlKCk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHdoYXQgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uKSB7CisgICAgICAvLyBUT0RPIFJlbW92ZSBSZW1vdGVKc29uRXhjZXB0aW9uIGZyb20gR2Vycml0IHNvdXJjZXMuCisgICAgICBoZHIgPSBScGNDb25zdGFudHMuQy5lcnJvclJlbW90ZUpzb25FeGNlcHRpb24oKTsKKyAgICAgIG1zZyA9IHdoYXQuZ2V0TWVzc2FnZSgpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgIGNuID0gd2hhdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgIGlmIChjbi5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoImphdmEubGFuZy4iLmxlbmd0aCgpKTsKLSAgICAgIH0gZWxzZSBpZiAoY24uc3RhcnRzV2l0aCgiY29tLmdvb2dsZS5nZXJyaXQuIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoY24ubGFzdEluZGV4T2YoJy4nKSArIDEpOworICAgICAgLy8gVE9ETyBGaXggY2FsbGVycyBvZiBFcnJvckRpYWxvZyB0byBzdG9wIHBhc3NpbmcgcmFuZG9tIHR5cGVzLgorICAgICAgaGRyID0gd2hhdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIGlmIChoZHIuc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoImphdmEubGFuZy4iLmxlbmd0aCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoaGRyLnN0YXJ0c1dpdGgoImNvbS5nb29nbGUuZ2Vycml0LiIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoaGRyLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKICAgICAgIH0KLSAgICAgIGlmIChjbi5lbmRzV2l0aCgiRXhjZXB0aW9uIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoMCwgY24ubGVuZ3RoKCkgLSAiRXhjZXB0aW9uIi5sZW5ndGgoKSk7Ci0gICAgICB9IGVsc2UgaWYgKGNuLmVuZHNXaXRoKCJFcnJvciIpKSB7Ci0gICAgICAgIGNuID0gY24uc3Vic3RyaW5nKDAsIGNuLmxlbmd0aCgpIC0gIkVycm9yIi5sZW5ndGgoKSk7CisgICAgICBpZiAoaGRyLmVuZHNXaXRoKCJFeGNlcHRpb24iKSkgeworICAgICAgICBoZHIgPSBoZHIuc3Vic3RyaW5nKDAsIGhkci5sZW5ndGgoKSAtICJFeGNlcHRpb24iLmxlbmd0aCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoaGRyLmVuZHNXaXRoKCJFcnJvciIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoMCwgaGRyLmxlbmd0aCgpIC0gIkVycm9yIi5sZW5ndGgoKSk7CiAgICAgICB9CisgICAgICBtc2cgPSB3aGF0LmdldE1lc3NhZ2UoKTsKICAgICB9CiAKLSAgICBmaW5hbCBMYWJlbCByID0gbmV3IExhYmVsKGNuKTsKLSAgICByLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmVycm9yRGlhbG9nRXJyb3JUeXBlKCkpOwotICAgIGJvZHkuYWRkKHIpOworICAgIGlmIChoZHIgIT0gbnVsbCkgeworICAgICAgZmluYWwgTGFiZWwgciA9IG5ldyBMYWJlbChoZHIpOworICAgICAgci5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5lcnJvckRpYWxvZ0Vycm9yVHlwZSgpKTsKKyAgICAgIGJvZHkuYWRkKHIpOworICAgIH0KIAotICAgIGZpbmFsIExhYmVsIG0gPSBuZXcgTGFiZWwod2hhdC5nZXRNZXNzYWdlKCkpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShtLmdldEVsZW1lbnQoKSwid2hpdGVTcGFjZSIsInByZSIpOwotICAgIGJvZHkuYWRkKG0pOworICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgZmluYWwgTGFiZWwgbSA9IG5ldyBMYWJlbChtc2cpOworICAgICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKG0uZ2V0RWxlbWVudCgpLCAid2hpdGVTcGFjZSIsICJwcmUiKTsKKyAgICAgIGJvZHkuYWRkKG0pOworICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldFRleHQoZmluYWwgU3RyaW5nIHQpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Gb3JtYXRVdGlsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRm9ybWF0VXRpbC5qYXZhCmluZGV4IGYxMDc2MmEuLjU0NDhkYzAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Gb3JtYXRVdGlsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0Zvcm1hdFV0aWwuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50LkRhdGVUaW1lRm9ybWF0OwpAQCAtMTE5LDEzICsxMTksOCBAQAogICAgIH0KICAgfQogCi0gIC8qKiBGb3JtYXQgYW4gYWNjb3VudCBhcyBhIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MuICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVFbWFpbChmaW5hbCBBY2NvdW50IGFjY3QpIHsKLSAgICByZXR1cm4gbmFtZUVtYWlsKG5ldyBBY2NvdW50SW5mbyhhY2N0KSk7Ci0gIH0KLQogICAvKioKLSAgICogRm9ybWF0cyBhbiBhY2NvdW50IGFzIGFuIG5hbWUgYW5kIGFuIGVtYWlsIGFkZHJlc3MuCisgICAqIEZvcm1hdHMgYW4gYWNjb3VudCBhcyBhIG5hbWUgYW5kIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAqIDxwPgogICAgKiBFeGFtcGxlIG91dHB1dDoKICAgICogPHVsPgpAQCAtMTM1LDIyICsxMzAsMTcgQEAKICAgICogPGxpPjxjb2RlPkFub255bW91cyBDb3dhcmQgKDEyKTwvY29kZT46IG1pc3NpbmcgbmFtZSBhbmQgZW1haWwgYWRkcmVzczwvbGk+CiAgICAqIDwvdWw+CiAgICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRW1haWwoZmluYWwgQWNjb3VudEluZm8gYWNjdCkgewotICAgIFN0cmluZyBuYW1lID0gYWNjdC5nZXRGdWxsTmFtZSgpOwotICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUVtYWlsKEFjY291bnRJbmZvIGluZm8pIHsKKyAgICBTdHJpbmcgbmFtZSA9IGluZm8ubmFtZSgpOworICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICBuYW1lID0gR2Vycml0LmdldENvbmZpZygpLmdldEFub255bW91c0Nvd2FyZE5hbWUoKTsKICAgICB9CiAKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGIuYXBwZW5kKG5hbWUpOwotICAgIGlmIChhY2N0LmdldFByZWZlcnJlZEVtYWlsKCkgIT0gbnVsbCkgewotICAgICAgYi5hcHBlbmQoIiA8Iik7Ci0gICAgICBiLmFwcGVuZChhY2N0LmdldFByZWZlcnJlZEVtYWlsKCkpOwotICAgICAgYi5hcHBlbmQoIj4iKTsKLSAgICB9IGVsc2UgaWYgKGFjY3QuZ2V0SWQoKSAhPSBudWxsKSB7Ci0gICAgICBiLmFwcGVuZCgiICgiKTsKLSAgICAgIGIuYXBwZW5kKGFjY3QuZ2V0SWQoKS5nZXQoKSk7Ci0gICAgICBiLmFwcGVuZCgiKSIpOworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKG5hbWUpOworICAgIGlmIChpbmZvLmVtYWlsKCkgIT0gbnVsbCkgeworICAgICAgYi5hcHBlbmQoIiA8IikuYXBwZW5kKGluZm8uZW1haWwoKSkuYXBwZW5kKCI+Iik7CisgICAgfSBlbHNlIGlmIChpbmZvLl9hY2NvdW50X2lkKCkgPiAwKSB7CisgICAgICBiLmFwcGVuZCgiICgiKS5hcHBlbmQoaW5mby5fYWNjb3VudF9pZCgpKS5hcHBlbmQoIikiKTsKICAgICB9CiAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKICAgfQpAQCAtMTYxLDEzICsxNTEsNDUgQEAKICAgICogSWYgdGhlIGFjY291bnQgaGFzIGEgZnVsbCBuYW1lLCBpdCByZXR1cm5zIG9ubHkgdGhlIGZ1bGwgbmFtZS4gT3RoZXJ3aXNlIGl0CiAgICAqIHJldHVybnMgYSBsb25nZXIgZm9ybSB0aGF0IGluY2x1ZGVzIHRoZSBlbWFpbCBhZGRyZXNzLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZShmaW5hbCBBY2NvdW50SW5mbyBhaSkgewotICAgIGlmIChhaS5nZXRGdWxsTmFtZSgpICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBhaS5nZXRGdWxsTmFtZSgpOworICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lKEFjY291bnQgYWNjdCkgeworICAgIHJldHVybiBuYW1lKGFzSW5mbyhhY2N0KSk7CisgIH0KKworICAvKioKKyAgICogRm9ybWF0cyBhbiBhY2NvdW50IG5hbWUuCisgICAqIDxwPgorICAgKiBJZiB0aGUgYWNjb3VudCBoYXMgYSBmdWxsIG5hbWUsIGl0IHJldHVybnMgb25seSB0aGUgZnVsbCBuYW1lLiBPdGhlcndpc2UgaXQKKyAgICogcmV0dXJucyBhIGxvbmdlciBmb3JtIHRoYXQgaW5jbHVkZXMgdGhlIGVtYWlsIGFkZHJlc3MuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lKEFjY291bnRJbmZvIGFpKSB7CisgICAgaWYgKGFpLm5hbWUoKSAhPSBudWxsICYmICFhaS5uYW1lKCkudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIGFpLm5hbWUoKTsKICAgICB9Ci0gICAgaWYgKGFpLmdldFByZWZlcnJlZEVtYWlsKCkgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGFpLmdldFByZWZlcnJlZEVtYWlsKCk7CisgICAgU3RyaW5nIGVtYWlsID0gYWkuZW1haWwoKTsKKyAgICBpZiAoZW1haWwgIT0gbnVsbCkgeworICAgICAgaW50IGF0ID0gZW1haWwuaW5kZXhPZignQCcpOworICAgICAgcmV0dXJuIDAgPCBhdCA/IGVtYWlsLnN1YnN0cmluZygwLCBhdCkgOiBlbWFpbDsKICAgICB9CiAgICAgcmV0dXJuIG5hbWVFbWFpbChhaSk7CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBBY2NvdW50SW5mbyBhc0luZm8oQWNjb3VudCBhY2N0KSB7CisgICAgaWYgKGFjY3QgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgwLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgKKyAgICAgICAgYWNjdC5nZXRJZCgpICE9IG51bGwgPyBhY2N0LmdldElkKCkuZ2V0KCkgOiAwLAorICAgICAgICBhY2N0LmdldEZ1bGxOYW1lKCksCisgICAgICAgIGFjY3QuZ2V0UHJlZmVycmVkRW1haWwoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEFjY291bnRJbmZvIGFzSW5mbyhjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbyBhY2N0KSB7CisgICAgaWYgKGFjY3QgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgwLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgKKyAgICAgICAgYWNjdC5nZXRJZCgpICE9IG51bGwgPyBhY2N0LmdldElkKCkuZ2V0KCkgOiAwLAorICAgICAgICBhY2N0LmdldEZ1bGxOYW1lKCksCisgICAgICAgIGFjY3QuZ2V0UHJlZmVycmVkRW1haWwoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXQuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXQuamF2YQppbmRleCA4ZmU2NThiLi5kNjdhNGNhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0LmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdC5qYXZhCkBAIC0xNSwxMyArMTUsMTEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50OwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUjsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfUFJPSkVDVDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfR1JPVVA7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50Q2FwYWJpbGl0aWVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZC5PcGVuSWRTaWduSW5EaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgub3BlbmlkLk9wZW5JZFNzb1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzLlVzZXJQYXNzU2lnbkluRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUNvbnN0YW50czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DaGFuZ2VMaXN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoU2NyZWVuOwpAQCAtMzEsOSArMjksOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Nb3JwaGluZ1RhYlBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5QYXRjaExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU2NyZWVuTG9hZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DbGllbnRWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluTW9kZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HZXJyaXRDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2l0d2ViQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkhvc3RQYWdlRGF0YTsKQEAgLTQyLDEyICs0MCwyNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RGlmZlByZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkNhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkVudHJ5UG9pbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NyaXB0SW5qZWN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5BbmNob3JFbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRG9jdW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLlZhbHVlQ2hhbmdlSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLlNpbXBsZUV2ZW50QnVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VcmxCdWlsZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkNvbW1hbmQ7CkBAIC01NSw5ICs2NSw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93LkxvY2F0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb2N1c1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkdyaWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGxGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lSFRNTDsKQEAgLTY3LDkgKzc3LDEyIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5jbGlwcHkuY2xpZW50LkNvcHlhYmxlTGFiZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5Vc2VyQWdlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5WaWV3U2l0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50LkNhbGxiYWNrSGFuZGxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuSnNvbkRlZlRhcmdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50Lkpzb25VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuWHNyZk1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5pbXBsLlJlc3VsdERlc2VyaWFsaXplcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtODEsMTcgKzk0LDE5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2Vycml0UmVzb3VyY2VzIFJFU09VUkNFUyA9CiAgICAgICBHV1QuY3JlYXRlKEdlcnJpdFJlc291cmNlcy5jbGFzcyk7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3lzdGVtSW5mb1NlcnZpY2UgU1lTVEVNX1NWQzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBFdmVudEJ1cyBFVkVOVF9CVVMgPSBHV1QuY3JlYXRlKFNpbXBsZUV2ZW50QnVzLmNsYXNzKTsKIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbXlIb3N0OwogICBwcml2YXRlIHN0YXRpYyBHZXJyaXRDb25maWcgbXlDb25maWc7CiAgIHByaXZhdGUgc3RhdGljIEhvc3RQYWdlRGF0YS5UaGVtZSBteVRoZW1lOwogICBwcml2YXRlIHN0YXRpYyBBY2NvdW50IG15QWNjb3VudDsKICAgcHJpdmF0ZSBzdGF0aWMgQWNjb3VudERpZmZQcmVmZXJlbmNlIG15QWNjb3VudERpZmZQcmVmOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeHNyZlRva2VuOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeEdlcnJpdEF1dGg7CiAKICAgcHJpdmF0ZSBzdGF0aWMgTW9ycGhpbmdUYWJQYW5lbCBtZW51TGVmdDsKICAgcHJpdmF0ZSBzdGF0aWMgTGlua01lbnVCYXIgbWVudVJpZ2h0OwogICBwcml2YXRlIHN0YXRpYyBMaW5rTWVudUJhciBkaWZmQmFyOworICBwcml2YXRlIHN0YXRpYyBMaW5rTWVudUJhciBwcm9qZWN0c0JhcjsKICAgcHJpdmF0ZSBzdGF0aWMgUm9vdFBhbmVsIHNpdGVIZWFkZXI7CiAgIHByaXZhdGUgc3RhdGljIFJvb3RQYW5lbCBzaXRlRm9vdGVyOwogICBwcml2YXRlIHN0YXRpYyBTZWFyY2hQYW5lbCBzZWFyY2hQYW5lbDsKQEAgLTIzMyw2ICsyNDgsMTEgQEAKICAgICByZXR1cm4gbXlBY2NvdW50OwogICB9CiAKKyAgLyoqIEByZXR1cm4gYWNjZXNzIHRva2VuIHRvIHByb3ZlIHVzZXIgaWRlbnRpdHkgZHVyaW5nIFJFU1QgQVBJIGNhbGxzLiAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYR2Vycml0QXV0aCgpIHsKKyAgICByZXR1cm4geEdlcnJpdEF1dGg7CisgIH0KKwogICAvKiogQHJldHVybiB0aGUgY3VycmVudGx5IHNpZ25lZCBpbiB1c2VycydzIGRpZmYgcHJlZmVyZW5jZXM7IG51bGwgaWYgbm8gZGlmZiBwcmVmZXJlbmNlcyBkZWZpbmVkIGZvciB0aGUgYWNjb3VudCAqLwogICBwdWJsaWMgc3RhdGljIEFjY291bnREaWZmUHJlZmVyZW5jZSBnZXRBY2NvdW50RGlmZlByZWZlcmVuY2UoKSB7CiAgICAgcmV0dXJuIG15QWNjb3VudERpZmZQcmVmOwpAQCAtMjQ5LDM0ICsyNjksNyBAQAogCiAgIC8qKiBTaWduIHRoZSB1c2VyIGludG8gdGhlIGFwcGxpY2F0aW9uLiAqLwogICBwdWJsaWMgc3RhdGljIHZvaWQgZG9TaWduSW4oU3RyaW5nIHRva2VuKSB7Ci0gICAgc3dpdGNoIChteUNvbmZpZy5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIEhUVFA6Ci0gICAgICBjYXNlIEhUVFBfTERBUDoKLSAgICAgIGNhc2UgQ0xJRU5UX1NTTF9DRVJUX0xEQVA6Ci0gICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046Ci0gICAgICAgIExvY2F0aW9uLmFzc2lnbihsb2dpblJlZGlyZWN0KHRva2VuKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgTG9jYXRpb24uYXNzaWduKHNlbGZSZWRpcmVjdCgiL2JlY29tZSIpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgT1BFTklEX1NTTzoKLSAgICAgICAgZmluYWwgUm9vdFBhbmVsIGdCb2R5ID0gUm9vdFBhbmVsLmdldCgiZ2Vycml0X2JvZHkiKTsKLSAgICAgICAgT3BlbklkU3NvUGFuZWwgc2luZ2xlU2lnbk9uUGFuZWwgPSBuZXcgT3BlbklkU3NvUGFuZWwoKTsKLSAgICAgICAgZ0JvZHkuYWRkKHNpbmdsZVNpZ25PblBhbmVsKTsKLSAgICAgICAgc2luZ2xlU2lnbk9uUGFuZWwuYXV0aGVudGljYXRlKFNpZ25Jbk1vZGUuU0lHTl9JTiwgdG9rZW4pOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBPUEVOSUQ6Ci0gICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2coU2lnbkluTW9kZS5TSUdOX0lOLCB0b2tlbiwgbnVsbCkuY2VudGVyKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIExEQVA6Ci0gICAgICBjYXNlIExEQVBfQklORDoKLSAgICAgICAgbmV3IFVzZXJQYXNzU2lnbkluRGlhbG9nKHRva2VuLCBudWxsKS5jZW50ZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIExvY2F0aW9uLmFzc2lnbihsb2dpblJlZGlyZWN0KHRva2VuKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb2dpblJlZGlyZWN0KFN0cmluZyB0b2tlbikgewpAQCAtMzI3LDcgKzMyMCw3IEBACiAgIHN0YXRpYyB2b2lkIGRlbGV0ZVNlc3Npb25Db29raWUoKSB7CiAgICAgbXlBY2NvdW50ID0gbnVsbDsKICAgICBteUFjY291bnREaWZmUHJlZiA9IG51bGw7Ci0gICAgeHNyZlRva2VuID0gbnVsbDsKKyAgICB4R2Vycml0QXV0aCA9IG51bGw7CiAgICAgcmVmcmVzaE1lbnVCYXIoKTsKIAogICAgIC8vIElmIHRoZSBjb29raWUgd2FzIEh0dHBPbmx5LCB0aGlzIHJlcXVlc3QgdG8gZGVsZXRlIGl0IHdpbGwKQEAgLTM3MCwxOCArMzYzLDIwIEBACiAKICAgICBmaW5hbCBIb3N0UGFnZURhdGFTZXJ2aWNlIGhwZCA9IEdXVC5jcmVhdGUoSG9zdFBhZ2VEYXRhU2VydmljZS5jbGFzcyk7CiAgICAgaHBkLmxvYWQobmV3IEdlcnJpdENhbGxiYWNrPEhvc3RQYWdlRGF0YT4oKSB7CisgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBIb3N0UGFnZURhdGEgcmVzdWx0KSB7CisgICAgICAgIERvY3VtZW50LmdldCgpLmdldEVsZW1lbnRCeUlkKCJnZXJyaXRfaG9zdHBhZ2VkYXRhIikucmVtb3ZlRnJvbVBhcmVudCgpOwogICAgICAgICBteUNvbmZpZyA9IHJlc3VsdC5jb25maWc7CiAgICAgICAgIG15VGhlbWUgPSByZXN1bHQudGhlbWU7CiAgICAgICAgIGlmIChyZXN1bHQuYWNjb3VudCAhPSBudWxsKSB7CiAgICAgICAgICAgbXlBY2NvdW50ID0gcmVzdWx0LmFjY291bnQ7Ci0gICAgICAgICAgeHNyZlRva2VuID0gcmVzdWx0LnhzcmZUb2tlbjsKKyAgICAgICAgICB4R2Vycml0QXV0aCA9IHJlc3VsdC54R2Vycml0QXV0aDsKICAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0LmFjY291bnREaWZmUHJlZiAhPSBudWxsKSB7CiAgICAgICAgICAgbXlBY2NvdW50RGlmZlByZWYgPSByZXN1bHQuYWNjb3VudERpZmZQcmVmOwogICAgICAgICAgIGFwcGx5VXNlclByZWZlcmVuY2VzKCk7CiAgICAgICAgIH0KLSAgICAgICAgb25Nb2R1bGVMb2FkMigpOworICAgICAgICBvbk1vZHVsZUxvYWQyKHJlc3VsdCk7CiAgICAgICB9CiAgICAgfSk7CiAgIH0KQEAgLTQ2Myw3ICs0NTgsNyBAQAogICAgIGJ0bW1lbnUuYWRkKHBvd2VyZWRCeSk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgb25Nb2R1bGVMb2FkMigpIHsKKyAgcHJpdmF0ZSB2b2lkIG9uTW9kdWxlTG9hZDIoSG9zdFBhZ2VEYXRhIGhwZCkgewogICAgIFJFU09VUkNFUy5nd3Rfb3ZlcnJpZGUoKS5lbnN1cmVJbmplY3RlZCgpOwogICAgIFJFU09VUkNFUy5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwogCkBAIC00ODQsOCArNDc5LDggQEAKICAgICBnVG9wTWVudS5hZGQobWVudUxpbmUpOwogICAgIGZpbmFsIEZsb3dQYW5lbCBtZW51UmlnaHRQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKICAgICBtZW51UmlnaHRQYW5lbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLnRvcG1lbnVNZW51UmlnaHQoKSk7Ci0gICAgbWVudVJpZ2h0UGFuZWwuYWRkKG1lbnVSaWdodCk7CiAgICAgbWVudVJpZ2h0UGFuZWwuYWRkKHNlYXJjaFBhbmVsKTsKKyAgICBtZW51UmlnaHRQYW5lbC5hZGQobWVudVJpZ2h0KTsKICAgICBtZW51TGluZS5zZXRXaWRnZXQoMCwgMCwgbWVudUxlZnQpOwogICAgIG1lbnVMaW5lLnNldFdpZGdldCgwLCAxLCBuZXcgRmxvd1BhbmVsKCkpOwogICAgIG1lbnVMaW5lLnNldFdpZGdldCgwLCAyLCBtZW51UmlnaHRQYW5lbCk7CkBAIC01MjIsNyArNTE3LDcgQEAKICAgICBKc29uVXRpbC5zZXREZWZhdWx0WHNyZk1hbmFnZXIobmV3IFhzcmZNYW5hZ2VyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKEpzb25EZWZUYXJnZXQgcHJveHkpIHsKLSAgICAgICAgcmV0dXJuIHhzcmZUb2tlbjsKKyAgICAgICAgcmV0dXJuIHhHZXJyaXRBdXRoOwogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKQEAgLTU0MSw2ICs1MzYsNyBAQAogICAgIHJlZnJlc2hNZW51QmFyKCk7CiAKICAgICBIaXN0b3J5LmFkZFZhbHVlQ2hhbmdlSGFuZGxlcihuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPFN0cmluZz4oKSB7CisgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoZmluYWwgVmFsdWVDaGFuZ2VFdmVudDxTdHJpbmc+IGV2ZW50KSB7CiAgICAgICAgIGRpc3BsYXkoZXZlbnQuZ2V0VmFsdWUoKSk7CiAgICAgICB9CkBAIC01NTYsNyArNTUyLDUwIEBACiAgICAgaWYgKHNpZ25JbkFuY2hvciAhPSBudWxsKSB7CiAgICAgICBzaWduSW5BbmNob3Iuc2V0SHJlZihsb2dpblJlZGlyZWN0KHRva2VuKSk7CiAgICAgfQotICAgIGRpc3BsYXkodG9rZW4pOworICAgIGxvYWRQbHVnaW5zKGhwZCwgdG9rZW4pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRQbHVnaW5zKEhvc3RQYWdlRGF0YSBocGQsIGZpbmFsIFN0cmluZyB0b2tlbikgeworICAgIGlmIChocGQucGx1Z2lucyAhPSBudWxsKSB7CisgICAgICBmb3IgKGZpbmFsIFN0cmluZyB1cmwgOiBocGQucGx1Z2lucykgeworICAgICAgICBTY3JpcHRJbmplY3Rvci5mcm9tVXJsKHVybCkKKyAgICAgICAgICAgIC5zZXRXaW5kb3coU2NyaXB0SW5qZWN0b3IuVE9QX1dJTkRPVykKKyAgICAgICAgICAgIC5zZXRDYWxsYmFjayhuZXcgQ2FsbGJhY2s8Vm9pZCwgRXhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkIHJlc3VsdCkgeworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShFeGNlcHRpb24gcmVhc29uKSB7CisgICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cgZCA9IG5ldyBFcnJvckRpYWxvZyhyZWFzb24pOworICAgICAgICAgICAgICAgIGQuc2V0VGl0bGUoTS5wbHVnaW5GYWlsZWQodXJsKSk7CisgICAgICAgICAgICAgICAgZC5jZW50ZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuaW5qZWN0KCk7CisgICAgICB9CisgICAgfQorCisgICAgQ2FsbGJhY2tIYW5kbGU8Vm9pZD4gY2IgPSBuZXcgQ2FsbGJhY2tIYW5kbGU8Vm9pZD4oCisgICAgICAgIG5ldyBSZXN1bHREZXNlcmlhbGl6ZXI8Vm9pZD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFZvaWQgZnJvbVJlc3VsdChKYXZhU2NyaXB0T2JqZWN0IHJlc3BvbnNlT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWQgcmVzdWx0KSB7CisgICAgICAgICAgICBkaXNwbGF5KHRva2VuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGNiLmluc3RhbGwoKTsKKyAgICBTY3JpcHRJbmplY3Rvci5mcm9tU3RyaW5nKGNiLmdldEZ1bmN0aW9uTmFtZSgpICsgIigpOyIpCisgICAgICAgIC5zZXRXaW5kb3coU2NyaXB0SW5qZWN0b3IuVE9QX1dJTkRPVykKKyAgICAgICAgLmluamVjdCgpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hNZW51QmFyKCkgewpAQCAtNTc3LDkgKzYxNiw5IEBACiAgICAgICBtID0gbmV3IExpbmtNZW51QmFyKCk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15Q2hhbmdlcygpLCBQYWdlTGlua3MuTUlORSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15RHJhZnRzKCksIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KCJpczpkcmFmdCIpKTsKKyAgICAgIGFkZExpbmsobSwgQy5tZW51TXlEcmFmdENvbW1lbnRzKCksIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KCJoYXM6ZHJhZnQiKSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15V2F0Y2hlZENoYW5nZXMoKSwgUGFnZUxpbmtzLnRvQ2hhbmdlUXVlcnkoImlzOndhdGNoZWQgc3RhdHVzOm9wZW4iKSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15U3RhcnJlZENoYW5nZXMoKSwgUGFnZUxpbmtzLnRvQ2hhbmdlUXVlcnkoImlzOnN0YXJyZWQiKSk7Ci0gICAgICBhZGRMaW5rKG0sIEMubWVudU15RHJhZnRDb21tZW50cygpLCBQYWdlTGlua3MudG9DaGFuZ2VRdWVyeSgiaGFzOmRyYWZ0IikpOwogICAgICAgbWVudUxlZnQuYWRkKG0sIEMubWVudU1pbmUoKSk7CiAgICAgICBtZW51TGVmdC5zZWxlY3RUYWIoMSk7CiAgICAgfSBlbHNlIHsKQEAgLTU5Niw0NCArNjM1LDQzIEBACiAgICAgYWRkRGlmZkxpbmsoZGlmZkJhciwgQy5tZW51RGlmZlBhdGNoU2V0cygpLCBQYXRjaFNjcmVlbi5Ub3BWaWV3LlBBVENIX1NFVFMpOwogICAgIGFkZERpZmZMaW5rKGRpZmZCYXIsIEMubWVudURpZmZGaWxlcygpLCBQYXRjaFNjcmVlbi5Ub3BWaWV3LkZJTEVTKTsKIAotICAgIGZpbmFsIExpbmtNZW51QmFyIHByb2plY3RzQmFyID0gbmV3IExpbmtNZW51QmFyKCk7CisgICAgcHJvamVjdHNCYXIgPSBuZXcgTGlua01lbnVCYXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU2NyZWVuTG9hZChTY3JlZW5Mb2FkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldFNjcmVlbigpIGluc3RhbmNlb2YgUHJvamVjdFNjcmVlbikgeworICAgICAgICAgIG1lbnVMZWZ0LnNlbGVjdFRhYihtZW51TGVmdC5nZXRXaWRnZXRJbmRleCh0aGlzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OwogICAgIGFkZExpbmsocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzTGlzdCgpLCBQYWdlTGlua3MuQURNSU5fUFJPSkVDVFMpOwotICAgIGlmKHNpZ25lZEluKSB7CisgICAgYWRkUHJvamVjdExpbmsocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzSW5mbygpLCBQcm9qZWN0U2NyZWVuLklORk8pOworICAgIGFkZFByb2plY3RMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0JyYW5jaGVzKCksIFByb2plY3RTY3JlZW4uQlJBTkNIKTsKKyAgICBhZGRQcm9qZWN0TGluayhwcm9qZWN0c0JhciwgQy5tZW51UHJvamVjdHNBY2Nlc3MoKSwgUHJvamVjdFNjcmVlbi5BQ0NFU1MpOworICAgIGFkZFByb2plY3RMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0Rhc2hib2FyZHMoKSwgUHJvamVjdFNjcmVlbi5EQVNIQk9BUkRTKTsKKyAgICBtZW51TGVmdC5hZGQocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzKCkpOworCisgICAgaWYgKHNpZ25lZEluKSB7CisgICAgICBmaW5hbCBMaW5rTWVudUJhciBwZW9wbGVCYXIgPSBuZXcgTGlua01lbnVCYXIoKTsKKyAgICAgIGFkZExpbmsocGVvcGxlQmFyLCBDLm1lbnVQZW9wbGVHcm91cHNMaXN0KCksIFBhZ2VMaW5rcy5BRE1JTl9HUk9VUFMpOworICAgICAgbWVudUxlZnQuYWRkKHBlb3BsZUJhciwgQy5tZW51UGVvcGxlKCkpOworCisgICAgICBmaW5hbCBMaW5rTWVudUJhciBwbHVnaW5zQmFyID0gbmV3IExpbmtNZW51QmFyKCk7CiAgICAgICBBY2NvdW50Q2FwYWJpbGl0aWVzLmFsbChuZXcgR2Vycml0Q2FsbGJhY2s8QWNjb3VudENhcGFiaWxpdGllcz4oKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQWNjb3VudENhcGFiaWxpdGllcyByZXN1bHQpIHsKICAgICAgICAgICBpZiAocmVzdWx0LmNhblBlcmZvcm0oQ1JFQVRFX1BST0pFQ1QpKSB7CiAgICAgICAgICAgICBhZGRMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0NyZWF0ZSgpLCBQYWdlTGlua3MuQURNSU5fQ1JFQVRFX1BST0pFQ1QpOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgQ1JFQVRFX1BST0pFQ1QpOwotICAgIH0KLSAgICBtZW51TGVmdC5hZGQocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzKCkpOwotCi0gICAgaWYgKHNpZ25lZEluKSB7Ci0gICAgICBmaW5hbCBMaW5rTWVudUJhciBncm91cHNCYXIgPSBuZXcgTGlua01lbnVCYXIoKTsKLSAgICAgIGFkZExpbmsoZ3JvdXBzQmFyLCBDLm1lbnVHcm91cHNMaXN0KCksIFBhZ2VMaW5rcy5BRE1JTl9HUk9VUFMpOwotICAgICAgQWNjb3VudENhcGFiaWxpdGllcy5hbGwobmV3IEdlcnJpdENhbGxiYWNrPEFjY291bnRDYXBhYmlsaXRpZXM+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEFjY291bnRDYXBhYmlsaXRpZXMgcmVzdWx0KSB7CiAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5QZXJmb3JtKENSRUFURV9HUk9VUCkpIHsKLSAgICAgICAgICAgIGFkZExpbmsoZ3JvdXBzQmFyLCBDLm1lbnVHcm91cHNDcmVhdGUoKSwgUGFnZUxpbmtzLkFETUlOX0NSRUFURV9HUk9VUCk7CisgICAgICAgICAgICBhZGRMaW5rKHBlb3BsZUJhciwgQy5tZW51UGVvcGxlR3JvdXBzQ3JlYXRlKCksIFBhZ2VMaW5rcy5BRE1JTl9DUkVBVEVfR1JPVVApOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgQ1JFQVRFX0dST1VQKTsKLSAgICAgIG1lbnVMZWZ0LmFkZChncm91cHNCYXIsIEMubWVudUdyb3VwcygpKTsKLQotICAgICAgZmluYWwgTGlua01lbnVCYXIgcGx1Z2luc0JhciA9IG5ldyBMaW5rTWVudUJhcigpOwotICAgICAgQWNjb3VudENhcGFiaWxpdGllcy5hbGwobmV3IEdlcnJpdENhbGxiYWNrPEFjY291bnRDYXBhYmlsaXRpZXM+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEFjY291bnRDYXBhYmlsaXRpZXMgcmVzdWx0KSB7CiAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5QZXJmb3JtKEFETUlOSVNUUkFURV9TRVJWRVIpKSB7CiAgICAgICAgICAgICBhZGRMaW5rKHBsdWdpbnNCYXIsIEMubWVudVBsdWdpbnNJbnN0YWxsZWQoKSwgUGFnZUxpbmtzLkFETUlOX1BMVUdJTlMpOwogICAgICAgICAgICAgbWVudUxlZnQuaW5zZXJ0KHBsdWdpbnNCYXIsIEMubWVudVBsdWdpbnMoKSwKLSAgICAgICAgICAgICAgICBtZW51TGVmdC5nZXRXaWRnZXRJbmRleChncm91cHNCYXIpICsgMSk7CisgICAgICAgICAgICAgICAgbWVudUxlZnQuZ2V0V2lkZ2V0SW5kZXgocGVvcGxlQmFyKSArIDEpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfSwgQURNSU5JU1RSQVRFX1NFUlZFUik7CisgICAgICB9LCBDUkVBVEVfUFJPSkVDVCwgQ1JFQVRFX0dST1VQLCBBRE1JTklTVFJBVEVfU0VSVkVSKTsKICAgICB9CiAKICAgICBpZiAoZ2V0Q29uZmlnKCkuaXNEb2N1bWVudGF0aW9uQXZhaWxhYmxlKCkpIHsKQEAgLTY0MiwxNSArNjgwLDEyIEBACiAgICAgICBhZGREb2NMaW5rKG0sIEMubWVudURvY3VtZW50YXRpb25TZWFyY2goKSwgInVzZXItc2VhcmNoLmh0bWwiKTsKICAgICAgIGFkZERvY0xpbmsobSwgQy5tZW51RG9jdW1lbnRhdGlvblVwbG9hZCgpLCAidXNlci11cGxvYWQuaHRtbCIpOwogICAgICAgYWRkRG9jTGluayhtLCBDLm1lbnVEb2N1bWVudGF0aW9uQWNjZXNzKCksICJhY2Nlc3MtY29udHJvbC5odG1sIik7CisgICAgICBhZGREb2NMaW5rKG0sIEMubWVudURvY3VtZW50YXRpb25BUEkoKSwgInJlc3QtYXBpLmh0bWwiKTsKICAgICAgIG1lbnVMZWZ0LmFkZChtLCBDLm1lbnVEb2N1bWVudGF0aW9uKCkpOwogICAgIH0KIAogICAgIGlmIChzaWduZWRJbikgewotICAgICAgd2hvQW1JKCk7Ci0gICAgICBhZGRMaW5rKG1lbnVSaWdodCwgQy5tZW51U2V0dGluZ3MoKSwgUGFnZUxpbmtzLlNFVFRJTkdTKTsKLSAgICAgIGlmIChjZmcuZ2V0QXV0aFR5cGUoKSAhPSBBdXRoVHlwZS5DTElFTlRfU1NMX0NFUlRfTERBUCkgewotICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcihDLm1lbnVTaWduT3V0KCksIHNlbGZSZWRpcmVjdCgiL2xvZ291dCIpKSk7Ci0gICAgICB9CisgICAgICB3aG9BbUkoY2ZnLmdldEF1dGhUeXBlKCkgIT0gQXV0aFR5cGUuQ0xJRU5UX1NTTF9DRVJUX0xEQVApOwogICAgIH0gZWxzZSB7CiAgICAgICBzd2l0Y2ggKGNmZy5nZXRBdXRoVHlwZSgpKSB7CiAgICAgICAgIGNhc2UgSFRUUDoKQEAgLTY2MSw4ICs2OTYsMTEgQEAKICAgICAgICAgY2FzZSBPUEVOSUQ6CiAgICAgICAgICAgbWVudVJpZ2h0LmFkZEl0ZW0oQy5tZW51UmVnaXN0ZXIoKSwgbmV3IENvbW1hbmQoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG8gPSBIaXN0b3J5LmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2coU2lnbkluTW9kZS5SRUdJU1RFUiwgdG8sIG51bGwpLmNlbnRlcigpOworICAgICAgICAgICAgICBTdHJpbmcgdCA9IEhpc3RvcnkuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSAiIjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkb1NpZ25JbihQYWdlTGlua3MuUkVHSVNURVIgKyB0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9KTsKICAgICAgICAgICBtZW51UmlnaHQuYWRkSXRlbShDLm1lbnVTaWduSW4oKSwgbmV3IENvbW1hbmQoKSB7CkBAIC02ODQsNyArNzIyLDggQEAKICAgICAgICAgY2FzZSBMREFQX0JJTkQ6CiAgICAgICAgIGNhc2UgQ1VTVE9NX0VYVEVOU0lPTjoKICAgICAgICAgICBpZiAoY2ZnLmdldFJlZ2lzdGVyVXJsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVudVJpZ2h0LmFkZChhbmNob3IoQy5tZW51UmVnaXN0ZXIoKSwgY2ZnLmdldFJlZ2lzdGVyVXJsKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWdpc3RlclRleHQgPSBjZmcuZ2V0UmVnaXN0ZXJUZXh0KCkgPT0gbnVsbCA/IEMubWVudVJlZ2lzdGVyKCkgOiBjZmcuZ2V0UmVnaXN0ZXJUZXh0KCk7CisgICAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcihyZWdpc3RlclRleHQsIGNmZy5nZXRSZWdpc3RlclVybCgpKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIG1lbnVSaWdodC5hZGRJdGVtKEMubWVudVNpZ25JbigpLCBuZXcgQ29tbWFuZCgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CkBAIC02OTQsNyArNzMzLDcgQEAKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcigiQmVjb21lIiwgc2VsZlJlZGlyZWN0KCIvYmVjb21lIikpKTsKKyAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcigiQmVjb21lIiwgbG9naW5SZWRpcmVjdCgiIikpKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC03MTQsMTcgKzc1Myw1NCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgd2hvQW1JKCkgewotICAgIGZpbmFsIFN0cmluZyBuYW1lID0gRm9ybWF0VXRpbC5uYW1lRW1haWwoZ2V0VXNlckFjY291bnQoKSk7Ci0gICAgZmluYWwgSW5saW5lTGFiZWwgbCA9IG5ldyBJbmxpbmVMYWJlbChuYW1lKTsKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3aG9BbUkoYm9vbGVhbiBjYW5Mb2dPdXQpIHsKKyAgICBBY2NvdW50IGFjY291bnQgPSBnZXRVc2VyQWNjb3VudCgpOworICAgIGZpbmFsIEN1cnJlbnRVc2VyUG9wdXBQYW5lbCB1c2VyUG9wdXAgPQorICAgICAgICBuZXcgQ3VycmVudFVzZXJQb3B1cFBhbmVsKGFjY291bnQsIGNhbkxvZ091dCk7CisgICAgZmluYWwgRmxvd1BhbmVsIHVzZXJTdW1tYXJ5UGFuZWwgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgY2xhc3MgUG9wdXBIYW5kbGVyIGltcGxlbWVudHMgS2V5RG93bkhhbmRsZXIsIENsaWNrSGFuZGxlciB7CisgICAgICBwcml2YXRlIHZvaWQgc2hvd0hpZGVQb3B1cCgpIHsKKyAgICAgICAgaWYgKHVzZXJQb3B1cC5pc1Nob3dpbmcoKSAmJiB1c2VyUG9wdXAuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICB1c2VyUG9wdXAuaGlkZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVzZXJQb3B1cC5zaG93UmVsYXRpdmVUbyh1c2VyU3VtbWFyeVBhbmVsKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBzaG93SGlkZVBvcHVwKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25LZXlEb3duKEtleURvd25FdmVudCBldmVudCkgeworICAgICAgICBpZihldmVudC5nZXROYXRpdmVLZXlDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7CisgICAgICAgICAgc2hvd0hpZGVQb3B1cCgpOworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmluYWwgUG9wdXBIYW5kbGVyIHBvcHVwSGFuZGxlciA9IG5ldyBQb3B1cEhhbmRsZXIoKTsKKyAgICBmaW5hbCBJbmxpbmVMYWJlbCBsID0gbmV3IElubGluZUxhYmVsKEZvcm1hdFV0aWwubmFtZShhY2NvdW50KSk7CiAgICAgbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZSgpKTsKLSAgICBtZW51UmlnaHQuYWRkKGwpOworICAgIGZpbmFsIEF2YXRhckltYWdlIGF2YXRhciA9IG5ldyBBdmF0YXJJbWFnZShhY2NvdW50LmdldElkKCksIDI2KTsKKyAgICBhdmF0YXIuc2V0U3R5bGVOYW1lKFJFU09VUkNFUy5jc3MoKS5tZW51QmFyVXNlck5hbWVBdmF0YXIoKSk7CisgICAgdXNlclN1bW1hcnlQYW5lbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZVBhbmVsKCkpOworICAgIHVzZXJTdW1tYXJ5UGFuZWwuYWRkKGwpOworICAgIHVzZXJTdW1tYXJ5UGFuZWwuYWRkKGF2YXRhcik7CisgICAgdXNlclN1bW1hcnlQYW5lbC5hZGQobmV3IElubGluZUxhYmVsKCIg4pa+IikpOworICAgIHVzZXJQb3B1cC5hZGRBdXRvSGlkZVBhcnRuZXIodXNlclN1bW1hcnlQYW5lbC5nZXRFbGVtZW50KCkpOworICAgIEZvY3VzUGFuZWwgZnAgPSBuZXcgRm9jdXNQYW5lbCh1c2VyU3VtbWFyeVBhbmVsKTsKKyAgICBmcC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZUZvY3VzUGFuZWwoKSk7CisgICAgZnAuYWRkS2V5RG93bkhhbmRsZXIocG9wdXBIYW5kbGVyKTsKKyAgICBmcC5hZGRDbGlja0hhbmRsZXIocG9wdXBIYW5kbGVyKTsKKyAgICBtZW51UmlnaHQuYWRkKGZwKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIEFuY2hvciBhbmNob3IoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyB0bykgewogICAgIGZpbmFsIEFuY2hvciBhID0gbmV3IEFuY2hvcih0ZXh0LCB0byk7CiAgICAgYS5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVJdGVtKCkpOwotICAgIEFjY2Vzc2liaWxpdHkuc2V0Um9sZShhLmdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX01FTlVJVEVNKTsKKyAgICBSb2xlcy5nZXRNZW51aXRlbVJvbGUoKS5zZXQoYS5nZXRFbGVtZW50KCkpOwogICAgIHJldHVybiBhOwogICB9CiAKQEAgLTc0Niw2ICs4MjIsMzAgQEAKICAgICAgIH0pOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9qZWN0TGluayhmaW5hbCBMaW5rTWVudUJhciBtLCBmaW5hbCBTdHJpbmcgdGV4dCwKKyAgICAgIGZpbmFsIFN0cmluZyBwYW5lbCkgeworICAgIG0uYWRkSXRlbShuZXcgTGlua01lbnVJdGVtKHRleHQsICIiKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNjcmVlbkxvYWQoU2NyZWVuTG9hZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgU2NyZWVuIHNjcmVlbiA9IGV2ZW50LmdldFNjcmVlbigpOworICAgICAgICAgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0S2V5OworICAgICAgICAgIGlmIChzY3JlZW4gaW5zdGFuY2VvZiBQcm9qZWN0U2NyZWVuKSB7CisgICAgICAgICAgICBwcm9qZWN0S2V5ID0gKChQcm9qZWN0U2NyZWVuKXNjcmVlbikuZ2V0UHJvamVjdEtleSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9qZWN0S2V5ID0gUHJvamVjdFNjcmVlbi5nZXRTYXZlZEtleSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwcm9qZWN0S2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRUYXJnZXRIaXN0b3J5VG9rZW4oRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbihwcm9qZWN0S2V5LCBwYW5lbCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3VwZXIub25TY3JlZW5Mb2FkKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERpZmZMaW5rKGZpbmFsIExpbmtNZW51QmFyIG0sIGZpbmFsIFN0cmluZyB0ZXh0LAogICAgICAgZmluYWwgUGF0Y2hTY3JlZW4uVHlwZSB0eXBlKSB7CiAgICAgbS5hZGRJdGVtKG5ldyBMaW5rTWVudUl0ZW0odGV4dCwgIiIpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMuamF2YQppbmRleCA4N2MwMWNjLi42ODNmMDU4IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q29uc3RhbnRzLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5qYXZhCkBAIC00NCw3ICs0NCw2IEBACiAKICAgU3RyaW5nIG5vdEZvdW5kVGl0bGUoKTsKICAgU3RyaW5nIG5vdEZvdW5kQm9keSgpOwotICBTdHJpbmcgbmFtZUFscmVhZHlVc2VkQm9keSgpOwogICBTdHJpbmcgbm9TdWNoQWNjb3VudFRpdGxlKCk7CiAKICAgU3RyaW5nIG5vU3VjaEdyb3VwVGl0bGUoKTsKQEAgLTcxLDEyICs3MCwxNiBAQAogCiAgIFN0cmluZyBtZW51UHJvamVjdHMoKTsKICAgU3RyaW5nIG1lbnVQcm9qZWN0c0xpc3QoKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0luZm8oKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0JyYW5jaGVzKCk7CisgIFN0cmluZyBtZW51UHJvamVjdHNBY2Nlc3MoKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0Rhc2hib2FyZHMoKTsKICAgU3RyaW5nIG1lbnVQcm9qZWN0c0NyZWF0ZSgpOwogCiAgIFN0cmluZyBtZW51UGVvcGxlKCk7Ci0gIFN0cmluZyBtZW51R3JvdXBzKCk7Ci0gIFN0cmluZyBtZW51R3JvdXBzTGlzdCgpOwotICBTdHJpbmcgbWVudUdyb3Vwc0NyZWF0ZSgpOworICBTdHJpbmcgbWVudVBlb3BsZUdyb3Vwc0xpc3QoKTsKKyAgU3RyaW5nIG1lbnVQZW9wbGVHcm91cHNDcmVhdGUoKTsKKwogICBTdHJpbmcgbWVudVBsdWdpbnMoKTsKICAgU3RyaW5nIG1lbnVQbHVnaW5zSW5zdGFsbGVkKCk7CiAKQEAgLTg1LDYgKzg4LDcgQEAKICAgU3RyaW5nIG1lbnVEb2N1bWVudGF0aW9uU2VhcmNoKCk7CiAgIFN0cmluZyBtZW51RG9jdW1lbnRhdGlvblVwbG9hZCgpOwogICBTdHJpbmcgbWVudURvY3VtZW50YXRpb25BY2Nlc3MoKTsKKyAgU3RyaW5nIG1lbnVEb2N1bWVudGF0aW9uQVBJKCk7CiAKICAgU3RyaW5nIHNlYXJjaEhpbnQoKTsKICAgU3RyaW5nIHNlYXJjaEJ1dHRvbigpOwpAQCAtMTA4LDQgKzExMiw2IEBACiAKICAgU3RyaW5nIHByb2plY3RBY2Nlc3NFcnJvcigpOwogICBTdHJpbmcgcHJvamVjdEFjY2Vzc1Byb3Bvc2VGb3JSZXZpZXdIaW50KCk7CisKKyAgU3RyaW5nIHVzZXJDYW5ub3RWb3RlVG9vbFRpcCgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IDU5NmIzYWQuLmRlZmM3ZTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTExLDcgKzExLDcgQEAKIHJlZ2lzdGVyRGlhbG9nVGl0bGUgPSBDb2RlIFJldmlldyAtIFJlZ2lzdGVyIE5ldyBBY2NvdW50CiBsb2dpblR5cGVVbnN1cHBvcnRlZCA9IFNpZ24gaW4gaXMgbm90IGF2YWlsYWJsZS4KIAotZXJyb3JEaWFsb2dUaXRsZSA9IEFwcGxpY2F0aW9uIEVycm9yCitlcnJvckRpYWxvZ1RpdGxlID0gQ29kZSBSZXZpZXcgLSBFcnJvcgogZXJyb3JEaWFsb2dDb250aW51ZSA9IENvbnRpbnVlCiAKIGNvbmZpcm1hdGlvbkRpYWxvZ09rID0gT0sKQEAgLTI3LDcgKzI3LDYgQEAKIAogbm90Rm91bmRUaXRsZSA9IE5vdCBGb3VuZAogbm90Rm91bmRCb2R5ID0gVGhlIHBhZ2UgeW91IHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLCBvciB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgcGFnZS4KLW5hbWVBbHJlYWR5VXNlZEJvZHkgPSBUaGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KIG5vU3VjaEFjY291bnRUaXRsZSA9IENvZGUgUmV2aWV3IC0gVW5rbm93biBVc2VyCiAKIG5vU3VjaEdyb3VwVGl0bGUgPSBDb2RlIFJldmlldyAtIFVua25vd24gR3JvdXAKQEAgLTU0LDEyICs1MywxNSBAQAogCiBtZW51UHJvamVjdHMgPSBQcm9qZWN0cwogbWVudVByb2plY3RzTGlzdCA9IExpc3QKK21lbnVQcm9qZWN0c0luZm8gPSBHZW5lcmFsCittZW51UHJvamVjdHNCcmFuY2hlcyA9IEJyYW5jaGVzCittZW51UHJvamVjdHNBY2Nlc3MgPSBBY2Nlc3MKK21lbnVQcm9qZWN0c0Rhc2hib2FyZHMgPSBEYXNoYm9hcmRzCiBtZW51UHJvamVjdHNDcmVhdGUgPSBDcmVhdGUgTmV3IFByb2plY3QKIAogbWVudVBlb3BsZSA9IFBlb3BsZQotbWVudUdyb3VwcyA9IEdyb3VwcwotbWVudUdyb3Vwc0xpc3QgPSBMaXN0Ci1tZW51R3JvdXBzQ3JlYXRlID0gQ3JlYXRlIE5ldyBHcm91cAorbWVudVBlb3BsZUdyb3Vwc0xpc3QgPSBMaXN0IEdyb3VwcworbWVudVBlb3BsZUdyb3Vwc0NyZWF0ZSA9IENyZWF0ZSBOZXcgR3JvdXAKIAogbWVudVBsdWdpbnMgPSBQbHVnaW5zCiBtZW51UGx1Z2luc0luc3RhbGxlZCA9IEluc3RhbGxlZApAQCAtNjksOCArNzEsOSBAQAogbWVudURvY3VtZW50YXRpb25TZWFyY2ggPSBTZWFyY2hpbmcKIG1lbnVEb2N1bWVudGF0aW9uVXBsb2FkID0gVXBsb2FkaW5nCiBtZW51RG9jdW1lbnRhdGlvbkFjY2VzcyA9IEFjY2VzcyBDb250cm9scworbWVudURvY3VtZW50YXRpb25BUEkgPSBSRVNUIEFQSQogCi1zZWFyY2hIaW50ID0gQ2hhbmdlICMsIFNIQS0xLCB0cjppZCwgb3duZXI6ZW1haWwgb3IgcmV2aWV3ZXI6ZW1haWwKK3NlYXJjaEhpbnQgPSBDaGFuZ2UgIywgU0hBLTEsIHRyOmlkIG9yIG93bmVyOmVtYWlsCiBzZWFyY2hCdXR0b24gPSBTZWFyY2gKIAogcnBjU3RhdHVzV29ya2luZyA9IFdvcmtpbmcgLi4uCkBAIC05MiwzICs5NSw1IEBACiAKIHByb2plY3RBY2Nlc3NFcnJvciA9IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgYWNjZXNzIHJpZ2h0cyBmb3IgdGhlIGZvbGxvd2luZyByZWZzOgogcHJvamVjdEFjY2Vzc1Byb3Bvc2VGb3JSZXZpZXdIaW50ID0gWW91IG1heSBwcm9wb3NlIHRoZXNlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHByb2plY3Qgb3duZXJzIGJ5IGNsaWNraW5nIG9uICdTYXZlIGZvciBSZXZpZXcnLgorCit1c2VyQ2Fubm90Vm90ZVRvb2xUaXAgPSBVc2VyIGNhbm5vdCB2b3RlIGluIHRoaXMgY2F0ZWdvcnkKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDc3MuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDc3MuamF2YQppbmRleCA5Y2JmNWNkLi40ODlmZjAwIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q3NzLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENzcy5qYXZhCkBAIC0xNywyMiArMTcsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwogCiBwdWJsaWMgaW50ZXJmYWNlIEdlcnJpdENzcyBleHRlbmRzIENzc1Jlc291cmNlIHsKLSAgU3RyaW5nIGdyZWVuQ2hlY2tDbGFzcygpOwogICBTdHJpbmcgYWNjb3VudENvbnRhY3RPbkZpbGUoKTsKICAgU3RyaW5nIGFjY291bnRDb250YWN0UHJpdmFjeURldGFpbHMoKTsKICAgU3RyaW5nIGFjY291bnREYXNoYm9hcmQoKTsKICAgU3RyaW5nIGFjY291bnRJbmZvQmxvY2soKTsKICAgU3RyaW5nIGFjY291bnROYW1lKCk7Ci0gIFN0cmluZyBhY2NvdW50VXNlcm5hbWUoKTsKICAgU3RyaW5nIGFjY291bnRQYXNzd29yZCgpOworICBTdHJpbmcgYWNjb3VudFVzZXJuYW1lKCk7CiAgIFN0cmluZyBhY3RpdmVSb3coKTsKKyAgU3RyaW5nIGFkZEJyYW5jaCgpOwogICBTdHJpbmcgYWRkTWVtYmVyVGV4dEJveCgpOwogICBTdHJpbmcgYWRkUmV2aWV3ZXIoKTsKLSAgU3RyaW5nIHJlbW92ZVJldmlld2VyKCk7Ci0gIFN0cmluZyByZW1vdmVSZXZpZXdlckNlbGwoKTsKICAgU3RyaW5nIGFkZFNzaEtleVBhbmVsKCk7CiAgIFN0cmluZyBhZGRXYXRjaFBhbmVsKCk7Ci0gIFN0cmluZyBhcHByb3ZhbENhdGVnb3J5TGlzdCgpOwogICBTdHJpbmcgYXBwcm92YWxUYWJsZSgpOwogICBTdHJpbmcgYXBwcm92YWxoaW50KCk7CiAgIFN0cmluZyBhcHByb3ZhbHJvbGUoKTsKQEAgLTQwLDEyICszNywxMyBAQAogICBTdHJpbmcgYmxvY2tIZWFkZXIoKTsKICAgU3RyaW5nIGJvdHRvbWhlYWRlcigpOwogICBTdHJpbmcgY0FQUFJPVkFMKCk7Ci0gIFN0cmluZyBjSUQoKTsKICAgU3RyaW5nIGNMYXN0VXBkYXRlKCk7Ci0gIFN0cmluZyBjUFJPSkVDVCgpOworICBTdHJpbmcgY09XTkVSKCk7CiAgIFN0cmluZyBjU1VCSkVDVCgpOworICBTdHJpbmcgY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpOwogICBTdHJpbmcgY2hhbmdlQ29tbWVudHMoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9jaygpOworICBTdHJpbmcgY2hhbmdlSW5mb1RvcGljUGFuZWwoKTsKICAgU3RyaW5nIGNoYW5nZVNjcmVlbigpOwogICBTdHJpbmcgY2hhbmdlU2NyZWVuRGVzY3JpcHRpb24oKTsKICAgU3RyaW5nIGNoYW5nZVNjcmVlblN0YXJJY29uKCk7CkBAIC01NCwyMyArNTIsMjQgQEAKICAgU3RyaW5nIGNoYW5nZVR5cGVDZWxsKCk7CiAgIFN0cmluZyBjaGFuZ2VpZCgpOwogICBTdHJpbmcgY2xvc2Vkc3RhdGUoKTsKLSAgU3RyaW5nIGNvbW1lbnRlZEFjdGlvbkRpYWxvZygpOwotICBTdHJpbmcgY29tbWVudGVkQWN0aW9uTWVzc2FnZSgpOwogICBTdHJpbmcgY29tbWVudENlbGwoKTsKICAgU3RyaW5nIGNvbW1lbnRFZGl0b3JQYW5lbCgpOwogICBTdHJpbmcgY29tbWVudEhvbGRlcigpOworICBTdHJpbmcgY29tbWVudEhvbGRlckxlZnRtb3N0KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWwoKTsKLSAgU3RyaW5nIGNvbW1lbnRQYW5lbEJvcmRlcigpOwogICBTdHJpbmcgY29tbWVudFBhbmVsQXV0aG9yQ2VsbCgpOworICBTdHJpbmcgY29tbWVudFBhbmVsQm9yZGVyKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxCdXR0b25zKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxDb250ZW50KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxEYXRlQ2VsbCgpOwogICBTdHJpbmcgY29tbWVudFBhbmVsSGVhZGVyKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxMYXN0KCk7Ci0gIFN0cmluZyBjb21tZW50UGFuZWxNZXNzYWdlKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxNZW51QmFyKCk7CisgIFN0cmluZyBjb21tZW50UGFuZWxNZXNzYWdlKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxTdW1tYXJ5KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxTdW1tYXJ5Q2VsbCgpOworICBTdHJpbmcgY29tbWVudGVkQWN0aW9uRGlhbG9nKCk7CisgIFN0cmluZyBjb21tZW50ZWRBY3Rpb25NZXNzYWdlKCk7CiAgIFN0cmluZyBjb21wbGV4SGVhZGVyKCk7CiAgIFN0cmluZyBjb250ZW50KCk7CiAgIFN0cmluZyBjb250cmlidXRvckFncmVlbWVudEFscmVhZHlTdWJtaXR0ZWQoKTsKQEAgLTg3LDI1ICs4NiwyNyBAQAogICBTdHJpbmcgZGlmZlRleHRDT05URVhUKCk7CiAgIFN0cmluZyBkaWZmVGV4dERFTEVURSgpOwogICBTdHJpbmcgZGlmZlRleHRGaWxlSGVhZGVyKCk7CisgIFN0cmluZyBkaWZmVGV4dEZvckJpbmFyeUluU2lkZUJ5U2lkZSgpOwogICBTdHJpbmcgZGlmZlRleHRIdW5rSGVhZGVyKCk7CiAgIFN0cmluZyBkaWZmVGV4dElOU0VSVCgpOwogICBTdHJpbmcgZGlmZlRleHROb0xGKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmsoKTsKLSAgU3RyaW5nIGRvd25sb2FkTGlua19BY3RpdmUoKTsKLSAgU3RyaW5nIGRvd25sb2FkTGlua0xpc3RDZWxsKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmtDb3B5TGFiZWwoKTsKICAgU3RyaW5nIGRvd25sb2FkTGlua0hlYWRlcigpOwogICBTdHJpbmcgZG93bmxvYWRMaW5rSGVhZGVyR2FwKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmtMaXN0KCk7CisgIFN0cmluZyBkb3dubG9hZExpbmtMaXN0Q2VsbCgpOworICBTdHJpbmcgZG93bmxvYWRMaW5rX0FjdGl2ZSgpOwogICBTdHJpbmcgZHJhZnRzKCk7CiAgIFN0cmluZyBlbXB0eVNlY3Rpb24oKTsKICAgU3RyaW5nIGVycm9yRGlhbG9nKCk7Ci0gIFN0cmluZyBlcnJvckRpYWxvZ0dsYXNzKCk7Ci0gIFN0cmluZyBlcnJvckRpYWxvZ1RpdGxlKCk7CiAgIFN0cmluZyBlcnJvckRpYWxvZ0J1dHRvbnMoKTsKICAgU3RyaW5nIGVycm9yRGlhbG9nRXJyb3JUeXBlKCk7CisgIFN0cmluZyBlcnJvckRpYWxvZ0dsYXNzKCk7CiAgIFN0cmluZyBlcnJvckRpYWxvZ1RleHQoKTsKKyAgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGUoKTsKICAgU3RyaW5nIGZpbGVDb2x1bW5IZWFkZXIoKTsKKyAgU3RyaW5nIGZpbGVDb21tZW50Qm9yZGVyKCk7CiAgIFN0cmluZyBmaWxlTGluZSgpOwogICBTdHJpbmcgZmlsZUxpbmVDT05URVhUKCk7CiAgIFN0cmluZyBmaWxlTGluZURFTEVURSgpOwpAQCAtMTEzLDggKzExNCw5IEBACiAgIFN0cmluZyBmaWxlTGluZU1vZGUoKTsKICAgU3RyaW5nIGZpbGVMaW5lTm9uZSgpOwogICBTdHJpbmcgZmlsZVBhdGhDZWxsKCk7Ci0gIFN0cmluZyBnZXJyaXRUb3BNZW51KCk7CiAgIFN0cmluZyBnZXJyaXRCb2R5KCk7CisgIFN0cmluZyBnZXJyaXRUb3BNZW51KCk7CisgIFN0cmluZyBncmVlbkNoZWNrQ2xhc3MoKTsKICAgU3RyaW5nIGdyb3VwRGVzY3JpcHRpb25QYW5lbCgpOwogICBTdHJpbmcgZ3JvdXBFeHRlcm5hbE5hbWVGaWx0ZXJUZXh0Qm94KCk7CiAgIFN0cmluZyBncm91cEluY2x1ZGVzVGFibGUoKTsKQEAgLTEyNSwyNCArMTI3LDI5IEBACiAgIFN0cmluZyBncm91cE9wdGlvbnNQYW5lbCgpOwogICBTdHJpbmcgZ3JvdXBPd25lclBhbmVsKCk7CiAgIFN0cmluZyBncm91cE93bmVyVGV4dEJveCgpOwotICBTdHJpbmcgZ3JvdXBUeXBlUGFuZWwoKTsKICAgU3RyaW5nIGdyb3VwVHlwZVNlbGVjdExpc3RCb3goKTsKICAgU3RyaW5nIGdyb3VwVVVJRFBhbmVsKCk7CiAgIFN0cmluZyBoZWFkZXIoKTsKICAgU3RyaW5nIGh5cGVybGluaygpOwogICBTdHJpbmcgaWNvbkNlbGwoKTsKKyAgU3RyaW5nIGljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpOwogICBTdHJpbmcgaWNvbkhlYWRlcigpOwogICBTdHJpbmcgaWRlbnRpdHlVbnRydXN0ZWRFeHRlcm5hbElkKCk7CiAgIFN0cmluZyBpbmZvQmxvY2soKTsKICAgU3RyaW5nIGluZm9UYWJsZSgpOwogICBTdHJpbmcgaW5wdXRGaWVsZFR5cGVIaW50KCk7CiAgIFN0cmluZyBrZXloZWxwKCk7CisgIFN0cmluZyBsYWJlbExpc3QoKTsKICAgU3RyaW5nIGxlZnRNb3N0Q2VsbCgpOwogICBTdHJpbmcgbGluZUhlYWRlcigpOwogICBTdHJpbmcgbGluZU51bWJlcigpOworICBTdHJpbmcgbGluaygpOwogICBTdHJpbmcgbGlua01lbnVCYXIoKTsKICAgU3RyaW5nIGxpbmtNZW51SXRlbU5vdExhc3QoKTsKICAgU3RyaW5nIG1lbnVCYXJVc2VyTmFtZSgpOworICBTdHJpbmcgbWVudUJhclVzZXJOYW1lQXZhdGFyKCk7CisgIFN0cmluZyBtZW51QmFyVXNlck5hbWVGb2N1c1BhbmVsKCk7CisgIFN0cmluZyBtZW51QmFyVXNlck5hbWVQYW5lbCgpOwogICBTdHJpbmcgbWVudUl0ZW0oKTsKICAgU3RyaW5nIG1lbnVTY3JlZW5NZW51QmFyKCk7CiAgIFN0cmluZyBtaXNzaW5nQXBwcm92YWwoKTsKQEAgLTE1MiwxMCArMTU5LDEyIEBACiAgIFN0cmluZyBuZWdzY29yZSgpOwogICBTdHJpbmcgbm9MaW5lTGluZU51bWJlcigpOwogICBTdHJpbmcgbm9ib3JkZXIoKTsKKyAgU3RyaW5nIG5vdFZvdGFibGUoKTsKICAgU3RyaW5nIG91dGRhdGVkKCk7CiAgIFN0cmluZyBwYXJlbnRzVGFibGUoKTsKICAgU3RyaW5nIHBhdGNoQnJvd3NlclBvcHVwKCk7CiAgIFN0cmluZyBwYXRjaEJyb3dzZXJQb3B1cEJvZHkoKTsKKyAgU3RyaW5nIHBhdGNoQ2VsbFJldmVyc2VEaWZmKCk7CiAgIFN0cmluZyBwYXRjaENvbW1lbnRzKCk7CiAgIFN0cmluZyBwYXRjaENvbnRlbnRUYWJsZSgpOwogICBTdHJpbmcgcGF0Y2hIaXN0b3J5VGFibGUoKTsKQEAgLTE3MCwxMiArMTc5LDE4IEBACiAgIFN0cmluZyBwYXRjaFNpemVDZWxsKCk7CiAgIFN0cmluZyBwbHVnaW5zVGFibGUoKTsKICAgU3RyaW5nIHBvc3Njb3JlKCk7Ci0gIFN0cmluZyBwcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5UmFuZ2VMaW5lKCk7Ci0gIFN0cmluZyBwcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5VmFsdWUoKTsKKyAgU3RyaW5nIHByb2plY3RBZG1pbkxhYmVsUmFuZ2VMaW5lKCk7CisgIFN0cmluZyBwcm9qZWN0QWRtaW5MYWJlbFZhbHVlKCk7CisgIFN0cmluZyBwcm9qZWN0RmlsdGVyTGFiZWwoKTsKKyAgU3RyaW5nIHByb2plY3RGaWx0ZXJQYW5lbCgpOwogICBTdHJpbmcgcHVibGlzaENvbW1lbnRzU2NyZWVuKCk7CiAgIFN0cmluZyByZWdpc3RlclNjcmVlbkV4cGxhaW4oKTsKICAgU3RyaW5nIHJlZ2lzdGVyU2NyZWVuTmV4dExpbmtzKCk7CiAgIFN0cmluZyByZWdpc3RlclNjcmVlblNlY3Rpb24oKTsKKyAgU3RyaW5nIHJlbW92ZVJldmlld2VyKCk7CisgIFN0cmluZyByZW1vdmVSZXZpZXdlckNlbGwoKTsKKyAgU3RyaW5nIHJldmlld2VkUGFuZWxCb3R0b20oKTsKKyAgU3RyaW5nIHJpZ2h0Qm9yZGVyKCk7CiAgIFN0cmluZyByaWdodG1vc3QoKTsKICAgU3RyaW5nIHJwY1N0YXR1cygpOwogICBTdHJpbmcgcnBjU3RhdHVzTG9hZGluZygpOwpAQCAtMTg1LDggKzIwMCwxMCBAQAogICBTdHJpbmcgc2NyZWVuTm9IZWFkZXIoKTsKICAgU3RyaW5nIHNlYXJjaFBhbmVsKCk7CiAgIFN0cmluZyBzZWN0aW9uSGVhZGVyKCk7CisgIFN0cmluZyBzZWxlY3RQYXRjaFNldE9sZFZlcnNpb24oKTsKICAgU3RyaW5nIHNpZGVCeVNpZGVTY3JlZW5MaW5rVGFibGUoKTsKICAgU3RyaW5nIHNpZGVCeVNpZGVTY3JlZW5TaWRlQnlTaWRlVGFibGUoKTsKKyAgU3RyaW5nIHNpZGVCeVNpZGVUYWJsZUJpbmFyeUhlYWRlcigpOwogICBTdHJpbmcgc2luZ2xlTGluZSgpOwogICBTdHJpbmcgc2tpcExpbmUoKTsKICAgU3RyaW5nIHNtYWxsSGVhZGluZygpOwpAQCAtMTk5LDE3ICsyMTYsMTggQEAKICAgU3RyaW5nIHNzaEhvc3RLZXlQYW5lbEtub3duSG9zdEVudHJ5KCk7CiAgIFN0cmluZyBzc2hLZXlQYW5lbEVuY29kZWRLZXkoKTsKICAgU3RyaW5nIHNzaEtleVBhbmVsSW52YWxpZCgpOworICBTdHJpbmcgdG9wTW9zdENlbGwoKTsKICAgU3RyaW5nIHRvcG1lbnUoKTsKICAgU3RyaW5nIHRvcG1lbnVNZW51TGVmdCgpOwogICBTdHJpbmcgdG9wbWVudU1lbnVSaWdodCgpOwogICBTdHJpbmcgdG9wbWVudVREZ2x1ZSgpOwogICBTdHJpbmcgdG9wbWVudVREbWVudSgpOwogICBTdHJpbmcgdG9wbW9zdCgpOwotICBTdHJpbmcgdG9wTW9zdENlbGwoKTsKKyAgU3RyaW5nIHVuaWZpZWRUYWJsZSgpOworICBTdHJpbmcgdW5pZmllZFRhYmxlSGVhZGVyKCk7CisgIFN0cmluZyB1c2VySW5mb1BvcHVwKCk7CiAgIFN0cmluZyB1c2VyaWRlbnRpdHkoKTsKICAgU3RyaW5nIHVzZXJuYW1lRmllbGQoKTsKICAgU3RyaW5nIHZlcnNpb24oKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0RmlsdGVyKCk7Ci0gIFN0cmluZyBzZWxlY3RQYXRjaFNldE9sZFZlcnNpb24oKTsKLSAgU3RyaW5nIHBhdGNoQ2VsbFJldmVyc2VEaWZmKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0TWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCmluZGV4IGFlZmEzYTUuLjhmYzE5NmEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCkBAIC0yMiw2ICsyMiwxNSBAQAogICBTdHJpbmcgcG93ZXJlZEJ5KFN0cmluZyB2ZXJzaW9uKTsKIAogICBTdHJpbmcgbm9TdWNoQWNjb3VudE1lc3NhZ2UoU3RyaW5nIHdobyk7Ci0KICAgU3RyaW5nIG5vU3VjaEdyb3VwTWVzc2FnZShTdHJpbmcgd2hvKTsKKyAgU3RyaW5nIG5hbWVBbHJlYWR5VXNlZEJvZHkoU3RyaW5nIGFscmVhZHlVc2VkTmFtZSk7CisKKyAgU3RyaW5nIGJyYW5jaENyZWF0aW9uRmFpbGVkKFN0cmluZyBicmFuY2hOYW1lLCBTdHJpbmcgZXJyb3IpOworICBTdHJpbmcgaW52YWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpOworICBTdHJpbmcgaW52YWxpZFJldmlzaW9uKFN0cmluZyByZXZpc2lvbik7CisgIFN0cmluZyBicmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRVbmRlclJlZm5hbWVQcmVmaXgoU3RyaW5nIHJlZm5hbWVQcmVmaXgpOworICBTdHJpbmcgYnJhbmNoQWxyZWFkeUV4aXN0cyhTdHJpbmcgYnJhbmNoTmFtZSk7CisgIFN0cmluZyBicmFuY2hDcmVhdGlvbkNvbmZsaWN0KFN0cmluZyBicmFuY2hOYW1lLCBTdHJpbmcgZXhpc3RpbmdCcmFuY2hOYW1lKTsKKworICBTdHJpbmcgcGx1Z2luRmFpbGVkKFN0cmluZyBzY3JpcHRQYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNzk3NzJiZC4uNDFjYWE0NCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTMsNSArMywxNCBAQAogcG93ZXJlZEJ5ID0gUG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0LyIgdGFyZ2V0PSJfYmxhbmsiPkdlcnJpdCBDb2RlIFJldmlldzwvYT4gKHswfSkKIAogbm9TdWNoQWNjb3VudE1lc3NhZ2UgPSB7MH0gaXMgbm90IGEgcmVnaXN0ZXJlZCB1c2VyLgotCiBub1N1Y2hHcm91cE1lc3NhZ2UgPSBHcm91cCB7MH0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHZpc2libGUgdG8geW91LgorbmFtZUFscmVhZHlVc2VkQm9keSA9IFRoZSBuYW1lIHswfSBpcyBhbHJlYWR5IGluIHVzZS4KKworYnJhbmNoQ3JlYXRpb25GYWlsZWQgPSBDcmVhdGluZyBicmFuY2ggezB9IGZhaWxlZC4gRXJyb3I6IHsxfQoraW52YWxpZEJyYW5jaE5hbWUgPSBUaGUgYnJhbmNoIG5hbWUgezB9IGlzIG5vdCB2YWxpZC4KK2ludmFsaWRSZXZpc2lvbiA9IFRoZSByZXZpc2lvbiB7MH0gaXMgbm90IHZhbGlkLgorYnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkVW5kZXJSZWZuYW1lUHJlZml4ID0gQnJhbmNoIGNyZWF0aW9uIGlzIG5vdCBhbGxvd2VkIHVuZGVyIHswfS4KK2JyYW5jaEFscmVhZHlFeGlzdHMgPSBBIGJyYW5jaCB3aXRoIHRoZSBuYW1lIHswfSBhbHJlYWR5IGV4aXN0cy4KK2JyYW5jaENyZWF0aW9uQ29uZmxpY3QgPSBDYW5ub3QgY3JlYXRlIGJyYW5jaCB7MH0gc2luY2UgaXQgY29uZmxpY3RzIHdpdGggYnJhbmNoIHsxfS4KKworcGx1Z2luRmFpbGVkID0gUGx1Z2luIEphdmFTY3JpcHQgezB9IGZhaWxlZCB0byBsb2FkCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0UmVzb3VyY2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0UmVzb3VyY2VzLmphdmEKaW5kZXggZDc2M2ZmMS4uZmM3ZWE1MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdFJlc291cmNlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRSZXNvdXJjZXMuamF2YQpAQCAtMjgsNiArMjgsOSBAQAogICBAU291cmNlKCJhcnJvd1JpZ2h0LmdpZiIpCiAgIHB1YmxpYyBJbWFnZVJlc291cmNlIGFycm93UmlnaHQoKTsKIAorICBAU291cmNlKCJlZGl0VGV4dC5wbmciKQorICBwdWJsaWMgSW1hZ2VSZXNvdXJjZSBlZGl0KCk7CisKICAgQFNvdXJjZSgic3Rhck9wZW4uZ2lmIikKICAgcHVibGljIEltYWdlUmVzb3VyY2Ugc3Rhck9wZW4oKTsKIApAQCAtNDIsNCArNDUsMTAgQEAKIAogICBAU291cmNlKCJkb3dubG9hZEljb24ucG5nIikKICAgcHVibGljIEltYWdlUmVzb3VyY2UgZG93bmxvYWRJY29uKCk7CisKKyAgQFNvdXJjZSgicXVlcnlJY29uLnBuZyIpCisgIHB1YmxpYyBJbWFnZVJlc291cmNlIHF1ZXJ5SWNvbigpOworCisgIEBTb3VyY2UoImFkZEZpbGVDb21tZW50LnBuZyIpCisgIHB1YmxpYyBJbWFnZVJlc291cmNlIGFkZEZpbGVDb21tZW50KCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvU2VhcmNoUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCmluZGV4IDdlN2I5MjcuLjJhZTYwMDUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCkBAIC0xOCw2ICsxOCw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkhpbnRUZXh0Qm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5hbmltYXRpb24uY2xpZW50LkFuaW1hdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkJsdXJFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkJsdXJIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwpAQCAtMzMsMjEgKzM2LDUxIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50LktleUNvbW1hbmQ7CiAKIGNsYXNzIFNlYXJjaFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZVTExfU0laRSA9IDcwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01BTExfU0laRSA9IDQ1OworCisgIHByaXZhdGUgY2xhc3MgU2l6ZUFuaW1hdGlvbiBleHRlbmRzIEFuaW1hdGlvbiB7CisgICAgaW50IHRhcmdldFNpemU7CisgICAgaW50IHN0YXJ0U2l6ZTsKKyAgICBwdWJsaWMgdm9pZCBydW4oYm9vbGVhbiBleHBhbmQpIHsKKyAgICAgIGlmKGV4cGFuZCkgeworICAgICAgICB0YXJnZXRTaXplID0gRlVMTF9TSVpFOworICAgICAgICBzdGFydFNpemUgPSBTTUFMTF9TSVpFOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGFyZ2V0U2l6ZSA9IFNNQUxMX1NJWkU7CisgICAgICAgIHN0YXJ0U2l6ZSA9IEZVTExfU0laRTsKKyAgICAgIH0KKyAgICAgIHN1cGVyLnJ1bigzMDApOworICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblVwZGF0ZShkb3VibGUgcHJvZ3Jlc3MpIHsKKyAgICAgIGludCBzaXplID0gKGludCkgKHRhcmdldFNpemUgKiBwcm9ncmVzcyArIHN0YXJ0U2l6ZSAqICgxLXByb2dyZXNzKSk7CisgICAgICBzZWFyY2hCb3guc2V0VmlzaWJsZUxlbmd0aChzaXplKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbXBsZXRlKCkgeworICAgICAgc2VhcmNoQm94LnNldFZpc2libGVMZW5ndGgodGFyZ2V0U2l6ZSk7CisgICAgfQorICB9CiAgIHByaXZhdGUgZmluYWwgSGludFRleHRCb3ggc2VhcmNoQm94OwogICBwcml2YXRlIEhhbmRsZXJSZWdpc3RyYXRpb24gcmVnRm9jdXM7CisgIHByaXZhdGUgZmluYWwgU2l6ZUFuaW1hdGlvbiBzaXplQW5pbWF0aW9uOwogCiAgIFNlYXJjaFBhbmVsKCkgewogICAgIGZpbmFsIEZsb3dQYW5lbCBib2R5ID0gbmV3IEZsb3dQYW5lbCgpOworICAgIHNpemVBbmltYXRpb24gPSBuZXcgU2l6ZUFuaW1hdGlvbigpOwogICAgIGluaXRXaWRnZXQoYm9keSk7CiAgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2VhcmNoUGFuZWwoKSk7CiAKICAgICBzZWFyY2hCb3ggPSBuZXcgSGludFRleHRCb3goKTsKLSAgICBzZWFyY2hCb3guc2V0VmlzaWJsZUxlbmd0aCg3MCk7Ci0gICAgc2VhcmNoQm94LnNldEhpbnRUZXh0KEdlcnJpdC5DLnNlYXJjaEhpbnQoKSk7CiAgICAgZmluYWwgTXlTdWdnZXN0aW9uRGlzcGxheSBzdWdnZXN0aW9uRGlzcGxheSA9IG5ldyBNeVN1Z2dlc3Rpb25EaXNwbGF5KCk7CiAgICAgc2VhcmNoQm94LmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKHNlYXJjaEJveC5nZXRWaXNpYmxlTGVuZ3RoKCkgPT0gU01BTExfU0laRSkgeworICAgICAgICAgIHNpemVBbmltYXRpb24ucnVuKHRydWUpOworICAgICAgICB9CiAgICAgICAgIGlmIChldmVudC5nZXROYXRpdmVFdmVudCgpLmdldEtleUNvZGUoKSA9PSBLZXlDb2Rlcy5LRVlfRU5URVIpIHsKICAgICAgICAgICBpZiAoIXN1Z2dlc3Rpb25EaXNwbGF5LmlzU3VnZ2VzdGlvblNlbGVjdGVkKSB7CiAgICAgICAgICAgICBkb1NlYXJjaCgpOwpAQCAtNTUsMTAgKzg4LDIwIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9KTsKKyAgICBzZWFyY2hCb3guYWRkQmx1ckhhbmRsZXIobmV3IEJsdXJIYW5kbGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkJsdXIoQmx1ckV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChzZWFyY2hCb3guZ2V0VmlzaWJsZUxlbmd0aCgpICE9IFNNQUxMX1NJWkUpIHsKKyAgICAgICAgICBzaXplQW5pbWF0aW9uLnJ1bihmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKIAogICAgIGZpbmFsIFN1Z2dlc3RCb3ggc3VnZ2VzdEJveCA9CiAgICAgICAgIG5ldyBTdWdnZXN0Qm94KG5ldyBTZWFyY2hTdWdnZXN0T3JhY2xlKCksIHNlYXJjaEJveCwgc3VnZ2VzdGlvbkRpc3BsYXkpOwogICAgIHNlYXJjaEJveC5zZXRTdHlsZU5hbWUoImd3dC1UZXh0Qm94Iik7CisgICAgc2VhcmNoQm94LnNldFZpc2libGVMZW5ndGgoU01BTExfU0laRSk7CisgICAgc2VhcmNoQm94LnNldEhpbnRUZXh0KEdlcnJpdC5DLnNlYXJjaEhpbnQoKSk7CiAKICAgICBmaW5hbCBCdXR0b24gc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbihHZXJyaXQuQy5zZWFyY2hCdXR0b24oKSk7CiAgICAgc2VhcmNoQnV0dG9uLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NlYXJjaFN1Z2dlc3RPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hTdWdnZXN0T3JhY2xlLmphdmEKaW5kZXggMTcyYTJhZi4uZGQ0ZGUzMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NlYXJjaFN1Z2dlc3RPcmFjbGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvU2VhcmNoU3VnZ2VzdE9yYWNsZS5qYXZhCkBAIC0xNCwxMyArMTQsNTQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQWNjb3VudFN1Z2dlc3RPcmFjbGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0T3JhY2xlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LkhpZ2hsaWdodFN1Z2dlc3RPcmFjbGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiBwdWJsaWMgY2xhc3MgU2VhcmNoU3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFBhcmFtU3VnZ2VzdGVyPiBwYXJhbVN1Z2dlc3RlciA9IEFycmF5cy5hc0xpc3QoCisgICAgICBuZXcgUGFyYW1TdWdnZXN0ZXIoInByb2plY3Q6IiwgbmV3IFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSgpKSwKKyAgICAgIG5ldyBQYXJhbVN1Z2dlc3RlcihBcnJheXMuYXNMaXN0KCJvd25lcjoiLCAicmV2aWV3ZXI6IiksCisgICAgICAgICAgbmV3IEFjY291bnRTdWdnZXN0T3JhY2xlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIENhbGxiYWNrIGRvbmUpIHsKKyAgICAgICAgICAgICAgc3VwZXIub25SZXF1ZXN0U3VnZ2VzdGlvbnMocmVxdWVzdCwgbmV3IENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VnZ2VzdGlvbnNSZWFkeShmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICBpZiAoInNlbGYiLnN0YXJ0c1dpdGgocmVxdWVzdC5nZXRRdWVyeSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3VnZ2VzdE9yYWNsZS5TdWdnZXN0aW9uPiByID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3VnZ2VzdE9yYWNsZS5TdWdnZXN0aW9uPihyZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdWdnZXN0aW9ucygpLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgICAgICByLmFkZEFsbChyZXNwb25zZS5nZXRTdWdnZXN0aW9ucygpKTsKKyAgICAgICAgICAgICAgICAgICAgci5hZGQobmV3IFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic2VsZiI7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3VnZ2VzdGlvbnMocik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBkb25lLm9uU3VnZ2VzdGlvbnNSZWFkeShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSwKKyAgICAgIG5ldyBQYXJhbVN1Z2dlc3RlcihBcnJheXMuYXNMaXN0KCJvd25lcmluOiIsICJyZXZpZXdlcmluOiIpLAorICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBTdWdnZXN0T3JhY2xlKCkpKTsKKwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmVlU2V0PFN0cmluZz4gc3VnZ2VzdGlvbnMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CiAKICAgc3RhdGljIHsKQEAgLTkzLDE3ICsxMzQsMTkgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKFJlcXVlc3QgcmVxdWVzdCwgQ2FsbGJhY2sgZG9uZSkgewogICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnkoKTsKLSAgICBpbnQgbGFzdFNwYWNlID0gcXVlcnkubGFzdEluZGV4T2YoJyAnKTsKLSAgICBmaW5hbCBTdHJpbmcgbGFzdFdvcmQ7Ci0gICAgLy8gTk9URTogdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpZiB0aGUgcXVlcnkgaXMgZW1wdHkuCi0gICAgaWYgKGxhc3RTcGFjZSA9PSBxdWVyeS5sZW5ndGgoKSAtIDEpIHsKKworICAgIGZpbmFsIFN0cmluZyBsYXN0V29yZCA9IGdldExhc3RXb3JkKHF1ZXJ5KTsKKyAgICBpZiAobGFzdFdvcmQgPT0gbnVsbCkgewogICAgICAgLy8gU3RhcnRpbmcgYSBuZXcgd29yZCAtIGRvbid0IHNob3cgc3VnZ2VzdGlvbnMgeWV0LgogICAgICAgZG9uZS5vblN1Z2dlc3Rpb25zUmVhZHkocmVxdWVzdCwgbnVsbCk7CiAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChsYXN0U3BhY2UgPT0gLTEpIHsKLSAgICAgIGxhc3RXb3JkID0gcXVlcnk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxhc3RXb3JkID0gcXVlcnkuc3Vic3RyaW5nKGxhc3RTcGFjZSArIDEpOworICAgIH0KKworICAgIGZvciAoZmluYWwgUGFyYW1TdWdnZXN0ZXIgcHMgOiBwYXJhbVN1Z2dlc3RlcikgeworICAgICAgaWYgKHBzLmFwcGxpY2FibGUobGFzdFdvcmQpKSB7CisgICAgICAgIHBzLnN1Z2dlc3QobGFzdFdvcmQsIHJlcXVlc3QsIGRvbmUpOworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQogCiAgICAgZmluYWwgQXJyYXlMaXN0PFNlYXJjaFN1Z2dlc3Rpb24+IHIgPSBuZXcgQXJyYXlMaXN0PFNlYXJjaFN1Z2dlc3RPcmFjbGUuU2VhcmNoU3VnZ2VzdGlvbj4oKTsKQEAgLTExOCw2ICsxNjEsMjcgQEAKICAgICBkb25lLm9uU3VnZ2VzdGlvbnNSZWFkeShyZXF1ZXN0LCBuZXcgUmVzcG9uc2UocikpOwogICB9CiAKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdFdvcmQoZmluYWwgU3RyaW5nIHF1ZXJ5KSB7CisgICAgZmluYWwgaW50IGxhc3RTcGFjZSA9IHF1ZXJ5Lmxhc3RJbmRleE9mKCcgJyk7CisgICAgaWYgKGxhc3RTcGFjZSA9PSBxdWVyeS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBpZiAobGFzdFNwYWNlID09IC0xKSB7CisgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorICAgIHJldHVybiBxdWVyeS5zdWJzdHJpbmcobGFzdFNwYWNlICsgMSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdWVyeVBhdHRlcm4oZmluYWwgU3RyaW5nIHF1ZXJ5KSB7CisgICAgcmV0dXJuIHN1cGVyLmdldFF1ZXJ5UGF0dGVybihnZXRMYXN0V29yZChxdWVyeSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGlzSFRNTCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlYXJjaFN1Z2dlc3Rpb24gaW1wbGVtZW50cyBTdWdnZXN0T3JhY2xlLlN1Z2dlc3Rpb24gewogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN1Z2dlc3Rpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbFF1ZXJ5OwpAQCAtMTM3LDQgKzIwMSw2NSBAQAogICAgICAgcmV0dXJuIGZ1bGxRdWVyeTsKICAgICB9CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJhbVN1Z2dlc3RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gb3BlcmF0b3JzOworICAgIHByaXZhdGUgZmluYWwgU3VnZ2VzdE9yYWNsZSBwYXJhbWV0ZXJTdWdnZXN0aW9uT3JhY2xlOworCisgICAgUGFyYW1TdWdnZXN0ZXIoZmluYWwgU3RyaW5nIG9wZXJhdG9yLAorICAgICAgICBmaW5hbCBTdWdnZXN0T3JhY2xlIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUpIHsKKyAgICAgIHRoaXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvcGVyYXRvciksIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUpOworICAgIH0KKworICAgIFBhcmFtU3VnZ2VzdGVyKGZpbmFsIExpc3Q8U3RyaW5nPiBvcGVyYXRvcnMsCisgICAgICAgIGZpbmFsIFN1Z2dlc3RPcmFjbGUgcGFyYW1ldGVyU3VnZ2VzdGlvbk9yYWNsZSkgeworICAgICAgdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7CisgICAgICB0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUgPSBwYXJhbWV0ZXJTdWdnZXN0aW9uT3JhY2xlOworICAgIH0KKworICAgIGJvb2xlYW4gYXBwbGljYWJsZShmaW5hbCBTdHJpbmcgcXVlcnkpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBvcGVyYXRvciA9IGdldEFwcGxpY2FibGVPcGVyYXRvcihxdWVyeSwgb3BlcmF0b3JzKTsKKyAgICAgIHJldHVybiBvcGVyYXRvciAhPSBudWxsICYmIHF1ZXJ5Lmxlbmd0aCgpID4gb3BlcmF0b3IubGVuZ3RoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwbGljYWJsZU9wZXJhdG9yKGZpbmFsIFN0cmluZyBsYXN0V29yZCwKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9wZXJhdG9ycykgeworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgb3BlcmF0b3IgOiBvcGVyYXRvcnMpIHsKKyAgICAgICAgaWYgKGxhc3RXb3JkLnN0YXJ0c1dpdGgob3BlcmF0b3IpKSB7CisgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIHN1Z2dlc3QoZmluYWwgU3RyaW5nIGxhc3RXb3JkLCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIENhbGxiYWNrIGRvbmUpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBvcGVyYXRvciA9IGdldEFwcGxpY2FibGVPcGVyYXRvcihsYXN0V29yZCwgb3BlcmF0b3JzKTsKKyAgICAgIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUucmVxdWVzdFN1Z2dlc3Rpb25zKAorICAgICAgICAgIG5ldyBSZXF1ZXN0KGxhc3RXb3JkLnN1YnN0cmluZyhvcGVyYXRvci5sZW5ndGgoKSksIHJlcXVlc3QuZ2V0TGltaXQoKSksCisgICAgICAgICAgbmV3IENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Z2dlc3Rpb25zUmVhZHkoZmluYWwgUmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5ID0gcmVxdWVzdC5nZXRRdWVyeSgpOworICAgICAgICAgICAgICBmaW5hbCBMaXN0PFNlYXJjaFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbj4gciA9CisgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbj4ocmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3VnZ2VzdGlvbnMoKS5zaXplKCkpOworICAgICAgICAgICAgICBmb3IgKGZpbmFsIFNlYXJjaFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbiBzIDogcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgIC5nZXRTdWdnZXN0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgci5hZGQobmV3IFNlYXJjaFN1Z2dlc3Rpb24ocy5nZXREaXNwbGF5U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnN1YnN0cmluZygwLCBxdWVyeS5sZW5ndGgoKSAtIGxhc3RXb3JkLmxlbmd0aCgpKSArCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yICsgcXVvdGVJZk5lZWRlZChzLmdldFJlcGxhY2VtZW50U3RyaW5nKCkpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZG9uZS5vblN1Z2dlc3Rpb25zUmVhZHkocmVxdWVzdCwgbmV3IFJlc3BvbnNlKHIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGVJZk5lZWRlZChmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgICBpZiAoIXMubWF0Y2hlcygiXlxcUyokIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIHMgKyAiXCIiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NpZ25JbkRpYWxvZy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NpZ25JbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmZkYjg1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TaWduSW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5Nb2RlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5HbG9iYWxLZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5BdXRvQ2VudGVyRGlhbG9nQm94OwotCi0vKiogUHJvbXB0cyB0aGUgdXNlciB0byBzaWduIGluIHRvIHRoZWlyIGFjY291bnQuICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2lnbkluRGlhbG9nIGV4dGVuZHMgQXV0b0NlbnRlckRpYWxvZ0JveCB7Ci0gIHByb3RlY3RlZCBmaW5hbCBTaWduSW5Nb2RlIG1vZGU7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdG9rZW47Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkaWFsb2cgdG8gaGFuZGxlIHVzZXIgc2lnbiBpbi4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25Jbk1vZGUgdHlwZSBvZiBtb2RlIHRoZSBsb2dpbiB3aWxsIHBlcmZvcm0uCi0gICAqIEBwYXJhbSB0b2tlbiB0aGUgdG9rZW4gdG8ganVtcCB0byBhZnRlciBzaWduLWluIGlzIGNvbXBsZXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFNpZ25JbkRpYWxvZyhmaW5hbCBTaWduSW5Nb2RlIHNpZ25Jbk1vZGUsIGZpbmFsIFN0cmluZyB0b2tlbikgewotICAgIHN1cGVyKC8qIGF1dG8gaGlkZSAqL3RydWUsIC8qIG1vZGFsICovdHJ1ZSk7Ci0gICAgc2V0R2xhc3NFbmFibGVkKHRydWUpOwotCi0gICAgdGhpcy5tb2RlID0gc2lnbkluTW9kZTsKLSAgICB0aGlzLnRva2VuID0gdG9rZW47Ci0KLSAgICBzd2l0Y2ggKHNpZ25Jbk1vZGUpIHsKLSAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICBzZXRUZXh0KEdlcnJpdC5DLmxpbmtJZGVudGl0eURpYWxvZ1RpdGxlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUkVHSVNURVI6Ci0gICAgICAgIHNldFRleHQoR2Vycml0LkMucmVnaXN0ZXJEaWFsb2dUaXRsZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBzZXRUZXh0KEdlcnJpdC5DLnNpZ25JbkRpYWxvZ1RpdGxlKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgR2xvYmFsS2V5LmRpYWxvZyh0aGlzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1ZvaWRSZXN1bHQuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Wb2lkUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiY2QwYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Wb2lkUmVzdWx0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBWb2lkUmVzdWx0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHByb3RlY3RlZCBWb2lkUmVzdWx0KCkgeworICB9CisKKyAgcHVibGljIHN0YXRpYyBWb2lkUmVzdWx0IGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gY3JlYXRlT2JqZWN0KCkuY2FzdCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzLmphdmEKaW5kZXggMDU2NWQzZS4uNDIzOTllZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENhcGFiaWxpdGllcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDYXBhYmlsaXRpZXMuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiAKIC8qKiBDYXBhYmlsaXRpZXMgdGhlIGNhbGxlciBoYXMgZnJvbSB7QGNvZGUgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzfS4gICovCiBwdWJsaWMgY2xhc3MgQWNjb3VudENhcGFiaWxpdGllcyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgewogICBwdWJsaWMgc3RhdGljIHZvaWQgYWxsKEFzeW5jQ2FsbGJhY2s8QWNjb3VudENhcGFiaWxpdGllcz4gY2IsIFN0cmluZy4uLiBmaWx0ZXIpIHsKLSAgICBSZXN0QXBpIGFwaSA9IG5ldyBSZXN0QXBpKCIvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMiKTsKLSAgICBmb3IgKFN0cmluZyBuYW1lIDogZmlsdGVyKSB7Ci0gICAgICBhcGkuYWRkUGFyYW1ldGVyKCJxIiwgbmFtZSk7Ci0gICAgfQotICAgIGFwaS5zZW5kKGNiKTsKKyAgICBuZXcgUmVzdEFwaSgiL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzIikKKyAgICAgIC5hZGRQYXJhbWV0ZXIoInEiLCBmaWx0ZXIpCisgICAgICAuZ2V0KGNiKTsKICAgfQogCiAgIHByb3RlY3RlZCBBY2NvdW50Q2FwYWJpbGl0aWVzKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5qYXZhCmluZGV4IGQzNzRkMzUuLmZhMmM1ZmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLmphdmEKQEAgLTY5LDYgKzY5LDcgQEAKICAgU3RyaW5nIHNzaEtleVN0YXR1cygpOwogCiAgIFN0cmluZyBhZGRTc2hLZXlQYW5lbEhlYWRlcigpOworICBTdHJpbmcgYWRkU3NoS2V5SGVscFRpdGxlKCk7CiAgIFN0cmluZyBhZGRTc2hLZXlIZWxwKCk7CiAgIFN0cmluZyBzc2hKYXZhQXBwbGV0Tm90QXZhaWxhYmxlKCk7CiAgIFN0cmluZyBpbnZhbGlkU3NoS2V5RXJyb3IoKTsKQEAgLTk1LDggKzk2LDEwIEBACiAgIFN0cmluZyB3YXRjaGVkUHJvamVjdEZpbHRlcigpOwogICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5FbWFpbE5vdGlmaWNhdGlvbnMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcygpOworICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5OZXdQYXRjaFNldHMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uQWxsQ29tbWVudHMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpOworICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5BYmFuZG9uZWRDaGFuZ2VzKCk7CiAKICAgU3RyaW5nIGNvbnRhY3RGaWVsZEZ1bGxOYW1lKCk7CiAgIFN0cmluZyBjb250YWN0RmllbGRFbWFpbCgpOwpAQCAtMTEwLDYgKzExMyw3IEBACiAgIFN0cmluZyBidXR0b25DYW5jZWwoKTsKICAgU3RyaW5nIHRpdGxlUmVnaXN0ZXJOZXdFbWFpbCgpOwogICBTdHJpbmcgZGVzY1JlZ2lzdGVyTmV3RW1haWwoKTsKKyAgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGVSZWdpc3Rlck5ld0VtYWlsKCk7CiAKICAgU3RyaW5nIG5ld0FncmVlbWVudCgpOwogICBTdHJpbmcgYWdyZWVtZW50U3RhdHVzKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLnByb3BlcnRpZXMKaW5kZXggOGIzMjE3NC4uZmQ1NDM2MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDb25zdGFudHMucHJvcGVydGllcwpAQCAtNjAsNyArNjAsMjcgQEAKIGJ1dHRvbkxpbmtJZGVudGl0eSA9IExpbmsgQW5vdGhlciBJZGVudGl0eQogCiBhZGRTc2hLZXlQYW5lbEhlYWRlciA9IEFkZCBTU0ggUHVibGljIEtleQotYWRkU3NoS2V5SGVscCA9ICg8YSBocmVmPSJodHRwOi8vaGVscC5naXRodWIuY29tL2tleS1zZXR1cC1yZWRpcmVjdCIgdGFyZ2V0PSJfYmxhbmsiPkdpdEh1YidzIEd1aWRlIHRvIFNTSCBLZXlzPC9hPikKK2FkZFNzaEtleUhlbHBUaXRsZSA9IEhvdyB0byBHZW5lcmF0ZSBhbiBTU0ggS2V5CithZGRTc2hLZXlIZWxwID0gXAorICA8b2w+XAorICAgIDxsaT5cCisgICAgICBGcm9tIHRoZSBUZXJtaW5hbCBvciBHaXQgQmFzaCwgcnVuIDxlbT5zc2gta2V5Z2VuPC9lbT5cCisgICAgPC9saT5cCisgICAgPGxpPlwKKyAgICAgIENvbmZpcm0gdGhlIGRlZmF1bHQgcGF0aCA8ZW0+LnNzaC9pZF9yc2E8L2VtPlwKKyAgICA8L2xpPlwKKyAgICA8bGk+XAorICAgICAgRW50ZXIgYSBwYXNzcGhyYXNlIChyZWNvbW1lbmRlZCkgb3IgbGVhdmUgaXQgYmxhbmsuPGJyPlwKKyAgICAgIFJlbWVtYmVyIHRoaXMgcGFzc3BocmFzZSwgYXMgeW91IHdpbGwgbmVlZCBpdCB0byB1bmxvY2sgdGhlPGJyPlwKKyAgICAgIGtleSB3aGVuZXZlciB5b3UgdXNlIGl0LlwKKyAgICA8L2xpPlwKKyAgICA8bGk+XAorICAgICAgT3BlbiA8ZW0+fi8uc3NoL2lkX3JzYS5wdWI8L2VtPiBhbmQgY29weSAmIHBhc3RlIHRoZSBjb250ZW50cyBpbnRvPGJyPlwKKyAgICAgIHRoZSBib3ggYmVsb3csIHRoZW4gY2xpY2sgb24gIkFkZCIuPGJyPlwKKyAgICAgIE5vdGUgdGhhdCA8ZW0+aWRfcnNhLnB1YjwvZW0+IGlzIHlvdXIgcHVibGljIGtleSBhbmQgY2FuIGJlIHNoYXJlZCw8YnI+XAorICAgICAgd2hpbGUgPGVtPmlkX3JzYTwvZW0+IGlzIHlvdXIgcHJpdmF0ZSBrZXkgYW5kIHNob3VsZCBiZSBrZXB0IHNlY3JldC5cCisgICAgPC9saT5cCisgIDxcb2w+CiBpbnZhbGlkU3NoS2V5RXJyb3IgPSBJbnZhbGlkIFNTSCBLZXkKIHNzaEphdmFBcHBsZXROb3RBdmFpbGFibGUgPSBPcGVuIEtleSBVbmF2YWlsYWJsZTogSmF2YSBub3QgZW5hYmxlZAogCkBAIC03NSw4ICs5NSwxMCBAQAogd2F0Y2hlZFByb2plY3RGaWx0ZXIgPSBPbmx5IElmCiB3YXRjaGVkUHJvamVjdENvbHVtbkVtYWlsTm90aWZpY2F0aW9ucyA9IEVtYWlsIE5vdGlmaWNhdGlvbnMKIHdhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcyA9IE5ldyBDaGFuZ2VzCit3YXRjaGVkUHJvamVjdENvbHVtbk5ld1BhdGNoU2V0cyA9IE5ldyBQYXRjaCBTZXRzCiB3YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzID0gQWxsIENvbW1lbnRzCiB3YXRjaGVkUHJvamVjdENvbHVtblN1Ym1pdHRlZENoYW5nZXMgPSBTdWJtaXR0ZWQgQ2hhbmdlcword2F0Y2hlZFByb2plY3RDb2x1bW5BYmFuZG9uZWRDaGFuZ2VzID0gQWJhbmRvbmVkIENoYW5nZXMKIAogY29udGFjdEZpZWxkRnVsbE5hbWUgPSBGdWxsIE5hbWUKIGNvbnRhY3RGaWVsZEVtYWlsID0gUHJlZmVycmVkIEVtYWlsCkBAIC05OSw2ICsxMjEsNyBAQAogZGVzY1JlZ2lzdGVyTmV3RW1haWwgPSBcCiAgIDxwPkEgY29uZmlybWF0aW9uIGxpbmsgd2lsbCBiZSBzZW50IGJ5IGVtYWlsIHRvIHRoaXMgYWRkcmVzcy48L3A+XAogICA8cD5Zb3UgbXVzdCBjbGljayBvbiB0aGUgbGluayB0byBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIGFuZCBtYWtlIHRoZSBhZGRyZXNzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLjwvcD4KK2Vycm9yRGlhbG9nVGl0bGVSZWdpc3Rlck5ld0VtYWlsID0gRW1haWwgUmVnaXN0cmF0aW9uIEZhaWxlZAogCiAKIG5ld0FncmVlbWVudCA9IE5ldyBDb250cmlidXRvciBBZ3JlZW1lbnQKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWQ4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50SW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICBwdWJsaWMgZmluYWwgbmF0aXZlIGludCBfYWNjb3VudF9pZCgpIC8qLXsgcmV0dXJuIHRoaXMuX2FjY291bnRfaWQgfHwgMDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmFtZSgpIC8qLXsgcmV0dXJuIHRoaXMubmFtZTsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgZW1haWwoKSAvKi17IHJldHVybiB0aGlzLmVtYWlsOyB9LSovOworCisgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIEFjY291bnRJbmZvIGNyZWF0ZShpbnQgaWQsIFN0cmluZyBuYW1lLAorICAgICAgU3RyaW5nIGVtYWlsKSAvKi17CisgICAgcmV0dXJuIHsnX2FjY291bnRfaWQnOiBpZCwgJ25hbWUnOiBuYW1lLCAnZW1haWwnOiBlbWFpbH07CisgIH0tKi87CisKKyAgcHJvdGVjdGVkIEFjY291bnRJbmZvKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Db250YWN0UGFuZWxTaG9ydC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQ29udGFjdFBhbmVsU2hvcnQuamF2YQppbmRleCA0ZmJlN2EwLi5mMzViZDRiIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Db250YWN0UGFuZWxTaG9ydC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0NvbnRhY3RQYW5lbFNob3J0LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5PbkVkaXRFbmFibGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudC5GaWVsZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOwpAQCAtMzAwLDcgKzMwMSwxNSBAQAogICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgICAgICAgICBpbkVtYWlsLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICByZWdpc3Rlci5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICBpZiAoY2F1Z2h0LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKEVtYWlsRXhjZXB0aW9uLk1FU1NBR0UpKSB7CisgICAgICAgICAgICAgIGZpbmFsIEVycm9yRGlhbG9nIGQgPQorICAgICAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKGNhdWdodC5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIEVtYWlsRXhjZXB0aW9uLk1FU1NBR0UubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgZC5zZXRUZXh0KFV0aWwuQy5lcnJvckRpYWxvZ1RpdGxlUmVnaXN0ZXJOZXdFbWFpbCgpKTsKKyAgICAgICAgICAgICAgZC5jZW50ZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgICB9CkBAIC0zMzksNyArMzQ4LDcgQEAKIAogICB2b2lkIGRvU2F2ZShmaW5hbCBBc3luY0NhbGxiYWNrPEFjY291bnQ+IG9uU2F2ZSkgewogICAgIFN0cmluZyBuZXdOYW1lID0gY2FuRWRpdEZ1bGxOYW1lKCkgPyBuYW1lVHh0LmdldFRleHQoKSA6IG51bGw7Ci0gICAgaWYgKCIiLmVxdWFscyhuZXdOYW1lKSkgeworICAgIGlmIChuZXdOYW1lICE9IG51bGwgJiYgbmV3TmFtZS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICBuZXdOYW1lID0gbnVsbDsKICAgICB9CiAKQEAgLTM4Myw2ICszOTIsNyBAQAogICAgIG1lLnNldEZ1bGxOYW1lKHJlc3VsdC5nZXRGdWxsTmFtZSgpKTsKICAgICBtZS5zZXRQcmVmZXJyZWRFbWFpbChyZXN1bHQuZ2V0UHJlZmVycmVkRW1haWwoKSk7CiAgICAgR2Vycml0LnJlZnJlc2hNZW51QmFyKCk7CisgICAgZGlzcGxheShtZSk7CiAgIH0KIAogICBDb250YWN0SW5mb3JtYXRpb24gdG9Db250YWN0SW5mb3JtYXRpb24oKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUdyb3Vwc1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlHcm91cHNTY3JlZW4uamF2YQppbmRleCA2Y2I3NDlkLi5mODNlOWVjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUdyb3Vwc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015R3JvdXBzU2NyZWVuLmphdmEKQEAgLTE1LDEwICsxNSw4IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLkdyb3VwVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cExpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgTXlHcm91cHNTY3JlZW4gZXh0ZW5kcyBTZXR0aW5nc1NjcmVlbiB7CiAgIHByaXZhdGUgR3JvdXBUYWJsZSBncm91cHM7CkBAIC0yNiwxOCArMjQsMTggQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7Ci0gICAgZ3JvdXBzID0gbmV3IEdyb3VwVGFibGUodHJ1ZSAvKiBoeXBlcmxpbmsgdG8gYWRtaW4gKi8pOworICAgIGdyb3VwcyA9IG5ldyBHcm91cFRhYmxlKCk7CiAgICAgYWRkKGdyb3Vwcyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwotICAgIFV0aWwuQUNDT1VOVF9TRUMubXlHcm91cHMobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxMaXN0PEFjY291bnRHcm91cD4+KHRoaXMpIHsKKyAgICBHcm91cExpc3QubXkobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxHcm91cExpc3Q+KHRoaXMpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcHJlRGlzcGxheShmaW5hbCBMaXN0PEFjY291bnRHcm91cD4gcmVzdWx0KSB7CisgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEdyb3VwTGlzdCByZXN1bHQpIHsKICAgICAgICAgZ3JvdXBzLmRpc3BsYXkocmVzdWx0KTsKLSAgICAgIH0KLSAgICB9KTsKKyAgICAgICAgZ3JvdXBzLmZpbmlzaERpc3BsYXkoKTsKKyAgICAgIH19KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlJZGVudGl0aWVzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQppbmRleCA4OTlhYTAzLi5jYTg3MmNjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQpAQCAtMTUsMTkgKzE1LDE5IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQuT3BlbklkU2lnbkluRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZC5PcGVuSWRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFVybHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3cuTG9jYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsZXhUYWJsZS5GbGV4Q2VsbEZvcm1hdHRlcjsKQEAgLTU5LDE5ICs1OSwxNSBAQAogICAgIH0pOwogICAgIGFkZChkZWxldGVJZGVudGl0eSk7CiAKLSAgICBzd2l0Y2ggKEdlcnJpdC5nZXRDb25maWcoKS5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIE9QRU5JRDogewotICAgICAgICBmaW5hbCBCdXR0b24gbGlua0lkZW50aXR5ID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uTGlua0lkZW50aXR5KCkpOwotICAgICAgICBsaW5rSWRlbnRpdHkuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG8gPSBIaXN0b3J5LmdldFRva2VuKCk7Ci0gICAgICAgICAgICBuZXcgT3BlbklkU2lnbkluRGlhbG9nKFNpZ25Jbk1vZGUuTElOS19JREVOVElZLCB0bywgbnVsbCkuY2VudGVyKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWRkKGxpbmtJZGVudGl0eSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXV0aFR5cGUoKSA9PSBBdXRoVHlwZS5PUEVOSUQpIHsKKyAgICAgIEJ1dHRvbiBsaW5rSWRlbnRpdHkgPSBuZXcgQnV0dG9uKFV0aWwuQy5idXR0b25MaW5rSWRlbnRpdHkoKSk7CisgICAgICBsaW5rSWRlbnRpdHkuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICBMb2NhdGlvbi5hc3NpZ24oR2Vycml0LmxvZ2luUmVkaXJlY3QoSGlzdG9yeS5nZXRUb2tlbigpKSArICI/bGluayIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGFkZChsaW5rSWRlbnRpdHkpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVByZWZlcmVuY2VzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVByZWZlcmVuY2VzU2NyZWVuLmphdmEKaW5kZXggZGU2ZTY2Ni4uYzE3YTBhYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlQcmVmZXJlbmNlc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015UHJlZmVyZW5jZXNTY3JlZW4uamF2YQpAQCAtMjAsMTAgKzIwLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50LkRhdGVUaW1lRm9ybWF0OwpAQCAtNTIsMzkgKzUxLDE1IEBACiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7CiAKLSAgICBmaW5hbCBDbGlja0hhbmRsZXIgb25DbGlja1NhdmUgPSBuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2F2ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH07Ci0gICAgZmluYWwgQ2hhbmdlSGFuZGxlciBvbkNoYW5nZVNhdmUgPSBuZXcgQ2hhbmdlSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2F2ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH07Ci0KICAgICBzaG93U2l0ZUhlYWRlciA9IG5ldyBDaGVja0JveChVdGlsLkMuc2hvd1NpdGVIZWFkZXIoKSk7Ci0gICAgc2hvd1NpdGVIZWFkZXIuYWRkQ2xpY2tIYW5kbGVyKG9uQ2xpY2tTYXZlKTsKLQogICAgIHVzZUZsYXNoQ2xpcGJvYXJkID0gbmV3IENoZWNrQm94KFV0aWwuQy51c2VGbGFzaENsaXBib2FyZCgpKTsKLSAgICB1c2VGbGFzaENsaXBib2FyZC5hZGRDbGlja0hhbmRsZXIob25DbGlja1NhdmUpOwotCiAgICAgY29weVNlbGZPbkVtYWlscyA9IG5ldyBDaGVja0JveChVdGlsLkMuY29weVNlbGZPbkVtYWlscygpKTsKLSAgICBjb3B5U2VsZk9uRW1haWxzLmFkZENsaWNrSGFuZGxlcihvbkNsaWNrU2F2ZSk7Ci0KICAgICByZXZlcnNlUGF0Y2hTZXRPcmRlciA9IG5ldyBDaGVja0JveChVdGlsLkMucmV2ZXJzZVBhdGNoU2V0T3JkZXIoKSk7Ci0gICAgcmV2ZXJzZVBhdGNoU2V0T3JkZXIuYWRkQ2xpY2tIYW5kbGVyKG9uQ2xpY2tTYXZlKTsKLQogICAgIHNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkoKSk7Ci0gICAgc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeS5hZGRDbGlja0hhbmRsZXIob25DbGlja1NhdmUpOwotCiAgICAgbWF4aW11bVBhZ2VTaXplID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKGZpbmFsIHNob3J0IHYgOiBQQUdFU0laRV9DSE9JQ0VTKSB7CiAgICAgICBtYXhpbXVtUGFnZVNpemUuYWRkSXRlbShVdGlsLk0ucm93c1BlclBhZ2UodiksIFN0cmluZy52YWx1ZU9mKHYpKTsKICAgICB9Ci0gICAgbWF4aW11bVBhZ2VTaXplLmFkZENoYW5nZUhhbmRsZXIob25DaGFuZ2VTYXZlKTsKIAogICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKICAgICBkYXRlRm9ybWF0ID0gbmV3IExpc3RCb3goKTsKQEAgLTk2LDcgKzcxLDYgQEAKICAgICAgIHIuYXBwZW5kKERhdGVUaW1lRm9ybWF0LmdldEZvcm1hdChmbXQuZ2V0TG9uZ0Zvcm1hdCgpKS5mb3JtYXQobm93KSk7CiAgICAgICBkYXRlRm9ybWF0LmFkZEl0ZW0oci50b1N0cmluZygpLCBmbXQubmFtZSgpKTsKICAgICB9Ci0gICAgZGF0ZUZvcm1hdC5hZGRDaGFuZ2VIYW5kbGVyKG9uQ2hhbmdlU2F2ZSk7CiAKICAgICB0aW1lRm9ybWF0ID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuVGltZUZvcm1hdCBmbXQgOiBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLlRpbWVGb3JtYXQKQEAgLTEwNSw3ICs3OSw2IEBACiAgICAgICByLmFwcGVuZChEYXRlVGltZUZvcm1hdC5nZXRGb3JtYXQoZm10LmdldEZvcm1hdCgpKS5mb3JtYXQobm93KSk7CiAgICAgICB0aW1lRm9ybWF0LmFkZEl0ZW0oci50b1N0cmluZygpLCBmbXQubmFtZSgpKTsKICAgICB9Ci0gICAgdGltZUZvcm1hdC5hZGRDaGFuZ2VIYW5kbGVyKG9uQ2hhbmdlU2F2ZSk7CiAKICAgICBGbG93UGFuZWwgZGF0ZVRpbWVQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKIApAQCAtMTYzLDYgKzEzNiwxNiBAQAogICAgICAgfQogICAgIH0pOwogICAgIGFkZChzYXZlKTsKKworICAgIGZpbmFsIE9uRWRpdEVuYWJsZXIgZSA9IG5ldyBPbkVkaXRFbmFibGVyKHNhdmUpOworICAgIGUubGlzdGVuVG8oc2hvd1NpdGVIZWFkZXIpOworICAgIGUubGlzdGVuVG8odXNlRmxhc2hDbGlwYm9hcmQpOworICAgIGUubGlzdGVuVG8oY29weVNlbGZPbkVtYWlscyk7CisgICAgZS5saXN0ZW5UbyhyZXZlcnNlUGF0Y2hTZXRPcmRlcik7CisgICAgZS5saXN0ZW5UbyhzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KTsKKyAgICBlLmxpc3RlblRvKG1heGltdW1QYWdlU2l6ZSk7CisgICAgZS5saXN0ZW5UbyhkYXRlRm9ybWF0KTsKKyAgICBlLmxpc3RlblRvKHRpbWVGb3JtYXQpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZWRQcm9qZWN0c1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlXYXRjaGVkUHJvamVjdHNTY3JlZW4uamF2YQppbmRleCBkMzgwMTVjLi5hNTI4OTEyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZWRQcm9qZWN0c1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015V2F0Y2hlZFByb2plY3RzU2NyZWVuLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0Qm94LkRlZmF1bHRTdWdnZXN0aW9uRGlzcGxheTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0T3JhY2xlLlN1Z2dlc3Rpb247CkBAIC02MCw3ICs2MSwxMCBAQAogICAgIGdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKICAgICBncmlkLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmluZm9CbG9jaygpKTsKICAgICBncmlkLnNldFRleHQoMCwgMCwgVXRpbC5DLndhdGNoZWRQcm9qZWN0TmFtZSgpKTsKLSAgICBncmlkLnNldFdpZGdldCgwLCAxLCBuYW1lVHh0KTsKKyAgICBmaW5hbCBIb3Jpem9udGFsUGFuZWwgaHAgPSBuZXcgSG9yaXpvbnRhbFBhbmVsKCk7CisgICAgaHAuYWRkKG5hbWVUeHQpOworICAgIGhwLmFkZChicm93c2UpOworICAgIGdyaWQuc2V0V2lkZ2V0KDAsIDEsIGhwKTsKIAogICAgIGdyaWQuc2V0VGV4dCgxLCAwLCBVdGlsLkMud2F0Y2hlZFByb2plY3RGaWx0ZXIoKSk7CiAgICAgZ3JpZC5zZXRXaWRnZXQoMSwgMSwgZmlsdGVyVHh0KTsKQEAgLTc2LDcgKzgwLDYgQEAKICAgICBmcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRXYXRjaFBhbmVsKCkpOwogICAgIGZwLmFkZChncmlkKTsKICAgICBmcC5hZGQoYWRkTmV3KTsKLSAgICBmcC5hZGQoYnJvd3NlKTsKICAgICBhZGQoZnApOwogCiAKQEAgLTkwLDcgKzkzLDcgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgb25Nb3ZlUG9pbnRlclRvKFN0cmluZyBwcm9qZWN0TmFtZSkgewogICAgICAgICAvLyBwcmV2ZW50IHVzZXIgaW5wdXQgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiBieSBzaW1wbHkgcG9waW5nIHVwCi0gICAgICAgIGlmICghcHJvamVjdHNQb3B1cC5pc1BvcGluZ1VwKCkgfHwgIiIuZXF1YWxzKG5hbWVCb3guZ2V0VGV4dCgpKSkgeworICAgICAgICBpZiAoIXByb2plY3RzUG9wdXAuaXNQb3BwaW5nVXAoKSB8fCAiIi5lcXVhbHMobmFtZUJveC5nZXRUZXh0KCkpKSB7CiAgICAgICAgICAgbmFtZUJveC5zZXRUZXh0KHByb2plY3ROYW1lKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTkzLDcgKzE5Niw3IEBACiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBkb0FkZE5ldygpIHsKLSAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBuYW1lVHh0LmdldFRleHQoKTsKKyAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBuYW1lVHh0LmdldFRleHQoKS50cmltKCk7CiAgICAgaWYgKCIiLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZXNUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlXYXRjaGVzVGFibGUuamF2YQppbmRleCBjMTU4YzJjLi5lMjI4NjQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZXNUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015V2F0Y2hlc1RhYmxlLmphdmEKQEAgLTUxLDEzICs1MSwxNyBAQAogICAgIGZtdC5zZXRSb3dTcGFuKDAsIDIsIDIpOwogICAgIERPTS5zZXRFbGVtZW50UHJvcGVydHkoZm10LmdldEVsZW1lbnQoMCwgMyksICJhbGlnbiIsICJjZW50ZXIiKTsKIAotICAgIGZtdC5zZXRDb2xTcGFuKDAsIDMsIDMpOworICAgIGZtdC5zZXRDb2xTcGFuKDAsIDMsIDUpOwogICAgIHRhYmxlLnNldFRleHQoMSwgMCwgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcygpKTsKLSAgICB0YWJsZS5zZXRUZXh0KDEsIDEsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzKCkpOwotICAgIHRhYmxlLnNldFRleHQoMSwgMiwgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDEsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbk5ld1BhdGNoU2V0cygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDIsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzKCkpOworICAgIHRhYmxlLnNldFRleHQoMSwgMywgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDQsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFiYW5kb25lZENoYW5nZXMoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAwLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAyLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAzLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgxLCA0LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBkZWxldGVDaGVja2VkKCkgewpAQCAtMTM1LDggKzEzOSwxMCBAQAogICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsIGZwKTsKIAogICAgIGFkZE5vdGlmeUJ1dHRvbihBY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGUuTkVXX0NIQU5HRVMsIGluZm8sIHJvdywgMyk7Ci0gICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMsIGluZm8sIHJvdywgNCk7Ci0gICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUywgaW5mbywgcm93LCA1KTsKKyAgICBhZGROb3RpZnlCdXR0b24oQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlLk5FV19QQVRDSFNFVFMsIGluZm8sIHJvdywgNCk7CisgICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMsIGluZm8sIHJvdywgNSk7CisgICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUywgaW5mbywgcm93LCA2KTsKKyAgICBhZGROb3RpZnlCdXR0b24oQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlLkFCQU5ET05FRF9DSEFOR0VTLCBpbmZvLCByb3csIDcpOwogCiAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKQEAgLTE0NCw2ICsxNTAsOCBAQAogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAzLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA0LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA1LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA2LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA3LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogCiAgICAgc2V0Um93SXRlbShyb3csIGluZm8pOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Tc2hQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvU3NoUGFuZWwuamF2YQppbmRleCA3MzEyN2YwLi5hYWFkYzVlNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvU3NoUGFuZWwuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Tc2hQYW5lbC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkVycm9yRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tcGxleERpc2Nsb3N1cmVQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuRmFuY3lGbGV4VGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Tc2hIb3N0S2V5OwpAQCAtOTIsNyArOTMsMTEgQEAKICAgICBhZGRLZXlCbG9jay5zZXRWaXNpYmxlKGZhbHNlKTsKICAgICBhZGRLZXlCbG9jay5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRTc2hLZXlQYW5lbCgpKTsKICAgICBhZGRLZXlCbG9jay5hZGQobmV3IFNtYWxsSGVhZGluZyhVdGlsLkMuYWRkU3NoS2V5UGFuZWxIZWFkZXIoKSkpOwotICAgIGFkZEtleUJsb2NrLmFkZChuZXcgSFRNTChVdGlsLkMuYWRkU3NoS2V5SGVscCgpKSk7CisKKyAgICBmaW5hbCBDb21wbGV4RGlzY2xvc3VyZVBhbmVsIGFkZFNzaEtleUhlbHAgPQorICAgICAgICBuZXcgQ29tcGxleERpc2Nsb3N1cmVQYW5lbChVdGlsLkMuYWRkU3NoS2V5SGVscFRpdGxlKCksIGZhbHNlKTsKKyAgICBhZGRTc2hLZXlIZWxwLnNldENvbnRlbnQobmV3IEhUTUwoVXRpbC5DLmFkZFNzaEtleUhlbHAoKSkpOworICAgIGFkZEtleUJsb2NrLmFkZChhZGRTc2hLZXlIZWxwKTsKIAogICAgIGFkZFR4dCA9IG5ldyBOcFRleHRBcmVhKCk7CiAgICAgYWRkVHh0LnNldFZpc2libGVMaW5lcygxMik7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRkRmlsZUNvbW1lbnQucG5nIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkZEZpbGVDb21tZW50LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUzYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkZEZpbGVDb21tZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IuamF2YQppbmRleCBhOWFhNDE4Li4zNDQxMDRkIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2Nlc3NTZWN0aW9uRWRpdG9yLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFjY2VzczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZWZDb25maWdTZWN0aW9uOwpAQCAtMjI2LDEwICsyMjYsOCBAQAogICAgICAgICBhZGRQZXJtaXNzaW9uKHZhck5hbWUsIHBlcm1zKTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKFJlZkNvbmZpZ1NlY3Rpb24uaXNWYWxpZCh2YWx1ZS5nZXROYW1lKCkpKSB7Ci0gICAgICBmb3IgKEFwcHJvdmFsVHlwZSB0IDogR2Vycml0LmdldENvbmZpZygpLmdldEFwcHJvdmFsVHlwZXMoKQotICAgICAgICAgIC5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBQZXJtaXNzaW9uLkxBQkVMICsgdC5nZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpOwotICAgICAgICBhZGRQZXJtaXNzaW9uKHZhck5hbWUsIHBlcm1zKTsKKyAgICAgIGZvciAoTGFiZWxUeXBlIHQgOiBwcm9qZWN0QWNjZXNzLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkpIHsKKyAgICAgICAgYWRkUGVybWlzc2lvbihQZXJtaXNzaW9uLkxBQkVMICsgdC5nZXROYW1lKCksIHBlcm1zKTsKICAgICAgIH0KICAgICAgIGZvciAoU3RyaW5nIHZhck5hbWUgOiBVdGlsLkMucGVybWlzc2lvbk5hbWVzKCkua2V5U2V0KCkpIHsKICAgICAgICAgYWRkUGVybWlzc2lvbih2YXJOYW1lLCBwZXJtcyk7CkBAIC0yODQsNyArMjgyLDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGVybWlzc2lvbkVkaXRvciBjcmVhdGUoaW50IGluZGV4KSB7CiAgICAgICBQZXJtaXNzaW9uRWRpdG9yIHN1YkVkaXRvciA9Ci0gICAgICAgICAgbmV3IFBlcm1pc3Npb25FZGl0b3IocHJvamVjdEFjY2Vzcy5nZXRQcm9qZWN0TmFtZSgpLCByZWFkT25seSwgdmFsdWUpOworICAgICAgICAgIG5ldyBQZXJtaXNzaW9uRWRpdG9yKHByb2plY3RBY2Nlc3MuZ2V0UHJvamVjdE5hbWUoKSwgcmVhZE9ubHksIHZhbHVlLAorICAgICAgICAgICAgICBwcm9qZWN0QWNjZXNzLmdldExhYmVsVHlwZXMoKSk7CiAgICAgICBwZXJtaXNzaW9uQ29udGFpbmVyLmluc2VydChzdWJFZGl0b3IsIGluZGV4KTsKICAgICAgIHJldHVybiBzdWJFZGl0b3I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IudWkueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IudWkueG1sCmluZGV4IDUwMWMzZmMuLmIzMWUwMmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2Nlc3NTZWN0aW9uRWRpdG9yLnVpLnhtbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci51aS54bWwKQEAgLTI5LDYgKzI5LDcgQEAKICAgQGV2YWwgdHJpbUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50cmltQ29sb3I7CiAKICAgLnBhbmVsIHsKKyAgICB3aWR0aDogNTBlbTsKICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cEluZm9TY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBJbmZvU2NyZWVuLmphdmEKaW5kZXggZWE3YzA0Yi4uZWE4MzZjNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cEluZm9TY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwSW5mb1NjcmVlbi5qYXZhCkBAIC0xNSwyOCArMTUsMjQgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlJQQ1N1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cE9wdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2hhbmdlSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkxhYmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkxpc3RCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuY2xpcHB5LmNsaWVudC5Db3B5YWJsZUxhYmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRBcmVhOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgQWNjb3VudEdyb3VwSW5mb1NjcmVlbiBleHRlbmRzIEFjY291bnRHcm91cFNjcmVlbiB7CiAgIHByaXZhdGUgQ29weWFibGVMYWJlbCBncm91cFVVSURMYWJlbDsKQEAgLTUxLDE0ICs0NywxMCBAQAogICBwcml2YXRlIE5wVGV4dEFyZWEgZGVzY1R4dDsKICAgcHJpdmF0ZSBCdXR0b24gc2F2ZURlc2M7CiAKLSAgcHJpdmF0ZSBMYWJlbCB0eXBlU3lzdGVtOwotICBwcml2YXRlIExpc3RCb3ggdHlwZVNlbGVjdDsKLSAgcHJpdmF0ZSBCdXR0b24gc2F2ZVR5cGU7Ci0KICAgcHJpdmF0ZSBDaGVja0JveCB2aXNpYmxlVG9BbGxDaGVja0JveDsKICAgcHJpdmF0ZSBCdXR0b24gc2F2ZUdyb3VwT3B0aW9uczsKIAotICBwdWJsaWMgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihmaW5hbCBHcm91cERldGFpbCB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgeworICBwdWJsaWMgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihmaW5hbCBHcm91cEluZm8gdG9TaG93LCBmaW5hbCBTdHJpbmcgdG9rZW4pIHsKICAgICBzdXBlcih0b1Nob3csIHRva2VuKTsKICAgfQogCkBAIC03MCwxNCArNjIsMTIgQEAKICAgICBpbml0T3duZXIoKTsKICAgICBpbml0RGVzY3JpcHRpb24oKTsKICAgICBpbml0R3JvdXBPcHRpb25zKCk7Ci0gICAgaW5pdEdyb3VwVHlwZSgpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUZvcm0oZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKICAgICBncm91cE5hbWVUeHQuc2V0RW5hYmxlZChjYW5Nb2RpZnkpOwogICAgIG93bmVyVHh0Qm94LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKICAgICBkZXNjVHh0LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKLSAgICB0eXBlU2VsZWN0LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKICAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRFbmFibGVkKGNhbk1vZGlmeSk7CiAgIH0KIApAQCAtMTA0LDEyICs5NCwxNSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG5ld05hbWUgPSBncm91cE5hbWVUeHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMucmVuYW1lR3JvdXAoZ2V0R3JvdXBJZCgpLCBuZXdOYW1lLAotICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwRGV0YWlsIGdyb3VwRGV0YWlsKSB7CisgICAgICAgIEdyb3VwQXBpLnJlbmFtZUdyb3VwKGdldEdyb3VwVVVJRCgpLCBuZXdOYW1lLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0PigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgIHNhdmVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZShVdGlsLk0uZ3JvdXAoZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgZGlzcGxheShncm91cERldGFpbCk7CisgICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKFV0aWwuTS5ncm91cChuZXdOYW1lKSk7CisgICAgICAgICAgICAgICAgZ3JvdXBOYW1lVHh0LnNldFRleHQobmV3TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGdldEdyb3VwVVVJRCgpLmVxdWFscyhnZXRPd25lckdyb3VwVVVJRCgpKSkgeworICAgICAgICAgICAgICAgICAgb3duZXJUeHQuc2V0VGV4dChuZXdOYW1lKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgICAgfQpAQCAtMTM5LDkgKzEzMiwxMCBAQAogICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuZXdPd25lciA9IG93bmVyVHh0LmdldFRleHQoKS50cmltKCk7CiAgICAgICAgIGlmIChuZXdPd25lci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBVdGlsLkdST1VQX1NWQy5jaGFuZ2VHcm91cE93bmVyKGdldEdyb3VwSWQoKSwgbmV3T3duZXIsCi0gICAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICBHcm91cEFwaS5zZXRHcm91cE93bmVyKGdldEdyb3VwVVVJRCgpLCBuZXdPd25lciwKKyAgICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwSW5mbz4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgIHVwZGF0ZU93bmVyR3JvdXAocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgIHNhdmVPd25lci5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0pOwpAQCAtMTcwLDcgKzE2NCw3IEBACiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgdHh0ID0gZGVzY1R4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBVdGlsLkdST1VQX1NWQy5jaGFuZ2VHcm91cERlc2NyaXB0aW9uKGdldEdyb3VwSWQoKSwgdHh0LAorICAgICAgICBHcm91cEFwaS5zZXRHcm91cERlc2NyaXB0aW9uKGdldEdyb3VwVVVJRCgpLCB0eHQsCiAgICAgICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CiAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBWb2lkUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgIHNhdmVEZXNjLnNldEVuYWJsZWQoZmFsc2UpOwpAQCAtMjAwLDEwICsxOTQsOCBAQAogICAgIHNhdmVHcm91cE9wdGlvbnMuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmaW5hbCBHcm91cE9wdGlvbnMgZ3JvdXBPcHRpb25zID0KLSAgICAgICAgICAgIG5ldyBHcm91cE9wdGlvbnModmlzaWJsZVRvQWxsQ2hlY2tCb3guZ2V0VmFsdWUoKSk7Ci0gICAgICAgIFV0aWwuR1JPVVBfU1ZDLmNoYW5nZUdyb3VwT3B0aW9ucyhnZXRHcm91cElkKCksIGdyb3VwT3B0aW9ucywKLSAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKKyAgICAgICAgR3JvdXBBcGkuc2V0R3JvdXBPcHRpb25zKGdldEdyb3VwVVVJRCgpLAorICAgICAgICAgICAgdmlzaWJsZVRvQWxsQ2hlY2tCb3guZ2V0VmFsdWUoKSwgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICBzYXZlR3JvdXBPcHRpb25zLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICB9CkBAIC0yMTgsMTE0ICsyMTAsMjAgQEAKICAgICBlbmFibGVyLmxpc3RlblRvKHZpc2libGVUb0FsbENoZWNrQm94KTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0R3JvdXBUeXBlKCkgewotICAgIHR5cGVTeXN0ZW0gPSBuZXcgTGFiZWwoVXRpbC5DLmdyb3VwVHlwZV9TWVNURU0oKSk7Ci0KLSAgICB0eXBlU2VsZWN0ID0gbmV3IExpc3RCb3goKTsKLSAgICB0eXBlU2VsZWN0LnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmdyb3VwVHlwZVNlbGVjdExpc3RCb3goKSk7Ci0gICAgdHlwZVNlbGVjdC5hZGRJdGVtKFV0aWwuQy5ncm91cFR5cGVfSU5URVJOQUwoKSwgQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwubmFtZSgpKTsKLSAgICB0eXBlU2VsZWN0LmFkZENoYW5nZUhhbmRsZXIobmV3IENoYW5nZUhhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHNhdmVUeXBlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzYXZlVHlwZSA9IG5ldyBCdXR0b24oVXRpbC5DLmJ1dHRvbkNoYW5nZUdyb3VwVHlwZSgpKTsKLSAgICBzYXZlVHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBzYXZlVHlwZS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9uU2F2ZVR5cGUoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHN3aXRjaCAoR2Vycml0LmdldENvbmZpZygpLmdldEF1dGhUeXBlKCkpIHsKLSAgICAgIGNhc2UgSFRUUF9MREFQOgotICAgICAgY2FzZSBMREFQOgotICAgICAgY2FzZSBMREFQX0JJTkQ6Ci0gICAgICBjYXNlIENMSUVOVF9TU0xfQ0VSVF9MREFQOgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmaW5hbCBWZXJ0aWNhbFBhbmVsIGZwID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBmcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5ncm91cFR5cGVQYW5lbCgpKTsKLSAgICBmcC5hZGQobmV3IFNtYWxsSGVhZGluZyhVdGlsLkMuaGVhZGluZ0dyb3VwVHlwZSgpKSk7Ci0gICAgZnAuYWRkKHR5cGVTeXN0ZW0pOwotICAgIGZwLmFkZCh0eXBlU2VsZWN0KTsKLSAgICBmcC5hZGQoc2F2ZVR5cGUpOwotICAgIGFkZChmcCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0VHlwZShmaW5hbCBBY2NvdW50R3JvdXAuVHlwZSBuZXdUeXBlKSB7Ci0gICAgZmluYWwgYm9vbGVhbiBzeXN0ZW0gPSBuZXdUeXBlID09IEFjY291bnRHcm91cC5UeXBlLlNZU1RFTTsKLQotICAgIHR5cGVTeXN0ZW0uc2V0VmlzaWJsZShzeXN0ZW0pOwotICAgIHR5cGVTZWxlY3Quc2V0VmlzaWJsZSghc3lzdGVtKTsKLSAgICBzYXZlVHlwZS5zZXRWaXNpYmxlKCFzeXN0ZW0pOwotCi0gICAgaWYgKCFzeXN0ZW0pIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNlbGVjdC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChuZXdUeXBlLm5hbWUoKS5lcXVhbHModHlwZVNlbGVjdC5nZXRWYWx1ZShpKSkpIHsKLSAgICAgICAgICB0eXBlU2VsZWN0LnNldFNlbGVjdGVkSW5kZXgoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzYXZlVHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIHNldE1lbWJlcnNUYWJWaXNpYmxlKG5ld1R5cGUgPT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uU2F2ZVR5cGUoKSB7Ci0gICAgZmluYWwgaW50IGlkeCA9IHR5cGVTZWxlY3QuZ2V0U2VsZWN0ZWRJbmRleCgpOwotICAgIGZpbmFsIEFjY291bnRHcm91cC5UeXBlIG5ld1R5cGUgPQotICAgICAgICBBY2NvdW50R3JvdXAuVHlwZS52YWx1ZU9mKHR5cGVTZWxlY3QuZ2V0VmFsdWUoaWR4KSk7Ci0KLSAgICB0eXBlU2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIHNhdmVUeXBlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgVXRpbC5HUk9VUF9TVkMuY2hhbmdlR3JvdXBUeXBlKGdldEdyb3VwSWQoKSwgbmV3VHlwZSwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgdHlwZVNlbGVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2V0VHlwZShuZXdUeXBlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgdHlwZVNlbGVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2F2ZVR5cGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwRGV0YWlsLmdyb3VwOworICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5KGZpbmFsIEdyb3VwSW5mbyBncm91cCwgZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKICAgICBncm91cFVVSURMYWJlbC5zZXRUZXh0KGdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpKTsKLSAgICBncm91cE5hbWVUeHQuc2V0VGV4dChncm91cC5nZXROYW1lKCkpOwotICAgIGlmIChncm91cERldGFpbC5vd25lckdyb3VwICE9IG51bGwpIHsKLSAgICAgIG93bmVyVHh0LnNldFRleHQoZ3JvdXBEZXRhaWwub3duZXJHcm91cC5nZXROYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvd25lclR4dC5zZXRUZXh0KFV0aWwuTS5kZWxldGVkUmVmZXJlbmNlKGdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkuZ2V0KCkpKTsKLSAgICB9Ci0gICAgZGVzY1R4dC5zZXRUZXh0KGdyb3VwLmdldERlc2NyaXB0aW9uKCkpOworICAgIGdyb3VwTmFtZVR4dC5zZXRUZXh0KGdyb3VwLm5hbWUoKSk7CisgICAgb3duZXJUeHQuc2V0VGV4dChncm91cC5vd25lcigpICE9IG51bGw/Z3JvdXAub3duZXIoKTpVdGlsLk0uZGVsZXRlZFJlZmVyZW5jZShncm91cC5nZXRPd25lclVVSUQoKS5nZXQoKSkpOworICAgIGRlc2NUeHQuc2V0VGV4dChncm91cC5kZXNjcmlwdGlvbigpKTsKKyAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRWYWx1ZShncm91cC5vcHRpb25zKCkuaXNWaXNpYmxlVG9BbGwoKSk7CisgICAgc2V0TWVtYmVyc1RhYlZpc2libGUoQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkKKyAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSk7CiAKLSAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRWYWx1ZShncm91cC5pc1Zpc2libGVUb0FsbCgpKTsKLQotICAgIHNldFR5cGUoZ3JvdXAuZ2V0VHlwZSgpKTsKLQotICAgIGVuYWJsZUZvcm0oZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBzYXZlTmFtZS5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZU93bmVyLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBzYXZlRGVzYy5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZUdyb3VwT3B0aW9ucy5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZVR5cGUuc2V0VmlzaWJsZShncm91cERldGFpbC5jYW5Nb2RpZnkpOworICAgIGVuYWJsZUZvcm0oY2FuTW9kaWZ5KTsKKyAgICBzYXZlTmFtZS5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CisgICAgc2F2ZU93bmVyLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKKyAgICBzYXZlRGVzYy5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CisgICAgc2F2ZUdyb3VwT3B0aW9ucy5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwTWVtYmVyc1NjcmVlbi5qYXZhCmluZGV4IDRjMGIxYmEuLmMyNzZhODkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cE1lbWJlcnNTY3JlZW4uamF2YQpAQCAtMTYsMzcgKzE2LDM2IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BZGRNZW1iZXJCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwSW5mbzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cEluZm9DYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxleFRhYmxlLkZsZXhDZWxsRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIHB1YmxpYyBjbGFzcyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuIGV4dGVuZHMgQWNjb3VudEdyb3VwU2NyZWVuIHsKIAotICBwcml2YXRlIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHMgPSBBY2NvdW50SW5mb0NhY2hlLmVtcHR5KCk7Ci0gIHByaXZhdGUgR3JvdXBJbmZvQ2FjaGUgZ3JvdXBzID0gR3JvdXBJbmZvQ2FjaGUuZW1wdHkoKTsKICAgcHJpdmF0ZSBNZW1iZXJUYWJsZSBtZW1iZXJzOwogICBwcml2YXRlIEluY2x1ZGVUYWJsZSBpbmNsdWRlczsKIApAQCAtNjAsNyArNTksNyBAQAogCiAgIHByaXZhdGUgRmxvd1BhbmVsIG5vTWVtYmVyc0luZm87CiAKLSAgcHVibGljIEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZmluYWwgR3JvdXBEZXRhaWwgdG9TaG93LCBmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgcHVibGljIEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZmluYWwgR3JvdXBJbmZvIHRvU2hvdywgZmluYWwgU3RyaW5nIHRva2VuKSB7CiAgICAgc3VwZXIodG9TaG93LCB0b2tlbik7CiAgIH0KIApAQCAtMTExLDggKzExMCw4IEBACiAKICAgcHJpdmF0ZSB2b2lkIGluaXRJbmNsdWRlTGlzdCgpIHsKICAgICBhZGRJbmNsdWRlQm94ID0KLSAgICAgIG5ldyBBZGRNZW1iZXJCb3goVXRpbC5DLmJ1dHRvbkFkZEluY2x1ZGVkR3JvdXAoKSwKLSAgICAgICAgICBVdGlsLkMuZGVmYXVsdEFjY291bnRHcm91cE5hbWUoKSwgbmV3IEFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUoKSk7CisgICAgICAgIG5ldyBBZGRNZW1iZXJCb3goVXRpbC5DLmJ1dHRvbkFkZEluY2x1ZGVkR3JvdXAoKSwKKyAgICAgICAgICAgIFV0aWwuQy5kZWZhdWx0QWNjb3VudEdyb3VwTmFtZSgpLCBuZXcgQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZSgpKTsKIAogICAgIGFkZEluY2x1ZGVCb3guYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTE0OCwyNCArMTQ3LDIwIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgIHN3aXRjaCAoZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0VHlwZSgpKSB7Ci0gICAgICBjYXNlIElOVEVSTkFMOgotICAgICAgICBhY2NvdW50cyA9IGdyb3VwRGV0YWlsLmFjY291bnRzOwotICAgICAgICBncm91cHMgPSBncm91cERldGFpbC5ncm91cHM7Ci0gICAgICAgIG1lbWJlcnMuZGlzcGxheShncm91cERldGFpbC5tZW1iZXJzKTsKLSAgICAgICAgaW5jbHVkZXMuZGlzcGxheShncm91cERldGFpbC5pbmNsdWRlcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbWVtYmVyUGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGluY2x1ZGVQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbm9NZW1iZXJzSW5mby5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBicmVhazsKKyAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cEluZm8gZ3JvdXAsIGZpbmFsIGJvb2xlYW4gY2FuTW9kaWZ5KSB7CisgICAgaWYgKEFjY291bnRHcm91cC5pc0ludGVybmFsR3JvdXAoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpCisgICAgICAgICYmICFBY2NvdW50R3JvdXAuaXNTeXN0ZW1Hcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgIG1lbWJlcnMuZGlzcGxheShOYXRpdmVzLmFzTGlzdChncm91cC5tZW1iZXJzKCkpKTsKKyAgICAgIGluY2x1ZGVzLmRpc3BsYXkoTmF0aXZlcy5hc0xpc3QoZ3JvdXAuaW5jbHVkZXMoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1iZXJQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIGluY2x1ZGVQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIG5vTWVtYmVyc0luZm8uc2V0VmlzaWJsZSh0cnVlKTsKICAgICB9CiAKLSAgICBlbmFibGVGb3JtKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgZGVsTWVtYmVyLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBkZWxJbmNsdWRlLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKKyAgICBlbmFibGVGb3JtKGNhbk1vZGlmeSk7CisgICAgZGVsTWVtYmVyLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKKyAgICBkZWxJbmNsdWRlLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKICAgfQogCiAgIHZvaWQgZG9BZGROZXdNZW1iZXIoKSB7CkBAIC0xNzUsMTUgKzE3MCwxMiBAQAogICAgIH0KIAogICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBVdGlsLkdST1VQX1NWQy5hZGRHcm91cE1lbWJlcihnZXRHcm91cElkKCksIG5hbWVFbWFpbCwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBEZXRhaWwgcmVzdWx0KSB7CisgICAgR3JvdXBBcGkuYWRkTWVtYmVyKGdldEdyb3VwVVVJRCgpLCBuYW1lRW1haWwsCisgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxBY2NvdW50SW5mbz4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEFjY291bnRJbmZvIG1lbWJlckluZm8pIHsKICAgICAgICAgICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgYWRkTWVtYmVyQm94LnNldFRleHQoIiIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5hY2NvdW50cyAhPSBudWxsICYmIHJlc3VsdC5tZW1iZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgYWNjb3VudHMubWVyZ2UocmVzdWx0LmFjY291bnRzKTsKLSAgICAgICAgICAgICAgbWVtYmVycy5kaXNwbGF5KHJlc3VsdC5tZW1iZXJzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWJlcnMuaW5zZXJ0KG1lbWJlckluZm8pOwogICAgICAgICAgIH0KIAogICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjAxLDE1ICsxOTMsMTIgQEAKICAgICB9CiAKICAgICBhZGRJbmNsdWRlQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIFV0aWwuR1JPVVBfU1ZDLmFkZEdyb3VwSW5jbHVkZShnZXRHcm91cElkKCksIGdyb3VwTmFtZSwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBEZXRhaWwgcmVzdWx0KSB7CisgICAgR3JvdXBBcGkuYWRkSW5jbHVkZWRHcm91cChnZXRHcm91cFVVSUQoKSwgZ3JvdXBOYW1lLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8R3JvdXBJbmZvPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBJbmZvIHJlc3VsdCkgewogICAgICAgICAgICAgYWRkSW5jbHVkZUJveC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgYWRkSW5jbHVkZUJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ3JvdXBzICE9IG51bGwgJiYgcmVzdWx0LmluY2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZ3JvdXBzLm1lcmdlKHJlc3VsdC5ncm91cHMpOwotICAgICAgICAgICAgICBpbmNsdWRlcy5kaXNwbGF5KHJlc3VsdC5pbmNsdWRlcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbmNsdWRlcy5pbnNlcnQocmVzdWx0KTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTIyMCw3ICsyMDksNyBAQAogICAgICAgICB9KTsKICAgfQogCi0gIHByaXZhdGUgY2xhc3MgTWVtYmVyVGFibGUgZXh0ZW5kcyBGYW5jeUZsZXhUYWJsZTxBY2NvdW50R3JvdXBNZW1iZXI+IHsKKyAgcHJpdmF0ZSBjbGFzcyBNZW1iZXJUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEFjY291bnRJbmZvPiB7CiAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwogCiAgICAgTWVtYmVyVGFibGUoKSB7CkBAIC0yMzYsMjkgKzIyNSwyOCBAQAogICAgIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBib29sZWFuIGVuYWJsZWQpIHsKICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByb3crKykgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCkgeworICAgICAgICBmaW5hbCBBY2NvdW50SW5mbyBpID0gZ2V0Um93SXRlbShyb3cpOworICAgICAgICBpZiAoaSAhPSBudWxsKSB7CiAgICAgICAgICAgKChDaGVja0JveCkgdGFibGUuZ2V0V2lkZ2V0KHJvdywgMSkpLnNldEVuYWJsZWQoZW5hYmxlZCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGRlbGV0ZUNoZWNrZWQoKSB7Ci0gICAgICBmaW5hbCBIYXNoU2V0PEFjY291bnRHcm91cE1lbWJlci5LZXk+IGlkcyA9Ci0gICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwTWVtYmVyLktleT4oKTsKKyAgICAgIGZpbmFsIEhhc2hTZXQ8SW50ZWdlcj4gaWRzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBrID0gZ2V0Um93SXRlbShyb3cpOwotICAgICAgICBpZiAoayAhPSBudWxsICYmICgoQ2hlY2tCb3gpIHRhYmxlLmdldFdpZGdldChyb3csIDEpKS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgaWRzLmFkZChrLmdldEtleSgpKTsKKyAgICAgICAgZmluYWwgQWNjb3VudEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGlkcy5hZGQoaS5fYWNjb3VudF9pZCgpKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKCFpZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFV0aWwuR1JPVVBfU1ZDLmRlbGV0ZUdyb3VwTWVtYmVycyhnZXRHcm91cElkKCksIGlkcywKKyAgICAgICAgR3JvdXBBcGkucmVtb3ZlTWVtYmVycyhnZXRHcm91cFVVSUQoKSwgaWRzLAogICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpOykgewotICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIGsgPSBnZXRSb3dJdGVtKHJvdyk7Ci0gICAgICAgICAgICAgICAgICBpZiAoayAhPSBudWxsICYmIGlkcy5jb250YWlucyhrLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgICAgICAgICAgIGlmIChpICE9IG51bGwgJiYgaWRzLmNvbnRhaW5zKGkuX2FjY291bnRfaWQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7CiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByb3crKzsKQEAgLTI2OSwzNiArMjU3LDgwIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkaXNwbGF5KGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwTWVtYmVyPiByZXN1bHQpIHsKKyAgICB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50SW5mbz4gcmVzdWx0KSB7CiAgICAgICB3aGlsZSAoMSA8IHRhYmxlLmdldFJvd0NvdW50KCkpCiAgICAgICAgIHRhYmxlLnJlbW92ZVJvdyh0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7CiAKLSAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIGsgOiByZXN1bHQpIHsKKyAgICAgIGZvciAoZmluYWwgQWNjb3VudEluZm8gaSA6IHJlc3VsdCkgewogICAgICAgICBmaW5hbCBpbnQgcm93ID0gdGFibGUuZ2V0Um93Q291bnQoKTsKICAgICAgICAgdGFibGUuaW5zZXJ0Um93KHJvdyk7CiAgICAgICAgIGFwcGx5RGF0YVJvd1N0eWxlKHJvdyk7Ci0gICAgICAgIHBvcHVsYXRlKHJvdywgayk7CisgICAgICAgIHBvcHVsYXRlKHJvdywgaSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgaykgewotICAgICAgZmluYWwgQWNjb3VudC5JZCBhY2NvdW50SWQgPSBrLmdldEFjY291bnRJZCgpOworICAgIHZvaWQgaW5zZXJ0KEFjY291bnRJbmZvIGluZm8pIHsKKyAgICAgIENvbXBhcmF0b3I8QWNjb3VudEluZm8+IGMgPSBuZXcgQ29tcGFyYXRvcjxBY2NvdW50SW5mbz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQWNjb3VudEluZm8gYSwgQWNjb3VudEluZm8gYikgeworICAgICAgICAgIGludCBjbXAgPSBudWxsVG9FbXB0eShhLm5hbWUoKSkuY29tcGFyZVRvKG51bGxUb0VtcHR5KGIubmFtZSgpKSk7CisgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICAgIH0KKworICAgICAgICAgIGNtcCA9IG51bGxUb0VtcHR5KGEuZW1haWwoKSkuY29tcGFyZVRvKG51bGxUb0VtcHR5KGIuZW1haWwoKSkpOworICAgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gYS5fYWNjb3VudF9pZCgpIC0gYi5fYWNjb3VudF9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBudWxsVG9FbXB0eShTdHJpbmcgc3RyKSB7CisgICAgICAgICAgcmV0dXJuIHN0ciA9PSBudWxsID8gIiIgOiBzdHI7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBpbnQgaW5zZXJ0UG9zaXRpb24gPSB0YWJsZS5nZXRSb3dDb3VudCgpOworICAgICAgaW50IGxlZnQgPSAxOworICAgICAgaW50IHJpZ2h0ID0gdGFibGUuZ2V0Um93Q291bnQoKSAtIDE7CisgICAgICB3aGlsZSAobGVmdCA8PSByaWdodCkgeworICAgICAgICBpbnQgbWlkZGxlID0gKGxlZnQgKyByaWdodCkgPj4+IDE7IC8vIChsZWZ0K3JpZ2h0KS8yCisgICAgICAgIEFjY291bnRJbmZvIGkgPSBnZXRSb3dJdGVtKG1pZGRsZSk7CisgICAgICAgIGludCBjbXAgPSBjLmNvbXBhcmUoaSwgaW5mbyk7CisKKyAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTsKKyAgICAgICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgcmlnaHQgPSBtaWRkbGUgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGdyb3VwIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSB0YWJsZQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5zZXJ0UG9zaXRpb24gPSBsZWZ0OworCisgICAgICB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pOworICAgICAgYXBwbHlEYXRhUm93U3R5bGUoaW5zZXJ0UG9zaXRpb24pOworICAgICAgcG9wdWxhdGUoaW5zZXJ0UG9zaXRpb24sIGluZm8pOworICAgIH0KKworICAgIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgQWNjb3VudEluZm8gaSkgewogICAgICAgQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgQ2hlY2tCb3goKTsKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIGNoZWNrQm94KTsKICAgICAgIGNoZWNrQm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAyLCBBY2NvdW50TGluay5saW5rKGFjY291bnRzLCBhY2NvdW50SWQpKTsKLSAgICAgIHRhYmxlLnNldFRleHQocm93LCAzLCBhY2NvdW50cy5nZXQoYWNjb3VudElkKS5nZXRQcmVmZXJyZWRFbWFpbCgpKTsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsIG5ldyBBY2NvdW50TGluayhpKSk7CisgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMywgaS5lbWFpbCgpKTsKIAogICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOwogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKIAotICAgICAgc2V0Um93SXRlbShyb3csIGspOworICAgICAgc2V0Um93SXRlbShyb3csIGkpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgY2xhc3MgSW5jbHVkZVRhYmxlIGV4dGVuZHMgRmFuY3lGbGV4VGFibGU8QWNjb3VudEdyb3VwSW5jbHVkZT4geworICBwcml2YXRlIGNsYXNzIEluY2x1ZGVUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEdyb3VwSW5mbz4gewogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKIAogICAgIEluY2x1ZGVUYWJsZSgpIHsKQEAgLTMxNCwyOSArMzQ2LDI4IEBACiAgICAgdm9pZCBzZXRFbmFibGVkKGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewogICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCkgeworICAgICAgICBmaW5hbCBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCkgewogICAgICAgICAgICgoQ2hlY2tCb3gpIHRhYmxlLmdldFdpZGdldChyb3csIDEpKS5zZXRFbmFibGVkKGVuYWJsZWQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBkZWxldGVDaGVja2VkKCkgewotICAgICAgZmluYWwgSGFzaFNldDxBY2NvdW50R3JvdXBJbmNsdWRlLktleT4ga2V5cyA9Ci0gICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZS5LZXk+KCk7CisgICAgICBmaW5hbCBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuVVVJRD4oKTsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgIGtleXMuYWRkKGsuZ2V0S2V5KCkpOworICAgICAgICBmaW5hbCBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGlkcy5hZGQoaS5nZXRHcm91cFVVSUQoKSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICgha2V5cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMuZGVsZXRlR3JvdXBJbmNsdWRlcyhnZXRHcm91cElkKCksIGtleXMsCisgICAgICBpZiAoIWlkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgR3JvdXBBcGkucmVtb3ZlSW5jbHVkZWRHcm91cHMoZ2V0R3JvdXBVVUlEKCksIGlkcywKICAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIFZvaWRSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgdGFibGUuZ2V0Um93Q291bnQoKTspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgICAgICAgICAgIGlmIChrICE9IG51bGwgJiYga2V5cy5jb250YWlucyhrLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgZmluYWwgR3JvdXBJbmZvIGkgPSBnZXRSb3dJdGVtKHJvdyk7CisgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsICYmIGlkcy5jb250YWlucyhpLmdldEdyb3VwVVVJRCgpKSkgewogICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVSb3cocm93KTsKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJvdysrOwpAQCAtMzQ3LDM0ICszNzgsODcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPiByZXN1bHQpIHsKKyAgICB2b2lkIGRpc3BsYXkoTGlzdDxHcm91cEluZm8+IGxpc3QpIHsKICAgICAgIHdoaWxlICgxIDwgdGFibGUuZ2V0Um93Q291bnQoKSkKICAgICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKIAotICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIGsgOiByZXN1bHQpIHsKKyAgICAgIGZvciAoZmluYWwgR3JvdXBJbmZvIGkgOiBsaXN0KSB7CiAgICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKICAgICAgICAgYXBwbHlEYXRhUm93U3R5bGUocm93KTsKLSAgICAgICAgcG9wdWxhdGUocm93LCBrKTsKKyAgICAgICAgcG9wdWxhdGUocm93LCBpKTsKICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHBvcHVsYXRlKGZpbmFsIGludCByb3csIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgaykgewotICAgICAgQWNjb3VudEdyb3VwLklkIGlkID0gay5nZXRJbmNsdWRlSWQoKTsKLSAgICAgIEdyb3VwSW5mbyBncm91cCA9IGdyb3Vwcy5nZXQoaWQpOworICAgIHZvaWQgaW5zZXJ0KEdyb3VwSW5mbyBpbmZvKSB7CisgICAgICBDb21wYXJhdG9yPEdyb3VwSW5mbz4gYyA9IG5ldyBDb21wYXJhdG9yPEdyb3VwSW5mbz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoR3JvdXBJbmZvIGEsIEdyb3VwSW5mbyBiKSB7CisgICAgICAgICAgaW50IGNtcCA9IG51bGxUb0VtcHR5KGEubmFtZSgpKS5jb21wYXJlVG8obnVsbFRvRW1wdHkoYi5uYW1lKCkpKTsKKyAgICAgICAgICBpZiAoY21wICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBhLmdldEdyb3VwVVVJRCgpLmNvbXBhcmVUbyhiLmdldEdyb3VwVVVJRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG51bGxUb0VtcHR5KEBOdWxsYWJsZSBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgcmV0dXJuIChzdHIgPT0gbnVsbCkgPyAiIiA6IHN0cjsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgaW50IGluc2VydFBvc2l0aW9uID0gdGFibGUuZ2V0Um93Q291bnQoKTsKKyAgICAgIGludCBsZWZ0ID0gMTsKKyAgICAgIGludCByaWdodCA9IHRhYmxlLmdldFJvd0NvdW50KCkgLSAxOworICAgICAgd2hpbGUgKGxlZnQgPD0gcmlnaHQpIHsKKyAgICAgICAgaW50IG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpID4+PiAxOyAvLyAobGVmdCtyaWdodCkvMgorICAgICAgICBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0obWlkZGxlKTsKKyAgICAgICAgaW50IGNtcCA9IGMuY29tcGFyZShpLCBpbmZvKTsKKworICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgIGxlZnQgPSBtaWRkbGUgKyAxOworICAgICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICByaWdodCA9IG1pZGRsZSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gZ3JvdXAgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIHRhYmxlCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbnNlcnRQb3NpdGlvbiA9IGxlZnQ7CisKKyAgICAgIHRhYmxlLmluc2VydFJvdyhpbnNlcnRQb3NpdGlvbik7CisgICAgICBhcHBseURhdGFSb3dTdHlsZShpbnNlcnRQb3NpdGlvbik7CisgICAgICBwb3B1bGF0ZShpbnNlcnRQb3NpdGlvbiwgaW5mbyk7CisgICAgfQorCisgICAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBHcm91cEluZm8gaSkgeworICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA9IGkuZ2V0R3JvdXBVVUlEKCk7CiAgICAgICBDaGVja0JveCBjaGVja0JveCA9IG5ldyBDaGVja0JveCgpOwogICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMSwgY2hlY2tCb3gpOwogICAgICAgY2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsCi0gICAgICAgICAgbmV3IEh5cGVybGluayhncm91cC5nZXROYW1lKCksIERpc3BhdGNoZXIudG9Hcm91cChpZCkpKTsKLSAgICAgIHRhYmxlLnNldFRleHQocm93LCAzLCBncm91cHMuZ2V0KGlkKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgIGlmIChBY2NvdW50R3JvdXAuaXNJbnRlcm5hbEdyb3VwKHV1aWQpKSB7CisgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsCisgICAgICAgICAgICBuZXcgSHlwZXJsaW5rKGkubmFtZSgpLCBEaXNwYXRjaGVyLnRvR3JvdXAodXVpZCkpKTsKKyAgICAgICAgZm10LmdldEVsZW1lbnQocm93LCAyKS5zZXRUaXRsZShudWxsKTsKKyAgICAgICAgdGFibGUuc2V0VGV4dChyb3csIDMsIGkuZGVzY3JpcHRpb24oKSk7CisgICAgICB9IGVsc2UgaWYgKGkudXJsKCkgIT0gbnVsbCkgeworICAgICAgICBBbmNob3IgYSA9IG5ldyBBbmNob3IoKTsKKyAgICAgICAgYS5zZXRUZXh0KGkubmFtZSgpKTsKKyAgICAgICAgYS5zZXRIcmVmKGkudXJsKCkpOworICAgICAgICBhLnNldFRpdGxlKCJVVUlEICIgKyB1dWlkLmdldCgpKTsKKyAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMiwgYSk7CisgICAgICAgIGZtdC5nZXRFbGVtZW50KHJvdywgMikuc2V0VGl0bGUobnVsbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgaS5uYW1lKCkpOworICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIDIpLnNldFRpdGxlKCJVVUlEICIgKyB1dWlkLmdldCgpKTsKKyAgICAgIH0KIAotICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOwogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKIAotICAgICAgc2V0Um93SXRlbShyb3csIGspOworICAgICAgc2V0Um93SXRlbShyb3csIGkpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cFNjcmVlbi5qYXZhCmluZGV4IDlhYzZjOWEuLmFkZTAwYjkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwU2NyZWVuLmphdmEKQEAgLTE2LDQ4ICsxNiw2NSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5EaXNwYXRjaGVyLnRvR3JvdXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk1lbnVTY3JlZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFjY291bnRHcm91cFNjcmVlbiBleHRlbmRzIE1lbnVTY3JlZW4gewogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPID0gImluZm8iOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTID0gIm1lbWJlcnMiOwogCi0gIHByaXZhdGUgZmluYWwgR3JvdXBEZXRhaWwgZ3JvdXBEZXRhaWw7CisgIHByaXZhdGUgZmluYWwgR3JvdXBJbmZvIGdyb3VwOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZW1iZXJzVGFiVG9rZW47CiAKLSAgcHVibGljIEFjY291bnRHcm91cFNjcmVlbihmaW5hbCBHcm91cERldGFpbCB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgeworICBwdWJsaWMgQWNjb3VudEdyb3VwU2NyZWVuKGZpbmFsIEdyb3VwSW5mbyB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgewogICAgIHNldFJlcXVpcmVzU2lnbkluKHRydWUpOwogCi0gICAgdGhpcy5ncm91cERldGFpbCA9IHRvU2hvdzsKKyAgICB0aGlzLmdyb3VwID0gdG9TaG93OwogICAgIHRoaXMubWVtYmVyc1RhYlRva2VuID0gZ2V0VGFiVG9rZW4odG9rZW4sIE1FTUJFUlMpOwogCiAgICAgbGluayhVdGlsLkMuZ3JvdXBUYWJHZW5lcmFsKCksIGdldFRhYlRva2VuKHRva2VuLCBJTkZPKSk7CiAgICAgbGluayhVdGlsLkMuZ3JvdXBUYWJNZW1iZXJzKCksIG1lbWJlcnNUYWJUb2tlbiwKLSAgICAgICAgZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0VHlwZSgpID09IEFjY291bnRHcm91cC5UeXBlLklOVEVSTkFMKTsKKyAgICAgICAgQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkKKyAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSk7CiAgIH0KIAogICBwcml2YXRlIFN0cmluZyBnZXRUYWJUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIFN0cmluZyB0YWIpIHsKICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgiL2FkbWluL2dyb3Vwcy91dWlkLSIpKSB7Ci0gICAgICByZXR1cm4gdG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRHcm91cFVVSUQoKSwgdGFiKTsKKyAgICAgIHJldHVybiB0b0dyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpLCB0YWIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRJZCgpLCB0YWIpOworICAgICAgcmV0dXJuIHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCB0YWIpOwogICAgIH0KICAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CiAgICAgc3VwZXIub25Mb2FkKCk7Ci0gICAgc2V0UGFnZVRpdGxlKFV0aWwuTS5ncm91cChncm91cERldGFpbC5ncm91cC5nZXROYW1lKCkpKTsKKyAgICBzZXRQYWdlVGl0bGUoVXRpbC5NLmdyb3VwKGdyb3VwLm5hbWUoKSkpOwogICAgIGRpc3BsYXkoKTsKLSAgICBkaXNwbGF5KGdyb3VwRGV0YWlsKTsKKyAgICBHcm91cEFwaS5pc0dyb3VwT3duZXIoZ3JvdXAubmFtZSgpLCBuZXcgR2Vycml0Q2FsbGJhY2s8Qm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhCb29sZWFuIHJlc3VsdCkgeworICAgICAgICBkaXNwbGF5KGdyb3VwLCByZXN1bHQpOworICAgICAgfQorICAgIH0pOwogICB9CiAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCk7CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc3BsYXkoZmluYWwgR3JvdXBJbmZvIGdyb3VwLCBmaW5hbCBib29sZWFuIGNhbk1vZGlmeSk7CiAKLSAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBnZXRHcm91cElkKCkgewotICAgIHJldHVybiBncm91cERldGFpbC5ncm91cC5nZXRJZCgpOworICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLlVVSUQgZ2V0R3JvdXBVVUlEKCkgeworICAgIHJldHVybiBncm91cC5nZXRHcm91cFVVSUQoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU93bmVyR3JvdXAoR3JvdXBJbmZvIG93bmVyR3JvdXApIHsKKyAgICBncm91cC5zZXRPd25lclVVSUQob3duZXJHcm91cC5nZXRHcm91cFVVSUQoKSk7CisgICAgZ3JvdXAub3duZXIob3duZXJHcm91cC5uYW1lKCkpOworICB9CisKKyAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5VVUlEIGdldE93bmVyR3JvdXBVVUlEKCkgeworICAgIHJldHVybiBncm91cC5nZXRPd25lclVVSUQoKTsKICAgfQogCiAgIHByb3RlY3RlZCB2b2lkIHNldE1lbWJlcnNUYWJWaXNpYmxlKGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FkbWluQ29uc3RhbnRzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQppbmRleCAwYzE4MTY5Li5mNGMwYjU1IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQpAQCAtNTUsNyArNTUsNiBAQAogICBTdHJpbmcgaGVhZGluZ093bmVyKCk7CiAgIFN0cmluZyBoZWFkaW5nRGVzY3JpcHRpb24oKTsKICAgU3RyaW5nIGhlYWRpbmdQcm9qZWN0T3B0aW9ucygpOwotICBTdHJpbmcgaGVhZGluZ0dyb3VwVHlwZSgpOwogICBTdHJpbmcgaGVhZGluZ01lbWJlcnMoKTsKICAgU3RyaW5nIGhlYWRpbmdJbmNsdWRlZEdyb3VwcygpOwogICBTdHJpbmcgbm9NZW1iZXJzSW5mbygpOwpAQCAtNjUsMTkgKzY0LDE4IEBACiAgIFN0cmluZyBjb2x1bW5Qcm9qZWN0TmFtZSgpOwogICBTdHJpbmcgaGVhZGluZ0FncmVlbWVudHMoKTsKIAorICBTdHJpbmcgaGVhZGluZ1Byb2plY3RTdWJtaXRUeXBlKCk7CiAgIFN0cmluZyBwcm9qZWN0U3VibWl0VHlwZV9GQVNUX0ZPUldBUkRfT05MWSgpOwogICBTdHJpbmcgcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTKCk7CiAgIFN0cmluZyBwcm9qZWN0U3VibWl0VHlwZV9NRVJHRV9JRl9ORUNFU1NBUlkoKTsKKyAgU3RyaW5nIHByb2plY3RTdWJtaXRUeXBlX1JFQkFTRV9JRl9ORUNFU1NBUlkoKTsKICAgU3RyaW5nIHByb2plY3RTdWJtaXRUeXBlX0NIRVJSWV9QSUNLKCk7CiAKKyAgU3RyaW5nIGhlYWRpbmdQcm9qZWN0U3RhdGUoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9BQ1RJVkUoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9SRUFEX09OTFkoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9ISURERU4oKTsKIAotICBTdHJpbmcgZ3JvdXBUeXBlX1NZU1RFTSgpOwotICBTdHJpbmcgZ3JvdXBUeXBlX0lOVEVSTkFMKCk7Ci0gIFN0cmluZyBncm91cFR5cGVfTERBUCgpOwotCiAgIFN0cmluZyBjb2x1bW5NZW1iZXIoKTsKICAgU3RyaW5nIGNvbHVtbkVtYWlsQWRkcmVzcygpOwogICBTdHJpbmcgY29sdW1uR3JvdXBOYW1lKCk7CkBAIC05MywyMSArOTEsMjAgQEAKICAgU3RyaW5nIGJ1dHRvbkRlbGV0ZUJyYW5jaCgpOwogICBTdHJpbmcgYnJhbmNoRGVsZXRpb25PcGVuQ2hhbmdlcygpOwogCi0gIFN0cmluZyBncm91cExpc3RQcmV2KCk7Ci0gIFN0cmluZyBncm91cExpc3ROZXh0KCk7Ci0gIFN0cmluZyBncm91cExpc3RPcGVuKCk7CisgIFN0cmluZyBncm91cEl0ZW1IZWxwKCk7CiAKICAgU3RyaW5nIGdyb3VwTGlzdFRpdGxlKCk7CisgIFN0cmluZyBncm91cEZpbHRlcigpOwogICBTdHJpbmcgY3JlYXRlR3JvdXBUaXRsZSgpOwogICBTdHJpbmcgZ3JvdXBUYWJHZW5lcmFsKCk7CiAgIFN0cmluZyBncm91cFRhYk1lbWJlcnMoKTsKICAgU3RyaW5nIHByb2plY3RMaXN0VGl0bGUoKTsKKyAgU3RyaW5nIHByb2plY3RGaWx0ZXIoKTsKICAgU3RyaW5nIGNyZWF0ZVByb2plY3RUaXRsZSgpOwotICBTdHJpbmcgcHJvamVjdEFkbWluVGFiR2VuZXJhbCgpOwotICBTdHJpbmcgcHJvamVjdEFkbWluVGFiQnJhbmNoZXMoKTsKLSAgU3RyaW5nIHByb2plY3RBZG1pblRhYkFjY2VzcygpOworICBTdHJpbmcgcHJvamVjdExpc3RRdWVyeUxpbmsoKTsKIAogICBTdHJpbmcgcGx1Z2lucygpOworICBTdHJpbmcgcGx1Z2luRW5hYmxlZCgpOwogICBTdHJpbmcgcGx1Z2luRGlzYWJsZWQoKTsKIAogICBTdHJpbmcgY29sdW1uUGx1Z2luTmFtZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FkbWluQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcwppbmRleCAzZmYzZjQzLi4xNjM3OTE5IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcwpAQCAtMjIsOCArMjIsOCBAQAogcHJvamVjdFJlcG9Ccm93c2VyID0gUmVwb3NpdG9yeSBCcm93c2VyCiB1c2VDb250ZW50TWVyZ2UgPSBBdXRvbWF0aWNhbGx5IHJlc29sdmUgY29uZmxpY3RzCiB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBSZXF1aXJlIGEgdmFsaWQgY29udHJpYnV0b3IgYWdyZWVtZW50IHRvIHVwbG9hZAotdXNlU2lnbmVkT2ZmQnkgPSBSZXF1aXJlIDxhIGhyZWY9Imh0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL3VzZXItc2lnbmVkb2ZmYnkuaHRtbCNTaWduZWQtb2ZmLWJ5IiB0YXJnZXQ9Il9ibGFuayI+PGNvZGU+U2lnbmVkLW9mZi1ieTwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCi1yZXF1aXJlQ2hhbmdlSUQgPSBSZXF1aXJlIDxhIGhyZWY9Imh0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL3VzZXItY2hhbmdlaWQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPkNoYW5nZS1JZDwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCit1c2VTaWduZWRPZmZCeSA9IFJlcXVpcmUgPGEgaHJlZj0iaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS91c2VyLXNpZ25lZG9mZmJ5Lmh0bWwjU2lnbmVkLW9mZi1ieSIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPlNpZ25lZC1vZmYtYnk8L2NvZGU+PC9hPiBpbiBjb21taXQgbWVzc2FnZQorcmVxdWlyZUNoYW5nZUlEID0gUmVxdWlyZSA8YSBocmVmPSJodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3VzZXItY2hhbmdlaWQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPkNoYW5nZS1JZDwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCiBoZWFkaW5nR3JvdXBPcHRpb25zID0gR3JvdXAgT3B0aW9ucwogaXNWaXNpYmxlVG9BbGwgPSBNYWtlIGdyb3VwIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCiBidXR0b25TYXZlR3JvdXBPcHRpb25zID0gU2F2ZSBHcm91cCBPcHRpb25zCkBAIC0zNiw3ICszNiw2IEBACiBoZWFkaW5nT3duZXIgPSBPd25lcnMKIGhlYWRpbmdEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uCiBoZWFkaW5nUHJvamVjdE9wdGlvbnMgPSBQcm9qZWN0IE9wdGlvbnMKLWhlYWRpbmdHcm91cFR5cGUgPSBHcm91cCBUeXBlCiBoZWFkaW5nTWVtYmVycyA9IE1lbWJlcnMKIGhlYWRpbmdJbmNsdWRlZEdyb3VwcyA9IEluY2x1ZGVkIEdyb3Vwcwogbm9NZW1iZXJzSW5mbyA9IEdyb3VwIE1lbWJlcnMgY2FuIG9ubHkgYmUgdmlld2VkIGZvciBHZXJyaXQgaW50ZXJuYWwgZ3JvdXBzLiBGb3IgZXh0ZXJuYWwgZ3JvdXBzIGFuZCBHZXJyaXQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUgZGlzcGxheWVkLgpAQCAtNDQsMTkgKzQzLDE4IEBACiBoZWFkaW5nQ3JlYXRlR3JvdXAgPSBDcmVhdGUgTmV3IEdyb3VwCiBoZWFkaW5nQWdyZWVtZW50cyA9IENvbnRyaWJ1dG9yIEFncmVlbWVudHMKIAoraGVhZGluZ1Byb2plY3RTdWJtaXRUeXBlID0gU3VibWl0IFR5cGUKIHByb2plY3RTdWJtaXRUeXBlX0ZBU1RfRk9SV0FSRF9PTkxZID0gRmFzdCBGb3J3YXJkIE9ubHkKLXByb2plY3RTdWJtaXRUeXBlX01FUkdFX0lGX05FQ0VTU0FSWSA9IE1lcmdlIElmIE5lY2Vzc2FyeQorcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfSUZfTkVDRVNTQVJZID0gTWVyZ2UgaWYgTmVjZXNzYXJ5Citwcm9qZWN0U3VibWl0VHlwZV9SRUJBU0VfSUZfTkVDRVNTQVJZID0gUmViYXNlIGlmIE5lY2Vzc2FyeQogcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTID0gQWx3YXlzIE1lcmdlCiBwcm9qZWN0U3VibWl0VHlwZV9DSEVSUllfUElDSyA9IENoZXJyeSBQaWNrCiAKK2hlYWRpbmdQcm9qZWN0U3RhdGUgPSBTdGF0ZQogcHJvamVjdFN0YXRlX0FDVElWRSA9IEFjdGl2ZQogcHJvamVjdFN0YXRlX1JFQURfT05MWSA9IFJlYWQgT25seQogcHJvamVjdFN0YXRlX0hJRERFTiA9IEhpZGRlbgogCi1ncm91cFR5cGVfU1lTVEVNID0gU3lzdGVtIEdyb3VwCi1ncm91cFR5cGVfSU5URVJOQUwgPSBJbnRlcm5hbCBHcm91cAotZ3JvdXBUeXBlX0xEQVAgPSBMREFQIEdyb3VwCi0KIGNvbHVtbk1lbWJlciA9IE1lbWJlcgogY29sdW1uRW1haWxBZGRyZXNzID0gRW1haWwgQWRkcmVzcwogY29sdW1uR3JvdXBOYW1lID0gR3JvdXAgTmFtZQpAQCAtNzMsMjEgKzcxLDIwIEBACiBicmFuY2hEZWxldGlvbk9wZW5DaGFuZ2VzID0gVGhlIGZvbGxvd2luZyBicmFuY2hlcyB3ZXJlIG5vdCBkZWxldGVkIFwKIGJlY2F1c2UgdGhleSBoYXZlIG9wZW4gY2hhbmdlczoKIAotZ3JvdXBMaXN0UHJldiA9IFByZXZpb3VzIGdyb3VwCi1ncm91cExpc3ROZXh0ID0gTmV4dCBncm91cAotZ3JvdXBMaXN0T3BlbiA9IE9wZW4gZ3JvdXAKK2dyb3VwSXRlbUhlbHAgPSBncm91cAogCiBncm91cExpc3RUaXRsZSA9IEdyb3VwcworZ3JvdXBGaWx0ZXIgPSBGaWx0ZXIKIGNyZWF0ZUdyb3VwVGl0bGUgPSBDcmVhdGUgR3JvdXAKIGdyb3VwVGFiR2VuZXJhbCA9IEdlbmVyYWwKIGdyb3VwVGFiTWVtYmVycyA9IE1lbWJlcnMKIHByb2plY3RMaXN0VGl0bGUgPSBQcm9qZWN0cworcHJvamVjdEZpbHRlciA9IEZpbHRlcgogY3JlYXRlUHJvamVjdFRpdGxlID0gQ3JlYXRlIFByb2plY3QKLXByb2plY3RBZG1pblRhYkdlbmVyYWwgPSBHZW5lcmFsCi1wcm9qZWN0QWRtaW5UYWJCcmFuY2hlcyA9IEJyYW5jaGVzCi1wcm9qZWN0QWRtaW5UYWJBY2Nlc3MgPSBBY2Nlc3MKK3Byb2plY3RMaXN0UXVlcnlMaW5rID0gU2VhcmNoIGZvciBjaGFuZ2VzIG9uIHRoaXMgcHJvamVjdAogCiBwbHVnaW5zID0gUGx1Z2lucworcGx1Z2luRW5hYmxlZCA9IEVuYWJsZWQKIHBsdWdpbkRpc2FibGVkID0gRGlzYWJsZWQKIGNvbHVtblBsdWdpbk5hbWUgPSBQbHVnaW4gTmFtZQogY29sdW1uUGx1Z2luVmVyc2lvbiA9IFZlcnNpb24KQEAgLTEwNCwyOCArMTAxLDQxIEBACiBwZXJtaXNzaW9uTmFtZXMgPSBcCiAJYWJhbmRvbiwgXAogCWNyZWF0ZSwgXAorCWRlbGV0ZURyYWZ0cywgXAorCWVkaXRUb3BpY05hbWUsIFwKIAlmb3JnZUF1dGhvciwgXAogCWZvcmdlQ29tbWl0dGVyLCBcCiAJZm9yZ2VTZXJ2ZXJBc0NvbW1pdHRlciwgXAogCW93bmVyLCBcCisJcHVibGlzaERyYWZ0cywgXAogCXB1c2gsIFwKIAlwdXNoTWVyZ2UsIFwKIAlwdXNoVGFnLCBcCisJcHVzaFNpZ25lZFRhZywgXAogCXJlYWQsIFwKIAlyZWJhc2UsIFwKLQlzdWJtaXQKKwlyZW1vdmVSZXZpZXdlciwgXAorCXN1Ym1pdCwgXAorCXZpZXdEcmFmdHMKKwogYWJhbmRvbiA9IEFiYW5kb24KIGNyZWF0ZSA9IENyZWF0ZSBSZWZlcmVuY2UKK2RlbGV0ZURyYWZ0cyA9IERlbGV0ZSBEcmFmdHMKK2VkaXRUb3BpY05hbWUgPSBFZGl0IFRvcGljIE5hbWUKIGZvcmdlQXV0aG9yID0gRm9yZ2UgQXV0aG9yIElkZW50aXR5CiBmb3JnZUNvbW1pdHRlciA9IEZvcmdlIENvbW1pdHRlciBJZGVudGl0eQogZm9yZ2VTZXJ2ZXJBc0NvbW1pdHRlciA9IEZvcmdlIFNlcnZlciBJZGVudGl0eQogb3duZXIgPSBPd25lcgorcHVibGlzaERyYWZ0cyA9IFB1Ymxpc2ggRHJhZnRzCiBwdXNoID0gUHVzaAogcHVzaE1lcmdlID0gUHVzaCBNZXJnZSBDb21taXQKIHB1c2hUYWcgPSBQdXNoIEFubm90YXRlZCBUYWcKK3B1c2hTaWduZWRUYWcgPSBQdXNoIFNpZ25lZCBUYWcKIHJlYWQgPSBSZWFkCiByZWJhc2UgPSBSZWJhc2UKK3JlbW92ZVJldmlld2VyID0gUmVtb3ZlIFJldmlld2VyCiBzdWJtaXQgPSBTdWJtaXQKK3ZpZXdEcmFmdHMgPSBWaWV3IERyYWZ0cwogCiByZWZFcnJvckVtcHR5ID0gUmVmZXJlbmNlIG11c3QgYmUgc3VwcGxpZWQKIHJlZkVycm9yQmVnaW5TbGFzaCA9IFJlZmVyZW5jZSBtdXN0IG5vdCBzdGFydCB3aXRoICcvJwpAQCAtMTM2LDYgKzE0Niw3IEBACiAKICMgQ2FwYWJpbGl0eSBOYW1lcwogY2FwYWJpbGl0eU5hbWVzID0gXAorICBhY2Nlc3NEYXRhYmFzZSwgXAogICBhZG1pbmlzdHJhdGVTZXJ2ZXIsIFwKICAgY3JlYXRlQWNjb3VudCwgXAogICBjcmVhdGVHcm91cCwgXApAQCAtMTQ1LDExICsxNTYsMTMgQEAKICAga2lsbFRhc2ssIFwKICAgcHJpb3JpdHksIFwKICAgcXVlcnlMaW1pdCwgXAorICBydW5HQywgXAogICBzdGFydFJlcGxpY2F0aW9uLCBcCiAgIHZpZXdDYWNoZXMsIFwKICAgdmlld0Nvbm5lY3Rpb25zLCBcCiAgIHZpZXdRdWV1ZQotYWRtaW5pc3RyYXRlU2VydmVyID0gQWRtaW5pc3RyYXRlIFNlcnZlciAKK2FjY2Vzc0RhdGFiYXNlID0gQWNjZXNzIERhdGFiYXNlCithZG1pbmlzdHJhdGVTZXJ2ZXIgPSBBZG1pbmlzdHJhdGUgU2VydmVyCiBjcmVhdGVBY2NvdW50ID0gQ3JlYXRlIEFjY291bnQKIGNyZWF0ZUdyb3VwID0gQ3JlYXRlIEdyb3VwCiBjcmVhdGVQcm9qZWN0ID0gQ3JlYXRlIFByb2plY3QKQEAgLTE1OCw2ICsxNzEsNyBAQAoga2lsbFRhc2sgPSBLaWxsIFRhc2sKIHByaW9yaXR5ID0gUHJpb3JpdHkKIHF1ZXJ5TGltaXQgPSBRdWVyeSBMaW1pdAorcnVuR0MgPSBSdW4gR2FyYmFnZSBDb2xsZWN0aW9uCiBzdGFydFJlcGxpY2F0aW9uID0gU3RhcnQgUmVwbGljYXRpb24KIHZpZXdDYWNoZXMgPSBWaWV3IENhY2hlcwogdmlld0Nvbm5lY3Rpb25zID0gVmlldyBDb25uZWN0aW9ucwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0NyZWF0ZUdyb3VwU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQppbmRleCA0NTc0YzZkLi42OWRmZjVjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQpAQCAtMjAsMTcgKzIwLDIxIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuTm90Rm91bmRTY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudENhcGFiaWxpdGllczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU21hbGxIZWFkaW5nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyLlNjaGVkdWxlZENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50Lkhpc3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZlcnRpY2FsUGFuZWw7CkBAIC03Myw3ICs3NywyNCBAQAogICAgIGFkZFBhbmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFkZFNzaEtleVBhbmVsKCkpOwogICAgIGFkZFBhbmVsLmFkZChuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nQ3JlYXRlR3JvdXAoKSkpOwogCi0gICAgYWRkVHh0ID0gbmV3IE5wVGV4dEJveCgpOworICAgIGFkZFR4dCA9IG5ldyBOcFRleHRCb3goKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGVJbnQoKSA9PSBFdmVudC5PTlBBU1RFKSB7CisgICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgIGlmIChhZGRUeHQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGFkZE5ldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIGFkZFR4dC5zaW5rRXZlbnRzKEV2ZW50Lk9OUEFTVEUpOworCiAgICAgYWRkVHh0LnNldFZpc2libGVMZW5ndGgoNjApOwogICAgIGFkZFR4dC5hZGRLZXlQcmVzc0hhbmRsZXIobmV3IEtleVByZXNzSGFuZGxlcigpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMTA2LDkgKzEyNywxMCBAQAogICAgIH0KIAogICAgIGFkZE5ldy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBVdGlsLkdST1VQX1NWQy5jcmVhdGVHcm91cChuZXdOYW1lLCBuZXcgR2Vycml0Q2FsbGJhY2s8QWNjb3VudEdyb3VwLklkPigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgcmVzdWx0KSB7Ci0gICAgICAgIEhpc3RvcnkubmV3SXRlbShEaXNwYXRjaGVyLnRvR3JvdXAocmVzdWx0LCBBY2NvdW50R3JvdXBTY3JlZW4uTUVNQkVSUykpOworICAgIEdyb3VwQXBpLmNyZWF0ZUdyb3VwKG5ld05hbWUsIG5ldyBHZXJyaXRDYWxsYmFjazxHcm91cEluZm8+KCkgeworICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwSW5mbyByZXN1bHQpIHsKKyAgICAgICAgSGlzdG9yeS5uZXdJdGVtKERpc3BhdGNoZXIudG9Hcm91cChyZXN1bHQuZ2V0R3JvdXBJZCgpLAorICAgICAgICAgICAgQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMpKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlUHJvamVjdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0NyZWF0ZVByb2plY3RTY3JlZW4uamF2YQppbmRleCBiNDk1MGQ4Li43NzQ5ZTljIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlUHJvamVjdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9DcmVhdGVQcm9qZWN0U2NyZWVuLmphdmEKQEAgLTIwLDIzICsyMCwzMSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5FcnJvckRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Ob3RGb3VuZFNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50Q2FwYWJpbGl0aWVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0QXBpOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdE1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IaW50VGV4dEJveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuT25FZGl0RW5hYmxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpc3RQb3B1cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Qcm9qZWN0c1RhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5IaXN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7CkBAIC00NCw3ICs1Miw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdFNjcmVlbiBleHRlbmRzIFNjcmVlbiB7CiAgIHByaXZhdGUgR3JpZCBncmlkOwpAQCAtNTIsNyArNTksNyBAQAogICBwcml2YXRlIEJ1dHRvbiBjcmVhdGU7CiAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZTsKICAgcHJpdmF0ZSBIaW50VGV4dEJveCBwYXJlbnQ7Ci0gIHByaXZhdGUgU3VnZ2VzdEJveCBzdWdlc3RQYXJlbnQ7CisgIHByaXZhdGUgU3VnZ2VzdEJveCBzdWdnZXN0UGFyZW50OwogICBwcml2YXRlIENoZWNrQm94IGVtcHR5Q29tbWl0OwogICBwcml2YXRlIENoZWNrQm94IHBlcm1pc3Npb25zT25seTsKICAgcHJpdmF0ZSBQcm9qZWN0c1RhYmxlIHN1Z2dlc3RlZFBhcmVudHNUYWI7CkBAIC05NSw4ICsxMDIsOCBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1vdmVQb2ludGVyVG8oU3RyaW5nIHByb2plY3ROYW1lKSB7CiAgICAgICAgIC8vIHByZXZlbnQgdXNlciBpbnB1dCBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHNpbXBseSBwb3BpbmcgdXAKLSAgICAgICAgaWYgKCFwcm9qZWN0c1BvcHVwLmlzUG9waW5nVXAoKSB8fCAiIi5lcXVhbHMoc3VnZXN0UGFyZW50LmdldFRleHQoKSkpIHsKLSAgICAgICAgICBzdWdlc3RQYXJlbnQuc2V0VGV4dChwcm9qZWN0TmFtZSk7CisgICAgICAgIGlmICghcHJvamVjdHNQb3B1cC5pc1BvcHBpbmdVcCgpIHx8ICIiLmVxdWFscyhzdWdnZXN0UGFyZW50LmdldFRleHQoKSkpIHsKKyAgICAgICAgICBzdWdnZXN0UGFyZW50LnNldFRleHQocHJvamVjdE5hbWUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfTsKQEAgLTEwNyw4ICsxMTQsOCBAQAogICAgIGZpbmFsIFZlcnRpY2FsUGFuZWwgZnAgPSBuZXcgVmVydGljYWxQYW5lbCgpOwogICAgIGZwLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNyZWF0ZVByb2plY3RQYW5lbCgpKTsKIAotICAgIGluaXRDcmVhdGVUeHQoKTsKICAgICBpbml0Q3JlYXRlQnV0dG9uKCk7CisgICAgaW5pdENyZWF0ZVR4dCgpOwogICAgIGluaXRQYXJlbnRCb3goKTsKIAogICAgIGFkZEdyaWQoZnApOwpAQCAtMTI2LDIwICsxMzMsMzggQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBpbml0Q3JlYXRlVHh0KCkgewotICAgIHByb2plY3QgPSBuZXcgTnBUZXh0Qm94KCk7CisgICAgcHJvamVjdCA9IG5ldyBOcFRleHRCb3goKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGVJbnQoKSA9PSBFdmVudC5PTlBBU1RFKSB7CisgICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjcmVhdGUuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICBwcm9qZWN0LnNpbmtFdmVudHMoRXZlbnQuT05QQVNURSk7CiAgICAgcHJvamVjdC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKICAgICBwcm9qZWN0LmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldENoYXJDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7CisgICAgICAgIGlmIChldmVudC5nZXROYXRpdmVFdmVudCgpLmdldEtleUNvZGUoKSA9PSBLZXlDb2Rlcy5LRVlfRU5URVIpIHsKICAgICAgICAgICBkb0NyZWF0ZVByb2plY3QoKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0pOworICAgIG5ldyBPbkVkaXRFbmFibGVyKGNyZWF0ZSwgcHJvamVjdCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgaW5pdENyZWF0ZUJ1dHRvbigpIHsKICAgICBjcmVhdGUgPSBuZXcgQnV0dG9uKFV0aWwuQy5idXR0b25DcmVhdGVQcm9qZWN0KCkpOworICAgIGNyZWF0ZS5zZXRFbmFibGVkKGZhbHNlKTsKICAgICBjcmVhdGUuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewpAQCAtMTY3LDcgKzE5Miw3IEBACiAKICAgcHJpdmF0ZSB2b2lkIGluaXRQYXJlbnRCb3goKSB7CiAgICAgcGFyZW50ID0gbmV3IEhpbnRUZXh0Qm94KCk7Ci0gICAgc3VnZXN0UGFyZW50ID0KKyAgICBzdWdnZXN0UGFyZW50ID0KICAgICAgICAgbmV3IFN1Z2dlc3RCb3gobmV3IFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSgpLCBwYXJlbnQpOwogICAgIHBhcmVudC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKICAgfQpAQCAtMTg1LDcgKzIxMCw3IEBACiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHN1Z2VzdFBhcmVudC5zZXRUZXh0KGdldFJvd0l0ZW0ocm93KS5uYW1lKCkpOworICAgICAgICAgICAgc3VnZ2VzdFBhcmVudC5zZXRUZXh0KGdldFJvd0l0ZW0ocm93KS5uYW1lKCkpOwogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKQEAgLTIxNSwxNCArMjQwLDE0IEBACiAgICAgZ3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy5jb2x1bW5Qcm9qZWN0TmFtZSgpICsgIjoiKTsKICAgICBncmlkLnNldFdpZGdldCgwLCAxLCBwcm9qZWN0KTsKICAgICBncmlkLnNldFRleHQoMSwgMCwgVXRpbC5DLmhlYWRpbmdQYXJlbnRQcm9qZWN0TmFtZSgpICsgIjoiKTsKLSAgICBncmlkLnNldFdpZGdldCgxLCAxLCBzdWdlc3RQYXJlbnQpOworICAgIGdyaWQuc2V0V2lkZ2V0KDEsIDEsIHN1Z2dlc3RQYXJlbnQpOwogICAgIGdyaWQuc2V0V2lkZ2V0KDEsIDIsIGJyb3dzZSk7CiAgICAgZnAuYWRkKGdyaWQpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvQ3JlYXRlUHJvamVjdCgpIHsKICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldFRleHQoKS50cmltKCk7Ci0gICAgZmluYWwgU3RyaW5nIHBhcmVudE5hbWUgPSBzdWdlc3RQYXJlbnQuZ2V0VGV4dCgpLnRyaW0oKTsKKyAgICBmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSA9IHN1Z2dlc3RQYXJlbnQuZ2V0VGV4dCgpLnRyaW0oKTsKIAogICAgIGlmICgiIi5lcXVhbHMocHJvamVjdE5hbWUpKSB7CiAgICAgICBwcm9qZWN0LnNldEZvY3VzKHRydWUpOwpAQCAtMjMwLDEzICsyNTUsMTMgQEAKICAgICB9CiAKICAgICBlbmFibGVGb3JtKGZhbHNlKTsKLSAgICBVdGlsLlBST0pFQ1RfU1ZDLmNyZWF0ZU5ld1Byb2plY3QocHJvamVjdE5hbWUsIHBhcmVudE5hbWUsCi0gICAgICAgIGVtcHR5Q29tbWl0LmdldFZhbHVlKCksIHBlcm1pc3Npb25zT25seS5nZXRWYWx1ZSgpLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CisgICAgUHJvamVjdEFwaS5jcmVhdGVQcm9qZWN0KHByb2plY3ROYW1lLCBwYXJlbnROYW1lLCBlbXB0eUNvbW1pdC5nZXRWYWx1ZSgpLAorICAgICAgICBwZXJtaXNzaW9uc09ubHkuZ2V0VmFsdWUoKSwgbmV3IEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CiAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWRSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZVdpdGhvdXRTdWZmaXggPSBQcm9qZWN0VXRpbC5zdHJpcEdpdFN1ZmZpeChwcm9qZWN0TmFtZSk7CiAgICAgICAgICAgICBIaXN0b3J5Lm5ld0l0ZW0oRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbihuZXcgUHJvamVjdC5OYW1lS2V5KAotICAgICAgICAgICAgICAgIHByb2plY3ROYW1lKSwgUHJvamVjdFNjcmVlbi5JTkZPKSk7CisgICAgICAgICAgICAgICAgbmFtZVdpdGhvdXRTdWZmaXgpLCBQcm9qZWN0U2NyZWVuLklORk8pKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cExpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cExpc3RTY3JlZW4uamF2YQppbmRleCAzMTU3ZDk3Li5kYWMwYjZhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vR3JvdXBMaXN0U2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0dyb3VwTGlzdFNjcmVlbi5qYXZhCkBAIC0xNCwzNiArMTQsMTA3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRTY3JlZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cExpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fR1JPVVBTOwogCi1wdWJsaWMgY2xhc3MgR3JvdXBMaXN0U2NyZWVuIGV4dGVuZHMgQWNjb3VudFNjcmVlbiB7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRTY3JlZW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZpbHRlcmVkVXNlckludGVyZmFjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlVcEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEJveDsKKworcHVibGljIGNsYXNzIEdyb3VwTGlzdFNjcmVlbiBleHRlbmRzIEFjY291bnRTY3JlZW4gaW1wbGVtZW50cyBGaWx0ZXJlZFVzZXJJbnRlcmZhY2UgewogICBwcml2YXRlIEdyb3VwVGFibGUgZ3JvdXBzOworICBwcml2YXRlIE5wVGV4dEJveCBmaWx0ZXJUeHQ7CisgIHByaXZhdGUgU3RyaW5nIHN1Ym5hbWU7CisKKyAgcHVibGljIEdyb3VwTGlzdFNjcmVlbigpIHsKKyAgfQorCisgIHB1YmxpYyBHcm91cExpc3RTY3JlZW4oU3RyaW5nIHBhcmFtcykgeworICAgIGZvciAoU3RyaW5nIGt2UGFpciA6IHBhcmFtcy5zcGxpdCgiWyw7Jl0iKSkgeworICAgICAgU3RyaW5nW10ga3YgPSBrdlBhaXIuc3BsaXQoIj0iLCAyKTsKKyAgICAgIGlmIChrdi5sZW5ndGggIT0gMiB8fCBrdlswXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICgiZmlsdGVyIi5lcXVhbHMoa3ZbMF0pKSB7CisgICAgICAgIHN1Ym5hbWUgPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOworICAgICAgfQorICAgIH0KKyAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CiAgICAgc3VwZXIub25Mb2FkKCk7Ci0gICAgVXRpbC5HUk9VUF9TVkMKLSAgICAgICAgLnZpc2libGVHcm91cHMobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxHcm91cExpc3Q+KHRoaXMpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEdyb3VwTGlzdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGdyb3Vwcy5kaXNwbGF5KHJlc3VsdC5nZXRHcm91cHMoKSk7Ci0gICAgICAgICAgICBncm91cHMuZmluaXNoRGlzcGxheSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgZGlzcGxheSgpOworICAgIHJlZnJlc2goKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgeworICAgIHNldFRva2VuKHN1Ym5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc3VibmFtZSkgPyBBRE1JTl9HUk9VUFMKKyAgICAgICAgOiBBRE1JTl9HUk9VUFMgKyAiP2ZpbHRlcj0iICsgVVJMLmVuY29kZVF1ZXJ5U3RyaW5nKHN1Ym5hbWUpKTsKKyAgICBHcm91cE1hcC5tYXRjaChzdWJuYW1lLAorICAgICAgICBuZXcgSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyPEdyb3VwTWFwPih0aGlzLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwTWFwPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cE1hcCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBncm91cHMuZGlzcGxheShyZXN1bHQsIHN1Ym5hbWUpOworICAgICAgICAgICAgICAgIGdyb3Vwcy5maW5pc2hEaXNwbGF5KCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRGaWx0ZXIoKSB7CisgICAgcmV0dXJuIHN1Ym5hbWU7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Jbml0VUkoKSB7CiAgICAgc3VwZXIub25Jbml0VUkoKTsKICAgICBzZXRQYWdlVGl0bGUoVXRpbC5DLmdyb3VwTGlzdFRpdGxlKCkpOworICAgIGluaXRQYWdlSGVhZGVyKCk7CiAKLSAgICBncm91cHMgPSBuZXcgR3JvdXBUYWJsZSh0cnVlIC8qIGh5cGVybGluayB0byBhZG1pbiAqLywgUGFnZUxpbmtzLkFETUlOX0dST1VQUyk7CisgICAgZ3JvdXBzID0gbmV3IEdyb3VwVGFibGUoUGFnZUxpbmtzLkFETUlOX0dST1VQUyk7CiAgICAgYWRkKGdyb3Vwcyk7CiAgIH0KIAorICBwcml2YXRlIHZvaWQgaW5pdFBhZ2VIZWFkZXIoKSB7CisgICAgZmluYWwgSG9yaXpvbnRhbFBhbmVsIGhwID0gbmV3IEhvcml6b250YWxQYW5lbCgpOworICAgIGhwLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnByb2plY3RGaWx0ZXJQYW5lbCgpKTsKKyAgICBmaW5hbCBMYWJlbCBmaWx0ZXJMYWJlbCA9IG5ldyBMYWJlbChVdGlsLkMucHJvamVjdEZpbHRlcigpKTsKKyAgICBmaWx0ZXJMYWJlbC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyTGFiZWwoKSk7CisgICAgaHAuYWRkKGZpbHRlckxhYmVsKTsKKyAgICBmaWx0ZXJUeHQgPSBuZXcgTnBUZXh0Qm94KCk7CisgICAgZmlsdGVyVHh0LnNldFZhbHVlKHN1Ym5hbWUpOworICAgIGZpbHRlclR4dC5hZGRLZXlVcEhhbmRsZXIobmV3IEtleVVwSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25LZXlVcChLZXlVcEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1Ym5hbWUgPSBmaWx0ZXJUeHQuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgICAgfQorICAgIH0pOworICAgIGhwLmFkZChmaWx0ZXJUeHQpOworICAgIGFkZChocCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TaG93VmlldygpIHsKKyAgICBzdXBlci5vblNob3dWaWV3KCk7CisgICAgaWYgKHN1Ym5hbWUgIT0gbnVsbCkgeworICAgICAgZmlsdGVyVHh0LnNldEN1cnNvclBvcyhzdWJuYW1lLmxlbmd0aCgpKTsKKyAgICB9CisgICAgZmlsdGVyVHh0LnNldEZvY3VzKHRydWUpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyS2V5cygpIHsKICAgICBzdXBlci5yZWdpc3RlcktleXMoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cFRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vR3JvdXBUYWJsZS5qYXZhCmluZGV4IDY4MTg4NDEuLjc2YTBjZmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cFRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0dyb3VwVGFibGUuamF2YQpAQCAtMTQsNDQgKzE0LDQ1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5VdGlsLkM7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cExpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cE1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuTmF2aWdhdGlvblRhYmxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5IaXN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGUuRmxleENlbGxGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIAotcHVibGljIGNsYXNzIEdyb3VwVGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8QWNjb3VudEdyb3VwPiB7CitwdWJsaWMgY2xhc3MgR3JvdXBUYWJsZSBleHRlbmRzIE5hdmlnYXRpb25UYWJsZTxHcm91cEluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9DT0xTID0gMzsKIAotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZW5hYmxlTGluazsKLQotICBwdWJsaWMgR3JvdXBUYWJsZShmaW5hbCBib29sZWFuIGVuYWJsZUxpbmspIHsKLSAgICB0aGlzKGVuYWJsZUxpbmssIG51bGwpOworICBwdWJsaWMgR3JvdXBUYWJsZSgpIHsKKyAgICB0aGlzKG51bGwpOwogICB9CiAKLSAgcHVibGljIEdyb3VwVGFibGUoZmluYWwgYm9vbGVhbiBlbmFibGVMaW5rLCBmaW5hbCBTdHJpbmcgcG9pbnRlcklkKSB7Ci0gICAgdGhpcy5lbmFibGVMaW5rID0gZW5hYmxlTGluazsKLQorICBwdWJsaWMgR3JvdXBUYWJsZShmaW5hbCBTdHJpbmcgcG9pbnRlcklkKSB7CisgICAgc3VwZXIoQy5ncm91cEl0ZW1IZWxwKCkpOwogICAgIHNldFNhdmVQb2ludGVySWQocG9pbnRlcklkKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IFByZXZLZXlDb21tYW5kKDAsICdrJywgVXRpbC5DLmdyb3VwTGlzdFByZXYoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLkMuZ3JvdXBMaXN0TmV4dCgpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCAnbycsIFV0aWwuQy5ncm91cExpc3RPcGVuKCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsIEtleUNvZGVzLktFWV9FTlRFUiwgVXRpbC5DCi0gICAgICAgIC5ncm91cExpc3RPcGVuKCkpKTsKIAotICAgIHRhYmxlLnNldFRleHQoMCwgMSwgVXRpbC5DLmNvbHVtbkdyb3VwTmFtZSgpKTsKLSAgICB0YWJsZS5zZXRUZXh0KDAsIDIsIFV0aWwuQy5jb2x1bW5Hcm91cERlc2NyaXB0aW9uKCkpOwotICAgIHRhYmxlLnNldFRleHQoMCwgMywgVXRpbC5DLmNvbHVtbkdyb3VwVmlzaWJsZVRvQWxsKCkpOworICAgIHRhYmxlLnNldFRleHQoMCwgMSwgQy5jb2x1bW5Hcm91cE5hbWUoKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAyLCBDLmNvbHVtbkdyb3VwRGVzY3JpcHRpb24oKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAzLCBDLmNvbHVtbkdyb3VwVmlzaWJsZVRvQWxsKCkpOwogICAgIHRhYmxlLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKQEAgLTcwLDM2ICs3MSw1NyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBBY2NvdW50R3JvdXAgaXRlbSkgewotICAgIHJldHVybiBpdGVtLmdldElkKCk7CisgIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBHcm91cEluZm8gaXRlbSkgeworICAgIHJldHVybiBpdGVtLmdldEdyb3VwSWQoKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbk9wZW5Sb3coZmluYWwgaW50IHJvdykgewotICAgIEhpc3RvcnkubmV3SXRlbShEaXNwYXRjaGVyLnRvR3JvdXAoZ2V0Um93SXRlbShyb3cpLmdldElkKCkpKTsKKyAgICBIaXN0b3J5Lm5ld0l0ZW0oRGlzcGF0Y2hlci50b0dyb3VwKGdldFJvd0l0ZW0ocm93KS5nZXRHcm91cElkKCkpKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IHJlc3VsdCkgeworICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdyb3VwTWFwIGdyb3VwcywgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgZGlzcGxheShOYXRpdmVzLmFzTGlzdChncm91cHMudmFsdWVzKCkpLCB0b0hpZ2hsaWdodCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdyb3VwTGlzdCBncm91cHMpIHsKKyAgICBkaXNwbGF5KE5hdGl2ZXMuYXNMaXN0KGdyb3VwcyksIG51bGwpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShMaXN0PEdyb3VwSW5mbz4gbGlzdCwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CiAgICAgd2hpbGUgKDEgPCB0YWJsZS5nZXRSb3dDb3VudCgpKQogICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKIAotICAgIGZvcihBY2NvdW50R3JvdXAgZ3JvdXAgOiByZXN1bHQpIHsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPEdyb3VwSW5mbz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShHcm91cEluZm8gYSwgR3JvdXBJbmZvIGIpIHsKKyAgICAgICAgcmV0dXJuIGEubmFtZSgpLmNvbXBhcmVUbyhiLm5hbWUoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgZm9yKEdyb3VwSW5mbyBncm91cCA6IGxpc3QpIHsKICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgdGFibGUuaW5zZXJ0Um93KHJvdyk7CiAgICAgICBhcHBseURhdGFSb3dTdHlsZShyb3cpOwotICAgICAgcG9wdWxhdGUocm93LCBncm91cCk7CisgICAgICBwb3B1bGF0ZShyb3csIGdyb3VwLCB0b0hpZ2hsaWdodCk7CiAgICAgfQogICB9CiAKLSAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBBY2NvdW50R3JvdXAgaykgewotICAgIGlmIChlbmFibGVMaW5rKSB7Ci0gICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAxLCBuZXcgSHlwZXJsaW5rKGsuZ2V0TmFtZSgpLAotICAgICAgICAgIERpc3BhdGNoZXIudG9Hcm91cChrLmdldElkKCkpKSk7CisgIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgR3JvdXBJbmZvIGssIGZpbmFsIFN0cmluZyB0b0hpZ2hsaWdodCkgeworICAgIGlmIChrLnVybCgpICE9IG51bGwpIHsKKyAgICAgIGlmIChrLnVybCgpLnN0YXJ0c1dpdGgoIiMiICsgUGFnZUxpbmtzLkFETUlOX0dST1VQUykpIHsKKyAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMSwgbmV3IEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayhrLm5hbWUoKSwKKyAgICAgICAgICAgIERpc3BhdGNoZXIudG9Hcm91cChrLmdldEdyb3VwSWQoKSksIHRvSGlnaGxpZ2h0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBbmNob3IgbGluayA9IG5ldyBBbmNob3IoKTsKKyAgICAgICAgbGluay5zZXRIVE1MKFV0aWwuaGlnaGxpZ2h0KGsubmFtZSgpLCB0b0hpZ2hsaWdodCkpOworICAgICAgICBsaW5rLnNldEhyZWYoay51cmwoKSk7CisgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIGxpbmspOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMSwgay5nZXROYW1lKCkpOworICAgICAgdGFibGUuc2V0SFRNTChyb3csIDEsIFV0aWwuaGlnaGxpZ2h0KGsubmFtZSgpLCB0b0hpZ2hsaWdodCkpOwogICAgIH0KLSAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgay5nZXREZXNjcmlwdGlvbigpKTsKLSAgICBpZiAoay5pc1Zpc2libGVUb0FsbCgpKSB7CisgICAgdGFibGUuc2V0VGV4dChyb3csIDIsIGsuZGVzY3JpcHRpb24oKSk7CisgICAgaWYgKGsub3B0aW9ucygpLmlzVmlzaWJsZVRvQWxsKCkpIHsKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDMsIG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmdyZWVuQ2hlY2soKSkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25FZGl0b3IuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9QZXJtaXNzaW9uRWRpdG9yLmphdmEKaW5kZXggMmM0MzIzMy4uOTg0OGMxOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25FZGl0b3IuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvbkVkaXRvci5qYXZhCkBAIC0xNCwxMyArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW47CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlN1Z2dlc3RVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CkBAIC0xMDIsMTYgKzEwMiwxOSBAQAogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OwogICBwcml2YXRlIGZpbmFsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXM7CiAgIHByaXZhdGUgUGVybWlzc2lvbiB2YWx1ZTsKICAgcHJpdmF0ZSBQZXJtaXNzaW9uUmFuZ2UuV2l0aERlZmF1bHRzIHZhbGlkUmFuZ2U7CiAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGV0ZWQ7CiAKICAgcHVibGljIFBlcm1pc3Npb25FZGl0b3IoUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAogICAgICAgYm9vbGVhbiByZWFkT25seSwKLSAgICAgIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgICAgQWNjZXNzU2VjdGlvbiBzZWN0aW9uLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CiAgICAgdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwogICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247CiAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOworICAgIHRoaXMubGFiZWxUeXBlcyA9IGxhYmVsVHlwZXM7CiAKICAgICBub3JtYWxOYW1lID0gbmV3IFZhbHVlTGFiZWw8U3RyaW5nPihQZXJtaXNzaW9uTmFtZVJlbmRlcmVyLklOU1RBTkNFKTsKICAgICBkZWxldGVkTmFtZSA9IG5ldyBWYWx1ZUxhYmVsPFN0cmluZz4oUGVybWlzc2lvbk5hbWVSZW5kZXJlci5JTlNUQU5DRSk7CkBAIC0yNjAsMTIgKzI2MywxMiBAQAogICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKIAogICAgIGlmICh2YWx1ZS5pc0xhYmVsKCkpIHsKLSAgICAgIEFwcHJvdmFsVHlwZSBhdCA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBcHByb3ZhbFR5cGVzKCkuYnlMYWJlbCh2YWx1ZS5nZXRMYWJlbCgpKTsKLSAgICAgIGlmIChhdCAhPSBudWxsKSB7CisgICAgICBMYWJlbFR5cGUgbHQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwodmFsdWUuZ2V0TGFiZWwoKSk7CisgICAgICBpZiAobHQgIT0gbnVsbCkgewogICAgICAgICB2YWxpZFJhbmdlID0gbmV3IFBlcm1pc3Npb25SYW5nZS5XaXRoRGVmYXVsdHMoCiAgICAgICAgICAgICB2YWx1ZS5nZXROYW1lKCksCi0gICAgICAgICAgICBhdC5nZXRNaW4oKS5nZXRWYWx1ZSgpLCBhdC5nZXRNYXgoKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgYXQuZ2V0TWluKCkuZ2V0VmFsdWUoKSwgYXQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBsdC5nZXRNaW4oKS5nZXRWYWx1ZSgpLCBsdC5nZXRNYXgoKS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgbHQuZ2V0TWluKCkuZ2V0VmFsdWUoKSwgbHQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChHbG9iYWxDYXBhYmlsaXR5LmlzQ2FwYWJpbGl0eSh2YWx1ZS5nZXROYW1lKCkpKSB7CiAgICAgICB2YWxpZFJhbmdlID0gR2xvYmFsQ2FwYWJpbGl0eS5nZXRSYW5nZSh2YWx1ZS5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25SdWxlRWRpdG9yLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQppbmRleCA1ZGQ4YjNjLi4wYzI2MjljIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLkVESVRfVE9QSUNfTkFNRTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbi5QVVNIOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLlBVU0hfVEFHOwogCkBAIC0xMzcsOCArMTM4LDExIEBACiAgICAgaWYgKGNhbkZvcmNlKSB7CiAgICAgICBTdHJpbmcgcmVmID0gc2VjdGlvbi5nZXROYW1lKCk7CiAgICAgICBjYW5Gb3JjZSA9ICFyZWYuc3RhcnRzV2l0aCgicmVmcy9mb3IvIikgJiYgIXJlZi5zdGFydHNXaXRoKCJecmVmcy9mb3IvIik7CisgICAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX1BVU0gpOworICAgIH0gZWxzZSB7CisgICAgICBjYW5Gb3JjZSA9IEVESVRfVE9QSUNfTkFNRS5lcXVhbHMobmFtZSk7CisgICAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX0VESVQpOwogICAgIH0KLSAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX1BVU0gpOwogICAgIGZvcmNlLnNldFZpc2libGUoY2FuRm9yY2UpOwogICAgIGZvcmNlLnNldEVuYWJsZWQoIXJlYWRPbmx5KTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1BsdWdpbkxpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9QbHVnaW5MaXN0U2NyZWVuLmphdmEKaW5kZXggMzk0OGIzNS4uOWU0YjgxYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1BsdWdpbkxpc3RTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGx1Z2luTGlzdFNjcmVlbi5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGx1Z2lucy5QbHVnaW5JbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wbHVnaW5zLlBsdWdpbk1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKQEAgLTczLDcgKzc0LDcgQEAKICAgICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKICAgICAgIH0KIAotICAgICAgZm9yIChmaW5hbCBQbHVnaW5JbmZvIHAgOiBwbHVnaW5zLnZhbHVlcygpLmFzTGlzdCgpKSB7CisgICAgICBmb3IgKGZpbmFsIFBsdWdpbkluZm8gcCA6IE5hdGl2ZXMuYXNMaXN0KHBsdWdpbnMudmFsdWVzKCkpKSB7CiAgICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKICAgICAgICAgYXBwbHlEYXRhUm93U3R5bGUocm93KTsKQEAgLTkyLDkgKzkzLDggQEAKICAgICAgICAgICAgICAgICArIHBsdWdpbi5uYW1lKCkgKyAiLyIpKSk7CiAgICAgICB9CiAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgcGx1Z2luLnZlcnNpb24oKSk7Ci0gICAgICBpZiAocGx1Z2luLmlzRGlzYWJsZWQoKSkgewotICAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMywgVXRpbC5DLnBsdWdpbkRpc2FibGVkKCkpOwotICAgICAgfQorICAgICAgdGFibGUuc2V0VGV4dChyb3csIDMsIHBsdWdpbi5pc0Rpc2FibGVkKCkgPyBVdGlsLkMucGx1Z2luRGlzYWJsZWQoKQorICAgICAgICAgIDogVXRpbC5DLnBsdWdpbkVuYWJsZWQoKSk7CiAKICAgICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi5qYXZhCmluZGV4IDQ0MDNjZTYuLjk2ODI0ZjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RBY2Nlc3NTY3JlZW4uamF2YQpAQCAtMTQsNiArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdEFjY2Vzc1V0aWwubWVyZ2VTZWN0aW9uczsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlByb2plY3RBY2Nlc3NVdGlsLnJlbW92ZUVtcHR5UGVybWlzc2lvbnNBbmRTZWN0aW9uczsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlNjcmVlbkxvYWRDYWxsYmFjazsKQEAgLTM5LDYgKzQyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgUHJvamVjdEFjY2Vzc1NjcmVlbiBleHRlbmRzIFByb2plY3RTY3JlZW4gewpAQCAtMTEwLDYgKzExNCw3IEBACiAgICAgICAgICAgICBkaXNwbGF5UmVhZE9ubHkoYWNjZXNzKTsKICAgICAgICAgICB9CiAgICAgICAgIH0pOworICAgIHNhdmVkUGFuZWwgPSBBQ0NFU1M7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZGlzcGxheVJlYWRPbmx5KFByb2plY3RBY2Nlc3MgYWNjZXNzKSB7CkBAIC0xOTQsMTIgKzE5OSwxNCBAQAogCiAgICAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXREaWZmcyhQcm9qZWN0QWNjZXNzIHdhbnRlZEFjY2VzcywKICAgICAgICAgICAgICAgUHJvamVjdEFjY2VzcyBuZXdBY2Nlc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzU2VjdGlvbj4gd2FudGVkU2VjdGlvbnMgPQorICAgICAgICAgICAgICAgIG1lcmdlU2VjdGlvbnMocmVtb3ZlRW1wdHlQZXJtaXNzaW9uc0FuZFNlY3Rpb25zKHdhbnRlZEFjY2Vzcy5nZXRMb2NhbCgpKSk7CiAgICAgICAgICAgICBmaW5hbCBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+IHNhbWUgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+KHdhbnRlZEFjY2Vzcy5nZXRMb2NhbCgpKTsKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxBY2Nlc3NTZWN0aW9uPih3YW50ZWRTZWN0aW9ucyk7CiAgICAgICAgICAgICBmaW5hbCBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+IGRpZmZlcmVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjZXNzU2VjdGlvbj4od2FudGVkQWNjZXNzLmdldExvY2FsKCkuc2l6ZSgpCisgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjZXNzU2VjdGlvbj4od2FudGVkU2VjdGlvbnMuc2l6ZSgpCiAgICAgICAgICAgICAgICAgICAgICsgbmV3QWNjZXNzLmdldExvY2FsKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGRpZmZlcmVudC5hZGRBbGwod2FudGVkQWNjZXNzLmdldExvY2FsKCkpOworICAgICAgICAgICAgZGlmZmVyZW50LmFkZEFsbCh3YW50ZWRTZWN0aW9ucyk7CiAgICAgICAgICAgICBkaWZmZXJlbnQuYWRkQWxsKG5ld0FjY2Vzcy5nZXRMb2NhbCgpKTsKICAgICAgICAgICAgIHNhbWUucmV0YWluQWxsKG5ld0FjY2Vzcy5nZXRMb2NhbCgpKTsKICAgICAgICAgICAgIGRpZmZlcmVudC5yZW1vdmVBbGwoc2FtZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi51aS54bWwKaW5kZXggYTY2NDE5MS4uYWIyNmJhOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RBY2Nlc3NTY3JlZW4udWkueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLnVpLnhtbApAQCAtODMsNiArODMsNSBAQAogICAgICAgPHVpOmF0dHJpYnV0ZSBuYW1lPSd0ZXh0Jy8+CiAgICAgPC9nOkJ1dHRvbj4KICAgPC9kaXY+Ci0gIDxkaXYgc3R5bGU9J3dpZHRoOiAzNWVtOyB2aXNpYmlsaXR5OiBoaWRkZW47JyAvPgogPC9nOkhUTUxQYW5lbD4KIDwvdWk6VWlCaW5kZXI+CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEJyYW5jaGVzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEJyYW5jaGVzU2NyZWVuLmphdmEKaW5kZXggNTZkOTQxNy4uYTdjNmEyMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RCcmFuY2hlc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QnJhbmNoZXNTY3JlZW4uamF2YQpAQCAtMjQsOSArMjQsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5GYW5jeUZsZXhUYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSGludFRleHRCb3g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWRkQnJhbmNoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxpc3RCcmFuY2hlc1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkludmFsaWROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKQEAgLTQ0LDkgKzQzLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZlcnRpY2FsUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuUmVtb3RlSnNvbkV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtODcsNiArODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CisgICAgc2F2ZWRQYW5lbCA9IEJSQU5DSDsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBkaXNwbGF5KGZpbmFsIExpc3Q8QnJhbmNoPiBsaXN0QnJhbmNoZXMpIHsKQEAgLTEwNiwxMiArMTA2LDEzIEBACiAgICAgc3VwZXIub25Jbml0VUkoKTsKIAogICAgIGFkZFBhbmVsID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGFkZFBhbmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFkZFNzaEtleVBhbmVsKCkpOwogCiAgICAgZmluYWwgR3JpZCBhZGRHcmlkID0gbmV3IEdyaWQoMiwgMik7CisgICAgYWRkR3JpZC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRCcmFuY2goKSk7CisgICAgZmluYWwgaW50IHRleEJveExlbmd0aCA9IDUwOwogCiAgICAgbmFtZVR4dEJveCA9IG5ldyBIaW50VGV4dEJveCgpOwotICAgIG5hbWVUeHRCb3guc2V0VmlzaWJsZUxlbmd0aCg1MCk7CisgICAgbmFtZVR4dEJveC5zZXRWaXNpYmxlTGVuZ3RoKHRleEJveExlbmd0aCk7CiAgICAgbmFtZVR4dEJveC5zZXRIaW50VGV4dChVdGlsLkMuZGVmYXVsdEJyYW5jaE5hbWUoKSk7CiAgICAgbmFtZVR4dEJveC5hZGRLZXlQcmVzc0hhbmRsZXIobmV3IEtleVByZXNzSGFuZGxlcigpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMTI1LDcgKzEyNiw3IEBACiAgICAgYWRkR3JpZC5zZXRXaWRnZXQoMCwgMSwgbmFtZVR4dEJveCk7CiAKICAgICBpcmV2VHh0Qm94ID0gbmV3IEhpbnRUZXh0Qm94KCk7Ci0gICAgaXJldlR4dEJveC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKKyAgICBpcmV2VHh0Qm94LnNldFZpc2libGVMZW5ndGgodGV4Qm94TGVuZ3RoKTsKICAgICBpcmV2VHh0Qm94LnNldEhpbnRUZXh0KFV0aWwuQy5kZWZhdWx0UmV2aXNpb25TcGVjKCkpOwogICAgIGlyZXZUeHRCb3guYWRkS2V5UHJlc3NIYW5kbGVyKG5ldyBLZXlQcmVzc0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTE2NCwxMyArMTY1LDEzIEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9BZGROZXdCcmFuY2goKSB7Ci0gICAgU3RyaW5nIGJyYW5jaE5hbWUgPSBuYW1lVHh0Qm94LmdldFRleHQoKTsKKyAgICBmaW5hbCBTdHJpbmcgYnJhbmNoTmFtZSA9IG5hbWVUeHRCb3guZ2V0VGV4dCgpOwogICAgIGlmICgiIi5lcXVhbHMoYnJhbmNoTmFtZSkpIHsKICAgICAgIG5hbWVUeHRCb3guc2V0Rm9jdXModHJ1ZSk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgU3RyaW5nIHJldiA9IGlyZXZUeHRCb3guZ2V0VGV4dCgpOworICAgIGZpbmFsIFN0cmluZyByZXYgPSBpcmV2VHh0Qm94LmdldFRleHQoKTsKICAgICBpZiAoIiIuZXF1YWxzKHJldikpIHsKICAgICAgIGlyZXZUeHRCb3guc2V0VGV4dCgiSEVBRCIpOwogICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CkBAIC0xODMsNDEgKzE4NCw3MCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICghYnJhbmNoTmFtZS5zdGFydHNXaXRoKEJyYW5jaC5SX1JFRlMpKSB7Ci0gICAgICBicmFuY2hOYW1lID0gQnJhbmNoLlJfSEVBRFMgKyBicmFuY2hOYW1lOwotICAgIH0KLQogICAgIGFkZEJyYW5jaC5zZXRFbmFibGVkKGZhbHNlKTsKICAgICBVdGlsLlBST0pFQ1RfU1ZDLmFkZEJyYW5jaChnZXRQcm9qZWN0S2V5KCksIGJyYW5jaE5hbWUsIHJldiwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPExpc3RCcmFuY2hlc1Jlc3VsdD4oKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIExpc3RCcmFuY2hlc1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEFkZEJyYW5jaFJlc3VsdD4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEFkZEJyYW5jaFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgIGFkZEJyYW5jaC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbmFtZVR4dEJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGlyZXZUeHRCb3guc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICBkaXNwbGF5KHJlc3VsdC5nZXRCcmFuY2hlcygpKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0Lmhhc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAgbmFtZVR4dEJveC5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgICAgaXJldlR4dEJveC5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgICAgZGlzcGxheShyZXN1bHQuZ2V0TGlzdEJyYW5jaGVzUmVzdWx0KCkuZ2V0QnJhbmNoZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmaW5hbCBBZGRCcmFuY2hSZXN1bHQuRXJyb3IgZXJyb3IgPSByZXN1bHQuZ2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzsKKyAgICAgICAgICAgICAgc3dpdGNoIChlcnJvci5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOVkFMSURfTkFNRToKKyAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFuZEZvY3VzKG5hbWVUeHRCb3gpOworICAgICAgICAgICAgICAgICAgbXNnID0gR2Vycml0Lk0uaW52YWxpZEJyYW5jaE5hbWUoYnJhbmNoTmFtZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9SRVZJU0lPTjoKKyAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFuZEZvY3VzKGlyZXZUeHRCb3gpOworICAgICAgICAgICAgICAgICAgbXNnID0gR2Vycml0Lk0uaW52YWxpZFJldmlzaW9uKHJldik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlJBTkNIX0NSRUFUSU9OX05PVF9BTExPV0VEX1VOREVSX1JFRk5BTUVfUFJFRklYOgorICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsQW5kRm9jdXMobmFtZVR4dEJveCk7CisgICAgICAgICAgICAgICAgICBtc2cgPQorICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5NLmJyYW5jaENyZWF0aW9uTm90QWxsb3dlZFVuZGVyUmVmbmFtZVByZWZpeChlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVmbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCUkFOQ0hfQUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxBbmRGb2N1cyhuYW1lVHh0Qm94KTsKKyAgICAgICAgICAgICAgICAgIG1zZyA9IEdlcnJpdC5NLmJyYW5jaEFscmVhZHlFeGlzdHMoZXJyb3IuZ2V0UmVmbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCUkFOQ0hfQ1JFQVRJT05fQ09ORkxJQ1Q6CisgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxBbmRGb2N1cyhuYW1lVHh0Qm94KTsKKyAgICAgICAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgR2Vycml0Lk0uYnJhbmNoQ3JlYXRpb25Db25mbGljdChicmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5nZXRSZWZuYW1lKCkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgICBHZXJyaXQuTS5icmFuY2hDcmVhdGlvbkZhaWxlZChicmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuZXcgRXJyb3JEaWFsb2cobXNnKS5jZW50ZXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgaWYgKGNhdWdodCBpbnN0YW5jZW9mIEludmFsaWROYW1lRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgfHwgY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKEludmFsaWROYW1lRXhjZXB0aW9uLk1FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgIG5hbWVUeHRCb3guc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgIG5hbWVUeHRCb3guc2V0Rm9jdXModHJ1ZSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1Z2h0IGluc3RhbmNlb2YgSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgfHwgY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKEludmFsaWRSZXZpc2lvbkV4Y2VwdGlvbi5NRVNTQUdFKSkgewotICAgICAgICAgICAgICBpcmV2VHh0Qm94LnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgICBpcmV2VHh0Qm94LnNldEZvY3VzKHRydWUpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBhZGRCcmFuY2guc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOwogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbGVjdEFsbEFuZEZvY3VzKGZpbmFsIFRleHRCb3ggdGV4dEJveCkgeworICAgIHRleHRCb3guc2VsZWN0QWxsKCk7CisgICAgdGV4dEJveC5zZXRGb2N1cyh0cnVlKTsKKyAgfQorCiAgIHByaXZhdGUgY2xhc3MgQnJhbmNoZXNUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEJyYW5jaD4gewogICAgIGJvb2xlYW4gY2FuRGVsZXRlOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdERhc2hib2FyZHNTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0RGFzaGJvYXJkc1NjcmVlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Nzk4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdERhc2hib2FyZHNTY3JlZW4uamF2YQpAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHMuRGFzaGJvYXJkTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZGFzaGJvYXJkcy5EYXNoYm9hcmRzVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0RGFzaGJvYXJkc1NjcmVlbiBleHRlbmRzIFByb2plY3RTY3JlZW4geworICBwcml2YXRlIERhc2hib2FyZHNUYWJsZSBkYXNoZXM7CisgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0OworCisgIHB1YmxpYyBQcm9qZWN0RGFzaGJvYXJkc1NjcmVlbihmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkgeworICAgIHN1cGVyKHByb2plY3QpOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgIHN1cGVyLm9uTG9hZCgpOworICAgIERhc2hib2FyZExpc3QuYWxsKGdldFByb2plY3RLZXkoKSwKKyAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxKc0FycmF5PERhc2hib2FyZExpc3Q+Pih0aGlzKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoSnNBcnJheTxEYXNoYm9hcmRMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgZGFzaGVzLmRpc3BsYXkocmVzdWx0KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBzYXZlZFBhbmVsID0gREFTSEJPQVJEUzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBvbkluaXRVSSgpIHsKKyAgICBzdXBlci5vbkluaXRVSSgpOworICAgIGRhc2hlcyA9IG5ldyBEYXNoYm9hcmRzVGFibGUocHJvamVjdCk7CisgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgIGZwLmFkZChkYXNoZXMpOworICAgIGFkZChmcCk7CisgICAgZGFzaGVzLnNldFNhdmVQb2ludGVySWQoImRhc2hib2FyZHMvcHJvamVjdC8iICsgZ2V0UHJvamVjdEtleSgpLmdldCgpKTsKKyAgICBkaXNwbGF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVnaXN0ZXJLZXlzKCkgeworICAgIHN1cGVyLnJlZ2lzdGVyS2V5cygpOworICAgIGRhc2hlcy5zZXRSZWdpc3RlcktleXModHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RJbmZvU2NyZWVuLmphdmEKaW5kZXggOTQ0YTE2OS4uNDA5MjEzMDkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhCkBAIC0xNSwzNiArMTUsNDMgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZG93bmxvYWQuRG93bmxvYWRQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuU2NyZWVuTG9hZENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5PbkVkaXRFbmFibGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TbWFsbEhlYWRpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdERldGFpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkluaGVyaXRlZEJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkJ1dHRvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5DaGVja0JveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGlzdEJveDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0QXJlYTsKIAogcHVibGljIGNsYXNzIFByb2plY3RJbmZvU2NyZWVuIGV4dGVuZHMgUHJvamVjdFNjcmVlbiB7CisgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwogICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKIAotICBwcml2YXRlIFBhbmVsIHByb2plY3RPcHRpb25zUGFuZWw7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggcmVxdWlyZUNoYW5nZUlEOworICBwcml2YXRlIExhYmVsZWRXaWRnZXRzR3JpZCBncmlkOworCisgIC8vIFNlY3Rpb246IFByb2plY3QgT3B0aW9ucworICBwcml2YXRlIExpc3RCb3ggcmVxdWlyZUNoYW5nZUlEOwogICBwcml2YXRlIExpc3RCb3ggc3VibWl0VHlwZTsKICAgcHJpdmF0ZSBMaXN0Qm94IHN0YXRlOwotICBwcml2YXRlIENoZWNrQm94IHVzZUNvbnRlbnRNZXJnZTsKKyAgcHJpdmF0ZSBMaXN0Qm94IGNvbnRlbnRNZXJnZTsKIAotICBwcml2YXRlIFBhbmVsIGFncmVlbWVudHNQYW5lbDsKLSAgcHJpdmF0ZSBDaGVja0JveCB1c2VDb250cmlidXRvckFncmVlbWVudHM7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggdXNlU2lnbmVkT2ZmQnk7CisgIC8vIFNlY3Rpb246IENvbnRyaWJ1dG9yIEFncmVlbWVudHMKKyAgcHJpdmF0ZSBMaXN0Qm94IGNvbnRyaWJ1dG9yQWdyZWVtZW50czsKKyAgcHJpdmF0ZSBMaXN0Qm94IHNpZ25lZE9mZkJ5OwogCiAgIHByaXZhdGUgTnBUZXh0QXJlYSBkZXNjVHh0OwogICBwcml2YXRlIEJ1dHRvbiBzYXZlUHJvamVjdDsKQEAgLTUzLDYgKzYwLDcgQEAKIAogICBwdWJsaWMgUHJvamVjdEluZm9TY3JlZW4oZmluYWwgUHJvamVjdC5OYW1lS2V5IHRvU2hvdykgewogICAgIHN1cGVyKHRvU2hvdyk7CisgICAgcHJvamVjdE5hbWUgPSB0b1Nob3cuZ2V0KCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY3LDkgKzc1LDEzIEBACiAgICAgICB9CiAgICAgfSk7CiAKKyAgICBhZGQobmV3IFByb2plY3REb3dubG9hZFBhbmVsKHByb2plY3ROYW1lLCB0cnVlKSk7CisKICAgICBpbml0RGVzY3JpcHRpb24oKTsKKyAgICBncmlkID0gbmV3IExhYmVsZWRXaWRnZXRzR3JpZCgpOwogICAgIGluaXRQcm9qZWN0T3B0aW9ucygpOwogICAgIGluaXRBZ3JlZW1lbnRzKCk7CisgICAgYWRkKGdyaWQpOwogICAgIGFkZChzYXZlUHJvamVjdCk7CiAgIH0KIApAQCAtODksNiArMTAxLDcgQEAKICAgICAgICAgICAgIGRpc3BsYXkocmVzdWx0KTsKICAgICAgICAgICB9CiAgICAgICAgIH0pOworICAgIHNhdmVkUGFuZWwgPSBJTkZPOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUZvcm0oZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnlBZ3JlZW1lbnRzLApAQCAtOTYsMTAgKzEwOSwxMCBAQAogICAgICAgZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnlTdGF0ZSkgewogICAgIHN1Ym1pdFR5cGUuc2V0RW5hYmxlZChjYW5Nb2RpZnlNZXJnZVR5cGUpOwogICAgIHN0YXRlLnNldEVuYWJsZWQoY2FuTW9kaWZ5U3RhdGUpOwotICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRFbmFibGVkKGNhbk1vZGlmeU1lcmdlVHlwZSk7CisgICAgY29udGVudE1lcmdlLnNldEVuYWJsZWQoY2FuTW9kaWZ5TWVyZ2VUeXBlKTsKICAgICBkZXNjVHh0LnNldEVuYWJsZWQoY2FuTW9kaWZ5RGVzY3JpcHRpb24pOwotICAgIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cy5zZXRFbmFibGVkKGNhbk1vZGlmeUFncmVlbWVudHMpOwotICAgIHVzZVNpZ25lZE9mZkJ5LnNldEVuYWJsZWQoY2FuTW9kaWZ5QWdyZWVtZW50cyk7CisgICAgY29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldEVuYWJsZWQoY2FuTW9kaWZ5QWdyZWVtZW50cyk7CisgICAgc2lnbmVkT2ZmQnkuc2V0RW5hYmxlZChjYW5Nb2RpZnlBZ3JlZW1lbnRzKTsKICAgICByZXF1aXJlQ2hhbmdlSUQuc2V0RW5hYmxlZChjYW5Nb2RpZnlNZXJnZVR5cGUpOwogICB9CiAKQEAgLTExOCw4ICsxMzEsNyBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9qZWN0T3B0aW9ucygpIHsKLSAgICBwcm9qZWN0T3B0aW9uc1BhbmVsID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBwcm9qZWN0T3B0aW9uc1BhbmVsLmFkZChuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nUHJvamVjdE9wdGlvbnMoKSkpOworICAgIGdyaWQuYWRkSGVhZGVyKG5ldyBTbWFsbEhlYWRpbmcoVXRpbC5DLmhlYWRpbmdQcm9qZWN0T3B0aW9ucygpKSk7CiAKICAgICBzdWJtaXRUeXBlID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKGZpbmFsIFByb2plY3QuU3VibWl0VHlwZSB0eXBlIDogUHJvamVjdC5TdWJtaXRUeXBlLnZhbHVlcygpKSB7CkBAIC0xMzIsMjkgKzE0NCwzNCBAQAogICAgICAgfQogICAgIH0pOwogICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKHN1Ym1pdFR5cGUpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHN1Ym1pdFR5cGUpOworICAgIGdyaWQuYWRkKFV0aWwuQy5oZWFkaW5nUHJvamVjdFN1Ym1pdFR5cGUoKSwgc3VibWl0VHlwZSk7CiAKICAgICBzdGF0ZSA9IG5ldyBMaXN0Qm94KCk7CiAgICAgZm9yIChmaW5hbCBQcm9qZWN0LlN0YXRlIHN0YXRlVmFsdWUgOiBQcm9qZWN0LlN0YXRlLnZhbHVlcygpKSB7CiAgICAgICBzdGF0ZS5hZGRJdGVtKFV0aWwudG9Mb25nU3RyaW5nKHN0YXRlVmFsdWUpLCBzdGF0ZVZhbHVlLm5hbWUoKSk7CiAgICAgfQotCiAgICAgc2F2ZUVuYWJsZXIubGlzdGVuVG8oc3RhdGUpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHN0YXRlKTsKKyAgICBncmlkLmFkZChVdGlsLkMuaGVhZGluZ1Byb2plY3RTdGF0ZSgpLCBzdGF0ZSk7CiAKLSAgICB1c2VDb250ZW50TWVyZ2UgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnVzZUNvbnRlbnRNZXJnZSgpLCB0cnVlKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VDb250ZW50TWVyZ2UpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHVzZUNvbnRlbnRNZXJnZSk7CisgICAgY29udGVudE1lcmdlID0gbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpOworICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKGNvbnRlbnRNZXJnZSk7CisgICAgZ3JpZC5hZGQoVXRpbC5DLnVzZUNvbnRlbnRNZXJnZSgpLCBjb250ZW50TWVyZ2UpOwogCi0gICAgcmVxdWlyZUNoYW5nZUlEID0gbmV3IENoZWNrQm94KFV0aWwuQy5yZXF1aXJlQ2hhbmdlSUQoKSwgdHJ1ZSk7CisgICAgcmVxdWlyZUNoYW5nZUlEID0gbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpOwogICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKHJlcXVpcmVDaGFuZ2VJRCk7Ci0gICAgcHJvamVjdE9wdGlvbnNQYW5lbC5hZGQocmVxdWlyZUNoYW5nZUlEKTsKKyAgICBncmlkLmFkZEh0bWwoVXRpbC5DLnJlcXVpcmVDaGFuZ2VJRCgpLCByZXF1aXJlQ2hhbmdlSUQpOworICB9CiAKLSAgICBhZGQocHJvamVjdE9wdGlvbnNQYW5lbCk7CisgIHByaXZhdGUgc3RhdGljIExpc3RCb3ggbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpIHsKKyAgICBMaXN0Qm94IGJveCA9IG5ldyBMaXN0Qm94KCk7CisgICAgZm9yIChJbmhlcml0YWJsZUJvb2xlYW4gYiA6IEluaGVyaXRhYmxlQm9vbGVhbi52YWx1ZXMoKSkgeworICAgICAgYm94LmFkZEl0ZW0oYi5uYW1lKCksIGIubmFtZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGJveDsKICAgfQogCiAgIC8qKgotICAgKiBFbmFibGVzIHRoZSB7QGxpbmsgI3VzZUNvbnRlbnRNZXJnZX0gY2hlY2tib3ggaWYgdGhlIHNlbGVjdGVkIHN1Ym1pdCB0eXBlCisgICAqIEVuYWJsZXMgdGhlIHtAbGluayAjY29udGVudE1lcmdlfSBjaGVja2JveCBpZiB0aGUgc2VsZWN0ZWQgc3VibWl0IHR5cGUKICAgICogYWxsb3dzIHRoZSB1c2FnZSBvZiBjb250ZW50IG1lcmdlLgogICAgKiBJZiB0aGUgc3VibWl0IHR5cGUgKGN1cnJlbnRseSBvbmx5ICdGYXN0IEZvcndhcmQgT25seScpIGRvZXMgbm90IGFsbG93CiAgICAqIGNvbnRlbnQgbWVyZ2UgdGhlIHVzZUNvbnRlbnRNZXJnZSBjaGVja2JveCBnZXRzIGRpc2FibGVkLgpAQCAtMTYyLDI2ICsxNzksMjcgQEAKICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JVc2VDb250ZW50TWVyZ2UoKSB7CiAgICAgaWYgKFN1Ym1pdFR5cGUuRkFTVF9GT1JXQVJEX09OTFkuZXF1YWxzKFByb2plY3QuU3VibWl0VHlwZQogICAgICAgICAudmFsdWVPZihzdWJtaXRUeXBlLmdldFZhbHVlKHN1Ym1pdFR5cGUuZ2V0U2VsZWN0ZWRJbmRleCgpKSkpKSB7Ci0gICAgICB1c2VDb250ZW50TWVyZ2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB1c2VDb250ZW50TWVyZ2Uuc2V0VmFsdWUoZmFsc2UpOworICAgICAgY29udGVudE1lcmdlLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgZmluYWwgSW5oZXJpdGVkQm9vbGVhbiBpbmhlcml0ZWRCb29sZWFuID0gbmV3IEluaGVyaXRlZEJvb2xlYW4oKTsKKyAgICAgIGluaGVyaXRlZEJvb2xlYW4uc2V0VmFsdWUoSW5oZXJpdGFibGVCb29sZWFuLkZBTFNFKTsKKyAgICAgIHNldEJvb2woY29udGVudE1lcmdlLCBpbmhlcml0ZWRCb29sZWFuKTsKICAgICB9IGVsc2UgewotICAgICAgdXNlQ29udGVudE1lcmdlLnNldEVuYWJsZWQoc3VibWl0VHlwZS5pc0VuYWJsZWQoKSk7CisgICAgICBjb250ZW50TWVyZ2Uuc2V0RW5hYmxlZChzdWJtaXRUeXBlLmlzRW5hYmxlZCgpKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgaW5pdEFncmVlbWVudHMoKSB7Ci0gICAgYWdyZWVtZW50c1BhbmVsID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBhZ3JlZW1lbnRzUGFuZWwuYWRkKG5ldyBTbWFsbEhlYWRpbmcoVXRpbC5DLmhlYWRpbmdBZ3JlZW1lbnRzKCkpKTsKKyAgICBncmlkLmFkZEhlYWRlcihuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nQWdyZWVtZW50cygpKSk7CiAKLSAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VDb250cmlidXRvckFncmVlbWVudHMpOwotICAgIGFncmVlbWVudHNQYW5lbC5hZGQodXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKTsKKyAgICBjb250cmlidXRvckFncmVlbWVudHMgPSBuZXdJbmhlcml0ZWRCb29sZWFuQm94KCk7CisgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKSB7CisgICAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyhjb250cmlidXRvckFncmVlbWVudHMpOworICAgICAgZ3JpZC5hZGQoVXRpbC5DLnVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpLCBjb250cmlidXRvckFncmVlbWVudHMpOworICAgIH0KIAotICAgIHVzZVNpZ25lZE9mZkJ5ID0gbmV3IENoZWNrQm94KFV0aWwuQy51c2VTaWduZWRPZmZCeSgpLCB0cnVlKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VTaWduZWRPZmZCeSk7Ci0gICAgYWdyZWVtZW50c1BhbmVsLmFkZCh1c2VTaWduZWRPZmZCeSk7Ci0KLSAgICBhZGQoYWdyZWVtZW50c1BhbmVsKTsKKyAgICBzaWduZWRPZmZCeSA9IG5ld0luaGVyaXRlZEJvb2xlYW5Cb3goKTsKKyAgICBzYXZlRW5hYmxlci5saXN0ZW5UbyhzaWduZWRPZmZCeSk7CisgICAgZ3JpZC5hZGRIdG1sKFV0aWwuQy51c2VTaWduZWRPZmZCeSgpLCBzaWduZWRPZmZCeSk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2V0U3VibWl0VHlwZShmaW5hbCBQcm9qZWN0LlN1Ym1pdFR5cGUgbmV3U3VibWl0VHlwZSkgewpAQCAtMjA5LDIxICsyMjcsNTQgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHZvaWQgc2V0Qm9vbChMaXN0Qm94IGJveCwgSW5oZXJpdGVkQm9vbGVhbiBpbmhlcml0ZWRCb29sZWFuKSB7CisgICAgaW50IGluaGVyaXRlZEluZGV4ID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3guZ2V0SXRlbUNvdW50KCk7IGkrKykgeworICAgICAgaWYgKGJveC5nZXRWYWx1ZShpKS5zdGFydHNXaXRoKEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklULm5hbWUoKSkpIHsKKyAgICAgICAgaW5oZXJpdGVkSW5kZXggPSBpOworICAgICAgfQorICAgICAgaWYgKGJveC5nZXRWYWx1ZShpKS5zdGFydHNXaXRoKGluaGVyaXRlZEJvb2xlYW4udmFsdWUubmFtZSgpKSkgeworICAgICAgICBib3guc2V0U2VsZWN0ZWRJbmRleChpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGluaGVyaXRlZEluZGV4ID49IDApIHsKKyAgICAgIGlmIChwcm9qZWN0LmdldFBhcmVudChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0V2lsZFByb2plY3QoKSkgPT0gbnVsbCkgeworICAgICAgICBpZiAoYm94LmdldFNlbGVjdGVkSW5kZXgoKSA9PSBpbmhlcml0ZWRJbmRleCkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm94LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChib3guZ2V0VmFsdWUoaSkuZXF1YWxzKEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRS5uYW1lKCkpKSB7CisgICAgICAgICAgICAgIGJveC5zZXRTZWxlY3RlZEluZGV4KGkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm94LnJlbW92ZUl0ZW0oaW5oZXJpdGVkSW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm94LnNldEl0ZW1UZXh0KGluaGVyaXRlZEluZGV4LCBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVC5uYW1lKCkgKyAiICgiCisgICAgICAgICAgICArIGluaGVyaXRlZEJvb2xlYW4uaW5oZXJpdGVkVmFsdWUgKyAiKSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRCb29sKExpc3RCb3ggYm94KSB7CisgICAgaW50IGkgPSBib3guZ2V0U2VsZWN0ZWRJbmRleCgpOworICAgIGlmIChpID49IDApIHsKKyAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3RlZFZhbHVlID0gYm94LmdldFZhbHVlKGkpOworICAgICAgaWYgKHNlbGVjdGVkVmFsdWUuc3RhcnRzV2l0aChJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVC5uYW1lKCkpKSB7CisgICAgICAgIHJldHVybiBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBJbmhlcml0YWJsZUJvb2xlYW4udmFsdWVPZihzZWxlY3RlZFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICB9CisKICAgdm9pZCBkaXNwbGF5KGZpbmFsIFByb2plY3REZXRhaWwgcmVzdWx0KSB7CiAgICAgcHJvamVjdCA9IHJlc3VsdC5wcm9qZWN0OwogCi0gICAgZmluYWwgYm9vbGVhbiBpc2FsbCA9Ci0gICAgICAgIEdlcnJpdC5nZXRDb25maWcoKS5nZXRXaWxkUHJvamVjdCgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWVLZXkoKSk7Ci0gICAgcHJvamVjdE9wdGlvbnNQYW5lbC5zZXRWaXNpYmxlKCFpc2FsbCk7Ci0gICAgYWdyZWVtZW50c1BhbmVsLnNldFZpc2libGUoIWlzYWxsKTsKLSAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMuc2V0VmlzaWJsZShHZXJyaXQuZ2V0Q29uZmlnKCkKLSAgICAgICAgLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotCiAgICAgZGVzY1R4dC5zZXRUZXh0KHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldFZhbHVlKHByb2plY3QuaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSk7Ci0gICAgdXNlU2lnbmVkT2ZmQnkuc2V0VmFsdWUocHJvamVjdC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRWYWx1ZShwcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpOwotICAgIHJlcXVpcmVDaGFuZ2VJRC5zZXRWYWx1ZShwcm9qZWN0LmlzUmVxdWlyZUNoYW5nZUlEKCkpOworICAgIHNldEJvb2woY29udHJpYnV0b3JBZ3JlZW1lbnRzLCByZXN1bHQudXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKTsKKyAgICBzZXRCb29sKHNpZ25lZE9mZkJ5LCByZXN1bHQudXNlU2lnbmVkT2ZmQnkpOworICAgIHNldEJvb2woY29udGVudE1lcmdlLCByZXN1bHQudXNlQ29udGVudE1lcmdlKTsKKyAgICBzZXRCb29sKHJlcXVpcmVDaGFuZ2VJRCwgcmVzdWx0LnJlcXVpcmVDaGFuZ2VJRCk7CiAgICAgc2V0U3VibWl0VHlwZShwcm9qZWN0LmdldFN1Ym1pdFR5cGUoKSk7CiAgICAgc2V0U3RhdGUocHJvamVjdC5nZXRTdGF0ZSgpKTsKIApAQCAtMjMyLDEwICsyODMsMTAgQEAKIAogICBwcml2YXRlIHZvaWQgZG9TYXZlKCkgewogICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY1R4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyh1c2VDb250cmlidXRvckFncmVlbWVudHMuZ2V0VmFsdWUoKSk7Ci0gICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeSh1c2VTaWduZWRPZmZCeS5nZXRWYWx1ZSgpKTsKLSAgICBwcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZSh1c2VDb250ZW50TWVyZ2UuZ2V0VmFsdWUoKSk7Ci0gICAgcHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQocmVxdWlyZUNoYW5nZUlELmdldFZhbHVlKCkpOworICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGdldEJvb2woY29udHJpYnV0b3JBZ3JlZW1lbnRzKSk7CisgICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShnZXRCb29sKHNpZ25lZE9mZkJ5KSk7CisgICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoZ2V0Qm9vbChjb250ZW50TWVyZ2UpKTsKKyAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChnZXRCb29sKHJlcXVpcmVDaGFuZ2VJRCkpOwogICAgIGlmIChzdWJtaXRUeXBlLmdldFNlbGVjdGVkSW5kZXgoKSA+PSAwKSB7CiAgICAgICBwcm9qZWN0LnNldFN1Ym1pdFR5cGUoUHJvamVjdC5TdWJtaXRUeXBlLnZhbHVlT2Yoc3VibWl0VHlwZQogICAgICAgICAgIC5nZXRWYWx1ZShzdWJtaXRUeXBlLmdldFNlbGVjdGVkSW5kZXgoKSkpKTsKQEAgLTI1Niw0ICszMDcsNTggQEAKICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICB9CisKKyAgcHVibGljIGNsYXNzIFByb2plY3REb3dubG9hZFBhbmVsIGV4dGVuZHMgRG93bmxvYWRQYW5lbCB7CisgICAgcHVibGljIFByb2plY3REb3dubG9hZFBhbmVsKFN0cmluZyBwcm9qZWN0LCBib29sZWFuIGlzQWxsb3dzQW5vbnltb3VzKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBudWxsLCBpc0FsbG93c0Fub255bW91cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVEb3dubG9hZENvbW1hbmRMaW5rcygpIHsKKyAgICAgIGlmICghdXJscy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFQ0tPVVQpCisgICAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgeworICAgICAgICAgIGNvbW1hbmRzLmFkZChjbWRMaW5rZmFjdG9yeS5uZXcgQ2xvbmVDb21tYW5kTGluaygpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY2xhc3MgTGFiZWxlZFdpZGdldHNHcmlkIGV4dGVuZHMgRmxleFRhYmxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbFN1ZmZpeDsKKworICAgIHB1YmxpYyBMYWJlbGVkV2lkZ2V0c0dyaWQoKSB7CisgICAgICBzdXBlcigpOworICAgICAgbGFiZWxTdWZmaXggPSAiOiI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEhlYWRlcihXaWRnZXQgd2lkZ2V0KSB7CisgICAgICBpbnQgcm93ID0gZ2V0Um93Q291bnQoKTsKKyAgICAgIGluc2VydFJvdyhyb3cpOworICAgICAgc2V0V2lkZ2V0KHJvdywgMCwgd2lkZ2V0KTsKKyAgICAgIGdldENlbGxGb3JtYXR0ZXIoKS5nZXRFbGVtZW50KHJvdywgMCkuc2V0QXR0cmlidXRlKCJjb2xTcGFuIiwgIjIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBsYWJlbCwgYm9vbGVhbiBsYWJlbElzSHRtbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgaW50IHJvdyA9IGdldFJvd0NvdW50KCk7CisgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgIGlmIChsYWJlbElzSHRtbCkgeworICAgICAgICAgIHNldEhUTUwocm93LCAwLCBsYWJlbCArIGxhYmVsU3VmZml4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRUZXh0KHJvdywgMCwgbGFiZWwgKyBsYWJlbFN1ZmZpeCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNldFdpZGdldChyb3csIDEsIHdpZGdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBsYWJlbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgYWRkKGxhYmVsLCBmYWxzZSwgd2lkZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRIdG1sKFN0cmluZyBsYWJlbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgYWRkKGxhYmVsLCB0cnVlLCB3aWRnZXQpOworICAgIH0KKworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdExpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCmluZGV4IDkxMjU2MjIuLmVlNTg0MjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCkBAIC0xNCwzOCArMTQsODIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW47CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9QUk9KRUNUUzsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5EaXNwYXRjaGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdpdHdlYkxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0TWFwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuU2NyZWVuTG9hZENhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuRmlsdGVyZWRVc2VySW50ZXJmYWNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLklnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdFNlYXJjaExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3RzVGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVVwSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhvcml6b250YWxQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0Qm94OwogCi1wdWJsaWMgY2xhc3MgUHJvamVjdExpc3RTY3JlZW4gZXh0ZW5kcyBTY3JlZW4geworcHVibGljIGNsYXNzIFByb2plY3RMaXN0U2NyZWVuIGV4dGVuZHMgU2NyZWVuIGltcGxlbWVudHMgRmlsdGVyZWRVc2VySW50ZXJmYWNlIHsKICAgcHJpdmF0ZSBQcm9qZWN0c1RhYmxlIHByb2plY3RzOworICBwcml2YXRlIE5wVGV4dEJveCBmaWx0ZXJUeHQ7CisgIHByaXZhdGUgU3RyaW5nIHN1Ym5hbWU7CisKKyAgcHVibGljIFByb2plY3RMaXN0U2NyZWVuKCkgeworICB9CisKKyAgcHVibGljIFByb2plY3RMaXN0U2NyZWVuKFN0cmluZyBwYXJhbXMpIHsKKyAgICBmb3IgKFN0cmluZyBrdlBhaXIgOiBwYXJhbXMuc3BsaXQoIlssOyZdIikpIHsKKyAgICAgIFN0cmluZ1tdIGt2ID0ga3ZQYWlyLnNwbGl0KCI9IiwgMik7CisgICAgICBpZiAoa3YubGVuZ3RoICE9IDIgfHwga3ZbMF0uaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoImZpbHRlciIuZXF1YWxzKGt2WzBdKSkgeworICAgICAgICBzdWJuYW1lID0gVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwotICAgIFByb2plY3RNYXAuYWxsKG5ldyBTY3JlZW5Mb2FkQ2FsbGJhY2s8UHJvamVjdE1hcD4odGhpcykgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KGZpbmFsIFByb2plY3RNYXAgcmVzdWx0KSB7Ci0gICAgICAgIHByb2plY3RzLmRpc3BsYXkocmVzdWx0KTsKLSAgICAgICAgcHJvamVjdHMuZmluaXNoRGlzcGxheSgpOwotICAgICAgfQotICAgIH0pOworICAgIGRpc3BsYXkoKTsKKyAgICByZWZyZXNoKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKKyAgICBzZXRUb2tlbihzdWJuYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHN1Ym5hbWUpID8gQURNSU5fUFJPSkVDVFMKKyAgICAgICAgOiBBRE1JTl9QUk9KRUNUUyArICI/ZmlsdGVyPSIgKyBVUkwuZW5jb2RlUXVlcnlTdHJpbmcoc3VibmFtZSkpOworICAgIFByb2plY3RNYXAubWF0Y2goc3VibmFtZSwKKyAgICAgICAgbmV3IElnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjxQcm9qZWN0TWFwPih0aGlzLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFByb2plY3RNYXA+KCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFByb2plY3RNYXAgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcHJvamVjdHMuZGlzcGxheShyZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RmlsdGVyKCkgeworICAgIHJldHVybiBzdWJuYW1lOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7CiAgICAgc2V0UGFnZVRpdGxlKFV0aWwuQy5wcm9qZWN0TGlzdFRpdGxlKCkpOworICAgIGluaXRQYWdlSGVhZGVyKCk7CiAKICAgICBwcm9qZWN0cyA9IG5ldyBQcm9qZWN0c1RhYmxlKCkgewogICAgICAgQE92ZXJyaWRlCkBAIC02NCw3ICsxMDgsNyBAQAogICAgICAgfQogCiAgICAgICBwcml2YXRlIFN0cmluZyBsaW5rKGZpbmFsIFByb2plY3RJbmZvIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuIERpc3BhdGNoZXIudG9Qcm9qZWN0QWRtaW4oaXRlbS5uYW1lX2tleSgpLCBQcm9qZWN0U2NyZWVuLklORk8pOworICAgICAgICByZXR1cm4gRGlzcGF0Y2hlci50b1Byb2plY3QoaXRlbS5uYW1lX2tleSgpKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCkBAIC03OCw3ICsxMjIsMTAgQEAKIAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBQcm9qZWN0SW5mbyBrKSB7Ci0gICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIG5ldyBIeXBlcmxpbmsoay5uYW1lKCksIGxpbmsoaykpKTsKKyAgICAgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgICAgICBmcC5hZGQobmV3IFByb2plY3RTZWFyY2hMaW5rKGsubmFtZV9rZXkoKSkpOworICAgICAgICBmcC5hZGQobmV3IEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayhrLm5hbWUoKSwgbGluayhrKSwgc3VibmFtZSkpOworICAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAxLCBmcCk7CiAgICAgICAgIHRhYmxlLnNldFRleHQocm93LCAyLCBrLmRlc2NyaXB0aW9uKCkpOwogICAgICAgICBHaXR3ZWJMaW5rIGwgPSBHZXJyaXQuZ2V0R2l0d2ViTGluaygpOwogICAgICAgICBpZiAobCAhPSBudWxsKSB7CkBAIC05NCw2ICsxNDEsMzQgQEAKICAgICBhZGQocHJvamVjdHMpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGluaXRQYWdlSGVhZGVyKCkgeworICAgIGZpbmFsIEhvcml6b250YWxQYW5lbCBocCA9IG5ldyBIb3Jpem9udGFsUGFuZWwoKTsKKyAgICBocC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyUGFuZWwoKSk7CisgICAgZmluYWwgTGFiZWwgZmlsdGVyTGFiZWwgPSBuZXcgTGFiZWwoVXRpbC5DLnByb2plY3RGaWx0ZXIoKSk7CisgICAgZmlsdGVyTGFiZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucHJvamVjdEZpbHRlckxhYmVsKCkpOworICAgIGhwLmFkZChmaWx0ZXJMYWJlbCk7CisgICAgZmlsdGVyVHh0ID0gbmV3IE5wVGV4dEJveCgpOworICAgIGZpbHRlclR4dC5zZXRWYWx1ZShzdWJuYW1lKTsKKyAgICBmaWx0ZXJUeHQuYWRkS2V5VXBIYW5kbGVyKG5ldyBLZXlVcEhhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uS2V5VXAoS2V5VXBFdmVudCBldmVudCkgeworICAgICAgICBzdWJuYW1lID0gZmlsdGVyVHh0LmdldFZhbHVlKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBocC5hZGQoZmlsdGVyVHh0KTsKKyAgICBhZGQoaHApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU2hvd1ZpZXcoKSB7CisgICAgc3VwZXIub25TaG93VmlldygpOworICAgIGlmIChzdWJuYW1lICE9IG51bGwpIHsKKyAgICAgIGZpbHRlclR4dC5zZXRDdXJzb3JQb3Moc3VibmFtZS5sZW5ndGgoKSk7CisgICAgfQorICAgIGZpbHRlclR4dC5zZXRGb2N1cyh0cnVlKTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCByZWdpc3RlcktleXMoKSB7CiAgICAgc3VwZXIucmVnaXN0ZXJLZXlzKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RTY3JlZW4uamF2YQppbmRleCBkZDViMDcwLi5mZGYzYWI4IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0U2NyZWVuLmphdmEKQEAgLTE0LDI3ICsxNCwzMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5NZW51U2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0U2NyZWVuIGV4dGVuZHMgTWVudVNjcmVlbiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdFNjcmVlbiBleHRlbmRzIFNjcmVlbiB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk8gPSAiaW5mbyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQU5DSCA9ICJicmFuY2hlcyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTUyA9ICJhY2Nlc3MiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVNIQk9BUkRTID0gImRhc2hib2FyZHMiOworCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNhdmVkUGFuZWw7CisgIHByb3RlY3RlZCBzdGF0aWMgUHJvamVjdC5OYW1lS2V5IHNhdmVkS2V5OworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkUGFuZWwoKSB7CisgICAgcmV0dXJuIHNhdmVkUGFuZWw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFByb2plY3QuTmFtZUtleSBnZXRTYXZlZEtleSgpIHsKKyAgICByZXR1cm4gc2F2ZWRLZXk7CisgIH0KIAogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBuYW1lOwogCiAgIHB1YmxpYyBQcm9qZWN0U2NyZWVuKGZpbmFsIFByb2plY3QuTmFtZUtleSB0b1Nob3cpIHsKICAgICBuYW1lID0gdG9TaG93OwotCi0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiR2VuZXJhbCgpLCB0b1Byb2plY3RBZG1pbihuYW1lLCBJTkZPKSk7Ci0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiQnJhbmNoZXMoKSwgdG9Qcm9qZWN0QWRtaW4obmFtZSwgQlJBTkNIKSk7Ci0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiQWNjZXNzKCksIHRvUHJvamVjdEFkbWluKG5hbWUsIEFDQ0VTUykpOwogICB9CiAKLSAgcHJvdGVjdGVkIFByb2plY3QuTmFtZUtleSBnZXRQcm9qZWN0S2V5KCkgeworICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldFByb2plY3RLZXkoKSB7CiAgICAgcmV0dXJuIG5hbWU7CiAgIH0KIApAQCAtNDMsNCArNDksMTAgQEAKICAgICBzdXBlci5vbkluaXRVSSgpOwogICAgIHNldFBhZ2VUaXRsZShVdGlsLk0ucHJvamVjdChuYW1lLmdldCgpKSk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgIHN1cGVyLm9uTG9hZCgpOworICAgIHNhdmVkS2V5ID0gbmFtZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1V0aWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9VdGlsLmphdmEKaW5kZXggYWE1YjdiNi4uMTY5NmM0MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1V0aWwuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vVXRpbC5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBBZG1pblNlcnZpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFkbWluU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CkBAIC0yMywxMyArMjIsOSBAQAogcHVibGljIGNsYXNzIFV0aWwgewogICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkbWluQ29uc3RhbnRzIEMgPSBHV1QuY3JlYXRlKEFkbWluQ29uc3RhbnRzLmNsYXNzKTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZG1pbk1lc3NhZ2VzIE0gPSBHV1QuY3JlYXRlKEFkbWluTWVzc2FnZXMuY2xhc3MpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyb3VwQWRtaW5TZXJ2aWNlIEdST1VQX1NWQzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcm9qZWN0QWRtaW5TZXJ2aWNlIFBST0pFQ1RfU1ZDOwogCiAgIHN0YXRpYyB7Ci0gICAgR1JPVVBfU1ZDID0gR1dULmNyZWF0ZShHcm91cEFkbWluU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChHUk9VUF9TVkMsICJycGMvR3JvdXBBZG1pblNlcnZpY2UiKTsKLQogICAgIFBST0pFQ1RfU1ZDID0gR1dULmNyZWF0ZShQcm9qZWN0QWRtaW5TZXJ2aWNlLmNsYXNzKTsKICAgICBKc29uVXRpbC5iaW5kKFBST0pFQ1RfU1ZDLCAicnBjL1Byb2plY3RBZG1pblNlcnZpY2UiKTsKIApAQCAtNDUsNiArNDAsOCBAQAogICAgICAgICByZXR1cm4gQy5wcm9qZWN0U3VibWl0VHlwZV9GQVNUX0ZPUldBUkRfT05MWSgpOwogICAgICAgY2FzZSBNRVJHRV9JRl9ORUNFU1NBUlk6CiAgICAgICAgIHJldHVybiBDLnByb2plY3RTdWJtaXRUeXBlX01FUkdFX0lGX05FQ0VTU0FSWSgpOworICAgICAgY2FzZSBSRUJBU0VfSUZfTkVDRVNTQVJZOgorICAgICAgICByZXR1cm4gQy5wcm9qZWN0U3VibWl0VHlwZV9SRUJBU0VfSUZfTkVDRVNTQVJZKCk7CiAgICAgICBjYXNlIE1FUkdFX0FMV0FZUzoKICAgICAgICAgcmV0dXJuIEMucHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTKCk7CiAgICAgICBjYXNlIENIRVJSWV9QSUNLOgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5qYXZhCmluZGV4IGE5YjkyYzIuLjVkNzU2YTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkQ29uc3RhbnRzLmphdmEKQEAgLTE3LDE4ICsxNyw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuQ29uc3RhbnRzOwogCiBwdWJsaWMgaW50ZXJmYWNlIE9wZW5JZENvbnN0YW50cyBleHRlbmRzIENvbnN0YW50cyB7Ci0gIFN0cmluZyBidXR0b25TaWduSW4oKTsKLSAgU3RyaW5nIGJ1dHRvblJlZ2lzdGVyKCk7Ci0gIFN0cmluZyBidXR0b25MaW5rSWQoKTsKLQotICBTdHJpbmcgcmVtZW1iZXJNZSgpOwotCi0gIFN0cmluZyBub3RBbGxvd2VkKCk7Ci0gIFN0cmluZyBub1Byb3ZpZGVyKCk7Ci0gIFN0cmluZyBlcnJvcigpOwotCiAgIFN0cmluZyBuYW1lR29vZ2xlKCk7CiAgIFN0cmluZyBuYW1lWWFob28oKTsKLQotICBTdHJpbmcgd2hhdElzT3BlbklESHRtbCgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IGFmOWE2M2QuLjFhOGFjYzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkQ29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTEsMjAgKzEsMiBAQAotYnV0dG9uU2lnbkluID0gU2lnbiBJbgotYnV0dG9uUmVnaXN0ZXIgPSBSZWdpc3RlcgotYnV0dG9uTGlua0lkID0gTGluayBJZGVudGl0eQotCi1yZW1lbWJlck1lID0gUmVtZW1iZXIgTWUKLQotbm90QWxsb3dlZCA9IFByb3ZpZGVyIGlzIG5vdCBhbGxvd2VkLgotbm9Qcm92aWRlciA9IFByb3ZpZGVyIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHdhcyBpbmNvcnJlY3RseSBlbnRlcmVkLgotZXJyb3IgPSBVbmFibGUgdG8gY29ubmVjdCB3aXRoIE9wZW5JRCBwcm92aWRlci4KLQogbmFtZUdvb2dsZSA9IEdvb2dsZSBBY2NvdW50CiBuYW1lWWFob28gPSBZYWhvbyEgSUQKLQotd2hhdElzT3BlbklESHRtbCA9IFwKLSAgPGgyIGNsYXNzPSJzbWFsbEhlYWRpbmciIHN0eWxlPSJtYXJnaW4tdG9wOiAyNXB4OyI+V2hhdCBpcyBPcGVuSUQ/PC9oMj5cCi0gIDxwPk9wZW5JRCBwcm92aWRlcyBzZWN1cmUgc2luZ2xlLXNpZ24tb24sIHdpdGhvdXQgXAotICByZXZlYWxpbmcgeW91ciBwYXNzd29yZHMgdG8gdGhpcyB3ZWJzaXRlLjwvcD5cCi0gIDxwPlRoZXJlIGFyZSBtYW55IE9wZW5JRCBwcm92aWRlcnMgYXZhaWxhYmxlLiAgWW91IG1heSBhbHJlYWR5IFwKLSAgYmUgbWVtYmVyIG9mIG9uZSE8L3A+XAotICA8cD48YSBocmVmPSJodHRwOi8vb3BlbmlkLm5ldC9nZXQvIiB0YXJnZXQ9Il9ibGFuayI+R2V0IE9wZW5JRDwvYT48L3A+XApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENzcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQwY2JiLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwotCi1pbnRlcmZhY2UgT3BlbklkQ3NzIGV4dGVuZHMgQ3NzUmVzb3VyY2UgewotICBTdHJpbmcgbG9naW5Gb3JtKCk7Ci0gIFN0cmluZyBsb2dvKCk7Ci0gIFN0cmluZyBsb2dpbkxpbmUoKTsKLSAgU3RyaW5nIGlkZW50aWZpZXIoKTsKLSAgU3RyaW5nIGRpcmVjdExpbmsoKTsKLSAgU3RyaW5nIGVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRmYzVmLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9wZW5JZE1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgewotICBTdHJpbmcgc2lnbkluQXQoU3RyaW5nIGhvc3RuYW1lKTsKLSAgU3RyaW5nIHJlZ2lzdGVyQXQoU3RyaW5nIGhvc3RuYW1lKTsKLSAgU3RyaW5nIGxpbmtBdChTdHJpbmcgaG9zdG5hbWUpOwotCi0gIFN0cmluZyBzaWduSW5XaXRoKFN0cmluZyB3aG8pOwotICBTdHJpbmcgcmVnaXN0ZXJXaXRoKFN0cmluZyB3aG8pOwotICBTdHJpbmcgbGlua1dpdGgoU3RyaW5nIHdobyk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkTWVzc2FnZXMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg2NmNjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zaWduSW5BdCA9IFNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotcmVnaXN0ZXJBdCA9IFJlZ2lzdGVyIHdpdGggR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotbGlua0F0ID0gTGluayBBbm90aGVyIElkZW50aXR5IHRvIEdlcnJpdCBDb2RlIFJldmlldyBhdCB7MH0KLQotc2lnbkluV2l0aCA9IFNpZ24gaW4gd2l0aCBhIHswfQotcmVnaXN0ZXJXaXRoID0gUmVnaXN0ZXIgd2l0aCBhIHswfQotbGlua1dpdGggPSBMaW5rIGEgezB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkUmVzb3VyY2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmVkMGIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNsaWVudEJ1bmRsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkRhdGFSZXNvdXJjZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkltYWdlUmVzb3VyY2U7Ci0KLWludGVyZmFjZSBPcGVuSWRSZXNvdXJjZXMgZXh0ZW5kcyBDbGllbnRCdW5kbGUgewotICBzdGF0aWMgZmluYWwgT3BlbklkUmVzb3VyY2VzIEkgPSBHV1QuY3JlYXRlKE9wZW5JZFJlc291cmNlcy5jbGFzcyk7Ci0KLSAgQFNvdXJjZSgib3BlbmlkLmNzcyIpCi0gIE9wZW5JZENzcyBjc3MoKTsKLQotICBAU291cmNlKCJpZGVudGlmaWVyQmFja2dyb3VuZC5naWYiKQotICBEYXRhUmVzb3VyY2UgaWRlbnRpZmllckJhY2tncm91bmQoKTsKLQotICBAU291cmNlKCJvcGVuaWRMb2dvLnBuZyIpCi0gIEltYWdlUmVzb3VyY2Ugb3BlbmlkTG9nbygpOwotCi0gIEBTb3VyY2UoImljb25Hb29nbGUuZ2lmIikKLSAgSW1hZ2VSZXNvdXJjZSBpY29uR29vZ2xlKCk7Ci0KLSAgQFNvdXJjZSgiaWNvbllhaG9vLmdpZiIpCi0gIEltYWdlUmVzb3VyY2UgaWNvbllhaG9vKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkU2lnbkluRGlhbG9nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkU2lnbkluRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmM0OTMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNpZ25JbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5TaWduSW5EaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU21hbGxIZWFkaW5nOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLkRpc2NvdmVyeVJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkUHJvdmlkZXJQYXR0ZXJuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRVcmxzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXIuU2NoZWR1bGVkQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkZvcm1FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuQ29va2llczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZvcm1QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb3JtUGFuZWwuU3VibWl0RXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRm9ybVN1Ym1pdENvbXBsZXRlRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IaWRkZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEJveDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSWRTaWduSW5EaWFsb2cgZXh0ZW5kcyBTaWduSW5EaWFsb2cgaW1wbGVtZW50cwotICAgIEZvcm1QYW5lbC5TdWJtaXRIYW5kbGVyIHsKLSAgc3RhdGljIHsKLSAgICBPcGVuSWRSZXNvdXJjZXMuSS5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBGbG93UGFuZWwgcGFuZWxXaWRnZXQ7Ci0gIHByaXZhdGUgZmluYWwgRm9ybVBhbmVsIGZvcm07Ci0gIHByaXZhdGUgZmluYWwgRmxvd1BhbmVsIGZvcm1Cb2R5OwotICBwcml2YXRlIGZpbmFsIEZvcm1QYW5lbCByZWRpcmVjdEZvcm07Ci0gIHByaXZhdGUgZmluYWwgRmxvd1BhbmVsIHJlZGlyZWN0Qm9keTsKLQotICBwcml2YXRlIEZsb3dQYW5lbCBlcnJvckxpbmU7Ci0gIHByaXZhdGUgSW5saW5lTGFiZWwgZXJyb3JNc2c7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gbG9naW47Ci0gIHByaXZhdGUgTnBUZXh0Qm94IHByb3ZpZGVySWQ7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggcmVtZW1iZXJJZDsKLSAgcHJpdmF0ZSBib29sZWFuIGRpc2NvdmVyaW5nOwotCi0gIHB1YmxpYyBPcGVuSWRTaWduSW5EaWFsb2coZmluYWwgU2lnbkluTW9kZSByZXF1ZXN0ZWRNb2RlLCBmaW5hbCBTdHJpbmcgdG9rZW4sCi0gICAgICBmaW5hbCBTdHJpbmcgaW5pdGlhbEVycm9yTXNnKSB7Ci0gICAgc3VwZXIocmVxdWVzdGVkTW9kZSwgdG9rZW4pOwotCi0gICAgZm9ybUJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZm9ybUJvZHkuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ2luRm9ybSgpKTsKLQotICAgIGZvcm0gPSBuZXcgRm9ybVBhbmVsKCk7Ci0gICAgZm9ybS5zZXRNZXRob2QoRm9ybVBhbmVsLk1FVEhPRF9HRVQpOwotICAgIGZvcm0uYWRkU3VibWl0SGFuZGxlcih0aGlzKTsKLSAgICBmb3JtLmFkZChmb3JtQm9keSk7Ci0KLSAgICByZWRpcmVjdEJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgcmVkaXJlY3RCb2R5LnNldFZpc2libGUoZmFsc2UpOwotICAgIHJlZGlyZWN0Rm9ybSA9IG5ldyBGb3JtUGFuZWwoKTsKLSAgICByZWRpcmVjdEZvcm0uYWRkKHJlZGlyZWN0Qm9keSk7Ci0KLSAgICBwYW5lbFdpZGdldCA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBwYW5lbFdpZGdldC5hZGQoZm9ybSk7Ci0gICAgcGFuZWxXaWRnZXQuYWRkKHJlZGlyZWN0Rm9ybSk7Ci0gICAgYWRkKHBhbmVsV2lkZ2V0KTsKLQotICAgIGNyZWF0ZUhlYWRlckxvZ28oKTsKLSAgICBjcmVhdGVIZWFkZXJUZXh0KCk7Ci0gICAgY3JlYXRlRXJyb3JCb3goKTsKLSAgICBjcmVhdGVJZGVudEJveCgpOwotCi0gICAgbGluayhPcGVuSWRVcmxzLlVSTF9HT09HTEUsIE9wZW5JZFV0aWwuQy5uYW1lR29vZ2xlKCksIE9wZW5JZFJlc291cmNlcy5JCi0gICAgICAgIC5pY29uR29vZ2xlKCkpOwotICAgIGxpbmsoT3BlbklkVXJscy5VUkxfWUFIT08sIE9wZW5JZFV0aWwuQy5uYW1lWWFob28oKSwgT3BlbklkUmVzb3VyY2VzLkkKLSAgICAgICAgLmljb25ZYWhvbygpKTsKLQotICAgIGlmIChpbml0aWFsRXJyb3JNc2cgIT0gbnVsbCkgewotICAgICAgc2hvd0Vycm9yKGluaXRpYWxFcnJvck1zZyk7Ci0gICAgfQotICAgIGZvcm1Cb2R5LmFkZChuZXcgSFRNTChPcGVuSWRVdGlsLkMud2hhdElzT3BlbklESHRtbCgpKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgcHJvdmlkZXJJZC5zZWxlY3RBbGwoKTsKLSAgICBTY2hlZHVsZXIuZ2V0KCkuc2NoZWR1bGVEZWZlcnJlZChuZXcgU2NoZWR1bGVkQ29tbWFuZCgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgcHJvdmlkZXJJZC5zZXRGb2N1cyh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVIZWFkZXJMb2dvKCkgewotICAgIGZpbmFsIEZsb3dQYW5lbCBoZWFkZXJMb2dvID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGhlYWRlckxvZ28uc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ28oKSk7Ci0gICAgaGVhZGVyTG9nby5hZGQobmV3IEltYWdlKE9wZW5JZFJlc291cmNlcy5JLm9wZW5pZExvZ28oKSkpOwotICAgIGZvcm1Cb2R5LmFkZChoZWFkZXJMb2dvKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVIZWFkZXJUZXh0KCkgewotICAgIGZpbmFsIEZsb3dQYW5lbCBoZWFkZXJUZXh0ID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGZpbmFsIFN0cmluZyBtZSA9IFdpbmRvdy5Mb2NhdGlvbi5nZXRIb3N0TmFtZSgpOwotICAgIGZpbmFsIFNtYWxsSGVhZGluZyBoZWFkZXJMYWJlbCA9IG5ldyBTbWFsbEhlYWRpbmcoKTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICBoZWFkZXJMYWJlbC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5saW5rQXQobWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFR0lTVEVSOgotICAgICAgICBoZWFkZXJMYWJlbC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5yZWdpc3RlckF0KG1lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTSUdOX0lOOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaGVhZGVyTGFiZWwuc2V0VGV4dChPcGVuSWRVdGlsLk0uc2lnbkluQXQobWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGhlYWRlclRleHQuYWRkKGhlYWRlckxhYmVsKTsKLSAgICBmb3JtQm9keS5hZGQoaGVhZGVyVGV4dCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JCb3goKSB7Ci0gICAgZXJyb3JMaW5lID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKLSAgICBlcnJvckxpbmUuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmVycm9yKCkpOwotCi0gICAgZXJyb3JNc2cgPSBuZXcgSW5saW5lTGFiZWwoKTsKLSAgICBlcnJvckxpbmUuYWRkKGVycm9yTXNnKTsKLSAgICBmb3JtQm9keS5hZGQoZXJyb3JMaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIG1zZ1RleHQpIHsKLSAgICBlcnJvck1zZy5zZXRUZXh0KG1zZ1RleHQpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICIiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKSB7Ci0gICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKGVycm9yTGluZS5nZXRFbGVtZW50KCksICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkZW50Qm94KCkgewotICAgIGJvb2xlYW4gcmVtZW1iZXIgPSBtb2RlID09IFNpZ25Jbk1vZGUuU0lHTl9JTiB8fCBtb2RlID09IFNpZ25Jbk1vZGUuUkVHSVNURVI7Ci0KLSAgICBmaW5hbCBGbG93UGFuZWwgZ3JvdXAgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZ3JvdXAuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ2luTGluZSgpKTsKLQotICAgIGZpbmFsIEZsb3dQYW5lbCBsaW5lMSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBncm91cC5hZGQobGluZTEpOwotCi0gICAgcHJvdmlkZXJJZCA9IG5ldyBOcFRleHRCb3goKTsKLSAgICBwcm92aWRlcklkLnNldFZpc2libGVMZW5ndGgoNjApOwotICAgIHByb3ZpZGVySWQuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmlkZW50aWZpZXIoKSk7Ci0gICAgcHJvdmlkZXJJZC5zZXRUYWJJbmRleCgwKTsKLSAgICBwcm92aWRlcklkLmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldE5hdGl2ZUV2ZW50KCkuZ2V0S2V5Q29kZSgpID09IEtleUNvZGVzLktFWV9FTlRFUikgewotICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGxpbmUxLmFkZChwcm92aWRlcklkKTsKLQotICAgIGxvZ2luID0gbmV3IEJ1dHRvbigpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgY2FzZSBMSU5LX0lERU5USVk6Ci0gICAgICAgIGxvZ2luLnNldFRleHQoT3BlbklkVXRpbC5DLmJ1dHRvbkxpbmtJZCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFR0lTVEVSOgotICAgICAgICBsb2dpbi5zZXRUZXh0KE9wZW5JZFV0aWwuQy5idXR0b25SZWdpc3RlcigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJR05fSU46Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBsb2dpbi5zZXRUZXh0KE9wZW5JZFV0aWwuQy5idXR0b25TaWduSW4oKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBsb2dpbi5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgbG9naW4uc2V0VGFiSW5kZXgocmVtZW1iZXIgPyAyIDogMSk7Ci0gICAgbGluZTEuYWRkKGxvZ2luKTsKLQotICAgIEJ1dHRvbiBjbG9zZSA9IG5ldyBCdXR0b24oR2Vycml0LkMuc2lnbkluRGlhbG9nQ2xvc2UoKSk7Ci0gICAgY2xvc2UuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBoaWRlKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgY2xvc2Uuc2V0VGFiSW5kZXgocmVtZW1iZXIgPyAzIDogMik7Ci0gICAgbGluZTEuYWRkKGNsb3NlKTsKLQotICAgIGlmIChyZW1lbWJlcikgewotICAgICAgcmVtZW1iZXJJZCA9IG5ldyBDaGVja0JveChPcGVuSWRVdGlsLkMucmVtZW1iZXJNZSgpKTsKLSAgICAgIHJlbWVtYmVySWQuc2V0VGFiSW5kZXgoMSk7Ci0gICAgICBncm91cC5hZGQocmVtZW1iZXJJZCk7Ci0KLSAgICAgIFN0cmluZyBsYXN0ID0gQ29va2llcy5nZXRDb29raWUoT3BlbklkVXJscy5MQVNUSURfQ09PS0lFKTsKLSAgICAgIGlmIChsYXN0ICE9IG51bGwgJiYgISIiLmVxdWFscyhsYXN0KSkgewotICAgICAgICBpZiAobGFzdC5zdGFydHNXaXRoKCJcIiIpICYmIGxhc3QuZW5kc1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAvLyBEZXF1b3RlIHRoZSB2YWx1ZS4gV2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8gdGhpcywgYnV0Ci0gICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGNhdXNpbmcgc29tZSBHb29nbGUgQWNjb3VudCB0b2tlbnMgdG8gZ2V0Ci0gICAgICAgICAgLy8gd3JhcHBlZCB1cCBpbiBkb3VibGUgcXVvdGVzIHdoZW4gb2J0YWluZWQgZnJvbSB0aGUgY29va2llLgotICAgICAgICAgIC8vCi0gICAgICAgICAgbGFzdCA9IGxhc3Quc3Vic3RyaW5nKDEsIGxhc3QubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgfQotICAgICAgICBwcm92aWRlcklkLnNldFRleHQobGFzdCk7Ci0gICAgICAgIHJlbWVtYmVySWQuc2V0VmFsdWUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9ybUJvZHkuYWRkKGdyb3VwKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsaW5rKGZpbmFsIFN0cmluZyBpZGVudFVybCwgZmluYWwgU3RyaW5nIHdobywKLSAgICAgIGZpbmFsIEltYWdlUmVzb3VyY2UgaWNvbikgewotICAgIGlmICghaXNBbGxvd2VkUHJvdmlkZXIoaWRlbnRVcmwpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluYWwgQ2xpY2tIYW5kbGVyIGkgPSBuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgaWYgKCFkaXNjb3ZlcmluZykgewotICAgICAgICAgIHByb3ZpZGVySWQuc2V0VGV4dChpZGVudFVybCk7Ci0gICAgICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0KLSAgICBmaW5hbCBGbG93UGFuZWwgbGluZSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBsaW5lLmFkZFN0eWxlTmFtZShPcGVuSWRSZXNvdXJjZXMuSS5jc3MoKS5kaXJlY3RMaW5rKCkpOwotCi0gICAgZmluYWwgSW1hZ2UgaW1nID0gbmV3IEltYWdlKGljb24pOwotICAgIGltZy5hZGRDbGlja0hhbmRsZXIoaSk7Ci0gICAgbGluZS5hZGQoaW1nKTsKLQotICAgIGZpbmFsIEFuY2hvciB0ZXh0ID0gbmV3IEFuY2hvcigpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgY2FzZSBMSU5LX0lERU5USVk6Ci0gICAgICAgIHRleHQuc2V0VGV4dChPcGVuSWRVdGlsLk0ubGlua1dpdGgod2hvKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSRUdJU1RFUjoKLSAgICAgICAgdGV4dC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5yZWdpc3RlcldpdGgod2hvKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTSUdOX0lOOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGV4dC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5zaWduSW5XaXRoKHdobykpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgdGV4dC5zZXRIcmVmKGlkZW50VXJsKTsKLSAgICB0ZXh0LmFkZENsaWNrSGFuZGxlcihpKTsKLSAgICBsaW5lLmFkZCh0ZXh0KTsKLQotICAgIGZvcm1Cb2R5LmFkZChsaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkUHJvdmlkZXIoZmluYWwgU3RyaW5nIGlkZW50VXJsKSB7Ci0gICAgZm9yIChPcGVuSWRQcm92aWRlclBhdHRlcm4gcCA6IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBbGxvd2VkT3BlbklEcygpKSB7Ci0gICAgICBpZiAocC5tYXRjaGVzKGlkZW50VXJsKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZShmaW5hbCBib29sZWFuIG9uKSB7Ci0gICAgcHJvdmlkZXJJZC5zZXRFbmFibGVkKG9uKTsKLSAgICBsb2dpbi5zZXRFbmFibGVkKG9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBvbkRpc2NvdmVyeShmaW5hbCBEaXNjb3ZlcnlSZXN1bHQgcmVzdWx0KSB7Ci0gICAgZGlzY292ZXJpbmcgPSBmYWxzZTsKLQotICAgIHN3aXRjaCAocmVzdWx0LnN0YXR1cykgewotICAgICAgY2FzZSBWQUxJRDoKLSAgICAgICAgLy8gVGhlIHByb3ZpZGVyIHdvbid0IHN1cHBvcnQgb3BlcmF0aW9uIGluc2lkZSBhbiBJRlJBTUUsCi0gICAgICAgIC8vIHNvIHdlIHJlcGxhY2Ugb3VyIGVudGlyZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgLy8KLSAgICAgICAgcmVkaXJlY3RGb3JtLnNldE1ldGhvZChGb3JtUGFuZWwuTUVUSE9EX1BPU1QpOwotICAgICAgICByZWRpcmVjdEZvcm0uc2V0QWN0aW9uKHJlc3VsdC5wcm92aWRlclVybCk7Ci0gICAgICAgIHJlZGlyZWN0Qm9keS5jbGVhcigpOwotICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHJlc3VsdC5wcm92aWRlckFyZ3MuZW50cnlTZXQoKSkgewotICAgICAgICAgIHJlZGlyZWN0Qm9keS5hZGQobmV3IEhpZGRlbihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBGb3JtRWxlbWVudC5hcyhyZWRpcmVjdEZvcm0uZ2V0RWxlbWVudCgpKS5zZXRUYXJnZXQoIl90b3AiKTsKLSAgICAgICAgcmVkaXJlY3RGb3JtLnN1Ym1pdCgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT1RfQUxMT1dFRDoKLSAgICAgICAgc2hvd0Vycm9yKE9wZW5JZFV0aWwuQy5ub3RBbGxvd2VkKCkpOwotICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT19QUk9WSURFUjoKLSAgICAgICAgc2hvd0Vycm9yKE9wZW5JZFV0aWwuQy5ub1Byb3ZpZGVyKCkpOwotICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBFUlJPUjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNob3dFcnJvcihPcGVuSWRVdGlsLkMuZXJyb3IoKSk7Ci0gICAgICAgIGVuYWJsZVJldHJ5RGlzY292ZXJ5KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVSZXRyeURpc2NvdmVyeSgpIHsKLSAgICBlbmFibGUodHJ1ZSk7Ci0gICAgcHJvdmlkZXJJZC5zZWxlY3RBbGwoKTsKLSAgICBwcm92aWRlcklkLnNldEZvY3VzKHRydWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uU3VibWl0KGZpbmFsIFN1Ym1pdEV2ZW50IGV2ZW50KSB7Ci0gICAgZXZlbnQuY2FuY2VsKCk7Ci0KLSAgICBTdHJpbmcgb3BlbmlkSWRlbnRpZmllciA9IHByb3ZpZGVySWQuZ2V0VGV4dCgpOwotICAgIGlmIChvcGVuaWRJZGVudGlmaWVyID09IG51bGwgfHwgb3BlbmlkSWRlbnRpZmllci5lcXVhbHMoIiIpKSB7Ci0gICAgICBlbmFibGUodHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFvcGVuaWRJZGVudGlmaWVyLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKQotICAgICAgICAmJiAhb3BlbmlkSWRlbnRpZmllci5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7Ci0gICAgICBvcGVuaWRJZGVudGlmaWVyID0gImh0dHA6Ly8iICsgb3BlbmlkSWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzQWxsb3dlZFByb3ZpZGVyKG9wZW5pZElkZW50aWZpZXIpKSB7Ci0gICAgICBzaG93RXJyb3IoT3BlbklkVXRpbC5DLm5vdEFsbG93ZWQoKSk7Ci0gICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRpc2NvdmVyaW5nID0gdHJ1ZTsKLSAgICBlbmFibGUoZmFsc2UpOwotICAgIGhpZGVFcnJvcigpOwotCi0gICAgZmluYWwgYm9vbGVhbiByZW1lbWJlciA9IHJlbWVtYmVySWQgIT0gbnVsbCAmJiByZW1lbWJlcklkLmdldFZhbHVlKCk7Ci0gICAgT3BlbklkVXRpbC5TVkMuZGlzY292ZXIob3BlbmlkSWRlbnRpZmllciwgbW9kZSwgcmVtZW1iZXIsIHRva2VuLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8RGlzY292ZXJ5UmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgRGlzY292ZXJ5UmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgb25EaXNjb3ZlcnkocmVzdWx0KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7Ci0gICAgICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvblN1Ym1pdENvbXBsZXRlKGZpbmFsIEZvcm1TdWJtaXRDb21wbGV0ZUV2ZW50IGV2ZW50KSB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRTc29QYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNzb1BhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGQ3OTQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNzb1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgub3BlbmlkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLkRpc2NvdmVyeVJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkZvcm1FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb3JtUGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSGlkZGVuOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIE9wZW5JZFNzb1BhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKLSAgcHJpdmF0ZSBmaW5hbCBGb3JtUGFuZWwgcmVkaXJlY3RGb3JtOwotICBwcml2YXRlIGZpbmFsIEZsb3dQYW5lbCByZWRpcmVjdEJvZHk7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHNzb1VybDsKLQotICBwdWJsaWMgT3BlbklkU3NvUGFuZWwoKSB7Ci0gICAgc3VwZXIoKTsKLSAgICByZWRpcmVjdEJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgcmVkaXJlY3RCb2R5LnNldFZpc2libGUoZmFsc2UpOwotICAgIHJlZGlyZWN0Rm9ybSA9IG5ldyBGb3JtUGFuZWwoKTsKLSAgICByZWRpcmVjdEZvcm0uYWRkKHJlZGlyZWN0Qm9keSk7Ci0KLSAgICBhZGQocmVkaXJlY3RGb3JtKTsKLQotICAgIHNzb1VybCA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRPcGVuSWRTc29VcmwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGF1dGhlbnRpY2F0ZShTaWduSW5Nb2RlIHJlcXVlc3RlZE1vZGUsIGZpbmFsIFN0cmluZyB0b2tlbikgewotICAgIE9wZW5JZFV0aWwuU1ZDLmRpc2NvdmVyKHNzb1VybCwgcmVxdWVzdGVkTW9kZSwgLyogcmVtZW1iZXIgKi8gZmFsc2UsIHRva2VuLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8RGlzY292ZXJ5UmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgRGlzY292ZXJ5UmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgb25EaXNjb3ZlcnkocmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uRGlzY292ZXJ5KGZpbmFsIERpc2NvdmVyeVJlc3VsdCByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdC5zdGF0dXMpIHsKLSAgICAgIGNhc2UgVkFMSUQ6Ci0gICAgICAgIHJlZGlyZWN0Rm9ybS5zZXRNZXRob2QoRm9ybVBhbmVsLk1FVEhPRF9QT1NUKTsKLSAgICAgICAgcmVkaXJlY3RGb3JtLnNldEFjdGlvbihyZXN1bHQucHJvdmlkZXJVcmwpOwotICAgICAgICByZWRpcmVjdEJvZHkuY2xlYXIoKTsKLSAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiByZXN1bHQucHJvdmlkZXJBcmdzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICByZWRpcmVjdEJvZHkuYWRkKG5ldyBIaWRkZW4oZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRm9ybUVsZW1lbnQuYXMocmVkaXJlY3RGb3JtLmdldEVsZW1lbnQoKSkuc2V0VGFyZ2V0KCJfdG9wIik7Ci0gICAgICAgIHJlZGlyZWN0Rm9ybS5zdWJtaXQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFV0aWwuamF2YQppbmRleCAxNWFlYjM0Li5kNWI3Njg0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRVdGlsLmphdmEKQEAgLTE0LDE5ICsxNCwxMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRTZXJ2aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50Lkpzb25VdGlsOwogCiBwdWJsaWMgY2xhc3MgT3BlbklkVXRpbCB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3BlbklkQ29uc3RhbnRzIEM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgT3BlbklkTWVzc2FnZXMgTTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBPcGVuSWRTZXJ2aWNlIFNWQzsKIAogICBzdGF0aWMgewogICAgIEMgPSBHV1QuY3JlYXRlKE9wZW5JZENvbnN0YW50cy5jbGFzcyk7Ci0gICAgTSA9IEdXVC5jcmVhdGUoT3BlbklkTWVzc2FnZXMuY2xhc3MpOwotICAgIFNWQyA9IEdXVC5jcmVhdGUoT3BlbklkU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChTVkMsICJycGMvT3BlbklkU2VydmljZSIpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbkdvb2dsZS5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbkdvb2dsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGZkMjAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL2ljb25Hb29nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL2ljb25ZYWhvby5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbllhaG9vLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyMDQ1NS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbllhaG9vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9pZGVudGlmaWVyQmFja2dyb3VuZC5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWRlbnRpZmllckJhY2tncm91bmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4MzZjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9pZGVudGlmaWVyQmFja2dyb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvb3BlbmlkLmNzcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ3NWVlLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLUBleHRlcm5hbCAuZ3d0LUJ1dHRvbjsKLQotQHVybCBpZGVudGlmaWVyQmFja2dyb3VuZCBpZGVudGlmaWVyQmFja2dyb3VuZDsKLQotLmxvZ2luRm9ybSB7Ci0gIG1hcmdpbi1sZWZ0OiAxMHB4OwotICBtYXJnaW4tcmlnaHQ6IDEwcHg7Ci19Ci0KLS5sb2dvIHsKLSAgdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5sb2dpbkxpbmUgewotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotfQotLmxvZ2luTGluZSBkaXYgewotICB3aGl0ZS1zcGFjZTogbm93cmFwOwotfQotLmxvZ2luTGluZSAuZ3d0LUJ1dHRvbiB7Ci0gIG1hcmdpbi1sZWZ0OiAycHg7Ci19Ci0KLS5pZGVudGlmaWVyIHsKLSAgYmFja2dyb3VuZDogI2ZmZmZmZiBpZGVudGlmaWVyQmFja2dyb3VuZCBuby1yZXBlYXQgc2Nyb2xsIDVweCA1MCU7Ci0gIHBhZGRpbmctbGVmdDogMjVweDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKLX0KLQotLmRpcmVjdExpbmsgewotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotICBtYXJnaW4tcmlnaHQ6IDVweDsKLSAgY29sb3I6IGJsdWU7Ci0gIGN1cnNvcjogcG9pbnRlcjsKLX0KLS5kaXJlY3RMaW5rOmhvdmVyIHsKLSAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0uZGlyZWN0TGluayBpbWcgewotICBtYXJnaW4tcmlnaHQ6IDNweDsKLSAgYm9yZGVyOiAwIG5vbmU7Ci19Ci0KLS5lcnJvciB7Ci0gIHBhZGRpbmctdG9wOiA1cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA1cHg7Ci19Ci0uZXJyb3Igc3BhbiB7Ci0gIHBhZGRpbmctdG9wOiA0cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA0cHg7Ci0gIHBhZGRpbmctbGVmdDogMTBweDsKLSAgcGFkZGluZy1yaWdodDogMTBweDsKLSAgYmFja2dyb3VuZDogI2ZmZjFhODsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWRMb2dvLnBuZyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWRMb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ZmE3My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvb3BlbmlkTG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNjM2OS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuQ29uc3RhbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJQYXNzQ29uc3RhbnRzIGV4dGVuZHMgQ29uc3RhbnRzIHsKLSAgU3RyaW5nIGJ1dHRvblNpZ25JbigpOwotICBTdHJpbmcgdXNlcm5hbWUoKTsKLSAgU3RyaW5nIHBhc3N3b3JkKCk7Ci0gIFN0cmluZyBpbnZhbGlkTG9naW4oKTsKLSAgU3RyaW5nIHVzZXJuYW1lUmVxdWlyZWQoKTsKLSAgU3RyaW5nIHBhc3N3b3JkUmVxdWlyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTIwNGY3Yi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1idXR0b25TaWduSW4gPSBTaWduIEluCi11c2VybmFtZSA9IFVzZXJuYW1lCi1wYXNzd29yZCA9IFBhc3N3b3JkCi1pbnZhbGlkTG9naW4gPSBJbmNvcnJlY3QgdXNlcm5hbWUgb3IgcGFzc3dvcmQuCi11c2VybmFtZVJlcXVpcmVkID0gUGxlYXNlIGVudGVyIGEgdXNlcm5hbWUuCi1wYXNzd29yZFJlcXVpcmVkID0gUGxlYXNlIGVudGVyIGEgcGFzc3dvcmQuCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0Nzcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5N2NjYTEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnJlc291cmNlcy5jbGllbnQuQ3NzUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVXNlclBhc3NDc3MgZXh0ZW5kcyBDc3NSZXNvdXJjZSB7Ci0gIFN0cmluZyBsb2dpbkZvcm0oKTsKLSAgU3RyaW5nIGVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZGQxZWMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJQYXNzTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7Ci0gIFN0cmluZyBzaWduSW5BdChTdHJpbmcgaG9zdG5hbWUpOwotICBTdHJpbmcgYXV0aGVudGljYXRpb25VbmF2YWlsYWJsZShBdXRoVHlwZSBhdXRoVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWFiMzUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1zaWduSW5BdCA9IFNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotYXV0aGVudGljYXRpb25VbmF2YWlsYWJsZSA9IHswfSBhdXRoZW50aWNhdGlvbiB1bmF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NSZXNvdXJjZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDc0Y2QuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNsaWVudEJ1bmRsZTsKLQotaW50ZXJmYWNlIFVzZXJQYXNzUmVzb3VyY2VzIGV4dGVuZHMgQ2xpZW50QnVuZGxlIHsKLSAgc3RhdGljIGZpbmFsIFVzZXJQYXNzUmVzb3VyY2VzIEkgPSBHV1QuY3JlYXRlKFVzZXJQYXNzUmVzb3VyY2VzLmNsYXNzKTsKLQotICBAU291cmNlKCJ1c2VycGFzcy5jc3MiKQotICBVc2VyUGFzc0NzcyBjc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzU2lnbkluRGlhbG9nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc1NpZ25JbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYzNjQwLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzU2lnbkluRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuU2lnbkluRGlhbG9nOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3MuTG9naW5SZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93LkxvY2F0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkJ1dHRvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYXNzd29yZFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVGV4dEJveDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci0KLXB1YmxpYyBjbGFzcyBVc2VyUGFzc1NpZ25JbkRpYWxvZyBleHRlbmRzIFNpZ25JbkRpYWxvZyB7Ci0gIHN0YXRpYyB7Ci0gICAgVXNlclBhc3NSZXNvdXJjZXMuSS5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBGbG93UGFuZWwgZm9ybUJvZHk7Ci0KLSAgcHJpdmF0ZSBGbG93UGFuZWwgZXJyb3JMaW5lOwotICBwcml2YXRlIElubGluZUxhYmVsIGVycm9yTXNnOwotCi0gIHByaXZhdGUgQnV0dG9uIGxvZ2luOwotICBwcml2YXRlIEJ1dHRvbiBjbG9zZTsKLSAgcHJpdmF0ZSBUZXh0Qm94IHVzZXJuYW1lOwotICBwcml2YXRlIFRleHRCb3ggcGFzc3dvcmQ7Ci0KLSAgcHVibGljIFVzZXJQYXNzU2lnbkluRGlhbG9nKGZpbmFsIFN0cmluZyB0b2tlbiwgZmluYWwgU3RyaW5nIGluaXRpYWxFcnJvck1zZykgewotICAgIHN1cGVyKFNpZ25Jbk1vZGUuU0lHTl9JTiwgdG9rZW4pOwotICAgIHNldEF1dG9IaWRlRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBmb3JtQm9keSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBmb3JtQm9keS5zZXRTdHlsZU5hbWUoVXNlclBhc3NSZXNvdXJjZXMuSS5jc3MoKS5sb2dpbkZvcm0oKSk7Ci0gICAgYWRkKGZvcm1Cb2R5KTsKLQotICAgIGNyZWF0ZUhlYWRlclRleHQoKTsKLSAgICBjcmVhdGVFcnJvckJveCgpOwotICAgIGNyZWF0ZVVzZXJuYW1lQm94KCk7Ci0gICAgaWYgKGluaXRpYWxFcnJvck1zZyAhPSBudWxsKSB7Ci0gICAgICBzaG93RXJyb3IoaW5pdGlhbEVycm9yTXNnKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIHVzZXJuYW1lLnNldEZvY3VzKHRydWUpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlYWRlclRleHQoKSB7Ci0gICAgZmluYWwgRmxvd1BhbmVsIGhlYWRlclRleHQgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZmluYWwgU21hbGxIZWFkaW5nIGhlYWRlckxhYmVsID0gbmV3IFNtYWxsSGVhZGluZygpOwotICAgIGhlYWRlckxhYmVsLnNldFRleHQoVXRpbC5NLnNpZ25JbkF0KExvY2F0aW9uLmdldEhvc3ROYW1lKCkpKTsKLSAgICBoZWFkZXJUZXh0LmFkZChoZWFkZXJMYWJlbCk7Ci0gICAgZm9ybUJvZHkuYWRkKGhlYWRlclRleHQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yQm94KCkgewotICAgIGVycm9yTGluZSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBET00uc2V0U3R5bGVBdHRyaWJ1dGUoZXJyb3JMaW5lLmdldEVsZW1lbnQoKSwgInZpc2liaWxpdHkiLCAiaGlkZGVuIik7Ci0gICAgZXJyb3JMaW5lLnNldFN0eWxlTmFtZShVc2VyUGFzc1Jlc291cmNlcy5JLmNzcygpLmVycm9yKCkpOwotCi0gICAgZXJyb3JNc2cgPSBuZXcgSW5saW5lTGFiZWwoKTsKLSAgICBlcnJvckxpbmUuYWRkKGVycm9yTXNnKTsKLSAgICBmb3JtQm9keS5hZGQoZXJyb3JMaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIG1zZ1RleHQpIHsKLSAgICBlcnJvck1zZy5zZXRUZXh0KG1zZ1RleHQpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICIiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKSB7Ci0gICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKGVycm9yTGluZS5nZXRFbGVtZW50KCksICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVzZXJuYW1lQm94KCkgewotICAgIHVzZXJuYW1lID0gbmV3IE5wVGV4dEJveCgpOwotICAgIHVzZXJuYW1lLnNldFZpc2libGVMZW5ndGgoMjUpOwotICAgIHVzZXJuYW1lLmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldE5hdGl2ZUV2ZW50KCkuZ2V0S2V5Q29kZSgpID09IEtleUNvZGVzLktFWV9FTlRFUikgewotICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2V0Rm9jdXModHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHBhc3N3b3JkID0gbmV3IFBhc3N3b3JkVGV4dEJveCgpOwotICAgIHBhc3N3b3JkLnNldFZpc2libGVMZW5ndGgoMjUpOwotICAgIHBhc3N3b3JkLmFkZEtleVByZXNzSGFuZGxlcihHbG9iYWxLZXkuU1RPUF9QUk9QQUdBVElPTik7Ci0gICAgcGFzc3dvcmQuYWRkS2V5UHJlc3NIYW5kbGVyKG5ldyBLZXlQcmVzc0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uS2V5UHJlc3MoZmluYWwgS2V5UHJlc3NFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0TmF0aXZlRXZlbnQoKS5nZXRLZXlDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7Ci0gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICBvbkxvZ2luKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGZpbmFsIEZsb3dQYW5lbCBidXR0b25zID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGJ1dHRvbnMuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZXJyb3JEaWFsb2dCdXR0b25zKCkpOwotCi0gICAgbG9naW4gPSBuZXcgQnV0dG9uKCk7Ci0gICAgbG9naW4uc2V0VGV4dChVdGlsLkMuYnV0dG9uU2lnbkluKCkpOwotICAgIGxvZ2luLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgb25Mb2dpbigpOwotICAgICAgfQotICAgIH0pOwotICAgIGJ1dHRvbnMuYWRkKGxvZ2luKTsKLQotICAgIGNsb3NlID0gbmV3IEJ1dHRvbigpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShjbG9zZS5nZXRFbGVtZW50KCksICJtYXJnaW5MZWZ0IiwgIjQ1cHgiKTsKLSAgICBjbG9zZS5zZXRUZXh0KEdlcnJpdC5DLnNpZ25JbkRpYWxvZ0Nsb3NlKCkpOwotICAgIGNsb3NlLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGlkZSgpOwotICAgICAgfQotICAgIH0pOwotICAgIGJ1dHRvbnMuYWRkKGNsb3NlKTsKLQotICAgIGZpbmFsIEdyaWQgZm9ybUdyaWQgPSBuZXcgR3JpZCgzLCAyKTsKLSAgICBmb3JtR3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy51c2VybmFtZSgpKTsKLSAgICBmb3JtR3JpZC5zZXRUZXh0KDEsIDAsIFV0aWwuQy5wYXNzd29yZCgpKTsKLSAgICBmb3JtR3JpZC5zZXRXaWRnZXQoMCwgMSwgdXNlcm5hbWUpOwotICAgIGZvcm1HcmlkLnNldFdpZGdldCgxLCAxLCBwYXNzd29yZCk7Ci0gICAgZm9ybUdyaWQuc2V0V2lkZ2V0KDIsIDEsIGJ1dHRvbnMpOwotICAgIGZvcm1Cb2R5LmFkZChmb3JtR3JpZCk7Ci0KLSAgICB1c2VybmFtZS5zZXRUYWJJbmRleCgxKTsKLSAgICBwYXNzd29yZC5zZXRUYWJJbmRleCgyKTsKLSAgICBsb2dpbi5zZXRUYWJJbmRleCgzKTsKLSAgICBjbG9zZS5zZXRUYWJJbmRleCg0KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGUoZmluYWwgYm9vbGVhbiBvbikgewotICAgIHVzZXJuYW1lLnNldEVuYWJsZWQob24pOwotICAgIHBhc3N3b3JkLnNldEVuYWJsZWQob24pOwotICAgIGxvZ2luLnNldEVuYWJsZWQob24pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uTG9naW4oKSB7Ci0gICAgaGlkZUVycm9yKCk7Ci0KLSAgICBmaW5hbCBTdHJpbmcgdXNlciA9IHVzZXJuYW1lLmdldFRleHQoKTsKLSAgICBpZiAodXNlciA9PSBudWxsIHx8IHVzZXIuZXF1YWxzKCIiKSkgewotICAgICAgc2hvd0Vycm9yKFV0aWwuQy51c2VybmFtZVJlcXVpcmVkKCkpOwotICAgICAgdXNlcm5hbWUuc2V0Rm9jdXModHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIHBhc3MgPSBwYXNzd29yZC5nZXRUZXh0KCk7Ci0gICAgaWYgKHBhc3MgPT0gbnVsbCB8fCBwYXNzLmVxdWFscygiIikpIHsKLSAgICAgIHNob3dFcnJvcihVdGlsLkMucGFzc3dvcmRSZXF1aXJlZCgpKTsKLSAgICAgIHBhc3N3b3JkLnNldEZvY3VzKHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVuYWJsZShmYWxzZSk7Ci0gICAgVXRpbC5TVkMuYXV0aGVudGljYXRlKHVzZXIsIHBhc3MsIG5ldyBHZXJyaXRDYWxsYmFjazxMb2dpblJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgTG9naW5SZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewotICAgICAgICAgIFN0cmluZyB0byA9IHRva2VuOwotICAgICAgICAgIGlmICghdG8uc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB0byA9ICIvIiArIHRvOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocmVzdWx0LmlzTmV3ICYmICF0b2tlbi5zdGFydHNXaXRoKFBhZ2VMaW5rcy5SRUdJU1RFUiArICIvIikpIHsKLSAgICAgICAgICAgIHRvID0gUGFnZUxpbmtzLlJFR0lTVEVSICsgdG87Ci0gICAgICAgICAgfQotICAgICAgICAgIExvY2F0aW9uLnJlcGxhY2UoTG9jYXRpb24uZ2V0UGF0aCgpICsgImxvZ2luIiArIHRvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRFcnJvcigpKSB7Ci0gICAgICAgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU9OX1VOQVZBSUxBQkxFOgotICAgICAgICAgICAgICBtZXNzYWdlID0gVXRpbC5NLmF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGUocmVzdWx0LmdldEF1dGhUeXBlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9MT0dJTjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIG1lc3NhZ2UgPSBVdGlsLkMuaW52YWxpZExvZ2luKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNob3dFcnJvcihtZXNzYWdlKTsKLSAgICAgICAgICBlbmFibGUodHJ1ZSk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgIHBhc3N3b3JkLnNldEZvY3VzKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7Ci0gICAgICAgIGVuYWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZjZTA0Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLnVzZXJwYXNzLlVzZXJQYXNzQXV0aFNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuSnNvblV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVc2VyUGFzc0NvbnN0YW50cyBDID0gR1dULmNyZWF0ZShVc2VyUGFzc0NvbnN0YW50cy5jbGFzcyk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVXNlclBhc3NNZXNzYWdlcyBNID0gR1dULmNyZWF0ZShVc2VyUGFzc01lc3NhZ2VzLmNsYXNzKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVc2VyUGFzc0F1dGhTZXJ2aWNlIFNWQzsKLQotICBzdGF0aWMgewotICAgIFNWQyA9IEdXVC5jcmVhdGUoVXNlclBhc3NBdXRoU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChTVkMsICJycGMvVXNlclBhc3NBdXRoU2VydmljZSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy91c2VycGFzcy5jc3MgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy91c2VycGFzcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTMyYzkuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvdXNlcnBhc3MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS5sb2dpbkZvcm0gewotICBtYXJnaW4tbGVmdDogMTBweDsKLSAgbWFyZ2luLXJpZ2h0OiAxMHB4OwotfQotCi0uZXJyb3IgewotICBwYWRkaW5nLXRvcDogNXB4OwotICBwYWRkaW5nLWJvdHRvbTogNXB4OwotfQotCi0uZXJyb3Igc3BhbiB7Ci0gIHBhZGRpbmctdG9wOiA0cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA0cHg7Ci0gIHBhZGRpbmctbGVmdDogMTBweDsKLSAgcGFkZGluZy1yaWdodDogMTBweDsKLSAgYmFja2dyb3VuZDogI2ZmZjFhODsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FjY291bnREYXNoYm9hcmRTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FjY291bnREYXNoYm9hcmRTY3JlZW4uamF2YQppbmRleCAwNWRkNWQ5Li4yNTgwNTQyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9BY2NvdW50RGFzaGJvYXJkU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQWNjb3VudERhc2hib2FyZFNjcmVlbi5qYXZhCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lk5vdEZvdW5kU2NyZWVuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwpAQCAtNjQsMTUgKzY1LDE1IEBACiAgICAgc3VwZXIub25Mb2FkKCk7CiAgICAgU3RyaW5nIHdobyA9IG1pbmUgPyAic2VsZiIgOiBvd25lcklkLnRvU3RyaW5nKCk7CiAgICAgQ2hhbmdlTGlzdC5xdWVyeSgKLSAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+Pih0aGlzKSB7CisgICAgICAgIG5ldyBTY3JlZW5Mb2FkQ2FsbGJhY2s8SnNBcnJheTxDaGFuZ2VMaXN0Pj4odGhpcykgewogICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEpzQXJyYXk8Q2hhbmdlTGlzdD4gcmVzdWx0KSB7CiAgICAgICAgICAgICBkaXNwbGF5KHJlc3VsdCk7CiAgICAgICAgICAgfQogICAgICAgICB9LAogICAgICAgICAiaXM6b3BlbiBvd25lcjoiICsgd2hvLAogICAgICAgICAiaXM6b3BlbiByZXZpZXdlcjoiICsgd2hvICsgIiAtb3duZXI6IiArIHdobywKLSAgICAgICAgImlzOmNsb3NlZCBvd25lcjoiICsgd2hvICsgIiAtYWdlOjF3IGxpbWl0OjEwIik7CisgICAgICAgICJpczpjbG9zZWQgb3duZXI6IiArIHdobyArICIgLWFnZTo0dyBsaW1pdDoxMCIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC04MSw3ICs4Miw3IEBACiAgICAgdGFibGUuc2V0UmVnaXN0ZXJLZXlzKHRydWUpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXkoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKICAgICBpZiAoIW1pbmUgJiYgIWhhc0NoYW5nZXMocmVzdWx0KSkgewogICAgICAgLy8gV2hlbiBubyByZXN1bHRzIGFyZSByZXR1cm5lZCBhbmQgdGhlIGRhdGEgaXMgbm90IGZvciB0aGUKICAgICAgIC8vIGN1cnJlbnQgdXNlciwgdGhlIHRhcmdldCB1c2VyIGlzIHByZXN1bWVkIHRvIG5vdCBleGlzdC4KQEAgLTExMiw3ICsxMTMsNyBAQAogICAgICAgfQogICAgIH0KIAotICAgIENvbGxlY3Rpb25zLnNvcnQob3V0LmFzTGlzdCgpLCBvdXRDb21wYXJhdG9yKCkpOworICAgIENvbGxlY3Rpb25zLnNvcnQoTmF0aXZlcy5hc0xpc3Qob3V0KSwgb3V0Q29tcGFyYXRvcigpKTsKIAogICAgIHRhYmxlLnVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMob3V0LCBpbiwgZG9uZSk7CiAgICAgb3V0Z29pbmcuZGlzcGxheShvdXQpOwpAQCAtMTMyLDkgKzEzMyw5IEBACiAgICAgfTsKICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNDaGFuZ2VzKE5hdGl2ZUxpc3Q8Q2hhbmdlTGlzdD4gcmVzdWx0KSB7Ci0gICAgZm9yIChDaGFuZ2VMaXN0IGxpc3QgOiByZXN1bHQuYXNMaXN0KCkpIHsKLSAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0NoYW5nZXMoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICBmb3IgKENoYW5nZUxpc3QgbGlzdCA6IE5hdGl2ZXMuYXNMaXN0KHJlc3VsdCkpIHsKKyAgICAgIGlmIChsaXN0Lmxlbmd0aCgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgfQpAQCAtMTQyLDcgKzE0Myw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKENoYW5nZUxpc3QgbGlzdCkgewotICAgIGZvciAoQ2hhbmdlSW5mbyBjaGFuZ2UgOiBsaXN0LmFzTGlzdCgpKSB7CisgICAgZm9yIChDaGFuZ2VJbmZvIGNoYW5nZSA6IE5hdGl2ZXMuYXNMaXN0KGxpc3QpKSB7CiAgICAgICBpZiAoY2hhbmdlLm93bmVyKCkgIT0gbnVsbCAmJiBjaGFuZ2Uub3duZXIoKS5uYW1lKCkgIT0gbnVsbCkgewogICAgICAgICByZXR1cm4gY2hhbmdlLm93bmVyKCkubmFtZSgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQXBwcm92YWxUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQXBwcm92YWxUYWJsZS5qYXZhCmluZGV4IDczMDM2ZmYuLmRlYjg2N2MgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FwcHJvdmFsVGFibGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9BcHByb3ZhbFRhYmxlLmphdmEKQEAgLTE0LDI3ICsxNCwyOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWUuZm9ybWF0VmFsdWU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuQ29uZmlybWF0aW9uQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkNvbmZpcm1hdGlvbkRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5BcHByb3ZhbEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5MYWJlbEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BZGRNZW1iZXJCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlJldmlld2VyU3VnZ2VzdE9yYWNsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldFB1Ymxpc2hEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3ZXJSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CkBAIC01MCwyNSArNTEsMjYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKiBEaXNwbGF5cyBhIHRhYmxlIG9mIHtAbGluayBBcHByb3ZhbERldGFpbH0gb2JqZWN0cyBmb3IgYSBjaGFuZ2UgcmVjb3JkLiAqLwogcHVibGljIGNsYXNzIEFwcHJvdmFsVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgdHlwZXM7CiAgIHByaXZhdGUgZmluYWwgR3JpZCB0YWJsZTsKICAgcHJpdmF0ZSBmaW5hbCBXaWRnZXQgbWlzc2luZzsKICAgcHJpdmF0ZSBmaW5hbCBQYW5lbCBhZGRSZXZpZXdlcjsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlclN1Z2dlc3RPcmFjbGUgcmV2aWV3ZXJTdWdnZXN0T3JhY2xlOwogICBwcml2YXRlIGZpbmFsIEFkZE1lbWJlckJveCBhZGRNZW1iZXJCb3g7Ci0gIHByaXZhdGUgQ2hhbmdlLklkIGNoYW5nZUlkOwotICBwcml2YXRlIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudENhY2hlID0gQWNjb3VudEluZm9DYWNoZS5lbXB0eSgpOworICBwcml2YXRlIENoYW5nZUluZm8gbGFzdENoYW5nZTsKKyAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgSW50ZWdlcj4gcm93czsKIAogICBwdWJsaWMgQXBwcm92YWxUYWJsZSgpIHsKLSAgICB0eXBlcyA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBcHByb3ZhbFR5cGVzKCk7CisgICAgcm93cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgdGFibGUgPSBuZXcgR3JpZCgxLCAzKTsKICAgICB0YWJsZS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pbmZvVGFibGUoKSk7CiAKQEAgLTEwMyw3ICsxMDUsNyBAQAogICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFwcHJvdmFsVGFibGUoKSk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgZGlzcGxheUhlYWRlcihMaXN0PFN0cmluZz4gbGFiZWxzKSB7CisgIHByaXZhdGUgdm9pZCBkaXNwbGF5SGVhZGVyKENvbGxlY3Rpb248U3RyaW5nPiBsYWJlbHMpIHsKICAgICB0YWJsZS5yZXNpemVDb2x1bW5zKDIgKyBsYWJlbHMuc2l6ZSgpKTsKIAogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwpAQCAtMTI1LDI2NCArMTI3LDIxOCBAQAogICAgIGZtdC5hZGRTdHlsZU5hbWUoMCwgY29sIC0gMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodG1vc3QoKSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50SW5mb0NhY2hlKGZpbmFsIEFjY291bnRJbmZvQ2FjaGUgYWljKSB7Ci0gICAgYXNzZXJ0IGFpYyAhPSBudWxsOwotICAgIGFjY291bnRDYWNoZSA9IGFpYzsKLSAgfQorICB2b2lkIGRpc3BsYXkoQ2hhbmdlSW5mbyBjaGFuZ2UpIHsKKyAgICBsYXN0Q2hhbmdlID0gY2hhbmdlOworICAgIHJldmlld2VyU3VnZ2VzdE9yYWNsZS5zZXRDaGFuZ2UoY2hhbmdlLmxlZ2FjeV9pZCgpKTsKKyAgICBNYXA8SW50ZWdlciwgQXBwcm92YWxEZXRhaWw+IGJ5VXNlciA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPEludGVnZXIsIEFwcHJvdmFsRGV0YWlsPigpOworICAgIE1hcDxJbnRlZ2VyLCBBY2NvdW50SW5mbz4gYWNjb3VudHMgPQorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBBY2NvdW50SW5mbz4oKTsKKyAgICBMaXN0PFN0cmluZz4gbWlzc2luZ0xhYmVscyA9IGluaXRMYWJlbHMoY2hhbmdlLCBhY2NvdW50cywgYnlVc2VyKTsKIAotICBwcml2YXRlIEFjY291bnRMaW5rIGxpbmsoZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgIHJldHVybiBBY2NvdW50TGluay5saW5rKGFjY291bnRDYWNoZSwgaWQpOwotICB9Ci0KLSAgdm9pZCBkaXNwbGF5KFBhdGNoU2V0UHVibGlzaERldGFpbCBkZXRhaWwpIHsKLSAgICBkb0Rpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLCBkZXRhaWwuZ2V0QXBwcm92YWxzKCksCi0gICAgICAgIGRldGFpbC5nZXRTdWJtaXRSZWNvcmRzKCkpOwotICB9Ci0KLSAgdm9pZCBkaXNwbGF5KENoYW5nZURldGFpbCBkZXRhaWwpIHsKLSAgICBkb0Rpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLCBkZXRhaWwuZ2V0QXBwcm92YWxzKCksCi0gICAgICAgIGRldGFpbC5nZXRTdWJtaXRSZWNvcmRzKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRvRGlzcGxheShDaGFuZ2UgY2hhbmdlLCBMaXN0PEFwcHJvdmFsRGV0YWlsPiBhcHByb3ZhbHMsCi0gICAgICBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVjb3JkcykgewotICAgIGNoYW5nZUlkID0gY2hhbmdlLmdldElkKCk7Ci0gICAgcmV2aWV3ZXJTdWdnZXN0T3JhY2xlLnNldENoYW5nZShjaGFuZ2VJZCk7Ci0KLSAgICBMaXN0PFN0cmluZz4gY29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgZmluYWwgRWxlbWVudCBtaXNzaW5nTGlzdCA9IG1pc3NpbmcuZ2V0RWxlbWVudCgpOwotICAgIHdoaWxlIChET00uZ2V0Q2hpbGRDb3VudChtaXNzaW5nTGlzdCkgPiAwKSB7Ci0gICAgICBET00ucmVtb3ZlQ2hpbGQobWlzc2luZ0xpc3QsIERPTS5nZXRDaGlsZChtaXNzaW5nTGlzdCwgMCkpOwotICAgIH0KLSAgICBtaXNzaW5nLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgaWYgKHN1Ym1pdFJlY29yZHMgIT0gbnVsbCkgewotICAgICAgSGFzaFNldDxTdHJpbmc+IHJlcG9ydGVkTWlzc2luZyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgSGFzaE1hcDxBY2NvdW50LklkLCBBcHByb3ZhbERldGFpbD4gYnlVc2VyID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LklkLCBBcHByb3ZhbERldGFpbD4oKTsKLSAgICAgIGZvciAoQXBwcm92YWxEZXRhaWwgYWQgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgYnlVc2VyLnB1dChhZC5nZXRBY2NvdW50KCksIGFkKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjIDogc3VibWl0UmVjb3JkcykgewotICAgICAgICBpZiAocmVjLmxhYmVscyA9PSBudWxsKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCBsYmwgOiByZWMubGFiZWxzKSB7Ci0gICAgICAgICAgaWYgKCFjb2x1bW5zLmNvbnRhaW5zKGxibC5sYWJlbCkpIHsKLSAgICAgICAgICAgIGNvbHVtbnMuYWRkKGxibC5sYWJlbCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3dpdGNoIChsYmwuc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIE9LOiB7Ci0gICAgICAgICAgICAgIEFwcHJvdmFsRGV0YWlsIGFkID0gYnlVc2VyLmdldChsYmwuYXBwbGllZEJ5KTsKLSAgICAgICAgICAgICAgaWYgKGFkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZC5hcHByb3ZlZChsYmwubGFiZWwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFJFSkVDVDogewotICAgICAgICAgICAgICBBcHByb3ZhbERldGFpbCBhZCA9IGJ5VXNlci5nZXQobGJsLmFwcGxpZWRCeSk7Ci0gICAgICAgICAgICAgIGlmIChhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWQucmVqZWN0ZWQobGJsLmxhYmVsKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBNQVk6Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5FRUQ6Ci0gICAgICAgICAgICBjYXNlIElNUE9TU0lCTEU6Ci0gICAgICAgICAgICAgIGlmIChyZXBvcnRlZE1pc3NpbmcuYWRkKGxibC5sYWJlbCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGxpID0gRE9NLmNyZWF0ZUVsZW1lbnQoImxpIik7Ci0gICAgICAgICAgICAgICAgbGkuc2V0Q2xhc3NOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubWlzc2luZ0FwcHJvdmFsKCkpOwotICAgICAgICAgICAgICAgIERPTS5zZXRJbm5lclRleHQobGksIFV0aWwuTS5uZWVkQXBwcm92YWwobGJsLmxhYmVsKSk7Ci0gICAgICAgICAgICAgICAgRE9NLmFwcGVuZENoaWxkKG1pc3NpbmdMaXN0LCBsaSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtaXNzaW5nLnNldFZpc2libGUoIXJlcG9ydGVkTWlzc2luZy5pc0VtcHR5KCkpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoQXBwcm92YWxEZXRhaWwgYWQgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IGFkLmdldFBhdGNoU2V0QXBwcm92YWxzKCkpIHsKLSAgICAgICAgICBBcHByb3ZhbFR5cGUgbGVnYWN5VHlwZSA9IHR5cGVzLmJ5SWQocHNhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgICAgaWYgKGxlZ2FjeVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBsZWdhY3lUeXBlLmdldENhdGVnb3J5KCkuZ2V0TGFiZWxOYW1lKCk7Ci0gICAgICAgICAgaWYgKHBzYS5nZXRWYWx1ZSgpICE9IDAgKSB7Ci0gICAgICAgICAgICBpZiAocHNhLmdldFZhbHVlKCkgPT0gbGVnYWN5VHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgIGFkLmFwcHJvdmVkKGxhYmVsTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBzYS5nZXRWYWx1ZSgpID09IGxlZ2FjeVR5cGUuZ2V0TWluKCkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICBhZC5yZWplY3RlZChsYWJlbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWNvbHVtbnMuY29udGFpbnMobGFiZWxOYW1lKSkgewotICAgICAgICAgICAgY29sdW1ucy5hZGQobGFiZWxOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb2x1bW5zLCBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbzEsIFN0cmluZyBvMikgewotICAgICAgICAgICAgQXBwcm92YWxUeXBlIGEgPSB0eXBlcy5ieUxhYmVsKG8xKTsKLSAgICAgICAgICAgIEFwcHJvdmFsVHlwZSBiID0gdHlwZXMuYnlMYWJlbChvMik7Ci0gICAgICAgICAgICBpbnQgY21wID0gMDsKLSAgICAgICAgICAgIGlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGNtcCA9IGEuZ2V0Q2F0ZWdvcnkoKS5nZXRQb3NpdGlvbigpIC0gYi5nZXRDYXRlZ29yeSgpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgY21wID0gbzEuY29tcGFyZVRvKG8yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KKyAgICByZW1vdmVBbGxDaGlsZHJlbihtaXNzaW5nLmdldEVsZW1lbnQoKSk7CisgICAgZm9yIChTdHJpbmcgbGFiZWwgOiBtaXNzaW5nTGFiZWxzKSB7CisgICAgICBhZGRNaXNzaW5nTGFiZWwoVXRpbC5NLm5lZWRBcHByb3ZhbChsYWJlbCkpOwogICAgIH0KIAotICAgIGlmIChhcHByb3ZhbHMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGJ5VXNlci5pc0VtcHR5KCkpIHsKICAgICAgIHRhYmxlLnNldFZpc2libGUoZmFsc2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICBkaXNwbGF5SGVhZGVyKGNvbHVtbnMpOwotICAgICAgdGFibGUucmVzaXplUm93cygxICsgYXBwcm92YWxzLnNpemUoKSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcHJvdmFscy5zaXplKCk7IGkrKykgewotICAgICAgICBkaXNwbGF5Um93KGkgKyAxLCBhcHByb3ZhbHMuZ2V0KGkpLCBjaGFuZ2UsIGNvbHVtbnMpOworICAgICAgZGlzcGxheUhlYWRlcihjaGFuZ2UubGFiZWxzKCkpOworICAgICAgdGFibGUucmVzaXplUm93cygxICsgYnlVc2VyLnNpemUoKSk7CisgICAgICBpbnQgaSA9IDE7CisgICAgICBmb3IgKEFwcHJvdmFsRGV0YWlsIGFkIDogQXBwcm92YWxEZXRhaWwuc29ydCgKKyAgICAgICAgICBieVVzZXIudmFsdWVzKCksIGNoYW5nZS5vd25lcigpLl9hY2NvdW50X2lkKCkpKSB7CisgICAgICAgIGRpc3BsYXlSb3coaSsrLCBhZCwgY2hhbmdlLCBhY2NvdW50cy5nZXQoYWQuZ2V0QWNjb3VudCgpLmdldCgpKSk7CiAgICAgICB9CiAgICAgICB0YWJsZS5zZXRWaXNpYmxlKHRydWUpOwogICAgIH0KIAotICAgIGFkZFJldmlld2VyLnNldFZpc2libGUoR2Vycml0LmlzU2lnbmVkSW4oKSk7Ci0KICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLnRlc3RDaGFuZ2VNZXJnZSgpCi0gICAgICAgICYmICFjaGFuZ2UuaXNNZXJnZWFibGUoKSkgewotICAgICAgRWxlbWVudCBsaSA9IERPTS5jcmVhdGVFbGVtZW50KCJsaSIpOwotICAgICAgbGkuc2V0Q2xhc3NOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubWlzc2luZ0FwcHJvdmFsKCkpOwotICAgICAgRE9NLnNldElubmVyVGV4dChsaSwgVXRpbC5DLm1lc3NhZ2VOZWVkc1JlYmFzZU9ySGFzRGVwZW5kZW5jeSgpKTsKLSAgICAgIERPTS5hcHBlbmRDaGlsZChtaXNzaW5nTGlzdCwgbGkpOwotICAgICAgbWlzc2luZy5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAmJiBjaGFuZ2Uuc3RhdHVzKCkgIT0gQ2hhbmdlLlN0YXR1cy5NRVJHRUQKKyAgICAgICAgJiYgIWNoYW5nZS5tZXJnZWFibGUoKSkgeworICAgICAgYWRkTWlzc2luZ0xhYmVsKFV0aWwuQy5tZXNzYWdlTmVlZHNSZWJhc2VPckhhc0RlcGVuZGVuY3koKSk7CiAgICAgfQorICAgIG1pc3Npbmcuc2V0VmlzaWJsZShET00uZ2V0Q2hpbGRDb3VudChtaXNzaW5nLmdldEVsZW1lbnQoKSkgPiAwKTsKKyAgICBhZGRSZXZpZXdlci5zZXRWaXNpYmxlKEdlcnJpdC5pc1NpZ25lZEluKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKEVsZW1lbnQgZWwpIHsKKyAgICBmb3IgKGludCBpID0gRE9NLmdldENoaWxkQ291bnQoZWwpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIERPTS5yZW1vdmVDaGlsZChlbCwgRE9NLmdldENoaWxkKGVsLCBpKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZE1pc3NpbmdMYWJlbChTdHJpbmcgdGV4dCkgeworICAgIEVsZW1lbnQgbGkgPSBET00uY3JlYXRlRWxlbWVudCgibGkiKTsKKyAgICBsaS5zZXRDbGFzc05hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5taXNzaW5nQXBwcm92YWwoKSk7CisgICAgRE9NLnNldElubmVyVGV4dChsaSwgdGV4dCk7CisgICAgRE9NLmFwcGVuZENoaWxkKG1pc3NpbmcuZ2V0RWxlbWVudCgpLCBsaSk7CisgIH0KKworICBwcml2YXRlIFNldDxJbnRlZ2VyPiByZW1vdmFibGVSZXZpZXdlcnMoQ2hhbmdlSW5mbyBjaGFuZ2UpIHsKKyAgICBTZXQ8SW50ZWdlcj4gcmVzdWx0ID0KKyAgICAgICAgbmV3IEhhc2hTZXQ8SW50ZWdlcj4oY2hhbmdlLnJlbW92YWJsZV9yZXZpZXdlcnMoKS5sZW5ndGgoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2UucmVtb3ZhYmxlX3Jldmlld2VycygpLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIHJlc3VsdC5hZGQoY2hhbmdlLnJlbW92YWJsZV9yZXZpZXdlcnMoKS5nZXQoaSkuX2FjY291bnRfaWQoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbml0TGFiZWxzKENoYW5nZUluZm8gY2hhbmdlLAorICAgICAgTWFwPEludGVnZXIsIEFjY291bnRJbmZvPiBhY2NvdW50cywKKyAgICAgIE1hcDxJbnRlZ2VyLCBBcHByb3ZhbERldGFpbD4gYnlVc2VyKSB7CisgICAgU2V0PEludGVnZXI+IHJlbW92YWJsZVJldmlld2VycyA9IHJlbW92YWJsZVJldmlld2VycyhjaGFuZ2UpOworICAgIExpc3Q8U3RyaW5nPiBtaXNzaW5nID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNoYW5nZS5sYWJlbHMoKSkgeworICAgICAgTGFiZWxJbmZvIGxhYmVsID0gY2hhbmdlLmxhYmVsKG5hbWUpOworCisgICAgICBTdHJpbmcgbWluID0gbnVsbDsKKyAgICAgIFN0cmluZyBtYXggPSBudWxsOworICAgICAgZm9yIChTdHJpbmcgdiA6IGxhYmVsLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChtaW4gPT0gbnVsbCkgeworICAgICAgICAgIG1pbiA9IHY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYuc3RhcnRzV2l0aCgiKyIpKSB7CisgICAgICAgICAgbWF4ID0gdjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobGFiZWwuc3RhdHVzKCkgPT0gU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cy5ORUVEKSB7CisgICAgICAgIG1pc3NpbmcuYWRkKG5hbWUpOworICAgICAgfQorCisgICAgICBpZiAobGFiZWwuYWxsKCkgIT0gbnVsbCkgeworICAgICAgICBmb3IgKEFwcHJvdmFsSW5mbyBhaSA6IE5hdGl2ZXMuYXNMaXN0KGxhYmVsLmFsbCgpKSkgeworICAgICAgICAgIGlmICghYWNjb3VudHMuY29udGFpbnNLZXkoYWkuX2FjY291bnRfaWQoKSkpIHsKKyAgICAgICAgICAgIGFjY291bnRzLnB1dChhaS5fYWNjb3VudF9pZCgpLCBhaSk7CisgICAgICAgICAgfQorICAgICAgICAgIGludCBpZCA9IGFpLl9hY2NvdW50X2lkKCk7CisgICAgICAgICAgQXBwcm92YWxEZXRhaWwgYWQgPSBieVVzZXIuZ2V0KGlkKTsKKyAgICAgICAgICBpZiAoYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgYWQgPSBuZXcgQXBwcm92YWxEZXRhaWwobmV3IEFjY291bnQuSWQoaWQpKTsKKyAgICAgICAgICAgIGFkLnNldENhblJlbW92ZShyZW1vdmFibGVSZXZpZXdlcnMuY29udGFpbnMoaWQpKTsKKyAgICAgICAgICAgIGJ5VXNlci5wdXQoaWQsIGFkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFpLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBhZC52b3RhYmxlKG5hbWUpOworICAgICAgICAgICAgYWQudmFsdWUobmFtZSwgYWkudmFsdWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgZnYgPSBmb3JtYXRWYWx1ZShhaS52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChmdi5lcXVhbHMobWF4KSkgeworICAgICAgICAgICAgICBhZC5hcHByb3ZlZChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWkudmFsdWUoKSA8IDAgJiYgZnYuZXF1YWxzKG1pbikpIHsKKyAgICAgICAgICAgICAgYWQucmVqZWN0ZWQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaXNzaW5nOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvQWRkUmV2aWV3ZXIoKSB7Ci0gICAgZmluYWwgU3RyaW5nIHJldmlld2VyID0gYWRkTWVtYmVyQm94LmdldFRleHQoKTsKLSAgICBpZiAocmV2aWV3ZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgcmV0dXJuOworICAgIFN0cmluZyByZXZpZXdlciA9IGFkZE1lbWJlckJveC5nZXRUZXh0KCk7CisgICAgaWYgKCFyZXZpZXdlci5pc0VtcHR5KCkpIHsKKyAgICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgIGFkZFJldmlld2VyKHJldmlld2VyLCBmYWxzZSk7CiAgICAgfQotCi0gICAgYWRkTWVtYmVyQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXZpZXdlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICByZXZpZXdlcnMuYWRkKHJldmlld2VyKTsKLQotICAgIGFkZFJldmlld2VycyhyZXZpZXdlcnMsIGZhbHNlKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBhZGRSZXZpZXdlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHJldmlld2VycywKLSAgICAgIGZpbmFsIGJvb2xlYW4gY29uZmlybWVkKSB7Ci0gICAgUGF0Y2hVdGlsLkRFVEFJTF9TVkMuYWRkUmV2aWV3ZXJzKGNoYW5nZUlkLCByZXZpZXdlcnMsIGNvbmZpcm1lZCwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFJldmlld2VyUmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0KSB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIHN0YXRpYyBQb3N0SW5wdXQgY3JlYXRlKFN0cmluZyByZXZpZXdlciwgYm9vbGVhbiBjb25maXJtZWQpIHsKKyAgICAgIFBvc3RJbnB1dCBpbnB1dCA9IGNyZWF0ZU9iamVjdCgpLmNhc3QoKTsKKyAgICAgIGlucHV0LmluaXQocmV2aWV3ZXIsIGNvbmZpcm1lZCk7CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KFN0cmluZyByZXZpZXdlciwgYm9vbGVhbiBjb25maXJtZWQpIC8qLXsKKyAgICAgIHRoaXMucmV2aWV3ZXIgPSByZXZpZXdlcjsKKyAgICAgIGlmIChjb25maXJtZWQpIHsKKyAgICAgICAgdGhpcy5jb25maXJtZWQgPSB0cnVlOworICAgICAgfQorICAgIH0tKi87CisKKyAgICBwcm90ZWN0ZWQgUG9zdElucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJldmlld2VySW5mbyBleHRlbmRzIEFjY291bnRJbmZvIHsKKyAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhcHByb3ZhbHMoKSB7CisgICAgICByZXR1cm4gTmF0aXZlcy5rZXlzKF9hcHByb3ZhbHMoKSk7CisgICAgfQorICAgIGZpbmFsIG5hdGl2ZSBTdHJpbmcgYXBwcm92YWwoU3RyaW5nIGwpIC8qLXsgcmV0dXJuIHRoaXMuYXBwcm92YWxzW2xdOyB9LSovOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIE5hdGl2ZU1hcDxOYXRpdmVTdHJpbmc+IF9hcHByb3ZhbHMoKSAvKi17IHJldHVybiB0aGlzLmFwcHJvdmFsczsgfS0qLzsKKworICAgIHByb3RlY3RlZCBSZXZpZXdlckluZm8oKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFJlc3VsdCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIGZpbmFsIG5hdGl2ZSBKc0FycmF5PFJldmlld2VySW5mbz4gcmV2aWV3ZXJzKCkgLyoteyByZXR1cm4gdGhpcy5yZXZpZXdlcnM7IH0tKi87CisgICAgZmluYWwgbmF0aXZlIGJvb2xlYW4gY29uZmlybSgpIC8qLXsgcmV0dXJuIHRoaXMuY29uZmlybSB8fCBmYWxzZTsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgU3RyaW5nIGVycm9yKCkgLyoteyByZXR1cm4gdGhpcy5lcnJvcjsgfS0qLzsKKworICAgIHByb3RlY3RlZCBQb3N0UmVzdWx0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRSZXZpZXdlcihmaW5hbCBTdHJpbmcgcmV2aWV3ZXIsIGJvb2xlYW4gY29uZmlybWVkKSB7CisgICAgQ2hhbmdlQXBpLnJldmlld2VycyhsYXN0Q2hhbmdlLmxlZ2FjeV9pZCgpLmdldCgpKS5wb3N0KAorICAgICAgICBQb3N0SW5wdXQuY3JlYXRlKHJldmlld2VyLCBjb25maXJtZWQpLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UG9zdFJlc3VsdD4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFBvc3RSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICBhZGRNZW1iZXJCb3guc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgIGFkZE1lbWJlckJveC5zZXRUZXh0KCIiKTsKLQotICAgICAgICAgICAgZmluYWwgQ2hhbmdlRGV0YWlsIGNoYW5nZURldGFpbCA9IHJlc3VsdC5nZXRDaGFuZ2UoKTsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VEZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICBzZXRBY2NvdW50SW5mb0NhY2hlKGNoYW5nZURldGFpbC5nZXRBY2NvdW50cygpKTsKLSAgICAgICAgICAgICAgZGlzcGxheShjaGFuZ2VEZXRhaWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlc3VsdC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgZmluYWwgU2FmZUh0bWxCdWlsZGVyIHIgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgIGZvciAoZmluYWwgUmV2aWV3ZXJSZXN1bHQuRXJyb3IgZSA6IHJlc3VsdC5nZXRFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgUkVWSUVXRVJfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZChVdGlsLk0ucmV2aWV3ZXJOb3RGb3VuZChlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBBQ0NPVU5UX0lOQUNUSVZFOgotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZChVdGlsLk0uYWNjb3VudEluYWN0aXZlKGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlIENIQU5HRV9OT1RfVklTSUJMRToKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoVXRpbC5NLmNoYW5nZU5vdFZpc2libGVUbyhlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9FTVBUWToKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoVXRpbC5NLmdyb3VwSXNFbXB0eShlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQVNfVE9PX01BTllfTUVNQkVSUzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5hc2tGb3JDb25maXJtYXRpb24oKSAmJiAhY29uZmlybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgYXNrRm9yQ29uZmlybWF0aW9uKGUuZ2V0TmFtZSgpLCByZXN1bHQuZ2V0TWVtYmVyQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKFV0aWwuTS5ncm91cEhhc1Rvb01hbnlNZW1iZXJzKGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfTk9UX0FMTE9XRUQ6Ci0gICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKFV0aWwuTS5ncm91cElzTm90QWxsb3dlZChlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZCgiIC0gIik7Ci0gICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgci5icigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKHIpLmNlbnRlcigpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgcmVsb2FkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb25maXJtKCkpIHsKKyAgICAgICAgICAgICAgYXNrRm9yQ29uZmlybWF0aW9uKHJlc3VsdC5lcnJvcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5ldyBFcnJvckRpYWxvZyhuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKHJlc3VsdC5lcnJvcigpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIGFza0ZvckNvbmZpcm1hdGlvbihmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lLAotICAgICAgICAgICAgICBmaW5hbCBpbnQgbWVtYmVyQ291bnQpIHsKLSAgICAgICAgICAgIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBiID0gbmV3IFNhZmVIdG1sQnVpbGRlcigpOwotICAgICAgICAgICAgYi5vcGVuRWxlbWVudCgiYiIpOwotICAgICAgICAgICAgYi5hcHBlbmQoVXRpbC5NCi0gICAgICAgICAgICAgICAgLmdyb3VwTWFueU1lbWJlcnNDb25maXJtYXRpb24oZ3JvdXBOYW1lLCBtZW1iZXJDb3VudCkpOwotICAgICAgICAgICAgYi5jbG9zZUVsZW1lbnQoImIiKTsKLSAgICAgICAgICAgIGZpbmFsIENvbmZpcm1hdGlvbkRpYWxvZyBjb25maXJtYXRpb25EaWFsb2cgPQotICAgICAgICAgICAgICAgIG5ldyBDb25maXJtYXRpb25EaWFsb2coVXRpbC5DCi0gICAgICAgICAgICAgICAgICAgIC5hcHByb3ZhbFRhYmxlQWRkTWFueVJldmlld2Vyc0NvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlKCksCi0gICAgICAgICAgICAgICAgICAgIGIudG9TYWZlSHRtbCgpLCBuZXcgQ29uZmlybWF0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PaygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJldmlld2VycyhyZXZpZXdlcnMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFza0ZvckNvbmZpcm1hdGlvbihTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gVXRpbC5DCisgICAgICAgICAgICAgICAgLmFwcHJvdmFsVGFibGVBZGRNYW55UmV2aWV3ZXJzQ29uZmlybWF0aW9uRGlhbG9nVGl0bGUoKTsKKyAgICAgICAgICAgIENvbmZpcm1hdGlvbkRpYWxvZyBjb25maXJtYXRpb25EaWFsb2cgPSBuZXcgQ29uZmlybWF0aW9uRGlhbG9nKAorICAgICAgICAgICAgICAgIHRpdGxlLCBuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKHRleHQpLAorICAgICAgICAgICAgICAgIG5ldyBDb25maXJtYXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmV2aWV3ZXIocmV2aWV3ZXIsIHRydWUpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgY29uZmlybWF0aW9uRGlhbG9nLmNlbnRlcigpOwogICAgICAgICAgIH0KIAogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgICAgICAgICBhZGRNZW1iZXJCb3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgaWYgKGlzTm9TdWNoRW50aXR5KGNhdWdodCkpIHsKKyAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKFV0aWwuTS5yZXZpZXdlck5vdEZvdW5kKHJldmlld2VyKSkuY2VudGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlSb3coZmluYWwgaW50IHJvdywgZmluYWwgQXBwcm92YWxEZXRhaWwgYWQsCi0gICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlLCBMaXN0PFN0cmluZz4gY29sdW1ucykgeworICBwcml2YXRlIHZvaWQgZGlzcGxheVJvdyhpbnQgcm93LCBmaW5hbCBBcHByb3ZhbERldGFpbCBhZCwgQ2hhbmdlSW5mbyBjaGFuZ2UsCisgICAgICBBY2NvdW50SW5mbyBhY2NvdW50KSB7CiAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CiAgICAgaW50IGNvbCA9IDA7CiAKLSAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wrKywgbGluayhhZC5nZXRBY2NvdW50KCkpKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wrKywgbmV3IEFjY291bnRMaW5rKGFjY291bnQpKTsKKyAgICByb3dzLnB1dChhY2NvdW50Ll9hY2NvdW50X2lkKCksIHJvdyk7CiAKICAgICBpZiAoYWQuY2FuUmVtb3ZlKCkpIHsKICAgICAgIGZpbmFsIFB1c2hCdXR0b24gcmVtb3ZlID0gbmV3IFB1c2hCdXR0b24oIC8vCiAgICAgICAgICAgbmV3IEltYWdlKFV0aWwuUi5yZW1vdmVSZXZpZXdlck5vcm1hbCgpKSwgLy8KICAgICAgICAgICBuZXcgSW1hZ2UoVXRpbC5SLnJlbW92ZVJldmlld2VyUHJlc3NlZCgpKSk7Ci0gICAgICByZW1vdmUuc2V0VGl0bGUoVXRpbC5NLnJlbW92ZVJldmlld2VyKCAvLwotICAgICAgICAgIEZvcm1hdFV0aWwubmFtZShhY2NvdW50Q2FjaGUuZ2V0KGFkLmdldEFjY291bnQoKSkpKSk7CisgICAgICByZW1vdmUuc2V0VGl0bGUoVXRpbC5NLnJlbW92ZVJldmlld2VyKGFjY291bnQubmFtZSgpKSk7CiAgICAgICByZW1vdmUuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmVtb3ZlUmV2aWV3ZXIoKSk7CisgICAgICByZW1vdmUuYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluaygpKTsKICAgICAgIHJlbW92ZS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewpAQCAtMzk1LDggKzM1MSwxMiBAQAogICAgIH0KICAgICBmbXQuc2V0U3R5bGVOYW1lKHJvdywgY29sKyssIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmVtb3ZlUmV2aWV3ZXJDZWxsKCkpOwogCi0gICAgZm9yIChTdHJpbmcgbGFiZWxOYW1lIDogY29sdW1ucykgeworICAgIGZvciAoU3RyaW5nIGxhYmVsTmFtZSA6IGNoYW5nZS5sYWJlbHMoKSkgewogICAgICAgZm10LnNldFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hcHByb3ZhbHNjb3JlKCkpOworICAgICAgaWYgKCFhZC5jYW5Wb3RlKGxhYmVsTmFtZSkpIHsKKyAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5ub3RWb3RhYmxlKCkpOworICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIGNvbCkuc2V0VGl0bGUoR2Vycml0LkMudXNlckNhbm5vdFZvdGVUb29sVGlwKCkpOworICAgICAgfQogCiAgICAgICBpZiAoYWQuaXNSZWplY3RlZChsYWJlbE5hbWUpKSB7CiAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKQEAgLTQwNSwyMiArMzY1LDE0IEBACiAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuZ3JlZW5DaGVjaygpKSk7CiAKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFwcHJvdmFsVHlwZSBsZWdhY3lUeXBlID0gdHlwZXMuYnlMYWJlbChsYWJlbE5hbWUpOwotICAgICAgICBpZiAobGVnYWN5VHlwZSA9PSBudWxsKSB7CisgICAgICAgIGludCB2ID0gYWQuZ2V0VmFsdWUobGFiZWxOYW1lKTsKKyAgICAgICAgaWYgKHYgPT0gMCkgewogICAgICAgICAgIHRhYmxlLmNsZWFyQ2VsbChyb3csIGNvbCk7CiAgICAgICAgICAgY29sKys7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLQotICAgICAgICBQYXRjaFNldEFwcHJvdmFsIGNhID0gYWQuZ2V0UGF0Y2hTZXRBcHByb3ZhbChsZWdhY3lUeXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChjYSA9PSBudWxsIHx8IGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICAgIHRhYmxlLmNsZWFyQ2VsbChyb3csIGNvbCk7Ci0gICAgICAgICAgY29sKys7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdnN0ciA9IFN0cmluZy52YWx1ZU9mKGNhLmdldFZhbHVlKCkpOwotICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKKyAgICAgICAgU3RyaW5nIHZzdHIgPSBTdHJpbmcudmFsdWVPZihhZC5nZXRWYWx1ZShsYWJlbE5hbWUpKTsKKyAgICAgICAgaWYgKHYgPiAwKSB7CiAgICAgICAgICAgdnN0ciA9ICIrIiArIHZzdHI7CiAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wb3NzY29yZSgpKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQzNSwyOSArMzg3LDIzIEBACiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCAtIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRtb3N0KCkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlKGZpbmFsIEFwcHJvdmFsRGV0YWlsIGFkLCBmaW5hbCBQdXNoQnV0dG9uIHJlbW92ZSkgewotICAgIHJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5yZW1vdmVSZXZpZXdlcihjaGFuZ2VJZCwgYWQuZ2V0QWNjb3VudCgpLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UmV2aWV3ZXJSZXN1bHQ+KCkgeworICBwcml2YXRlIHZvaWQgcmVsb2FkKCkgeworICAgIENoYW5nZUFwaS5kZXRhaWwobGFzdENoYW5nZS5sZWdhY3lfaWQoKS5nZXQoKSwKKyAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPENoYW5nZUluZm8+KCkgewogICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhSZXZpZXdlclJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIENoYW5nZURldGFpbCByID0gcmVzdWx0LmdldENoYW5nZSgpOwotICAgICAgICAgICAgICBkaXNwbGF5KHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZmluYWwgUmV2aWV3ZXJSZXN1bHQuRXJyb3IgcmVzdWx0RXJyb3IgPQotICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEVycm9ycygpLmdldCgwKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBVdGlsLkMuYXBwcm92YWxUYWJsZVJlbW92ZU5vdFBlcm1pdHRlZCgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT1VMRF9OT1RfUkVNT1ZFOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBtZXNzYWdlID0gVXRpbC5DLmFwcHJvdmFsVGFibGVDb3VsZE5vdFJlbW92ZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG5ldyBFcnJvckRpYWxvZyhtZXNzYWdlICsgIiAiICsgcmVzdWx0RXJyb3IuZ2V0TmFtZSgpKS5jZW50ZXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgIGRpc3BsYXkocmVzdWx0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlKEFwcHJvdmFsRGV0YWlsIGFkLCBmaW5hbCBQdXNoQnV0dG9uIHJlbW92ZSkgeworICAgIHJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICBDaGFuZ2VBcGkucmV2aWV3ZXIobGFzdENoYW5nZS5sZWdhY3lfaWQoKS5nZXQoKSwgYWQuZ2V0QWNjb3VudCgpLmdldCgpKQorICAgICAgLmRlbGV0ZShuZXcgR2Vycml0Q2FsbGJhY2s8SmF2YVNjcmlwdE9iamVjdD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEphdmFTY3JpcHRPYmplY3QgcmVzdWx0KSB7CisgICAgICAgICAgICByZWxvYWQoKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUFwaS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlQXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkOTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUFwaS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIHN0YXRpYyBtZXRob2RzIHdoaWNoIHdvcmsgb24gdGhlIEdlcnJpdCBSRVNUIEFQSSBmb3Igc3BlY2lmaWMKKyAqIGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFuZ2VBcGkgeworICAvKiogQWJhbmRvbiB0aGUgY2hhbmdlLCBlbmRpbmcgaXRzIHJldmlldy4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFiYW5kb24oaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJhYmFuZG9uIikucG9zdChpbnB1dCwgY2IpOworICB9CisKKyAgLyoqIFJlc3RvcmUgYSBwcmV2aW91c2x5IGFiYW5kb25lZCBjaGFuZ2UgdG8gYmUgb3BlbiBhZ2Fpbi4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlc3RvcmUoaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJyZXN0b3JlIikucG9zdChpbnB1dCwgY2IpOworICB9CisKKyAgLyoqIENyZWF0ZSBhIG5ldyBjaGFuZ2UgdGhhdCByZXZlcnRzIHRoZSBkZWx0YSBjYXVzZWQgYnkgdGhpcyBjaGFuZ2UuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXZlcnQoaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJyZXZlcnQiKS5wb3N0KGlucHV0LCBjYik7CisgIH0KKworICAvKiogVXBkYXRlIHRoZSB0b3BpYyBvZiBhIGNoYW5nZS4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvcGljKGludCBpZCwgU3RyaW5nIHRvcGljLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPFN0cmluZz4gY2IpIHsKKyAgICBSZXN0QXBpIGNhbGwgPSBjYWxsKGlkLCAidG9waWMiKTsKKyAgICB0b3BpYyA9IGVtcHR5VG9OdWxsKHRvcGljKTsKKyAgICBtc2cgPSBlbXB0eVRvTnVsbChtc2cpOworICAgIGlmICh0b3BpYyAhPSBudWxsIHx8IG1zZyAhPSBudWxsKSB7CisgICAgICBJbnB1dCBpbnB1dCA9IElucHV0LmNyZWF0ZSgpOworICAgICAgaW5wdXQudG9waWModG9waWMpOworICAgICAgaW5wdXQubWVzc2FnZShtc2cpOworICAgICAgY2FsbC5wdXQoaW5wdXQsIE5hdGl2ZVN0cmluZy51bndyYXAoY2IpKTsKKyAgICB9IGVsc2UgeworICAgICAgY2FsbC5kZWxldGUoTmF0aXZlU3RyaW5nLnVud3JhcChjYikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXRhaWwoaW50IGlkLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgY2FsbChpZCwgImRldGFpbCIpLmdldChjYik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlc3RBcGkgcmV2aXNpb24oUGF0Y2hTZXQuSWQgaWQpIHsKKyAgICByZXR1cm4gY2hhbmdlKGlkLmdldFBhcmVudEtleSgpLmdldCgpKS52aWV3KCJyZXZpc2lvbnMiKS5pZChpZC5nZXQoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlc3RBcGkgcmV2aWV3ZXJzKGludCBpZCkgeworICAgIHJldHVybiBjaGFuZ2UoaWQpLnZpZXcoInJldmlld2VycyIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXN0QXBpIHJldmlld2VyKGludCBpZCwgaW50IHJldmlld2VyKSB7CisgICAgcmV0dXJuIGNoYW5nZShpZCkudmlldygicmV2aWV3ZXJzIikuaWQocmV2aWV3ZXIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXN0QXBpIHJldmlld2VyKGludCBpZCwgU3RyaW5nIHJldmlld2VyKSB7CisgICAgcmV0dXJuIGNoYW5nZShpZCkudmlldygicmV2aWV3ZXJzIikuaWQocmV2aWV3ZXIpOworICB9CisKKyAgLyoqIFN1Ym1pdCBhIHNwZWNpZmljIHJldmlzaW9uIG9mIGEgY2hhbmdlLiAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc3VibWl0KGludCBpZCwgU3RyaW5nIGNvbW1pdCwgQXN5bmNDYWxsYmFjazxTdWJtaXRJbmZvPiBjYikgeworICAgIFN1Ym1pdElucHV0IGluID0gU3VibWl0SW5wdXQuY3JlYXRlKCk7CisgICAgaW4ud2FpdF9mb3JfbWVyZ2UodHJ1ZSk7CisgICAgY2FsbChpZCwgY29tbWl0LCAic3VibWl0IikucG9zdChpbiwgY2IpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCB0b3BpYyhTdHJpbmcgdCkgLyoteyBpZih0KXRoaXMudG9waWM9dDsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBtZXNzYWdlKFN0cmluZyBtKSAvKi17IGlmKG0pdGhpcy5tZXNzYWdlPW07IH0tKi87CisKKyAgICBzdGF0aWMgSW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChJbnB1dCkgY3JlYXRlT2JqZWN0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIElucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1Ym1pdElucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgd2FpdF9mb3JfbWVyZ2UoYm9vbGVhbiBiKSAvKi17IHRoaXMud2FpdF9mb3JfbWVyZ2U9YjsgfS0qLzsKKworICAgIHN0YXRpYyBTdWJtaXRJbnB1dCBjcmVhdGUoKSB7CisgICAgICByZXR1cm4gKFN1Ym1pdElucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3VibWl0SW5wdXQoKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBjYWxsKGludCBpZCwgU3RyaW5nIGFjdGlvbikgeworICAgIHJldHVybiBjaGFuZ2UoaWQpLnZpZXcoYWN0aW9uKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgY2FsbChpbnQgaWQsIFN0cmluZyBjb21taXQsIFN0cmluZyBhY3Rpb24pIHsKKyAgICByZXR1cm4gY2hhbmdlKGlkKS52aWV3KCJyZXZpc2lvbnMiKS5pZChjb21taXQpLnZpZXcoYWN0aW9uKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgY2hhbmdlKGludCBpZCkgeworICAgIC8vIFRPRE8gU3dpdGNoIHRvIHRyaXBsZXQgcHJvamVjdH5icmFuY2h+aWQgZm9ybWF0IGluIFVSSS4KKyAgICByZXR1cm4gbmV3IFJlc3RBcGkoIi9jaGFuZ2VzLyIpLmlkKFN0cmluZy52YWx1ZU9mKGlkKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eVRvTnVsbChTdHJpbmcgc3RyKSB7CisgICAgcmV0dXJuIHN0ciA9PSBudWxsIHx8IHN0ci5pc0VtcHR5KCkgPyBudWxsIDogc3RyOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCmluZGV4IGQ0Mjk5MmYuLjUwMGYwNmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCkBAIC0zNiw3ICszNiw2IEBACiAgIFN0cmluZyBhbGxBYmFuZG9uZWRDaGFuZ2VzKCk7CiAgIFN0cmluZyBhbGxNZXJnZWRDaGFuZ2VzKCk7CiAKLSAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uSUQoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uU3ViamVjdCgpOwogICBTdHJpbmcgY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpOwogICBTdHJpbmcgY2hhbmdlVGFibGVDb2x1bW5SZXZpZXdlcnMoKTsKQEAgLTQ1LDkgKzQ0LDcgQEAKICAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uTGFzdFVwZGF0ZSgpOwogICBTdHJpbmcgY2hhbmdlVGFibGVOb25lKCk7CiAKLSAgU3RyaW5nIGNoYW5nZVRhYmxlUHJldigpOwotICBTdHJpbmcgY2hhbmdlVGFibGVOZXh0KCk7Ci0gIFN0cmluZyBjaGFuZ2VUYWJsZU9wZW4oKTsKKyAgU3RyaW5nIGNoYW5nZUl0ZW1IZWxwKCk7CiAgIFN0cmluZyBjaGFuZ2VUYWJsZVN0YXIoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlUGFnZVByZXYoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlUGFnZU5leHQoKTsKQEAgLTY2LDYgKzYzLDcgQEAKICAgU3RyaW5nIHBhdGNoVGFibGVEb3dubG9hZFByZUltYWdlKCk7CiAgIFN0cmluZyBwYXRjaFRhYmxlRG93bmxvYWRQb3N0SW1hZ2UoKTsKICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2UoKTsKKyAgU3RyaW5nIGZpbGVDb21tZW50SGVhZGVyKCk7CiAKICAgU3RyaW5nIHBhdGNoVGFibGVQcmV2KCk7CiAgIFN0cmluZyBwYXRjaFRhYmxlTmV4dCgpOwpAQCAtODAsNiArNzgsNyBAQAogICBTdHJpbmcgY2hhbmdlU2NyZWVuRGVwZW5kc09uKCk7CiAgIFN0cmluZyBjaGFuZ2VTY3JlZW5OZWVkZWRCeSgpOwogICBTdHJpbmcgY2hhbmdlU2NyZWVuQ29tbWVudHMoKTsKKyAgU3RyaW5nIGNoYW5nZVNjcmVlbkFkZENvbW1lbnQoKTsKIAogICBTdHJpbmcgYXBwcm92YWxUYWJsZVJldmlld2VyKCk7CiAgIFN0cmluZyBhcHByb3ZhbFRhYmxlQWRkUmV2aWV3ZXIoKTsKQEAgLTkyLDE0ICs5MSwyNCBAQAogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrUHJvamVjdCgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrQnJhbmNoKCk7CiAgIFN0cmluZyBjaGFuZ2VJbmZvQmxvY2tUb3BpYygpOworICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrVG9waWNBbHRlclRvcGljVG9vbFRpcCgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrVXBsb2FkZWQoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja1VwZGF0ZWQoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja1N0YXR1cygpOworICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrU3VibWl0VHlwZSgpOwogICBTdHJpbmcgY2hhbmdlUGVybWFsaW5rKCk7CiAgIFN0cmluZyBjaGFuZ2VJbmZvQmxvY2tDYW5NZXJnZSgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2VZZXMoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja0Nhbk1lcmdlTm8oKTsKIAorICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpYygpOworICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpY0JlZ2luKCk7CisgIFN0cmluZyBidXR0b25BbHRlclRvcGljU2VuZCgpOworICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpY0NhbmNlbCgpOworICBTdHJpbmcgaGVhZGluZ0FsdGVyVG9waWNNZXNzYWdlKCk7CisgIFN0cmluZyBhbHRlclRvcGljVGl0bGUoKTsKKyAgU3RyaW5nIGFsdGVyVG9waWNMYWJlbCgpOworCiAgIFN0cmluZyBpbmNsdWRlZEluVGFibGVCcmFuY2goKTsKICAgU3RyaW5nIGluY2x1ZGVkSW5UYWJsZVRhZygpOwogCkBAIC0xMjIsMTEgKzEzMSwxNSBAQAogICBTdHJpbmcgaGVhZGluZ1JldmVydE1lc3NhZ2UoKTsKICAgU3RyaW5nIHJldmVydENoYW5nZVRpdGxlKCk7CiAKKyAgU3RyaW5nIGhlYWRpbmdFZGl0Q29tbWl0TWVzc2FnZSgpOworICBTdHJpbmcgZWRpdENvbW1pdE1lc3NhZ2VUb29sVGlwKCk7CisgIFN0cmluZyB0aXRsZUVkaXRDb21taXRNZXNzYWdlKCk7CisKICAgU3RyaW5nIGJ1dHRvbkFiYW5kb25DaGFuZ2VCZWdpbigpOwogICBTdHJpbmcgYnV0dG9uQWJhbmRvbkNoYW5nZVNlbmQoKTsKICAgU3RyaW5nIGhlYWRpbmdBYmFuZG9uTWVzc2FnZSgpOwogICBTdHJpbmcgYWJhbmRvbkNoYW5nZVRpdGxlKCk7Ci0gIFN0cmluZyBvbGRWZXJzaW9uSGlzdG9yeSgpOworICBTdHJpbmcgcmVmZXJlbmNlVmVyc2lvbigpOwogICBTdHJpbmcgYmFzZURpZmZJdGVtKCk7CiAgIFN0cmluZyBhdXRvTWVyZ2UoKTsKIApAQCAtMTU2LDYgKzE2OSw2IEBACiAgIFN0cmluZyBzdWJtaXRGYWlsZWQoKTsKICAgU3RyaW5nIGJ1dHRvbkNsb3NlKCk7CiAKLSAgU3RyaW5nIGJ1dHRvbkRpZmZBbGxTaWRlQnlTaWRlKCk7Ci0gIFN0cmluZyBidXR0b25EaWZmQWxsVW5pZmllZCgpOworICBTdHJpbmcgZGlmZkFsbFNpZGVCeVNpZGUoKTsKKyAgU3RyaW5nIGRpZmZBbGxVbmlmaWVkKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDb25zdGFudHMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IDhjZWI3NGMuLjA2YmQ2NGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw2IEBACiBhbGxBYmFuZG9uZWRDaGFuZ2VzID0gQWxsIGFiYW5kb25lZCBjaGFuZ2VzCiBhbGxNZXJnZWRDaGFuZ2VzID0gQWxsIG1lcmdlZCBjaGFuZ2VzCiAKLWNoYW5nZVRhYmxlQ29sdW1uSUQgPSBJRAogY2hhbmdlVGFibGVDb2x1bW5TdWJqZWN0ID0gU3ViamVjdAogY2hhbmdlVGFibGVDb2x1bW5Pd25lciA9IE93bmVyCiBjaGFuZ2VUYWJsZUNvbHVtblJldmlld2VycyA9IFJldmlld2VycwpAQCAtMjUsOSArMjQsNyBAQAogY2hhbmdlVGFibGVDb2x1bW5MYXN0VXBkYXRlID0gVXBkYXRlZAogY2hhbmdlVGFibGVOb25lID0gKE5vbmUpCiAKLWNoYW5nZVRhYmxlUHJldiA9IFByZXZpb3VzIGNoYW5nZQotY2hhbmdlVGFibGVOZXh0ID0gTmV4dCBjaGFuZ2UKLWNoYW5nZVRhYmxlT3BlbiA9IE9wZW4gY2hhbmdlCitjaGFuZ2VJdGVtSGVscCA9IGNoYW5nZQogY2hhbmdlVGFibGVTdGFyID0gU3RhciAob3IgdW5zdGFyKSBjaGFuZ2UKIGNoYW5nZVRhYmxlUGFnZVByZXYgPSBQcmV2aW91cyBwYWdlIG9mIGNoYW5nZXMKIGNoYW5nZVRhYmxlUGFnZU5leHQgPSBOZXh0IHBhZ2Ugb2YgY2hhbmdlcwpAQCAtNDYsNiArNDMsNyBAQAogcGF0Y2hUYWJsZURvd25sb2FkUHJlSW1hZ2UgPSBvbGQKIHBhdGNoVGFibGVEb3dubG9hZFBvc3RJbWFnZSA9IG5ldwogY29tbWl0TWVzc2FnZSA9IENvbW1pdCBNZXNzYWdlCitmaWxlQ29tbWVudEhlYWRlciA9IEZpbGUgQ29tbWVudDoKIAogcGF0Y2hUYWJsZVByZXYgPSBQcmV2aW91cyBmaWxlCiBwYXRjaFRhYmxlTmV4dCA9IE5leHQgZmlsZQpAQCAtNTcsNiArNTUsNyBAQAogY2hhbmdlU2NyZWVuRGVwZW5kc09uID0gRGVwZW5kcyBPbgogY2hhbmdlU2NyZWVuTmVlZGVkQnkgPSBOZWVkZWQgQnkKIGNoYW5nZVNjcmVlbkNvbW1lbnRzID0gQ29tbWVudHMKK2NoYW5nZVNjcmVlbkFkZENvbW1lbnQgPSBBZGQgQ29tbWVudAogCiBhcHByb3ZhbFRhYmxlUmV2aWV3ZXIgPSBSZXZpZXdlcgogYXBwcm92YWxUYWJsZUFkZFJldmlld2VyID0gQWRkIFJldmlld2VyCkBAIC02OSwxNCArNjgsMjQgQEAKIGNoYW5nZUluZm9CbG9ja1Byb2plY3QgPSBQcm9qZWN0CiBjaGFuZ2VJbmZvQmxvY2tCcmFuY2ggPSBCcmFuY2gKIGNoYW5nZUluZm9CbG9ja1RvcGljID0gVG9waWMKK2NoYW5nZUluZm9CbG9ja1RvcGljQWx0ZXJUb3BpY1Rvb2xUaXAgPSBFZGl0IFRvcGljCiBjaGFuZ2VJbmZvQmxvY2tVcGxvYWRlZCA9IFVwbG9hZGVkCiBjaGFuZ2VJbmZvQmxvY2tVcGRhdGVkID0gVXBkYXRlZAogY2hhbmdlSW5mb0Jsb2NrU3RhdHVzID0gU3RhdHVzCitjaGFuZ2VJbmZvQmxvY2tTdWJtaXRUeXBlID0gU3VibWl0IFR5cGUKIGNoYW5nZVBlcm1hbGluayA9IFBlcm1hbGluawogY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2UgPSBDYW4gTWVyZ2UKIGNoYW5nZUluZm9CbG9ja0Nhbk1lcmdlWWVzID0gWWVzCiBjaGFuZ2VJbmZvQmxvY2tDYW5NZXJnZU5vID0gTm8KIAorYnV0dG9uQWx0ZXJUb3BpYyA9IEVkaXQgVG9waWMKK2J1dHRvbkFsdGVyVG9waWNCZWdpbiA9IEVkaXQgVG9waWMKK2J1dHRvbkFsdGVyVG9waWNTZW5kID0gVXBkYXRlIFRvcGljCitidXR0b25BbHRlclRvcGljQ2FuY2VsID0gQ2FuY2VsCitoZWFkaW5nQWx0ZXJUb3BpY01lc3NhZ2UgPSBFZGl0IFRvcGljIE1lc3NhZ2U6CithbHRlclRvcGljVGl0bGUgPSBDb2RlIFJldmlldyAtIEVkaXQgVG9waWMKK2FsdGVyVG9waWNMYWJlbCA9IE5ldyBUb3BpYyBOYW1lOgorCiBpbmNsdWRlZEluVGFibGVCcmFuY2ggPSBCcmFuY2ggTmFtZQogaW5jbHVkZWRJblRhYmxlVGFnID0gVGFnIE5hbWUKIApAQCAtOTYsNyArMTA1LDcgQEAKIGJ1dHRvbkFiYW5kb25DaGFuZ2VTZW5kID0gQWJhbmRvbiBDaGFuZ2UKIGhlYWRpbmdBYmFuZG9uTWVzc2FnZSA9IEFiYW5kb24gTWVzc2FnZToKIGFiYW5kb25DaGFuZ2VUaXRsZSA9IENvZGUgUmV2aWV3IC0gQWJhbmRvbiBDaGFuZ2UKLW9sZFZlcnNpb25IaXN0b3J5ID0gT2xkIFZlcnNpb24gSGlzdG9yeToKK3JlZmVyZW5jZVZlcnNpb24gPSBSZWZlcmVuY2UgVmVyc2lvbjoKIGJhc2VEaWZmSXRlbSA9IEJhc2UKIGF1dG9NZXJnZSA9IEF1dG8gTWVyZ2UKIApAQCAtMTA3LDYgKzExNiwxMCBAQAogaGVhZGluZ1JldmVydE1lc3NhZ2UgPSBSZXZlcnQgQ29tbWl0IE1lc3NhZ2U6CiByZXZlcnRDaGFuZ2VUaXRsZSA9IENvZGUgUmV2aWV3IC0gUmV2ZXJ0IE1lcmdlZCBDaGFuZ2UKIAoraGVhZGluZ0VkaXRDb21taXRNZXNzYWdlID0gQ29tbWl0IE1lc3NhZ2UKK2VkaXRDb21taXRNZXNzYWdlVG9vbFRpcCA9IEVkaXQgQ29tbWl0IE1lc3NhZ2UKK3RpdGxlRWRpdENvbW1pdE1lc3NhZ2UgPSBDcmVhdGUgTmV3IFBhdGNoIFNldAorCiBidXR0b25SZXN0b3JlQ2hhbmdlQmVnaW4gPSBSZXN0b3JlIENoYW5nZQogcmVzdG9yZUNoYW5nZVRpdGxlID0gQ29kZSBSZXZpZXcgLSBSZXN0b3JlIENoYW5nZQogaGVhZGluZ1Jlc3RvcmVNZXNzYWdlID0gUmVzdG9yZSBNZXNzYWdlOgpAQCAtMTM3LDUgKzE1MCw1IEBACiBzdWJtaXRGYWlsZWQgPSBTdWJtaXQgRmFpbGVkCiBidXR0b25DbG9zZSA9IENsb3NlCiAKLWJ1dHRvbkRpZmZBbGxTaWRlQnlTaWRlID0gRGlmZiBBbGwgU2lkZS1ieS1TaWRlCi1idXR0b25EaWZmQWxsVW5pZmllZCA9IERpZmYgQWxsIFVuaWZpZWQKK2RpZmZBbGxTaWRlQnlTaWRlID0gQWxsIFNpZGUtYnktU2lkZQorZGlmZkFsbFVuaWZpZWQgPSBBbGwgVW5pZmllZApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGVzY3JpcHRpb25CbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGVzY3JpcHRpb25CbG9jay5qYXZhCmluZGV4IGM4YjJhNjYuLjVjZDZjZGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZURlc2NyaXB0aW9uQmxvY2suamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VEZXNjcmlwdGlvbkJsb2NrLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFR5cGVSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKQEAgLTM1LDkgKzM2LDExIEBACiAgICAgaW5pdFdpZGdldChocCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBkaXNwbGF5KENoYW5nZSBjaGcsIEJvb2xlYW4gc3RhcnJlZCwgUGF0Y2hTZXRJbmZvIGluZm8sCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjYykgewotICAgIGluZm9CbG9jay5kaXNwbGF5KGNoZywgYWNjKTsKLSAgICBtZXNzYWdlQmxvY2suZGlzcGxheShjaGcuZ2V0SWQoKSwgc3RhcnJlZCwgaW5mby5nZXRNZXNzYWdlKCkpOworICBwdWJsaWMgdm9pZCBkaXNwbGF5KENoYW5nZSBjaGcsIEJvb2xlYW4gc3RhcnJlZCwgQm9vbGVhbiBjYW5FZGl0Q29tbWl0TWVzc2FnZSwKKyAgICAgIFBhdGNoU2V0SW5mbyBpbmZvLAorICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZSBhY2MsIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgeworICAgIGluZm9CbG9jay5kaXNwbGF5KGNoZywgYWNjLCBzdWJtaXRUeXBlUmVjb3JkKTsKKyAgICBtZXNzYWdlQmxvY2suZGlzcGxheShjaGcuY3VycmVudFBhdGNoU2V0SWQoKSwgc3RhcnJlZCwKKyAgICAgIGNhbkVkaXRDb21taXRNZXNzYWdlLCAgaW5mby5nZXRNZXNzYWdlKCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VJbmZvLmphdmEKaW5kZXggMGM4ZTAzZS4uMDA2OTNkOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mby5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUluZm8uamF2YQpAQCAtMTQsMTcgKzE0LDI4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXlTdHJpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5pbXBsLnNlci5KYXZhU3FsVGltZXN0YW1wX0pzb25TZXJpYWxpemVyOwogCiBpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBDaGFuZ2VJbmZvIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoKSB7CisgICAgaWYgKGxhYmVsczAoKSAhPSBudWxsKSB7CisgICAgICBsYWJlbHMwKCkuY29weUtleXNJbnRvQ2hpbGRyZW4oIl9uYW1lIik7CisgICAgfQorICB9CisKICAgcHVibGljIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0X25hbWVfa2V5KCkgewogICAgIHJldHVybiBuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3QoKSk7CiAgIH0KQEAgLTUwLDcgKzYxLDcgQEAKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaWRfYWJicmV2aWF0ZWQoKSB7Ci0gICAgcmV0dXJuIG5ldyBDaGFuZ2UuS2V5KGlkKCkpLmFiYnJldmlhdGUoKTsKKyAgICByZXR1cm4gbmV3IENoYW5nZS5LZXkoY2hhbmdlX2lkKCkpLmFiYnJldmlhdGUoKTsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBDaGFuZ2UuU3RhdHVzIHN0YXR1cygpIHsKQEAgLTU4LDEzICs2OSwxNSBAQAogICB9CiAKICAgcHVibGljIGZpbmFsIFNldDxTdHJpbmc+IGxhYmVscygpIHsKLSAgICByZXR1cm4gTmF0aXZlcy5rZXlzKGxhYmVsczAoKSk7CisgICAgcmV0dXJuIGxhYmVsczAoKS5rZXlTZXQoKTsKICAgfQogCisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGlkKCkgLyoteyByZXR1cm4gdGhpcy5pZDsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgcHJvamVjdCgpIC8qLXsgcmV0dXJuIHRoaXMucHJvamVjdDsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgYnJhbmNoKCkgLyoteyByZXR1cm4gdGhpcy5icmFuY2g7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHRvcGljKCkgLyoteyByZXR1cm4gdGhpcy50b3BpYzsgfS0qLzsKLSAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgaWQoKSAvKi17IHJldHVybiB0aGlzLmlkOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBjaGFuZ2VfaWQoKSAvKi17IHJldHVybiB0aGlzLmNoYW5nZV9pZDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIG1lcmdlYWJsZSgpIC8qLXsgcmV0dXJuIHRoaXMubWVyZ2VhYmxlOyB9LSovOwogICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgc3RhdHVzUmF3KCkgLyoteyByZXR1cm4gdGhpcy5zdGF0dXM7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHN1YmplY3QoKSAvKi17IHJldHVybiB0aGlzLnN1YmplY3Q7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgQWNjb3VudEluZm8gb3duZXIoKSAvKi17IHJldHVybiB0aGlzLm93bmVyOyB9LSovOwpAQCAtNzMsOCArODYsMjIgQEAKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHN0YXJyZWQoKSAvKi17IHJldHVybiB0aGlzLnN0YXJyZWQgPyB0cnVlIDogZmFsc2U7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiByZXZpZXdlZCgpIC8qLXsgcmV0dXJuIHRoaXMucmV2aWV3ZWQgPyB0cnVlIDogZmFsc2U7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIF9zb3J0a2V5KCkgLyoteyByZXR1cm4gdGhpcy5fc29ydGtleTsgfS0qLzsKLSAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgSmF2YVNjcmlwdE9iamVjdCBsYWJlbHMwKCkgLyoteyByZXR1cm4gdGhpcy5sYWJlbHM7IH0tKi87CisgIHByaXZhdGUgZmluYWwgbmF0aXZlIE5hdGl2ZU1hcDxMYWJlbEluZm8+IGxhYmVsczAoKSAvKi17IHJldHVybiB0aGlzLmxhYmVsczsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBMYWJlbEluZm8gbGFiZWwoU3RyaW5nIG4pIC8qLXsgcmV0dXJuIHRoaXMubGFiZWxzW25dOyB9LSovOworCisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBoYXNfcGVybWl0dGVkX2xhYmVscygpCisgIC8qLXsgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoJ3Blcm1pdHRlZF9sYWJlbHMnKSB9LSovOworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBOYXRpdmVNYXA8SmF2YVNjcmlwdE9iamVjdD4gX3Blcm1pdHRlZF9sYWJlbHMoKQorICAvKi17IHJldHVybiB0aGlzLnBlcm1pdHRlZF9sYWJlbHM7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBwZXJtaXR0ZWRfbGFiZWxzKCkgeworICAgIHJldHVybiBOYXRpdmVzLmtleXMoX3Blcm1pdHRlZF9sYWJlbHMoKSk7CisgIH0KKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBKc0FycmF5U3RyaW5nIHBlcm1pdHRlZF92YWx1ZXMoU3RyaW5nIG4pCisgIC8qLXsgcmV0dXJuIHRoaXMucGVybWl0dGVkX2xhYmVsc1tuXTsgfS0qLzsKKworICBwdWJsaWMgZmluYWwgbmF0aXZlIEpzQXJyYXk8QWNjb3VudEluZm8+IHJlbW92YWJsZV9yZXZpZXdlcnMoKQorICAvKi17IHJldHVybiB0aGlzLnJlbW92YWJsZV9yZXZpZXdlcnM7IH0tKi87CisKICAgZmluYWwgbmF0aXZlIGludCBfbnVtYmVyKCkgLyoteyByZXR1cm4gdGhpcy5fbnVtYmVyOyB9LSovOwogICBmaW5hbCBuYXRpdmUgYm9vbGVhbiBfbW9yZV9jaGFuZ2VzKCkKICAgLyoteyByZXR1cm4gdGhpcy5fbW9yZV9jaGFuZ2VzID8gdHJ1ZSA6IGZhbHNlOyB9LSovOwpAQCAtODIsMTMgKzEwOSw2IEBACiAgIHByb3RlY3RlZCBDaGFuZ2VJbmZvKCkgewogICB9CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBBY2NvdW50SW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgewotICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hbWUoKSAvKi17IHJldHVybiB0aGlzLm5hbWU7IH0tKi87Ci0KLSAgICBwcm90ZWN0ZWQgQWNjb3VudEluZm8oKSB7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYWJlbEluZm8gZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKICAgICBwdWJsaWMgZmluYWwgU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cyBzdGF0dXMoKSB7CiAgICAgICBpZiAoYXBwcm92ZWQoKSAhPSBudWxsKSB7CkBAIC0xMDgsNiArMTI4LDE2IEBACiAKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEFjY291bnRJbmZvIHJlY29tbWVuZGVkKCkgLyoteyByZXR1cm4gdGhpcy5yZWNvbW1lbmRlZDsgfS0qLzsKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEFjY291bnRJbmZvIGRpc2xpa2VkKCkgLyoteyByZXR1cm4gdGhpcy5kaXNsaWtlZDsgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgSnNBcnJheTxBcHByb3ZhbEluZm8+IGFsbCgpIC8qLXsgcmV0dXJuIHRoaXMuYWxsOyB9LSovOworCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgTmF0aXZlTWFwPE5hdGl2ZVN0cmluZz4gX3ZhbHVlcygpIC8qLXsgcmV0dXJuIHRoaXMudmFsdWVzOyB9LSovOworCisgICAgcHVibGljIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcygpIHsKKyAgICAgIHJldHVybiBOYXRpdmVzLmtleXMoX3ZhbHVlcygpKTsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgdmFsdWVfdGV4dChTdHJpbmcgbikgLyoteyByZXR1cm4gdGhpcy52YWx1ZXNbbl07IH0tKi87CisKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gb3B0aW9uYWwoKSAvKi17IHJldHVybiB0aGlzLm9wdGlvbmFsID8gdHJ1ZSA6IGZhbHNlOyB9LSovOwogICAgIGZpbmFsIG5hdGl2ZSBzaG9ydCBfdmFsdWUoKQogICAgIC8qLXsKQEAgLTEyMCw0ICsxNTAsMTIgQEAKICAgICBwcm90ZWN0ZWQgTGFiZWxJbmZvKCkgewogICAgIH0KICAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwcm92YWxJbmZvIGV4dGVuZHMgQWNjb3VudEluZm8geworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBoYXNfdmFsdWUoKSAvKi17IHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KCd2YWx1ZScpOyB9LSovOworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgc2hvcnQgdmFsdWUoKSAvKi17IHJldHVybiB0aGlzLnZhbHVlOyB9LSovOworCisgICAgcHJvdGVjdGVkIEFwcHJvdmFsSW5mbygpIHsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUluZm9CbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKaW5kZXggM2ZmYWNjMy4uZTRkYmMzMiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKQEAgLTE3LDE1ICsxNywzMSBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbC5tZWRpdW1Gb3JtYXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Qcm9qZWN0TGluazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3RTZWFyY2hMaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm9DYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0VHlwZVJlY29yZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIAogcHVibGljIGNsYXNzIENoYW5nZUluZm9CbG9jayBleHRlbmRzIENvbXBvc2l0ZSB7CkBAIC0zNiw5ICs1MiwxMCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9UT1BJQyA9IDQ7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1VQTE9BREVEID0gNTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJfVVBEQVRFRCA9IDY7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1NUQVRVUyA9IDc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX01FUkdFX1RFU1QgPSA4OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9DTlQgPSA5OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9TVUJNSVRfVFlQRSA9IDc7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1NUQVRVUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX01FUkdFX1RFU1QgPSA5OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9DTlQgPSAxMDsKIAogICBwcml2YXRlIGZpbmFsIEdyaWQgdGFibGU7CiAKQEAgLTU5LDYgKzc2LDcgQEAKICAgICBpbml0Um93KFJfVVBMT0FERUQsIFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tVcGxvYWRlZCgpKTsKICAgICBpbml0Um93KFJfVVBEQVRFRCwgVXRpbC5DLmNoYW5nZUluZm9CbG9ja1VwZGF0ZWQoKSk7CiAgICAgaW5pdFJvdyhSX1NUQVRVUywgVXRpbC5DLmNoYW5nZUluZm9CbG9ja1N0YXR1cygpKTsKKyAgICBpbml0Um93KFJfU1VCTUlUX1RZUEUsIFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tTdWJtaXRUeXBlKCkpOwogICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkudGVzdENoYW5nZU1lcmdlKCkpIHsKICAgICAgIGluaXRSb3coUl9NRVJHRV9URVNULCBVdGlsLkMuY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2UoKSk7CiAgICAgfQpAQCAtNzcsNyArOTUsOCBAQAogICAgIHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5hZGRTdHlsZU5hbWUocm93LCAwLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmhlYWRlcigpKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgQ2hhbmdlIGNoZywgZmluYWwgQWNjb3VudEluZm9DYWNoZSBhY2MpIHsKKyAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBDaGFuZ2UgY2hnLCBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjYywKKyAgICAgIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgewogICAgIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGRzdCA9IGNoZy5nZXREZXN0KCk7CiAKICAgICBDb3B5YWJsZUxhYmVsIGNoYW5nZUlkTGFiZWwgPQpAQCAtODYsMTQgKzEwNSwyNyBAQAogICAgIHRhYmxlLnNldFdpZGdldChSX0NIQU5HRV9JRCwgMSwgY2hhbmdlSWRMYWJlbCk7CiAKICAgICB0YWJsZS5zZXRXaWRnZXQoUl9PV05FUiwgMSwgQWNjb3VudExpbmsubGluayhhY2MsIGNoZy5nZXRPd25lcigpKSk7Ci0gICAgdGFibGUuc2V0V2lkZ2V0KFJfUFJPSkVDVCwgMSwgbmV3IFByb2plY3RMaW5rKGNoZy5nZXRQcm9qZWN0KCksIGNoZy5nZXRTdGF0dXMoKSkpOworCisgICAgZmluYWwgRmxvd1BhbmVsIHAgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgcC5hZGQobmV3IFByb2plY3RTZWFyY2hMaW5rKGNoZy5nZXRQcm9qZWN0KCkpKTsKKyAgICBwLmFkZChuZXcgSW5saW5lSHlwZXJsaW5rKGNoZy5nZXRQcm9qZWN0KCkuZ2V0KCksCisgICAgICAgIFBhZ2VMaW5rcy50b1Byb2plY3QoY2hnLmdldFByb2plY3QoKSkpKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQoUl9QUk9KRUNULCAxLCBwKTsKKwogICAgIHRhYmxlLnNldFdpZGdldChSX0JSQU5DSCwgMSwgbmV3IEJyYW5jaExpbmsoZHN0LmdldFNob3J0TmFtZSgpLCBjaGcKICAgICAgICAgLmdldFByb2plY3QoKSwgY2hnLmdldFN0YXR1cygpLCBkc3QuZ2V0KCksIG51bGwpKTsKLSAgICB0YWJsZS5zZXRXaWRnZXQoUl9UT1BJQywgMSwgbmV3IEJyYW5jaExpbmsoY2hnLmdldFRvcGljKCksCi0gICAgICAgIGNoZy5nZXRQcm9qZWN0KCksIGNoZy5nZXRTdGF0dXMoKSwgZHN0LmdldCgpLCBjaGcuZ2V0VG9waWMoKSkpOworICAgIHRhYmxlLnNldFdpZGdldChSX1RPUElDLCAxLCB0b3BpYyhjaGcpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfVVBMT0FERUQsIDEsIG1lZGl1bUZvcm1hdChjaGcuZ2V0Q3JlYXRlZE9uKCkpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfVVBEQVRFRCwgMSwgbWVkaXVtRm9ybWF0KGNoZy5nZXRMYXN0VXBkYXRlZE9uKCkpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfU1RBVFVTLCAxLCBVdGlsLnRvTG9uZ1N0cmluZyhjaGcuZ2V0U3RhdHVzKCkpKTsKKyAgICBTdHJpbmcgc3VibWl0VHlwZTsKKyAgICBpZiAoc3VibWl0VHlwZVJlY29yZC5zdGF0dXMgPT0gU3VibWl0VHlwZVJlY29yZC5TdGF0dXMuT0spIHsKKyAgICAgIHN1Ym1pdFR5cGUgPSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uVXRpbAorICAgICAgICAgICAgICAudG9Mb25nU3RyaW5nKHN1Ym1pdFR5cGVSZWNvcmQudHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN1Ym1pdFR5cGUgPSBzdWJtaXRUeXBlUmVjb3JkLnN0YXR1cy5uYW1lKCk7CisgICAgfQorICAgIHRhYmxlLnNldFRleHQoUl9TVUJNSVRfVFlQRSwgMSwgc3VibWl0VHlwZSk7CiAgICAgZmluYWwgQ2hhbmdlLlN0YXR1cyBzdGF0dXMgPSBjaGcuZ2V0U3RhdHVzKCk7CiAgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS50ZXN0Q2hhbmdlTWVyZ2UoKSkgewogICAgICAgaWYgKHN0YXR1cy5lcXVhbHMoQ2hhbmdlLlN0YXR1cy5ORVcpIHx8IHN0YXR1cy5lcXVhbHMoQ2hhbmdlLlN0YXR1cy5EUkFGVCkpIHsKQEAgLTEwNyw4ICsxMzksOTIgQEAKIAogICAgIGlmIChzdGF0dXMuaXNDbG9zZWQoKSkgewogICAgICAgdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpLmFkZFN0eWxlTmFtZShSX1NUQVRVUywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jbG9zZWRzdGF0ZSgpKTsKKyAgICAgIHRhYmxlLmdldFJvd0Zvcm1hdHRlcigpLnNldFZpc2libGUoUl9TVUJNSVRfVFlQRSwgZmFsc2UpOwogICAgIH0gZWxzZSB7CiAgICAgICB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCkucmVtb3ZlU3R5bGVOYW1lKFJfU1RBVFVTLCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNsb3NlZHN0YXRlKCkpOworICAgICAgdGFibGUuZ2V0Um93Rm9ybWF0dGVyKCkuc2V0VmlzaWJsZShSX1NVQk1JVF9UWVBFLCB0cnVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgV2lkZ2V0IHRvcGljKGZpbmFsIENoYW5nZSBjaGcpIHsKKyAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBkc3QgPSBjaGcuZ2V0RGVzdCgpOworCisgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgIGZwLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZUluZm9Ub3BpY1BhbmVsKCkpOworICAgIGZwLmFkZChuZXcgQnJhbmNoTGluayhjaGcuZ2V0VG9waWMoKSwgY2hnLmdldFByb2plY3QoKSwgY2hnLmdldFN0YXR1cygpLAorICAgICAgICAgICBkc3QuZ2V0KCksIGNoZy5nZXRUb3BpYygpKSk7CisKKyAgICBDaGFuZ2VEZXRhaWxDYWNoZSBkZXRhaWxDYWNoZSA9IENoYW5nZUNhY2hlLmdldChjaGcuZ2V0SWQoKSkuZ2V0Q2hhbmdlRGV0YWlsQ2FjaGUoKTsKKyAgICBDaGFuZ2VEZXRhaWwgY2hhbmdlRGV0YWlsID0gZGV0YWlsQ2FjaGUuZ2V0KCk7CisKKyAgICBpZiAoY2hhbmdlRGV0YWlsLmNhbkVkaXRUb3BpY05hbWUoKSkgeworICAgICAgZmluYWwgSW1hZ2UgZWRpdCA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmVkaXQoKSk7CisgICAgICBlZGl0LmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmsoKSk7CisgICAgICBlZGl0LnNldFRpdGxlKFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tUb3BpY0FsdGVyVG9waWNUb29sVGlwKCkpOworICAgICAgZWRpdC5hZGRDbGlja0hhbmRsZXIobmV3ICBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICBuZXcgQWx0ZXJUb3BpY0RpYWxvZyhjaGcpLmNlbnRlcigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGZwLmFkZChlZGl0KTsKKyAgICB9CisKKyAgICByZXR1cm4gZnA7CisgIH0KKworICBwcml2YXRlIGNsYXNzIEFsdGVyVG9waWNEaWFsb2cgZXh0ZW5kcyBDb21tZW50ZWRBY3Rpb25EaWFsb2c8Q2hhbmdlRGV0YWlsPgorICAgICAgaW1wbGVtZW50cyBLZXlQcmVzc0hhbmRsZXIgeworICAgIFRleHRCb3ggbmV3VG9waWM7CisgICAgQ2hhbmdlIGNoYW5nZTsKKworICAgIEFsdGVyVG9waWNEaWFsb2coQ2hhbmdlIGNoZykgeworICAgICAgc3VwZXIoVXRpbC5DLmFsdGVyVG9waWNUaXRsZSgpLCBVdGlsLkMuaGVhZGluZ0FsdGVyVG9waWNNZXNzYWdlKCksCisgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLklnbm9yZUVycm9yQ2FsbGJhY2soKSk7CisgICAgICBjaGFuZ2UgPSBjaGc7CisKKyAgICAgIG5ld1RvcGljID0gbmV3IFRleHRCb3goKTsKKyAgICAgIG5ld1RvcGljLmFkZEtleVByZXNzSGFuZGxlcih0aGlzKTsKKyAgICAgIHNldEZvY3VzT24obmV3VG9waWMpOworICAgICAgcGFuZWwuaW5zZXJ0KG5ld1RvcGljLCAwKTsKKyAgICAgIHBhbmVsLmluc2VydChuZXcgSW5saW5lTGFiZWwoVXRpbC5DLmFsdGVyVG9waWNMYWJlbCgpKSwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgICAgc3VwZXIub25Mb2FkKCk7CisgICAgICBuZXdUb3BpYy5zZXRUZXh0KGNoYW5nZS5nZXRUb3BpYygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ub3BpY0VkaXQoKSB7CisgICAgICBTdHJpbmcgdG9waWMgPSBuZXdUb3BpYy5nZXRUZXh0KCk7CisgICAgICBDaGFuZ2VBcGkudG9waWMoY2hhbmdlLmdldElkKCkuZ2V0KCksIHRvcGljLCBnZXRNZXNzYWdlVGV4dCgpLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgICAgc2VudCA9IHRydWU7CisgICAgICAgICAgR2Vycml0LmRpc3BsYXkoUGFnZUxpbmtzLnRvQ2hhbmdlKGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICAgICAgaGlkZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgZW5hYmxlQnV0dG9ucyh0cnVlKTsKKyAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgfX0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2VuZCgpIHsKKyAgICAgIGRvVG9waWNFZGl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25LZXlQcmVzcyhLZXlQcmVzc0V2ZW50IGV2ZW50KSB7CisgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gbmV3VG9waWMKKyAgICAgICAgICAmJiBldmVudC5nZXROYXRpdmVFdmVudCgpLmdldEtleUNvZGUoKSA9PSBLZXlDb2Rlcy5LRVlfRU5URVIpIHsKKyAgICAgICAgZG9Ub3BpY0VkaXQoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUxpc3QuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUxpc3QuamF2YQppbmRleCA1NjBlNmIzLi43YzQxZWExIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VMaXN0LmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTGlzdC5qYXZhCkBAIC0xNCwyOCArMTQsMjggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIAogLyoqIExpc3Qgb2YgY2hhbmdlcyBhdmFpbGFibGUgZnJvbSB7QGNvZGUgL2NoYW5nZXMvfS4gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VMaXN0IGV4dGVuZHMgTmF0aXZlTGlzdDxDaGFuZ2VJbmZvPiB7CitwdWJsaWMgY2xhc3MgQ2hhbmdlTGlzdCBleHRlbmRzIEpzQXJyYXk8Q2hhbmdlSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gIi9jaGFuZ2VzLyI7CiAKICAgLyoqIFJ1biAyIG9yIG1vcmUgcXVlcmllcyBpbiBhIHNpbmdsZSByZW1vdGUgaW52b2NhdGlvbi4gKi8KICAgcHVibGljIHN0YXRpYyB2b2lkIHF1ZXJ5KAotICAgICAgQXN5bmNDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+PiBjYWxsYmFjaywgU3RyaW5nLi4uIHF1ZXJpZXMpIHsKKyAgICAgIEFzeW5jQ2FsbGJhY2s8SnNBcnJheTxDaGFuZ2VMaXN0Pj4gY2FsbGJhY2ssIFN0cmluZy4uLiBxdWVyaWVzKSB7CiAgICAgYXNzZXJ0IHF1ZXJpZXMubGVuZ3RoID49IDI7IC8vIEF0IGxlYXN0IDIgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgcmVzdWx0LgogICAgIFJlc3RBcGkgY2FsbCA9IG5ldyBSZXN0QXBpKFVSSSk7CiAgICAgZm9yIChTdHJpbmcgcSA6IHF1ZXJpZXMpIHsKICAgICAgIGNhbGwuYWRkUGFyYW1ldGVyUmF3KCJxIiwgS2V5VXRpbC5lbmNvZGUocSkpOwogICAgIH0KICAgICBhZGRPcHRpb25zKGNhbGwsIExpc3RDaGFuZ2VzT3B0aW9uLkxBQkVMUyk7Ci0gICAgY2FsbC5zZW5kKGNhbGxiYWNrKTsKKyAgICBjYWxsLmdldChjYWxsYmFjayk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgcHJldihTdHJpbmcgcXVlcnksCkBAIC00OSw3ICs0OSw3IEBACiAgICAgaWYgKCFQYWdlZFNpbmdsZUxpc3RTY3JlZW4uTUlOX1NPUlRLRVkuZXF1YWxzKHNvcnRrZXkpKSB7CiAgICAgICBjYWxsLmFkZFBhcmFtZXRlcigiUCIsIHNvcnRrZXkpOwogICAgIH0KLSAgICBjYWxsLnNlbmQoY2FsbGJhY2spOworICAgIGNhbGwuZ2V0KGNhbGxiYWNrKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBuZXh0KFN0cmluZyBxdWVyeSwKQEAgLTYzLDcgKzYzLDcgQEAKICAgICBpZiAoIVBhZ2VkU2luZ2xlTGlzdFNjcmVlbi5NQVhfU09SVEtFWS5lcXVhbHMoc29ydGtleSkpIHsKICAgICAgIGNhbGwuYWRkUGFyYW1ldGVyKCJOIiwgc29ydGtleSk7CiAgICAgfQotICAgIGNhbGwuc2VuZChjYWxsYmFjayk7CisgICAgY2FsbC5nZXQoY2FsbGJhY2spOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRPcHRpb25zKApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZU1lc3NhZ2VzLmphdmEKaW5kZXggNGJkMDgyOC4uYmE0NjcwMiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5qYXZhCkBAIC01Niw2ICs1Niw0IEBACiAgIFN0cmluZyBncm91cElzTm90QWxsb3dlZChTdHJpbmcgZ3JvdXApOwogICBTdHJpbmcgZ3JvdXBIYXNUb29NYW55TWVtYmVycyhTdHJpbmcgZ3JvdXApOwogICBTdHJpbmcgZ3JvdXBNYW55TWVtYmVyc0NvbmZpcm1hdGlvbihTdHJpbmcgZ3JvdXAsIGludCBtZW1iZXJDb3VudCk7Ci0KLSAgU3RyaW5nIGFub255bW91c0Rvd25sb2FkKFN0cmluZyBwcm90b2NvbCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcwppbmRleCAyNDQ5NjEzLi5mZmE3NDlkIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZU1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsMyArMSw1IEBACisjIENoYW5nZXMgdG8gdGhpcyBmaWxlIHNob3VsZCBhbHNvIGJlIG1hZGUgaW4KKyMgZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCiBhY2NvdW50RGFzaGJvYXJkVGl0bGUgPSBDb2RlIFJldmlldyBEYXNoYm9hcmQgZm9yIHswfQogY2hhbmdlc09wZW5JblByb2plY3QgPSBPcGVuIENoYW5nZXMgSW4gezB9CiBjaGFuZ2VzTWVyZ2VkSW5Qcm9qZWN0ID0gTWVyZ2VkIENoYW5nZXMgSW4gezB9CkBAIC0zNyw1ICszOSwzIEBACiBncm91cElzTm90QWxsb3dlZCA9ICBUaGUgZ3JvdXAgezB9IGNhbm5vdCBiZSBhZGRlZCBhcyByZXZpZXdlci4KIGdyb3VwSGFzVG9vTWFueU1lbWJlcnMgPSBUaGUgZ3JvdXAgezB9IGhhcyB0b28gbWFueSBtZW1iZXJzIHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnMuCiBncm91cE1hbnlNZW1iZXJzQ29uZmlybWF0aW9uID0gVGhlIGdyb3VwIHswfSBoYXMgezF9IG1lbWJlcnMuIERvIHlvdSB3YW50IHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnM/Ci0KLWFub255bW91c0Rvd25sb2FkID0gQW5vbnltb3VzIHswfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQppbmRleCA0ZGQ2YjAzLi5iZWU4YWM0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQpAQCAtMTUsMjkgKzE1LDMzIEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkRpc3BhdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21tZW50UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkNvbXBsZXhEaXNjbG9zdXJlUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkV4cGFuZEFsbENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkxpbmtNZW51QmFyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OZWVkc1NpZ25JbktleUNvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZS5TdGF0dXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2hhbmdlRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkhhbmRsZXJSZWdpc3RyYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuTG9jYWxlSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRGlzY2xvc3VyZVBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5HcmlkOwpAQCAtNTksNiArNjMsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZDsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBvcGVuUGF0Y2hTZXRJZDsKICAgcHJpdmF0ZSBDaGFuZ2VEZXRhaWxDYWNoZSBkZXRhaWxDYWNoZTsKKyAgcHJpdmF0ZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DaGFuZ2VJbmZvIGNoYW5nZUluZm87CiAKICAgcHJpdmF0ZSBDaGFuZ2VEZXNjcmlwdGlvbkJsb2NrIGRlc2NyaXB0aW9uQmxvY2s7CiAgIHByaXZhdGUgQXBwcm92YWxUYWJsZSBhcHByb3ZhbHM7CkBAIC05NSwxNCArMTAwLDYgQEAKICAgcHVibGljIENoYW5nZVNjcmVlbihmaW5hbCBDaGFuZ2UuSWQgdG9TaG93KSB7CiAgICAgY2hhbmdlSWQgPSB0b1Nob3c7CiAgICAgb3BlblBhdGNoU2V0SWQgPSBudWxsOwotCi0gICAgLy8gSWYgd2UgaGF2ZSBhbnkgZGlmZiBzdG9yZWQsIG1ha2Ugc3VyZSB0aGV5IGFyZSBhcHBsaWNhYmxlIHRvIHRoZQotICAgIC8vIGN1cnJlbnQgY2hhbmdlLCBkaXNjYXJkIHRoZW0gb3RoZXJ3aXNlLgotICAgIC8vCi0gICAgaWYgKGN1cnJlbnRDaGFuZ2VJZCAhPSBudWxsICYmICFjdXJyZW50Q2hhbmdlSWQuZXF1YWxzKHRvU2hvdykpIHsKLSAgICAgIGRpZmZCYXNlSWQgPSBudWxsOwotICAgIH0KLSAgICBjdXJyZW50Q2hhbmdlSWQgPSB0b1Nob3c7CiAgIH0KIAogICBwdWJsaWMgQ2hhbmdlU2NyZWVuKGZpbmFsIFBhdGNoU2V0LklkIHRvU2hvdykgewpAQCAtMjI4LDcgKzIyNSw3IEBACiAKICAgICBwYXRjaGVzR3JpZCA9IG5ldyBHcmlkKDEsIDIpOwogICAgIHBhdGNoZXNHcmlkLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNlbGVjdFBhdGNoU2V0T2xkVmVyc2lvbigpKTsKLSAgICBwYXRjaGVzR3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy5vbGRWZXJzaW9uSGlzdG9yeSgpKTsKKyAgICBwYXRjaGVzR3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy5yZWZlcmVuY2VWZXJzaW9uKCkpOwogICAgIHBhdGNoZXNHcmlkLnNldFdpZGdldCgwLCAxLCBwYXRjaGVzTGlzdCk7CiAgICAgYWRkKHBhdGNoZXNHcmlkKTsKIApAQCAtMjYwLDE0ICsyNTcsMjYgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvblZhbHVlQ2hhbmdlKFZhbHVlQ2hhbmdlRXZlbnQ8Q2hhbmdlRGV0YWlsPiBldmVudCkgeworICBwdWJsaWMgdm9pZCBvblZhbHVlQ2hhbmdlKGZpbmFsIFZhbHVlQ2hhbmdlRXZlbnQ8Q2hhbmdlRGV0YWlsPiBldmVudCkgewogICAgIGlmIChpc0F0dGFjaGVkKCkpIHsKLSAgICAgIGRpc3BsYXkoZXZlbnQuZ2V0VmFsdWUoKSk7CisgICAgICAvLyBVbnRpbCB0aGlzIHNjcmVlbiBpcyBmdWxseSBtaWdyYXRlZCB0byB0aGUgbmV3IEFQSSwgdGhpcyBjYWxsIG11c3QgYmUKKyAgICAgIC8vIHNlcXVlbnRpYWwsIGJlY2F1c2Ugd2UgY2FuJ3Qgc3RhcnQgYW4gYXN5bmMgZ2V0IGF0IHRoZSBzb3VyY2Ugb2YgZXZlcnkKKyAgICAgIC8vIGNhbGwgdGhhdCBtaWdodCB0cmlnZ2VyIGEgdmFsdWUgY2hhbmdlLgorICAgICAgQ2hhbmdlQXBpLmRldGFpbChldmVudC5nZXRWYWx1ZSgpLmdldENoYW5nZSgpLmdldElkKCkuZ2V0KCksCisgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoCisgICAgICAgICAgICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgY2hhbmdlSW5mbyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgZGlzcGxheShldmVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZGlzcGxheShmaW5hbCBDaGFuZ2VEZXRhaWwgZGV0YWlsKSB7CiAgICAgZGlzcGxheVRpdGxlKGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRLZXkoKSwgZGV0YWlsLmdldENoYW5nZSgpLmdldFN1YmplY3QoKSk7CisgICAgZGlzY2FyZERpZmZCYXNlSWZOb3RBcHBsaWNhYmxlKGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRJZCgpKTsKIAogICAgIGlmIChTdGF0dXMuTUVSR0VEID09IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRTdGF0dXMoKSkgewogICAgICAgaW5jbHVkZWRJblBhbmVsLnNldFZpc2libGUodHJ1ZSk7CkBAIC0yNzcsMTYgKzI4NiwxNyBAQAogICAgIH0KIAogICAgIGRlcGVuZGVuY2llcy5zZXRBY2NvdW50SW5mb0NhY2hlKGRldGFpbC5nZXRBY2NvdW50cygpKTsKLSAgICBhcHByb3ZhbHMuc2V0QWNjb3VudEluZm9DYWNoZShkZXRhaWwuZ2V0QWNjb3VudHMoKSk7CiAKICAgICBkZXNjcmlwdGlvbkJsb2NrLmRpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLAogICAgICAgICBkZXRhaWwuaXNTdGFycmVkKCksCisgICAgICAgIGRldGFpbC5jYW5FZGl0Q29tbWl0TWVzc2FnZSgpLAogICAgICAgICBkZXRhaWwuZ2V0Q3VycmVudFBhdGNoU2V0RGV0YWlsKCkuZ2V0SW5mbygpLAotICAgICAgICBkZXRhaWwuZ2V0QWNjb3VudHMoKSk7CisgICAgICAgIGRldGFpbC5nZXRBY2NvdW50cygpLCBkZXRhaWwuZ2V0U3VibWl0VHlwZVJlY29yZCgpKTsKICAgICBkZXBlbmRzT24uZGlzcGxheShkZXRhaWwuZ2V0RGVwZW5kc09uKCkpOwogICAgIG5lZWRlZEJ5LmRpc3BsYXkoZGV0YWlsLmdldE5lZWRlZEJ5KCkpOwotICAgIGFwcHJvdmFscy5kaXNwbGF5KGRldGFpbCk7CisgICAgYXBwcm92YWxzLmRpc3BsYXkoY2hhbmdlSW5mbyk7CiAKKyAgICBwYXRjaGVzTGlzdC5jbGVhcigpOwogICAgIGlmIChkZXRhaWwuZ2V0Q3VycmVudFBhdGNoU2V0RGV0YWlsKCkuZ2V0SW5mbygpLmdldFBhcmVudHMoKS5zaXplKCkgPiAxKSB7CiAgICAgICBwYXRjaGVzTGlzdC5hZGRJdGVtKFV0aWwuQy5hdXRvTWVyZ2UoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTMxMyw4ICszMjMsOSBAQAogICAgIGJvb2xlYW4gZGVwc09wZW4gPSBmYWxzZTsKICAgICBpbnQgb3V0ZGF0ZWQgPSAwOwogICAgIGlmICghZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKLSAgICAgIGlmIChkZXRhaWwuZ2V0RGVwZW5kc09uKCkgIT0gbnVsbCkgewotICAgICAgICBmb3IgKGZpbmFsIENoYW5nZUluZm8gY2kgOiBkZXRhaWwuZ2V0RGVwZW5kc09uKCkpIHsKKyAgICAgIGZpbmFsIExpc3Q8Q2hhbmdlSW5mbz4gZGVwZW5kc09uID0gZGV0YWlsLmdldERlcGVuZHNPbigpOworICAgICAgaWYgKGRlcGVuZHNPbiAhPSBudWxsKSB7CisgICAgICAgIGZvciAoZmluYWwgQ2hhbmdlSW5mbyBjaSA6IGRlcGVuZHNPbikgewogICAgICAgICAgIGlmICghY2kuaXNMYXRlc3QoKSkgewogICAgICAgICAgICAgZGVwc09wZW4gPSB0cnVlOwogICAgICAgICAgICAgb3V0ZGF0ZWQrKzsKQEAgLTMyNCw4ICszMzUsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGlmIChkZXRhaWwuZ2V0TmVlZGVkQnkoKSAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGZpbmFsIENoYW5nZUluZm8gY2kgOiBkZXRhaWwuZ2V0TmVlZGVkQnkoKSkgeworICAgIGZpbmFsIExpc3Q8Q2hhbmdlSW5mbz4gbmVlZGVkQnkgPSBkZXRhaWwuZ2V0TmVlZGVkQnkoKTsKKyAgICBpZiAobmVlZGVkQnkgIT0gbnVsbCkgeworICAgICAgZm9yIChmaW5hbCBDaGFuZ2VJbmZvIGNpIDogbmVlZGVkQnkpIHsKICAgICAgICAgaWYgKChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgfHwKICAgICAgICAgICAgIChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLlNVQk1JVFRFRCkgfHwKICAgICAgICAgICAgIChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkRSQUZUKSkgewpAQCAtMzQ4LDYgKzM2MCwxMyBAQAogICAgIHBhdGNoU2V0c0Jsb2NrLnNldFJlZ2lzdGVyS2V5cyh0cnVlKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZGlzY2FyZERpZmZCYXNlSWZOb3RBcHBsaWNhYmxlKGZpbmFsIENoYW5nZS5JZCB0b1Nob3cpIHsKKyAgICBpZiAoY3VycmVudENoYW5nZUlkICE9IG51bGwgJiYgIWN1cnJlbnRDaGFuZ2VJZC5lcXVhbHModG9TaG93KSkgeworICAgICAgZGlmZkJhc2VJZCA9IG51bGw7CisgICAgfQorICAgIGN1cnJlbnRDaGFuZ2VJZCA9IHRvU2hvdzsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCBhZGRDb21tZW50cyhmaW5hbCBDaGFuZ2VEZXRhaWwgZGV0YWlsKSB7CiAgICAgY29tbWVudHMuY2xlYXIoKTsKIApAQCAtMzY5LDEzICszODgsMTEgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ0xpc3Quc2l6ZSgpOyBpKyspIHsKICAgICAgIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnID0gbXNnTGlzdC5nZXQoaSk7CiAKLSAgICAgIGZpbmFsIEFjY291bnRJbmZvIGF1dGhvcjsKKyAgICAgIEFjY291bnRJbmZvIGF1dGhvcjsKICAgICAgIGlmIChtc2cuZ2V0QXV0aG9yKCkgIT0gbnVsbCkgewotICAgICAgICBhdXRob3IgPSBhY2N0cy5nZXQobXNnLmdldEF1dGhvcigpKTsKKyAgICAgICAgYXV0aG9yID0gRm9ybWF0VXRpbC5hc0luZm8oYWNjdHMuZ2V0KG1zZy5nZXRBdXRob3IoKSkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmluYWwgQWNjb3VudCBnZXJyaXQgPSBuZXcgQWNjb3VudChudWxsKTsKLSAgICAgICAgZ2Vycml0LnNldEZ1bGxOYW1lKFV0aWwuQy5tZXNzYWdlTm9BdXRob3IoKSk7Ci0gICAgICAgIGF1dGhvciA9IG5ldyBBY2NvdW50SW5mbyhnZXJyaXQpOworICAgICAgICBhdXRob3IgPSBBY2NvdW50SW5mby5jcmVhdGUoMCwgVXRpbC5DLm1lc3NhZ2VOb0F1dGhvcigpLCBudWxsKTsKICAgICAgIH0KIAogICAgICAgYm9vbGVhbiBpc1JlY2VudDsKQEAgLTM5Nyw2ICs0MTQsMTUgQEAKICAgICAgIGNvbW1lbnRzLmFkZChjcCk7CiAgICAgfQogCisgICAgZmluYWwgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKFV0aWwuQy5jaGFuZ2VTY3JlZW5BZGRDb21tZW50KCkpOworICAgIGIuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFBhdGNoU2V0LklkIGN1cnJlbnRQYXRjaFNldElkID0gcGF0Y2hTZXRzQmxvY2suZ2V0Q3VycmVudFBhdGNoU2V0KCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KERpc3BhdGNoZXIudG9QdWJsaXNoKGN1cnJlbnRQYXRjaFNldElkKSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBjb21tZW50cy5hZGQoYik7CiAgICAgY29tbWVudHMuc2V0VmlzaWJsZShtc2dMaXN0LnNpemUoKSA+IDApOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VUYWJsZS5qYXZhCmluZGV4IGVmNGVmNTIuLjk3YTVhMDkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlVGFibGUuamF2YQpAQCAtMTYsMTAgKzE2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbC5zaG9ydEZvcm1hdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Gb3JtYXRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOwpAQCAtMjcsNzAgKzI0LDM2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk5lZWRzU2lnbkluS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsU3VtbWFyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFN1bW1hcnlTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZUluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRWxlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRE9NOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsZXhUYWJsZS5GbGV4Q2VsbEZvcm1hdHRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGxGb3JtYXR0ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVUlPYmplY3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIENoYW5nZVRhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPENoYW5nZUluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1RBUiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0lEID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1VCSkVDVCA9IDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX09XTkVSID0gNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfUFJPSkVDVCA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0JSQU5DSCA9IDY7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0xBU1RfVVBEQVRFID0gNzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfQ09MVU1OUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX1NVQkpFQ1QgPSAyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19PV05FUiA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX1BST0pFQ1QgPSA0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19CUkFOQ0ggPSA1OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19MQVNUX1VQREFURSA9IDY7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TID0gNzsKIAogICBwcml2YXRlIGZpbmFsIExpc3Q8U2VjdGlvbj4gc2VjdGlvbnM7CiAgIHByaXZhdGUgQWNjb3VudEluZm9DYWNoZSBhY2NvdW50Q2FjaGUgPSBBY2NvdW50SW5mb0NhY2hlLmVtcHR5KCk7Ci0gIHByaXZhdGUgZmluYWwgTGlzdDxBcHByb3ZhbFR5cGU+IGFwcHJvdmFsVHlwZXM7Ci0gIHByaXZhdGUgZmluYWwgaW50IGNvbHVtbnM7CiAKICAgcHVibGljIENoYW5nZVRhYmxlKCkgewotICAgIHRoaXMoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIENoYW5nZVRhYmxlKGJvb2xlYW4gc2hvd0FwcHJvdmFscykgewotICAgIGFwcHJvdmFsVHlwZXMgPSBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXBwcm92YWxUeXBlcygpLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgICBpZiAoc2hvd0FwcHJvdmFscykgewotICAgICAgY29sdW1ucyA9IEJBU0VfQ09MVU1OUyArIGFwcHJvdmFsVHlwZXMuc2l6ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb2x1bW5zID0gQkFTRV9DT0xVTU5TOwotICAgIH0KLQotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgUHJldktleUNvbW1hbmQoMCwgJ2snLCBVdGlsLkMuY2hhbmdlVGFibGVQcmV2KCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE5leHRLZXlDb21tYW5kKDAsICdqJywgVXRpbC5DLmNoYW5nZVRhYmxlTmV4dCgpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCAnbycsIFV0aWwuQy5jaGFuZ2VUYWJsZU9wZW4oKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgT3BlbktleUNvbW1hbmQoMCwgS2V5Q29kZXMuS0VZX0VOVEVSLCBVdGlsLkMKLSAgICAgICAgLmNoYW5nZVRhYmxlT3BlbigpKSk7CisgICAgc3VwZXIoVXRpbC5DLmNoYW5nZUl0ZW1IZWxwKCkpOwogCiAgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKICAgICAgIGtleXNBY3Rpb24uYWRkKG5ldyBTdGFyS2V5Q29tbWFuZCgwLCAncycsIFV0aWwuQy5jaGFuZ2VUYWJsZVN0YXIoKSkpOwpAQCAtOTgsMjkgKzYxLDE1IEBACiAKICAgICBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VjdGlvbj4oKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfU1RBUiwgIiIpOwotICAgIHRhYmxlLnNldFRleHQoMCwgQ19JRCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uSUQoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX1NVQkpFQ1QsIFV0aWwuQy5jaGFuZ2VUYWJsZUNvbHVtblN1YmplY3QoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX09XTkVSLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfUFJPSkVDVCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uUHJvamVjdCgpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfQlJBTkNILCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5CcmFuY2goKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX0xBU1RfVVBEQVRFLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5MYXN0VXBkYXRlKCkpOwotICAgIGZvciAoaW50IGkgPSBCQVNFX0NPTFVNTlM7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZSB0eXBlID0gYXBwcm92YWxUeXBlcy5nZXQoaSAtIEJBU0VfQ09MVU1OUyk7Ci0gICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdCA9IHR5cGUuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgIFN0cmluZyB0ZXh0ID0gY2F0LmdldEFiYnJldmlhdGVkTmFtZSgpOwotICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICB0ZXh0ID0gY2F0LmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHRhYmxlLnNldFRleHQoMCwgaSwgdGV4dCk7Ci0gICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgIHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5nZXRFbGVtZW50KDAsIGkpLnNldFRpdGxlKGNhdC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KIAogICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkhlYWRlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwotICAgIGZvciAoaW50IGkgPSBDX0lEOyBpIDwgY29sdW1uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IENfU1VCSkVDVDsgaSA8IENPTFVNTlM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgfQogCkBAIC0xNjQsNyArMTEzLDcgQEAKICAgICBpbnNlcnRSb3cocm93KTsKICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMCwgVXRpbC5DLmNoYW5nZVRhYmxlTm9uZSgpKTsKICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwotICAgIGZtdC5zZXRDb2xTcGFuKHJvdywgMCwgY29sdW1ucyk7CisgICAgZm10LnNldENvbFNwYW4ocm93LCAwLCBDT0xVTU5TKTsKICAgICBmbXQuc2V0U3R5bGVOYW1lKHJvdywgMCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5lbXB0eVNlY3Rpb24oKSk7CiAgIH0KIApAQCAtMTc4LDE3ICsxMjcsMTIgQEAKICAgICBzdXBlci5hcHBseURhdGFSb3dTdHlsZShyb3cpOwogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkNlbGwoKSk7Ci0gICAgZm9yIChpbnQgaSA9IENfSUQ7IGkgPCBjb2x1bW5zOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gQ19TVUJKRUNUOyBpIDwgQ09MVU1OUzsgaSsrKSB7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgaSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKICAgICB9Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX1NVQkpFQ1QsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY1NVQkpFQ1QoKSk7Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfUFJPSkVDVCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jUFJPSkVDVCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19CUkFOQ0gsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY1BST0pFQ1QoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfT1dORVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY09XTkVSKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0xBU1RfVVBEQVRFLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNMYXN0VXBkYXRlKCkpOwotICAgIGZvciAoaW50IGkgPSBCQVNFX0NPTFVNTlM7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNBUFBST1ZBTCgpKTsKLSAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgcG9wdWxhdGVDaGFuZ2VSb3coZmluYWwgaW50IHJvdywgZmluYWwgQ2hhbmdlSW5mbyBjLApAQCAtMTk2LDEyICsxNDAsMTAgQEAKICAgICBDaGFuZ2VDYWNoZSBjYWNoZSA9IENoYW5nZUNhY2hlLmdldChjLmdldElkKCkpOwogICAgIGNhY2hlLmdldENoYW5nZUluZm9DYWNoZSgpLnNldChjKTsKIAotICAgIGZpbmFsIFN0cmluZyBpZHN0ciA9IGMuZ2V0S2V5KCkuYWJicmV2aWF0ZSgpOwogICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfQVJST1csIG51bGwpOwogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CiAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1NUQVIsIFN0YXJyZWRDaGFuZ2VzLmNyZWF0ZUljb24oYy5nZXRJZCgpLCBjLmlzU3RhcnJlZCgpKSk7CiAgICAgfQotICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfSUQsIG5ldyBUYWJsZUNoYW5nZUxpbmsoaWRzdHIsIGMpKTsKIAogICAgIFN0cmluZyBzID0gVXRpbC5jcm9wU3ViamVjdChjLmdldFN1YmplY3QoKSk7CiAgICAgaWYgKGMuZ2V0U3RhdHVzKCkgIT0gbnVsbCAmJiBjLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuTkVXKSB7CkBAIC0yNTEsNyArMTkzLDcgQEAKICAgICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgdGFibGUuc2V0VGV4dChzLnRpdGxlUm93LCAwLCBzLnRpdGxlVGV4dCk7CiAgICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwotICAgICAgZm10LnNldENvbFNwYW4ocy50aXRsZVJvdywgMCwgY29sdW1ucyk7CisgICAgICBmbXQuc2V0Q29sU3BhbihzLnRpdGxlUm93LCAwLCBDT0xVTU5TKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocy50aXRsZVJvdywgMCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zZWN0aW9uSGVhZGVyKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICBzLnRpdGxlUm93ID0gLTE7CkBAIC0yOTIsMTEwICsyMzQsNiBAQAogICAgIHRhYmxlLnJlbW92ZVJvdyhyb3cpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlBcHByb3ZhbHMoZmluYWwgaW50IHJvdywgZmluYWwgQXBwcm92YWxTdW1tYXJ5IHN1bW1hcnksCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFpYywgZmluYWwgYm9vbGVhbiBoaWdobGlnaHRVbnJldmlld2VkKSB7Ci0gICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7Ci0gICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyA9Ci0gICAgICAgIHN1bW1hcnkuZ2V0QXBwcm92YWxNYXAoKTsKLSAgICBpbnQgY29sID0gQkFTRV9DT0xVTU5TOwotICAgIGJvb2xlYW4gaGF2ZVJldmlldyA9IGZhbHNlOwotCi0gICAgYm9vbGVhbiBzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5ID0gZmFsc2U7Ci0KLSAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewotICAgICAgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcyBwcmVmcyA9IEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldEdlbmVyYWxQcmVmZXJlbmNlcygpOwotCi0gICAgICBpZiAocHJlZnMuaXNTaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KCkpIHsKLSAgICAgICAgc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgdHlwZSA6IGFwcHJvdmFsVHlwZXMpIHsKLSAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EgPSBhcHByb3ZhbHMuZ2V0KHR5cGUuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpKTsKLQotICAgICAgZm10LnJlbW92ZVN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5uZWdzY29yZSgpKTsKLSAgICAgIGZtdC5yZW1vdmVTdHlsZU5hbWUocm93LCBjb2wsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucG9zc2NvcmUoKSk7Ci0gICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgY29sLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNpbmdsZUxpbmUoKSk7Ci0KLSAgICAgIGlmIChjYSA9PSBudWxsIHx8IGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICB0YWJsZS5jbGVhckNlbGwocm93LCBjb2wpOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICBoYXZlUmV2aWV3ID0gdHJ1ZTsKLQotICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgYWN2ID0gdHlwZS5nZXRWYWx1ZShjYSk7Ci0gICAgICAgIGZpbmFsIEFjY291bnRJbmZvIGFpID0gYWljLmdldChjYS5nZXRBY2NvdW50SWQoKSk7Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNNYXhOZWdhdGl2ZShjYSkpIHsKLQotICAgICAgICAgIGlmIChzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KSB7Ci0gICAgICAgICAgICBGbG93UGFuZWwgZnAgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgICAgICAgICBmcC5hZGQobmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKLSAgICAgICAgICAgIGZwLmFkZChuZXcgSW5saW5lTGFiZWwoRm9ybWF0VXRpbC5uYW1lKGFpKSkpOwotICAgICAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgY29sLCBmcCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzTWF4UG9zaXRpdmUoY2EpKSB7Ci0KLSAgICAgICAgICBpZiAoc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeSkgewotICAgICAgICAgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgICAgICAgICAgZnAuYWRkKG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmdyZWVuQ2hlY2soKSkpOwotICAgICAgICAgICAgZnAuYWRkKG5ldyBJbmxpbmVMYWJlbChGb3JtYXRVdGlsLm5hbWUoYWkpKSk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wsIGZwKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgY29sLCBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5ncmVlbkNoZWNrKCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTdHJpbmcgdnN0ciA9IFN0cmluZy52YWx1ZU9mKGNhLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgaWYgKHNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIHZzdHIgPSB2c3RyICsgIiAiICsgRm9ybWF0VXRpbC5uYW1lKGFpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKLSAgICAgICAgICAgIHZzdHIgPSAiKyIgKyB2c3RyOwotICAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wb3NzY29yZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5uZWdzY29yZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGFibGUuc2V0VGV4dChyb3csIGNvbCwgdnN0cik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTb21lIHdlYiBicm93c2VycyBpZ25vcmUgdGhlIGVtYmVkZGVkIG5ld2xpbmU7IHNvbWUgbGlrZSBpdDsKLSAgICAgICAgLy8gc28gd2UgaW5jbHVkZSBhIHNwYWNlIGJlZm9yZSB0aGUgbmV3bGluZSB0byBhY2NvbW1vZGF0ZSBib3RoLgotICAgICAgICAvLwotICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIGNvbCkuc2V0VGl0bGUoCi0gICAgICAgICAgICBhY3YuZ2V0TmFtZSgpICsgIiBcbmJ5ICIgKyBGb3JtYXRVdGlsLm5hbWVFbWFpbChhaSkpOwotICAgICAgfQotCi0gICAgICBjb2wrKzsKLSAgICB9Ci0KLSAgICBmaW5hbCBFbGVtZW50IHRyID0gRE9NLmdldFBhcmVudChmbXQuZ2V0RWxlbWVudChyb3csIDApKTsKLSAgICBVSU9iamVjdC5zZXRTdHlsZU5hbWUodHIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubmVlZHNSZXZpZXcoKSwgIWhhdmVSZXZpZXcKLSAgICAgICAgJiYgaGlnaGxpZ2h0VW5yZXZpZXdlZCk7Ci0gIH0KLQotICBHZXJyaXRDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+IGFwcHJvdmFsRm9ybWF0dGVyKGZpbmFsIGludCBkYXRhQmVnaW4sCi0gICAgICBmaW5hbCBpbnQgcm93cywgZmluYWwgYm9vbGVhbiBoaWdobGlnaHRVbnJldmlld2VkKSB7Ci0gICAgcmV0dXJuIG5ldyBHZXJyaXRDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgQXBwcm92YWxTdW1tYXJ5U2V0IGFzKSB7Ci0gICAgICAgIE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4gaWRzID0gYXMuZ2V0U3VtbWFyeU1hcCgpOwotICAgICAgICBBY2NvdW50SW5mb0NhY2hlIGFpYyA9IGFzLmdldEFjY291bnRJbmZvQ2FjaGUoKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gZGF0YUJlZ2luOyByb3cgPCBkYXRhQmVnaW4gKyByb3dzOyByb3crKykgewotICAgICAgICAgIGZpbmFsIENoYW5nZUluZm8gYyA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgICBpZiAoaWRzLmNvbnRhaW5zS2V5KGMuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIGRpc3BsYXlBcHByb3ZhbHMocm93LCBpZHMuZ2V0KGMuZ2V0SWQoKSksIGFpYywgaGlnaGxpZ2h0VW5yZXZpZXdlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCiAgIHB1YmxpYyBjbGFzcyBTdGFyS2V5Q29tbWFuZCBleHRlbmRzIE5lZWRzU2lnbkluS2V5Q29tbWFuZCB7CiAgICAgcHVibGljIFN0YXJLZXlDb21tYW5kKGludCBtYXNrLCBjaGFyIGtleSwgU3RyaW5nIGhlbHApIHsKICAgICAgIHN1cGVyKG1hc2ssIGtleSwgaGVscCk7CkBAIC00MTksMTUgKzI1NywxMCBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyBlbnVtIEFwcHJvdmFsVmlld1R5cGUgewotICAgIE5PTkUsIFVTRVIsIFNUUk9OR0VTVAotICB9Ci0KICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN0aW9uIHsKICAgICBTdHJpbmcgdGl0bGVUZXh0OwogCiAgICAgQ2hhbmdlVGFibGUgcGFyZW50OwotICAgIGZpbmFsIEFwcHJvdmFsVmlld1R5cGUgdmlld1R5cGU7CiAgICAgZmluYWwgQWNjb3VudC5JZCBvd25lcklkOwogICAgIGludCB0aXRsZVJvdyA9IC0xOwogICAgIGludCBkYXRhQmVnaW47CkBAIC00MzYsMTcgKzI2OSwxNSBAQAogICAgIHByaXZhdGUgQ2hhbmdlUm93Rm9ybWF0dGVyIGNoYW5nZVJvd0Zvcm1hdHRlcjsKIAogICAgIHB1YmxpYyBTZWN0aW9uKCkgewotICAgICAgdGhpcyhudWxsLCBBcHByb3ZhbFZpZXdUeXBlLk5PTkUsIG51bGwpOworICAgICAgdGhpcyhudWxsLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0KSB7Ci0gICAgICB0aGlzKHRpdGxlVGV4dCwgQXBwcm92YWxWaWV3VHlwZS5OT05FLCBudWxsKTsKKyAgICAgIHRoaXModGl0bGVUZXh0LCBudWxsKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0LCBmaW5hbCBBcHByb3ZhbFZpZXdUeXBlIHZpZXcsCi0gICAgICAgIGZpbmFsIEFjY291bnQuSWQgb3duZXIpIHsKKyAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0LCBmaW5hbCBBY2NvdW50LklkIG93bmVyKSB7CiAgICAgICBzZXRUaXRsZVRleHQodGl0bGVUZXh0KTsKLSAgICAgIHZpZXdUeXBlID0gdmlldzsKICAgICAgIG93bmVySWQgPSBvd25lcjsKICAgICB9CiAKQEAgLTQ5MywxOSArMzI0LDYgQEAKICAgICAgICAgICBwYXJlbnQucG9wdWxhdGVDaGFuZ2VSb3coZGF0YUJlZ2luICsgaSwgYywgY2hhbmdlUm93Rm9ybWF0dGVyKTsKICAgICAgICAgICBjaWRzLmFkZChjLmdldElkKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICh2aWV3VHlwZSkgewotICAgICAgICAgIGNhc2UgTk9ORToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVVNFUjoKLSAgICAgICAgICAgIFBhdGNoVXRpbC5ERVRBSUxfU1ZDLnVzZXJBcHByb3ZhbHMoY2lkcywgb3duZXJJZCwgcGFyZW50Ci0gICAgICAgICAgICAgICAgLmFwcHJvdmFsRm9ybWF0dGVyKGRhdGFCZWdpbiwgcm93cywgdHJ1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBTVFJPTkdFU1Q6Ci0gICAgICAgICAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5zdHJvbmdlc3RBcHByb3ZhbHMoY2lkcywgcGFyZW50Ci0gICAgICAgICAgICAgICAgLmFwcHJvdmFsRm9ybWF0dGVyKGRhdGFCZWdpbiwgcm93cywgZmFsc2UpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VUYWJsZTIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCmluZGV4IDIwZGQ4MGYuLjAzY2MxMWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCkBAIC0xOCw5ICsxOCw5IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8uTGFiZWxJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BY2NvdW50TGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQnJhbmNoTGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ2hhbmdlTGluazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OYXZpZ2F0aW9uVGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk5lZWRzU2lnbkluS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpbms7CkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5FbGVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxleFRhYmxlLkZsZXhDZWxsRm9ybWF0dGVyOwpAQCAtMzksNiArMzgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLklubGluZUxhYmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlVJT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDYsMzUgKzQ2LDI4IEBACiAKIHB1YmxpYyBjbGFzcyBDaGFuZ2VUYWJsZTIgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8Q2hhbmdlSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19TVEFSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfSUQgPSAyOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19TVUJKRUNUID0gMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfT1dORVIgPSA0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19QUk9KRUNUID0gNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfQlJBTkNIID0gNjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfTEFTVF9VUERBVEUgPSA3OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9DT0xVTU5TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1VCSkVDVCA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX09XTkVSID0gMzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfUFJPSkVDVCA9IDQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0JSQU5DSCA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0xBU1RfVVBEQVRFID0gNjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfQ09MVU1OUyA9IDc7CiAKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNlY3Rpb24+IHNlY3Rpb25zOwogICBwcml2YXRlIGludCBjb2x1bW5zOwogICBwcml2YXRlIExpc3Q8U3RyaW5nPiBsYWJlbE5hbWVzOwogCiAgIHB1YmxpYyBDaGFuZ2VUYWJsZTIoKSB7CisgICAgc3VwZXIoVXRpbC5DLmNoYW5nZUl0ZW1IZWxwKCkpOwogICAgIGNvbHVtbnMgPSBCQVNFX0NPTFVNTlM7CiAgICAgbGFiZWxOYW1lcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCi0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBQcmV2S2V5Q29tbWFuZCgwLCAnaycsIFV0aWwuQy5jaGFuZ2VUYWJsZVByZXYoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLkMuY2hhbmdlVGFibGVOZXh0KCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsICdvJywgVXRpbC5DLmNoYW5nZVRhYmxlT3BlbigpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKAotICAgICAgICBuZXcgT3BlbktleUNvbW1hbmQoMCwgS2V5Q29kZXMuS0VZX0VOVEVSLCBVdGlsLkMuY2hhbmdlVGFibGVPcGVuKCkpKTsKLQogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CiAgICAgICBrZXlzQWN0aW9uLmFkZChuZXcgU3RhcktleUNvbW1hbmQoMCwgJ3MnLCBVdGlsLkMuY2hhbmdlVGFibGVTdGFyKCkpKTsKICAgICB9CiAKICAgICBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VjdGlvbj4oKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfU1RBUiwgIiIpOwotICAgIHRhYmxlLnNldFRleHQoMCwgQ19JRCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uSUQoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX1NVQkpFQ1QsIFV0aWwuQy5jaGFuZ2VUYWJsZUNvbHVtblN1YmplY3QoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX09XTkVSLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfUFJPSkVDVCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uUHJvamVjdCgpKTsKQEAgLTgzLDggKzc2LDcgQEAKIAogICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkhlYWRlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwotICAgIGZvciAoaW50IGkgPSBDX0lEOyBpIDwgY29sdW1uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IENfU1VCSkVDVDsgaSA8IGNvbHVtbnM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgfQogCkBAIC0xMzYsMTMgKzEyOCwxMSBAQAogICAgIHN1cGVyLmFwcGx5RGF0YVJvd1N0eWxlKHJvdyk7CiAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfU1RBUiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKLSAgICBmb3IgKGludCBpID0gQ19JRDsgaSA8IGNvbHVtbnM7IGkrKykgeworICAgIGZvciAoaW50IGkgPSBDX1NVQkpFQ1Q7IGkgPCBjb2x1bW5zOyBpKyspIHsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIH0KLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19JRCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jSUQoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfU1VCSkVDVCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jU1VCSkVDVCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19QUk9KRUNULCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNQUk9KRUNUKCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0JSQU5DSCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jUFJPSkVDVCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19PV05FUiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jT1dORVIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfTEFTVF9VUERBVEUsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0xhc3RVcGRhdGUoKSk7CiAgICAgZm9yIChpbnQgaSA9IEJBU0VfQ09MVU1OUzsgaSA8IGNvbHVtbnM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGksIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0FQUFJPVkFMKCkpOwpAQCAtMTUyLDcgKzE0Miw3IEBACiAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMoQ2hhbmdlTGlzdC4uLiBsaXN0cykgewogICAgIGxhYmVsTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICBmb3IgKENoYW5nZUxpc3QgbGlzdCA6IGxpc3RzKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBsaXN0LmdldChpKS5sYWJlbHMoKSkgewogICAgICAgICAgIGlmICghbGFiZWxOYW1lcy5jb250YWlucyhuYW1lKSkgewogICAgICAgICAgICAgbGFiZWxOYW1lcy5hZGQobmFtZSk7CkBAIC0xOTgsNyArMTg4LDYgQEAKICAgICAgICAgICBjLmxlZ2FjeV9pZCgpLAogICAgICAgICAgIGMuc3RhcnJlZCgpKSk7CiAgICAgfQotICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfSUQsIG5ldyBUYWJsZUNoYW5nZUxpbmsoYy5pZF9hYmJyZXZpYXRlZCgpLCBjKSk7CiAKICAgICBTdHJpbmcgc3ViamVjdCA9IFV0aWwuY3JvcFN1YmplY3QoYy5zdWJqZWN0KCkpOwogICAgIENoYW5nZS5TdGF0dXMgc3RhdHVzID0gYy5zdGF0dXMoKTsKQEAgLTIwNywxNCArMTk2LDEyIEBACiAgICAgfQogICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfU1VCSkVDVCwgbmV3IFRhYmxlQ2hhbmdlTGluayhzdWJqZWN0LCBjKSk7CiAKLSAgICBTdHJpbmcgb3duZXIgPSAiIjsKLSAgICBpZiAoYy5vd25lcigpICE9IG51bGwgJiYgYy5vd25lcigpLm5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICBvd25lciA9IGMub3duZXIoKS5uYW1lKCk7CisgICAgaWYgKGMub3duZXIoKSAhPSBudWxsKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX09XTkVSLCBuZXcgQWNjb3VudExpbmsoYy5vd25lcigpLCBzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGUuc2V0VGV4dChyb3csIENfT1dORVIsICIiKTsKICAgICB9CiAKLSAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX09XTkVSLCBuZXcgSW5saW5lSHlwZXJsaW5rKG93bmVyLAotICAgICAgICBQYWdlTGlua3MudG9BY2NvdW50UXVlcnkob3duZXIsIGMuc3RhdHVzKCkpKSk7Ci0KICAgICB0YWJsZS5zZXRXaWRnZXQoCiAgICAgICAgIHJvdywgQ19QUk9KRUNULCBuZXcgUHJvamVjdExpbmsoYy5wcm9qZWN0X25hbWVfa2V5KCksIGMuc3RhdHVzKCkpKTsKICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX0JSQU5DSCwgbmV3IEJyYW5jaExpbmsoYy5wcm9qZWN0X25hbWVfa2V5KCksIGMKQEAgLTI5OSw5ICsyODYsOSBAQAogICBwdWJsaWMgdm9pZCBhZGRTZWN0aW9uKGZpbmFsIFNlY3Rpb24gcykgewogICAgIGFzc2VydCBzLnBhcmVudCA9PSBudWxsOwogCi0gICAgaWYgKHMudGl0bGVUZXh0ICE9IG51bGwpIHsKLSAgICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwotICAgICAgdGFibGUuc2V0VGV4dChzLnRpdGxlUm93LCAwLCBzLnRpdGxlVGV4dCk7CisgICAgcy5wYXJlbnQgPSB0aGlzOworICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOworICAgIGlmIChzLmRpc3BsYXlUaXRsZSgpKSB7CiAgICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwogICAgICAgZm10LnNldENvbFNwYW4ocy50aXRsZVJvdywgMCwgY29sdW1ucyk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHMudGl0bGVSb3csIDAsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2VjdGlvbkhlYWRlcigpKTsKQEAgLTMwOSw3ICsyOTYsNiBAQAogICAgICAgcy50aXRsZVJvdyA9IC0xOwogICAgIH0KIAotICAgIHMucGFyZW50ID0gdGhpczsKICAgICBzLmRhdGFCZWdpbiA9IHRhYmxlLmdldFJvd0NvdW50KCk7CiAgICAgaW5zZXJ0Tm9uZVJvdyhzLmRhdGFCZWdpbik7CiAgICAgc2VjdGlvbnMuYWRkKHMpOwpAQCAtMzY5LDYgKzM1NSw3IEBACiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdGlvbiB7CiAgICAgQ2hhbmdlVGFibGUyIHBhcmVudDsKICAgICBTdHJpbmcgdGl0bGVUZXh0OworICAgIFdpZGdldCB0aXRsZVdpZGdldDsKICAgICBpbnQgdGl0bGVSb3cgPSAtMTsKICAgICBpbnQgZGF0YUJlZ2luOwogICAgIGludCByb3dzOwpAQCAtMzgwLDEzICszNjcsMzMgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewogICAgICAgdGl0bGVUZXh0ID0gdGV4dDsKKyAgICAgIHRpdGxlV2lkZ2V0ID0gbnVsbDsKICAgICAgIGlmICh0aXRsZVJvdyA+PSAwKSB7CiAgICAgICAgIHBhcmVudC50YWJsZS5zZXRUZXh0KHRpdGxlUm93LCAwLCB0aXRsZVRleHQpOwogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlV2lkZ2V0KGZpbmFsIFdpZGdldCB0aXRsZSkgeworICAgICAgdGl0bGVXaWRnZXQgPSB0aXRsZTsKKyAgICAgIHRpdGxlVGV4dCA9IG51bGw7CisgICAgICBpZiAodGl0bGVSb3cgPj0gMCkgeworICAgICAgICBwYXJlbnQudGFibGUuc2V0V2lkZ2V0KHRpdGxlUm93LCAwLCB0aXRsZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGxheVRpdGxlKCkgeworICAgICAgaWYgKHRpdGxlVGV4dCAhPSBudWxsKSB7CisgICAgICAgIHNldFRpdGxlVGV4dCh0aXRsZVRleHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZih0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgIHNldFRpdGxlV2lkZ2V0KHRpdGxlV2lkZ2V0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGlzcGxheShDaGFuZ2VMaXN0IGNoYW5nZUxpc3QpIHsKLSAgICAgIGZpbmFsIGludCBzeiA9IGNoYW5nZUxpc3QgIT0gbnVsbCA/IGNoYW5nZUxpc3Quc2l6ZSgpIDogMDsKKyAgICAgIGZpbmFsIGludCBzeiA9IGNoYW5nZUxpc3QgIT0gbnVsbCA/IGNoYW5nZUxpc3QubGVuZ3RoKCkgOiAwOwogICAgICAgZmluYWwgYm9vbGVhbiBoYWREYXRhID0gcm93cyA+IDA7CiAKICAgICAgIGlmIChoYWREYXRhKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Db21taXRNZXNzYWdlQmxvY2suamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCmluZGV4IGVmZjNjZDUuLmVhMTg0ZGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCkBAIC0xNCwyNCArMTQsMzMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlczsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5FcnJvckRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21tZW50TGlua1Byb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5UZXh0Qm94Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuUHJlRWxlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LlN0eWxlLkRpc3BsYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUJpbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlGaWVsZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TaW1wbGVQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwogCiBwdWJsaWMgY2xhc3MgQ29tbWl0TWVzc2FnZUJsb2NrIGV4dGVuZHMgQ29tcG9zaXRlIHsKICAgaW50ZXJmYWNlIEJpbmRlciBleHRlbmRzIFVpQmluZGVyPEhUTUxQYW5lbCwgQ29tbWl0TWVzc2FnZUJsb2NrPiB7CkBAIC02MCwxMyArNjksNDQgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKLSAgICBkaXNwbGF5KG51bGwsIG51bGwsIGNvbW1pdE1lc3NhZ2UpOworICAgIGRpc3BsYXkobnVsbCwgbnVsbCwgZmFsc2UsIGNvbW1pdE1lc3NhZ2UpOwogICB9CiAKLSAgcHVibGljIHZvaWQgZGlzcGxheShDaGFuZ2UuSWQgY2hhbmdlSWQsIEJvb2xlYW4gc3RhcnJlZCwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKLSAgICBzdGFyUGFuZWwuY2xlYXIoKTsKKyAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDb21taXRNZXNzYWdlRWRpdERpYWxvZyBleHRlbmRzIENvbW1lbnRlZEFjdGlvbkRpYWxvZzxDaGFuZ2VEZXRhaWw+IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvcmlnaW5hbE1lc3NhZ2U7CisgICAgcHVibGljIENvbW1pdE1lc3NhZ2VFZGl0RGlhbG9nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGhlYWRpbmcsCisgICAgICAgIGZpbmFsIFN0cmluZyBjb21taXRNZXNzYWdlLCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKKyAgICAgIHN1cGVyKHRpdGxlLCBoZWFkaW5nLCBjYWxsYmFjayk7CisgICAgICBvcmlnaW5hbE1lc3NhZ2UgPSBjb21taXRNZXNzYWdlLnRyaW0oKTsKKyAgICAgIG1lc3NhZ2Uuc2V0Q2hhcmFjdGVyV2lkdGgoNzIpOworICAgICAgbWVzc2FnZS5zZXRWaXNpYmxlTGluZXMoMjApOworICAgICAgbWVzc2FnZS5zZXRUZXh0KG9yaWdpbmFsTWVzc2FnZSk7CisgICAgICBtZXNzYWdlLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uKCkpOworICAgICAgc2VuZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKIAotICAgIGlmIChjaGFuZ2VJZCAhPSBudWxsICYmIHN0YXJyZWQgIT0gbnVsbCAmJiBHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICBuZXcgVGV4dEJveENoYW5nZUxpc3RlbmVyKG1lc3NhZ2UpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChTdHJpbmcgbmV3VGV4dCkgeworICAgICAgICAgIC8vIFRyaW0gdGhlIG5ldyB0ZXh0IHNvIHdlIGRvbid0IGNvbnNpZGVyIHRyYWlsaW5nCisgICAgICAgICAgLy8gbmV3bGluZXMgYXMgY2hhbmdlcworICAgICAgICAgIHNlbmRCdXR0b24uc2V0RW5hYmxlZCghbmV3VGV4dC50cmltKCkuZXF1YWxzKG9yaWdpbmFsTWVzc2FnZSkpOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRleHQoKSB7CisgICAgICAvLyBBcyB3ZSByZWx5IG9uIGNvbW1pdCBtZXNzYWdlIGxpbmVzIGVuZGluZyBpbiBMRiwgd2UgY29udmVydCBDUkxGIHRvCisgICAgICAvLyBMRi4gQWRkaXRpb25hbGx5LCB0aGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIHRyaW1tZWQgdG8gcmVtb3ZlIGFueQorICAgICAgLy8gZXhjZXNzIG5ld2xpbmVzIGF0IHRoZSBlbmQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBzdGlsbCBoYXMgYXQKKyAgICAgIC8vIGxlYXN0IG9uZSB0cmFpbGluZyBuZXdsaW5lLgorICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0VGV4dCgpLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKS50cmltKCkgKyAnXG4nOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKKyAgICAgIEJvb2xlYW4gc3RhcnJlZCwgQm9vbGVhbiBjYW5FZGl0Q29tbWl0TWVzc2FnZSwgZmluYWwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKKyAgICBzdGFyUGFuZWwuY2xlYXIoKTsKKyAgICBpZiAocGF0Y2hTZXRJZCAhPSBudWxsICYmIHN0YXJyZWQgIT0gbnVsbCAmJiBHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwogICAgICAgU3RhcnJlZENoYW5nZXMuSWNvbiBzdGFyID0gU3RhcnJlZENoYW5nZXMuY3JlYXRlSWNvbihjaGFuZ2VJZCwgc3RhcnJlZCk7CiAgICAgICBzdGFyLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZVNjcmVlblN0YXJJY29uKCkpOwogICAgICAgc3RhclBhbmVsLmFkZChzdGFyKTsKQEAgLTc3LDkgKzExNyw0NiBAQAogICAgIH0KIAogICAgIHBlcm1hbGlua1BhbmVsLmNsZWFyKCk7Ci0gICAgaWYgKGNoYW5nZUlkICE9IG51bGwpIHsKKyAgICBpZiAocGF0Y2hTZXRJZCAhPSBudWxsKSB7CisgICAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwogICAgICAgcGVybWFsaW5rUGFuZWwuYWRkKG5ldyBDaGFuZ2VMaW5rKFV0aWwuQy5jaGFuZ2VQZXJtYWxpbmsoKSwgY2hhbmdlSWQpKTsKLSAgICAgIHBlcm1hbGlua1BhbmVsLmFkZChuZXcgQ29weWFibGVMYWJlbChDaGFuZ2VMaW5rLnBlcm1hbGluayhjaGFuZ2VJZCksIGZhbHNlKSk7CisgICAgICBwZXJtYWxpbmtQYW5lbC5hZGQobmV3IENvcHlhYmxlTGFiZWwoQ2hhbmdlTGluay5wZXJtYWxpbmsoY2hhbmdlSWQpLAorICAgICAgICAgIGZhbHNlKSk7CisgICAgICBpZiAoY2FuRWRpdENvbW1pdE1lc3NhZ2UpIHsKKyAgICAgICAgZmluYWwgSW1hZ2UgZWRpdCA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmVkaXQoKSk7CisgICAgICAgIGVkaXQuc2V0VGl0bGUoVXRpbC5DLmVkaXRDb21taXRNZXNzYWdlVG9vbFRpcCgpKTsKKyAgICAgICAgZWRpdC5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5rKCkpOworICAgICAgICBlZGl0LmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICAgICAgbmV3IENvbW1pdE1lc3NhZ2VFZGl0RGlhbG9nKFV0aWwuQy50aXRsZUVkaXRDb21taXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgVXRpbC5DLmhlYWRpbmdFZGl0Q29tbWl0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgIGNvbW1pdE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLklnbm9yZUVycm9yQ2FsbGJhY2soKSB7fSkgeworCisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7CisgICAgICAgICAgICAgICAgVXRpbC5NQU5BR0VfU1ZDLmNyZWF0ZU5ld1BhdGNoU2V0KHBhdGNoU2V0SWQsIGdldE1lc3NhZ2VUZXh0KCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlRGV0YWlsIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShjaGFuZ2VJZCkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKGNhdWdodC5nZXRNZXNzYWdlKCkpLmNlbnRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0uY2VudGVyKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBwZXJtYWxpbmtQYW5lbC5hZGQoZWRpdCk7CisgICAgICB9CiAgICAgfQogCiAgICAgU3RyaW5nW10gc3BsaXRDb21taXRNZXNzYWdlID0gY29tbWl0TWVzc2FnZS5zcGxpdCgiXG4iLCAyKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0N1c3RvbURhc2hib2FyZFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKaW5kZXggYzlmMWRjNi4uODQwZWJhYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKQEAgLTE0LDk3ICsxNCw0MyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZUxpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgQ3VzdG9tRGFzaGJvYXJkU2NyZWVuIGV4dGVuZHMgU2NyZWVuIGltcGxlbWVudHMgQ2hhbmdlTGlzdFNjcmVlbiB7Ci0gIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotICBwcml2YXRlIExpc3Q8U3RyaW5nPiB0aXRsZXM7Ci0gIHByaXZhdGUgTGlzdDxTdHJpbmc+IHF1ZXJpZXM7Ci0gIHByaXZhdGUgQ2hhbmdlVGFibGUyIHRhYmxlOwotICBwcml2YXRlIExpc3Q8Q2hhbmdlVGFibGUyLlNlY3Rpb24+IHNlY3Rpb25zOworICBwcml2YXRlIERhc2hib2FyZFRhYmxlIHRhYmxlOworICBwcml2YXRlIFN0cmluZyBwYXJhbXM7CiAKICAgcHVibGljIEN1c3RvbURhc2hib2FyZFNjcmVlbihTdHJpbmcgcGFyYW1zKSB7Ci0gICAgdGl0bGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGZvciAoU3RyaW5nIGt2UGFpciA6IHBhcmFtcy5zcGxpdCgiWyw7Jl0iKSkgewotICAgICAgU3RyaW5nW10ga3YgPSBrdlBhaXIuc3BsaXQoIj0iLCAyKTsKLSAgICAgIGlmIChrdi5sZW5ndGggIT0gMiB8fCBrdlswXS5pc0VtcHR5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgidGl0bGUiLmVxdWFscyhrdlswXSkpIHsKLSAgICAgICAgdGl0bGUgPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGl0bGVzLmFkZChVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMF0pKTsKLSAgICAgICAgcXVlcmllcy5hZGQoVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKSk7Ci0gICAgICB9Ci0gICAgfQorICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgeworICAgIHRhYmxlID0gbmV3IERhc2hib2FyZFRhYmxlKHBhcmFtcykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CisgICAgICAgIHN1cGVyLm9uTG9hZCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaERpc3BsYXkoKSB7CisgICAgICAgIHN1cGVyLmZpbmlzaERpc3BsYXkoKTsKKyAgICAgICAgZGlzcGxheSgpOworICAgICAgfQorICAgIH07CisKICAgICBzdXBlci5vbkluaXRVSSgpOwogCisgICAgU3RyaW5nIHRpdGxlID0gdGFibGUuZ2V0VGl0bGUoKTsKICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewogICAgICAgc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgc2V0UGFnZVRpdGxlKHRpdGxlKTsKICAgICB9CiAKLSAgICB0YWJsZSA9IG5ldyBDaGFuZ2VUYWJsZTIoKTsKLSAgICB0YWJsZS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY2NvdW50RGFzaGJvYXJkKCkpOwotCi0gICAgc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PENoYW5nZVRhYmxlMi5TZWN0aW9uPigpOwotICAgIGZvciAoU3RyaW5nIHRpdGxlIDogdGl0bGVzKSB7Ci0gICAgICBDaGFuZ2VUYWJsZTIuU2VjdGlvbiBzID0gbmV3IENoYW5nZVRhYmxlMi5TZWN0aW9uKCk7Ci0gICAgICBzLnNldFRpdGxlVGV4dCh0aXRsZSk7Ci0gICAgICB0YWJsZS5hZGRTZWN0aW9uKHMpOwotICAgICAgc2VjdGlvbnMuYWRkKHMpOwotICAgIH0KICAgICBhZGQodGFibGUpOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKLSAgICBzdXBlci5vbkxvYWQoKTsKLQotICAgIGlmIChxdWVyaWVzLmlzRW1wdHkoKSkgewotICAgICAgZGlzcGxheSgpOwotICAgIH0gZWxzZSBpZiAocXVlcmllcy5zaXplKCkgPT0gMSkgewotICAgICAgQ2hhbmdlTGlzdC5uZXh0KHF1ZXJpZXMuZ2V0KDApLAotICAgICAgICAgIDAsIFBhZ2VkU2luZ2xlTGlzdFNjcmVlbi5NQVhfU09SVEtFWSwKLSAgICAgICAgICBuZXcgU2NyZWVuTG9hZENhbGxiYWNrPENoYW5nZUxpc3Q+KHRoaXMpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJlRGlzcGxheShDaGFuZ2VMaXN0IHJlc3VsdCkgewotICAgICAgICAgICAgICB0YWJsZS51cGRhdGVDb2x1bW5zRm9yTGFiZWxzKHJlc3VsdCk7Ci0gICAgICAgICAgICAgIHNlY3Rpb25zLmdldCgwKS5kaXNwbGF5KHJlc3VsdCk7Ci0gICAgICAgICAgICAgIHRhYmxlLmZpbmlzaERpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENoYW5nZUxpc3QucXVlcnkoCi0gICAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+Pih0aGlzKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgdGFibGUudXBkYXRlQ29sdW1uc0ZvckxhYmVscygKLSAgICAgICAgICAgICAgICAgIHJlc3VsdC5hc0xpc3QoKS50b0FycmF5KG5ldyBDaGFuZ2VMaXN0W3Jlc3VsdC5zaXplKCldKSk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KGkpLmRpc3BsYXkocmVzdWx0LmdldChpKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGFibGUuZmluaXNoRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgcXVlcmllcy50b0FycmF5KG5ldyBTdHJpbmdbcXVlcmllcy5zaXplKCldKSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyS2V5cygpIHsKICAgICBzdXBlci5yZWdpc3RlcktleXMoKTsKICAgICB0YWJsZS5zZXRSZWdpc3RlcktleXModHJ1ZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9EYXNoYm9hcmRUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRGFzaGJvYXJkVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM4N2FiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRGFzaGJvYXJkVGFibGUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBEYXNoYm9hcmRUYWJsZSBleHRlbmRzIENoYW5nZVRhYmxlMiB7CisgIHByaXZhdGUgTGlzdDxTZWN0aW9uPiBzZWN0aW9uczsKKyAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHRpdGxlczsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcXVlcmllczsKKworICBwdWJsaWMgRGFzaGJvYXJkVGFibGUoU3RyaW5nIHBhcmFtcykgeworICAgIHRpdGxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBTdHJpbmcgZm9yZWFjaCA9IG51bGw7CisgICAgZm9yIChTdHJpbmcga3ZQYWlyIDogcGFyYW1zLnNwbGl0KCJbLDsmXSIpKSB7CisgICAgICBTdHJpbmdbXSBrdiA9IGt2UGFpci5zcGxpdCgiPSIsIDIpOworICAgICAgaWYgKGt2Lmxlbmd0aCAhPSAyIHx8IGt2WzBdLmlzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCJ0aXRsZSIuZXF1YWxzKGt2WzBdKSkgeworICAgICAgICB0aXRsZSA9IFVSTC5kZWNvZGVRdWVyeVN0cmluZyhrdlsxXSk7CisgICAgICB9IGVsc2UgaWYgKCJmb3JlYWNoIi5lcXVhbHMoa3ZbMF0pKSB7CisgICAgICAgIGZvcmVhY2ggPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGl0bGVzLmFkZChVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMF0pKTsKKyAgICAgICAgcXVlcmllcy5hZGQoVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvcmVhY2ggIT0gbnVsbCkgeworICAgICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBxdWVyaWVzLmxpc3RJdGVyYXRvcigpOworICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICBpdC5zZXQoaXQubmV4dCgpICsgIiAiICsgZm9yZWFjaCk7CisgICAgICB9CisgICAgfQorCisgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuYWNjb3VudERhc2hib2FyZCgpKTsKKworICAgIHNlY3Rpb25zID0gbmV3IEFycmF5TGlzdDxDaGFuZ2VUYWJsZTIuU2VjdGlvbj4oKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChTdHJpbmcgdGl0bGUgOiB0aXRsZXMpIHsKKyAgICAgIFNlY3Rpb24gcyA9IG5ldyBTZWN0aW9uKCk7CisgICAgICBzLnNldFRpdGxlV2lkZ2V0KG5ldyBJbmxpbmVIeXBlcmxpbmsodGl0bGUsIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KHF1ZXJpZXMuZ2V0KGkrKykpKSk7CisgICAgICBhZGRTZWN0aW9uKHMpOworICAgICAgc2VjdGlvbnMuYWRkKHMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgcmV0dXJuIHRpdGxlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKKyAgICBzdXBlci5vbkxvYWQoKTsKKworICAgIGlmIChxdWVyaWVzLnNpemUoKSA9PSAxKSB7CisgICAgICBDaGFuZ2VMaXN0Lm5leHQocXVlcmllcy5nZXQoMCksCisgICAgICAgICAgMCwgUGFnZWRTaW5nbGVMaXN0U2NyZWVuLk1BWF9TT1JUS0VZLAorICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VMaXN0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKENoYW5nZUxpc3QgcmVzdWx0KSB7CisgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMocmVzdWx0KTsKKyAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KDApLmRpc3BsYXkocmVzdWx0KTsKKyAgICAgICAgICAgICAgZmluaXNoRGlzcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKCEgcXVlcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIENoYW5nZUxpc3QucXVlcnkoCisgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEpzQXJyYXk8Q2hhbmdlTGlzdD4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgTGlzdDxDaGFuZ2VMaXN0PiBjbHMgPSBOYXRpdmVzLmFzTGlzdChyZXN1bHQpOworICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5zRm9yTGFiZWxzKGNscy50b0FycmF5KG5ldyBDaGFuZ2VMaXN0W2Nscy5zaXplKCldKSk7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KGkpLmRpc3BsYXkoY2xzLmdldChpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZmluaXNoRGlzcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgcXVlcmllcy50b0FycmF5KG5ldyBTdHJpbmdbcXVlcmllcy5zaXplKCldKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTVkNGQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRG93bmxvYWRDb21tYW5kTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7Ci0KLWFic3RyYWN0IGNsYXNzIERvd25sb2FkQ29tbWFuZExpbmsgZXh0ZW5kcyBBbmNob3IgaW1wbGVtZW50cyBDbGlja0hhbmRsZXIgewotICBmaW5hbCBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZCBjbWRUeXBlOwotCi0gIERvd25sb2FkQ29tbWFuZExpbmsoQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQgY21kVHlwZSwKLSAgICAgIFN0cmluZyB0ZXh0KSB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gICAgdGhpcy5jbWRUeXBlID0gY21kVHlwZTsKLSAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmsoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQik7Ci0gICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0KLSAgICBzZWxlY3QoKTsKLQotICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgotICAgICAgLy8KLSAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9Ci0gICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICBwcmVmLnNldERvd25sb2FkQ29tbWFuZChjbWRUeXBlKTsKLSAgICAgIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LlV0aWwuQUNDT1VOVF9TVkMuY2hhbmdlUHJlZmVyZW5jZXMocHJlZiwKLSAgICAgICAgICBuZXcgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVm9pZFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQgZ2V0Q21kVHlwZSgpIHsKLSAgICByZXR1cm4gY21kVHlwZTsKLSAgfQotCi0gIHZvaWQgc2VsZWN0KCkgewotICAgIERvd25sb2FkQ29tbWFuZFBhbmVsIHBhcmVudCA9IChEb3dubG9hZENvbW1hbmRQYW5lbCkgZ2V0UGFyZW50KCk7Ci0gICAgZm9yIChXaWRnZXQgdyA6IHBhcmVudCkgewotICAgICAgaWYgKHcgIT0gdGhpcyAmJiB3IGluc3RhbmNlb2YgRG93bmxvYWRDb21tYW5kTGluaykgewotICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBhcmVudC5zZXRDdXJyZW50Q29tbWFuZCh0aGlzKTsKLSAgICBhZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtfQWN0aXZlKCkpOwotICB9Ci0KLSAgYWJzdHJhY3Qgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE2ZGExLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BY2Nlc3NpYmlsaXR5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7Ci0KLWNsYXNzIERvd25sb2FkQ29tbWFuZFBhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKLSAgcHJpdmF0ZSBEb3dubG9hZENvbW1hbmRMaW5rIGN1cnJlbnRDb21tYW5kOwotICBwcml2YXRlIERvd25sb2FkVXJsTGluayBjdXJyZW50VXJsOwotCi0gIERvd25sb2FkQ29tbWFuZFBhbmVsKCkgewotICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0xpc3QoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQkxJU1QpOwotICB9Ci0KLSAgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiBnZXRXaWRnZXRDb3VudCgpID09IDA7Ci0gIH0KLQotICB2b2lkIHNlbGVjdChBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZCBjbWRUeXBlKSB7Ci0gICAgRG93bmxvYWRDb21tYW5kTGluayBmaXJzdCA9IG51bGw7Ci0KLSAgICBmb3IgKFdpZGdldCB3IDogdGhpcykgewotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBEb3dubG9hZENvbW1hbmRMaW5rKSB7Ci0gICAgICAgIGZpbmFsIERvd25sb2FkQ29tbWFuZExpbmsgZCA9IChEb3dubG9hZENvbW1hbmRMaW5rKSB3OwotICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewotICAgICAgICAgIGZpcnN0ID0gZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZC5jbWRUeXBlID09IGNtZFR5cGUpIHsKLSAgICAgICAgICBkLnNlbGVjdCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIG5vbmUgbWF0Y2hlZCB0aGUgcmVxdWVzdGVkIHR5cGUsIHNlbGVjdCB0aGUgZmlyc3QgaW4gdGhlCi0gICAgLy8gZ3JvdXAgYXMgdGhhdCB3aWxsIGF0IGxlYXN0IGdpdmUgdXMgYW4gaW5pdGlhbCBiYXNlbGluZS4KLSAgICBpZiAoZmlyc3QgIT0gbnVsbCkgewotICAgICAgZmlyc3Quc2VsZWN0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgY3VycmVudFVybCA9IGxpbms7Ci0gICAgdXBkYXRlKCk7Ci0gIH0KLQotICB2b2lkIHNldEN1cnJlbnRDb21tYW5kKERvd25sb2FkQ29tbWFuZExpbmsgY21kKSB7Ci0gICAgY3VycmVudENvbW1hbmQgPSBjbWQ7Ci0gICAgdXBkYXRlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotICAgIGlmIChjdXJyZW50Q29tbWFuZCAhPSBudWxsICYmIGN1cnJlbnRVcmwgIT0gbnVsbCkgewotICAgICAgY3VycmVudENvbW1hbmQuc2V0Q3VycmVudFVybChjdXJyZW50VXJsKTsKLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb21tYW5kICE9IG51bGwgJiYKLSAgICAgICAgY3VycmVudENvbW1hbmQuZ2V0Q21kVHlwZSgpLmVxdWFscyhEb3dubG9hZENvbW1hbmQuUkVQT19ET1dOTE9BRCkpIHsKLSAgICAgIGN1cnJlbnRDb21tYW5kLnNldEN1cnJlbnRVcmwobnVsbCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZFVybExpbmsuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWZhZmFhLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7Ci0KLWNsYXNzIERvd25sb2FkVXJsTGluayBleHRlbmRzIEFuY2hvciBpbXBsZW1lbnRzIENsaWNrSGFuZGxlciB7Ci0gIGZpbmFsIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZTsKLSAgZmluYWwgU3RyaW5nIHVybERhdGE7Ci0KLSAgRG93bmxvYWRVcmxMaW5rKEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZSwgU3RyaW5nIHRleHQsCi0gICAgICBTdHJpbmcgdXJsRGF0YSkgewotICAgIHN1cGVyKHRleHQpOwotICAgIHRoaXMudXJsVHlwZSA9IHVybFR5cGU7Ci0gICAgdGhpcy51cmxEYXRhID0gdXJsRGF0YTsKLSAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmsoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQik7Ci0gICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0KLSAgICBzZWxlY3QoKTsKLQotICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgotICAgICAgLy8KLSAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9Ci0gICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICBwcmVmLnNldERvd25sb2FkVXJsKHVybFR5cGUpOwotICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuVXRpbC5BQ0NPVU5UX1NWQy5jaGFuZ2VQcmVmZXJlbmNlcyhwcmVmLAotICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VsZWN0KCkgewotICAgIERvd25sb2FkVXJsUGFuZWwgcGFyZW50ID0gKERvd25sb2FkVXJsUGFuZWwpIGdldFBhcmVudCgpOwotICAgIGZvciAoV2lkZ2V0IHcgOiBwYXJlbnQpIHsKLSAgICAgIGlmICh3ICE9IHRoaXMgJiYgdyBpbnN0YW5jZW9mIERvd25sb2FkVXJsTGluaykgewotICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBhcmVudC5zZXRDdXJyZW50VXJsKHRoaXMpOwotICAgIGFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjOWViYy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZFVybFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLQotY2xhc3MgRG93bmxvYWRVcmxQYW5lbCBleHRlbmRzIEZsb3dQYW5lbCB7Ci0gIHByaXZhdGUgZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZFBhbmVsOwotCi0gIERvd25sb2FkVXJsUGFuZWwoZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZFBhbmVsKSB7Ci0gICAgdGhpcy5jb21tYW5kUGFuZWwgPSBjb21tYW5kUGFuZWw7Ci0gICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rTGlzdCgpKTsKLSAgICBBY2Nlc3NpYmlsaXR5LnNldFJvbGUoZ2V0RWxlbWVudCgpLCBBY2Nlc3NpYmlsaXR5LlJPTEVfVEFCTElTVCk7Ci0gIH0KLQotICBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgcmV0dXJuIGdldFdpZGdldENvdW50KCkgPT0gMDsKLSAgfQotCi0gIHZvaWQgc2VsZWN0KEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZSkgewotICAgIERvd25sb2FkVXJsTGluayBmaXJzdCA9IG51bGw7Ci0KLSAgICBmb3IgKFdpZGdldCB3IDogdGhpcykgewotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBEb3dubG9hZFVybExpbmspIHsKLSAgICAgICAgZmluYWwgRG93bmxvYWRVcmxMaW5rIGQgPSAoRG93bmxvYWRVcmxMaW5rKSB3OwotICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewotICAgICAgICAgIGZpcnN0ID0gZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZC51cmxUeXBlID09IHVybFR5cGUpIHsKLSAgICAgICAgICBkLnNlbGVjdCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIG5vbmUgbWF0Y2hlZCB0aGUgcmVxdWVzdGVkIHR5cGUsIHNlbGVjdCB0aGUgZmlyc3QgaW4gdGhlCi0gICAgLy8gZ3JvdXAgYXMgdGhhdCB3aWxsIGF0IGxlYXN0IGdpdmUgdXMgYW4gaW5pdGlhbCBiYXNlbGluZS4KLSAgICBpZiAoZmlyc3QgIT0gbnVsbCkgewotICAgICAgZmlyc3Quc2VsZWN0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgY29tbWFuZFBhbmVsLnNldEN1cnJlbnRVcmwobGluayk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhZ2VkU2luZ2xlTGlzdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKaW5kZXggMjNjZTE3OC4uYzIxYzY4ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSG9yaXpvbnRhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kOwogCkBAIC0xMTYsOSArMTE2LDkgQEAKIAogICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5KGZpbmFsIENoYW5nZUxpc3QgcmVzdWx0KSB7CiAgICAgY2hhbmdlcyA9IHJlc3VsdDsKLSAgICBpZiAoIWNoYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGNoYW5nZXMubGVuZ3RoKCkgIT0gMCkgewogICAgICAgZmluYWwgQ2hhbmdlSW5mbyBmID0gY2hhbmdlcy5nZXQoMCk7Ci0gICAgICBmaW5hbCBDaGFuZ2VJbmZvIGwgPSBjaGFuZ2VzLmdldChjaGFuZ2VzLnNpemUoKSAtIDEpOworICAgICAgZmluYWwgQ2hhbmdlSW5mbyBsID0gY2hhbmdlcy5nZXQoY2hhbmdlcy5sZW5ndGgoKSAtIDEpOwogCiAgICAgICBwcmV2LnNldFRhcmdldEhpc3RvcnlUb2tlbihhbmNob3JQcmVmaXggKyAiLHAsIiArIGYuX3NvcnRrZXkoKSk7CiAgICAgICBuZXh0LnNldFRhcmdldEhpc3RvcnlUb2tlbihhbmNob3JQcmVmaXggKyAiLG4sIiArIGwuX3NvcnRrZXkoKSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldENvbXBsZXhEaXNjbG9zdXJlUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCmluZGV4IDdlMzE0Y2MuLjc2Zjc3YTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCkBAIC0xOCwzMyArMTgsMjcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HaXR3ZWJMaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZC5Eb3dubG9hZFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BY2NvdW50TGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21wbGV4RGlzY2xvc3VyZVBhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkxpc3RlbmFibGVBY2NvdW50RGlmZlByZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnREaWZmUHJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuT3BlbkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLk9wZW5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LldpbmRvdzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkRpc2Nsb3N1cmVQYW5lbDsKQEAgLTU0LDcgKzQ4LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTE4Myw3ICsxNzYsNiBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgcG9wdWxhdGVEaWZmQWxsQWN0aW9ucyhkZXRhaWwpOwogICAgICAgYm9keS5hZGQoYWN0aW9uc1BhbmVsKTsKICAgICB9CiAgIH0KQEAgLTIwMiwyMTIgKzE5NCw1MCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBkaXNwbGF5RG93bmxvYWQoKSB7Ci0gICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3RLZXkgPSBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpOwotICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3RLZXkuZ2V0KCk7Ci0gICAgZmluYWwgQ29weWFibGVMYWJlbCBjb3B5TGFiZWwgPSBuZXcgQ29weWFibGVMYWJlbCgiIik7Ci0gICAgZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZHMgPSBuZXcgRG93bmxvYWRDb21tYW5kUGFuZWwoKTsKLSAgICBmaW5hbCBEb3dubG9hZFVybFBhbmVsIHVybHMgPSBuZXcgRG93bmxvYWRVcmxQYW5lbChjb21tYW5kcyk7Ci0gICAgZmluYWwgU2V0PERvd25sb2FkU2NoZW1lPiBhbGxvd2VkU2NoZW1lcyA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXREb3dubG9hZFNjaGVtZXMoKTsKLSAgICBmaW5hbCBTZXQ8RG93bmxvYWRDb21tYW5kPiBhbGxvd2VkQ29tbWFuZHMgPSBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0RG93bmxvYWRDb21tYW5kcygpOwotCi0gICAgY29weUxhYmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0NvcHlMYWJlbCgpKTsKLQotICAgIGlmIChjaGFuZ2VEZXRhaWwuaXNBbGxvd3NBbm9ueW1vdXMoKQotICAgICAgICAmJiBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0RGFlbW9uVXJsKCkgIT0gbnVsbAotICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuQU5PTl9HSVQpIHx8Ci0gICAgICAgICAgICBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgci5hcHBlbmQoR2Vycml0LmdldENvbmZpZygpLmdldEdpdERhZW1vblVybCgpKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChwYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluayhEb3dubG9hZFNjaGVtZS5BTk9OX0dJVCwgVXRpbC5NCi0gICAgICAgICAgLmFub255bW91c0Rvd25sb2FkKCJHaXQiKSwgci50b1N0cmluZygpKSk7CisgIHB1YmxpYyBjbGFzcyBDaGFuZ2VEb3dubG9hZFBhbmVsIGV4dGVuZHMgRG93bmxvYWRQYW5lbCB7CisgICAgcHVibGljIENoYW5nZURvd25sb2FkUGFuZWwoU3RyaW5nIHByb2plY3QsIFN0cmluZyByZWYsIGJvb2xlYW4gYWxsb3dBbm9ueW1vdXMpIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIHJlZiwgYWxsb3dBbm9ueW1vdXMpOwogICAgIH0KIAotICAgIFN0cmluZyBob3N0UGFnZVVybCA9IEdXVC5nZXRIb3N0UGFnZUJhc2VVUkwoKTsKLSAgICBpZiAoIWhvc3RQYWdlVXJsLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgIGhvc3RQYWdlVXJsICs9ICIvIjsKLSAgICB9Ci0KLSAgICBpZiAoY2hhbmdlRGV0YWlsLmlzQWxsb3dzQW5vbnltb3VzKCkKLSAgICAgICAgJiYgKGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkFOT05fSFRUUCkgfHwKLSAgICAgICAgICAgIGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsKSB7Ci0gICAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXRIdHRwVXJsKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgci5hcHBlbmQoaG9zdFBhZ2VVcmwpOwotICAgICAgfQotICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOwotICAgICAgci5hcHBlbmQoIiAiKTsKLSAgICAgIHIuYXBwZW5kKHBhdGNoU2V0LmdldFJlZk5hbWUoKSk7Ci0gICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rKERvd25sb2FkU2NoZW1lLkFOT05fSFRUUCwgVXRpbC5NCi0gICAgICAgICAgLmFub255bW91c0Rvd25sb2FkKCJIVFRQIiksIHIudG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0U3NoZEFkZHJlc3MoKSAhPSBudWxsCi0gICAgICAgICYmIGhhc1VzZXJOYW1lKCkKLSAgICAgICAgJiYgKGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLlNTSCkgfHwKLSAgICAgICAgICAgIGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIFN0cmluZyBzc2hBZGRyID0gR2Vycml0LmdldENvbmZpZygpLmdldFNzaGRBZGRyZXNzKCk7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgci5hcHBlbmQoInNzaDovLyIpOwotICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7Ci0gICAgICByLmFwcGVuZCgiQCIpOwotICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKjoiKSB8fCAiIi5lcXVhbHMoc3NoQWRkcikpIHsKLSAgICAgICAgci5hcHBlbmQoV2luZG93LkxvY2F0aW9uLmdldEhvc3ROYW1lKCkpOwotICAgICAgfQotICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKiIpKSB7Ci0gICAgICAgIHNzaEFkZHIgPSBzc2hBZGRyLnN1YnN0cmluZygxKTsKLSAgICAgIH0KLSAgICAgIHIuYXBwZW5kKHNzaEFkZHIpOwotICAgICAgci5hcHBlbmQoIi8iKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChwYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluayhEb3dubG9hZFNjaGVtZS5TU0gsICJTU0giLCByLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBpZiAoKGhhc1VzZXJOYW1lKCkgfHwgc2l0ZVJlbGllc09uSHR0cCgpKQotICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuSFRUUCkKLSAgICAgICAgICAgIHx8IGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCi0gICAgICAgICAgJiYgKGNoYW5nZURldGFpbC5pc0FsbG93c0Fub255bW91cygpIHx8IHNpdGVSZWxpZXNPbkh0dHAoKSkpIHsKLSAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTdHJpbmcgYmFzZSA9IGhvc3RQYWdlVXJsOwotICAgICAgICBpbnQgcCA9IGJhc2UuaW5kZXhPZigiOi8vIik7Ci0gICAgICAgIGludCBzID0gYmFzZS5pbmRleE9mKCcvJywgcCArIDMpOwotICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICBzID0gYmFzZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaG9zdCA9IGJhc2Uuc3Vic3RyaW5nKHAgKyAzLCBzKTsKLSAgICAgICAgaWYgKGhvc3QuY29udGFpbnMoIkAiKSkgewotICAgICAgICAgIGhvc3QgPSBob3N0LnN1YnN0cmluZyhob3N0LmluZGV4T2YoJ0AnKSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgci5hcHBlbmQoYmFzZS5zdWJzdHJpbmcoMCwgcCArIDMpKTsKLSAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7Ci0gICAgICAgIHIuYXBwZW5kKCdAJyk7Ci0gICAgICAgIHIuYXBwZW5kKGhvc3QpOwotICAgICAgICByLmFwcGVuZChiYXNlLnN1YnN0cmluZyhzKSk7Ci0gICAgICB9Ci0gICAgICByLmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0gICAgICByLmFwcGVuZCgiICIpOwotICAgICAgci5hcHBlbmQocGF0Y2hTZXQuZ2V0UmVmTmFtZSgpKTsKLSAgICAgIHVybHMuYWRkKG5ldyBEb3dubG9hZFVybExpbmsoRG93bmxvYWRTY2hlbWUuSFRUUCwgIkhUVFAiLCByLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuUkVQT19ET1dOTE9BRCkpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZURvd25sb2FkQ29tbWFuZExpbmtzKCkgewogICAgICAgLy8gVGhpcyBzaXRlIHByZWZlcnMgdXNhZ2Ugb2YgdGhlICdyZXBvJyB0b29sLCBzbyBzdWdnZXN0CiAgICAgICAvLyB0aGF0IGZvciBlYXN5IGZldGNoLgogICAgICAgLy8KLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICByLmFwcGVuZCgicmVwbyBkb3dubG9hZCAiKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSk7Ci0gICAgICByLmFwcGVuZCgiLyIpOwotICAgICAgci5hcHBlbmQocGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpKTsKLSAgICAgIGZpbmFsIFN0cmluZyBjbWQgPSByLnRvU3RyaW5nKCk7Ci0gICAgICBjb21tYW5kcy5hZGQobmV3IERvd25sb2FkQ29tbWFuZExpbmsoRG93bmxvYWRDb21tYW5kLlJFUE9fRE9XTkxPQUQsCi0gICAgICAgICAgInJlcG8gZG93bmxvYWQiKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICB1cmxzLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KGNtZCk7CisgICAgICBpZiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuUkVQT19ET1dOTE9BRCkpIHsKKyAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBSZXBvQ29tbWFuZExpbmsocHJvamVjdE5hbWUsCisgICAgICAgICAgICBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSArICIvIgorICAgICAgICAgICAgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF1cmxzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBDaGVja291dENvbW1hbmRMaW5rKCkpOwogICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICBpZiAoIXVybHMuaXNFbXB0eSgpKSB7Ci0gICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCkKLSAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgewotICAgICAgICBjb21tYW5kcy5hZGQobmV3IERvd25sb2FkQ29tbWFuZExpbmsoRG93bmxvYWRDb21tYW5kLkNIRUNLT1VULAotICAgICAgICAgICAgImNoZWNrb3V0IikgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgewotICAgICAgICAgICAgdXJscy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBmZXRjaCAiICsgbGluay51cmxEYXRhCi0gICAgICAgICAgICAgICAgKyAiICYmIGdpdCBjaGVja291dCBGRVRDSF9IRUFEIik7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLlBVTEwpCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5QVUxMLCAicHVsbCIpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICAgIHVybHMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KCJnaXQgcHVsbCAiICsgbGluay51cmxEYXRhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFUlJZX1BJQ0spCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5DSEVSUllfUElDSywKLSAgICAgICAgICAgICJjaGVycnktcGljayIpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICAgIHVybHMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KCJnaXQgZmV0Y2ggIiArIGxpbmsudXJsRGF0YQotICAgICAgICAgICAgICAgICsgIiAmJiBnaXQgY2hlcnJ5LXBpY2sgRkVUQ0hfSEVBRCIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5GT1JNQVRfUEFUQ0gpCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5GT1JNQVRfUEFUQ0gsCi0gICAgICAgICAgICAicGF0Y2giKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgICAgICAgICB1cmxzLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGZldGNoICIgKyBsaW5rLnVybERhdGEKLSAgICAgICAgICAgICAgICArICIgJiYgZ2l0IGZvcm1hdC1wYXRjaCAtMSAtLXN0ZG91dCBGRVRDSF9IRUFEIik7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuUFVMTCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBQdWxsQ29tbWFuZExpbmsoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFUlJZX1BJQ0spCisgICAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgeworICAgICAgICAgIGNvbW1hbmRzLmFkZChjbWRMaW5rZmFjdG9yeS5uZXcgQ2hlcnJ5UGlja0NvbW1hbmRMaW5rKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkZPUk1BVF9QQVRDSCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBGb3JtYXRQYXRjaENvbW1hbmRMaW5rKCkpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgZmluYWwgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICBmaW5hbCBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzIHByZWY7Ci0gICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewotICAgICAgICBwcmVmID0gR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVmID0gbmV3IEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgcHJlZi5yZXNldFRvRGVmYXVsdHMoKTsKLSAgICAgIH0KLSAgICAgIGNvbW1hbmRzLnNlbGVjdChwcmVmLmdldERvd25sb2FkQ29tbWFuZCgpKTsKLSAgICAgIHVybHMuc2VsZWN0KHByZWYuZ2V0RG93bmxvYWRVcmwoKSk7Ci0KLSAgICAgIEZsb3dQYW5lbCBwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgICAgcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtIZWFkZXIoKSk7Ci0gICAgICBwLmFkZChjb21tYW5kcyk7Ci0gICAgICBmaW5hbCBJbmxpbmVMYWJlbCBnbHVlID0gbmV3IElubGluZUxhYmVsKCk7Ci0gICAgICBnbHVlLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0hlYWRlckdhcCgpKTsKLSAgICAgIHAuYWRkKGdsdWUpOwotICAgICAgcC5hZGQodXJscyk7Ci0KLSAgICAgIGZwLmFkZChwKTsKLSAgICAgIGZwLmFkZChjb3B5TGFiZWwpOwotICAgIH0KLSAgICBpbmZvVGFibGUuc2V0V2lkZ2V0KFJfRE9XTkxPQUQsIDEsIGZwKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2l0ZVJlbGllc09uSHR0cCgpIHsKLSAgICByZXR1cm4gR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCi0gICAgICAgICYmIEdlcnJpdC5nZXRDb25maWcoKS5nZXRBdXRoVHlwZSgpID09IEF1dGhUeXBlLkNVU1RPTV9FWFRFTlNJT04KLSAgICAgICAgJiYgIUdlcnJpdC5nZXRDb25maWcoKS5zaXRlSGFzVXNlcm5hbWVzKCk7Ci0gIH0KKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlEb3dubG9hZCgpIHsKKyAgICBDaGFuZ2VEb3dubG9hZFBhbmVsIGRwID0gbmV3IENoYW5nZURvd25sb2FkUGFuZWwoCisgICAgICBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpLmdldCgpLAorICAgICAgcGF0Y2hTZXQuZ2V0UmVmTmFtZSgpLAorICAgICAgY2hhbmdlRGV0YWlsLmlzQWxsb3dzQW5vbnltb3VzKCkpOwogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzVXNlck5hbWUoKSB7Ci0gICAgcmV0dXJuIEdlcnJpdC5pc1NpZ25lZEluKCkKLSAgICAgICAgJiYgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSAhPSBudWxsCi0gICAgICAgICYmIEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldFVzZXJOYW1lKCkubGVuZ3RoKCkgPiAwOworICAgIGluZm9UYWJsZS5zZXRXaWRnZXQoUl9ET1dOTE9BRCwgMSwgZHApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlVc2VySWRlbnRpdHkoZmluYWwgaW50IHJvdywgZmluYWwgVXNlcklkZW50aXR5IHdobykgewpAQCAtNDIwLDggKzI1MCw3IEBACiAgICAgZnAuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucGF0Y2hTZXRVc2VySWRlbnRpdHkoKSk7CiAgICAgaWYgKHdoby5nZXROYW1lKCkgIT0gbnVsbCkgewogICAgICAgaWYgKHdoby5nZXRBY2NvdW50KCkgIT0gbnVsbCkgewotICAgICAgICBmcC5hZGQobmV3IElubGluZUh5cGVybGluayh3aG8uZ2V0TmFtZSgpLAotICAgICAgICAgICAgUGFnZUxpbmtzLnRvQWNjb3VudFF1ZXJ5KHdoby5nZXROYW1lKCkpKSk7CisgICAgICAgIGZwLmFkZChuZXcgQWNjb3VudExpbmsod2hvKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBmaW5hbCBJbmxpbmVMYWJlbCBsYmwgPSBuZXcgSW5saW5lTGFiZWwod2hvLmdldE5hbWUoKSk7CiAgICAgICAgIGxibC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY2NvdW50TmFtZSgpKTsKQEAgLTQ3NSwxMSArMzA0LDI5IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICBiLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5zdWJtaXQocGF0Y2hTZXQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLkdlcnJpdFdpZGdldENhbGxiYWNrKGIpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlRGV0YWlsIHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgb25TdWJtaXRSZXN1bHQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgQ2hhbmdlQXBpLnN1Ym1pdCgKKyAgICAgICAgICAgICAgcGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSwKKyAgICAgICAgICAgICAgcGF0Y2hTZXQuZ2V0UmV2aXNpb24oKS5nZXQoKSwKKyAgICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFN1Ym1pdEluZm8+KCkgeworICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFN1Ym1pdEluZm8gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlZGlzcGxheSgpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGVycikgeworICAgICAgICAgICAgICAgICAgICBpZiAoU3VibWl0RmFpbHVyZURpYWxvZy5pc0NvbmZsaWN0KGVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VibWl0RmFpbHVyZURpYWxvZyhlcnIuZ2V0TWVzc2FnZSgpKS5jZW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICByZWRpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBiLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGVycik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZGlzcGxheSgpIHsKKyAgICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBQYWdlTGlua3MudG9DaGFuZ2UocGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlU2NyZWVuKHBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCkpKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICAgIH0pOwpAQCAtNTA0LDggKzM1MSwyMiBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VuZCgpIHsKLSAgICAgICAgICAgICAgVXRpbC5NQU5BR0VfU1ZDLnJldmVydENoYW5nZShwYXRjaFNldC5nZXRJZCgpLCBnZXRNZXNzYWdlVGV4dCgpLAotICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgQ2hhbmdlQXBpLnJldmVydChjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSwKKyAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0KCksIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VJbmZvPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDaGFuZ2VJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShuZXcgQ2hhbmdlLklkKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAuX251bWJlcigpKSkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0uY2VudGVyKCk7CiAgICAgICAgIH0KQEAgLTUyNyw4ICszODgsMjUgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7Ci0gICAgICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5hYmFuZG9uQ2hhbmdlKHBhdGNoU2V0LmdldElkKCksIGdldE1lc3NhZ2VUZXh0KCksCi0gICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgLy8gVE9ETzogb25jZSB0aGUgb3RoZXIgdXNlcnMgb2YgQWN0aW9uRGlhbG9nIGhhdmUgY29udmVydGVkIHRvCisgICAgICAgICAgICAgIC8vIFJFU1QgQVBJcywgd2UgY2FuIHVzZSBjcmVhdGVDYWxsYmFjaygpIHJhdGhlciB0aGFuIHByb3ZpZGluZworICAgICAgICAgICAgICAvLyB0aGVtIGRpcmVjdGx5LgorICAgICAgICAgICAgICBDaGFuZ2VBcGkuYWJhbmRvbihjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSwKKyAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0KCksIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VJbmZvPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDaGFuZ2VJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShuZXcgQ2hhbmdlLklkKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAuX251bWJlcigpKSkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0uY2VudGVyKCk7CiAgICAgICAgIH0KQEAgLTU3NCw4ICs0NTIsMjIgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7Ci0gICAgICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5yZXN0b3JlQ2hhbmdlKHBhdGNoU2V0LmdldElkKCksIGdldE1lc3NhZ2VUZXh0KCksCi0gICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgQ2hhbmdlQXBpLnJlc3RvcmUoY2hhbmdlRGV0YWlsLmdldENoYW5nZSgpLmdldENoYW5nZUlkKCksCisgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlVGV4dCgpLCBuZXcgR2Vycml0Q2FsbGJhY2s8Q2hhbmdlSW5mbz4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheShQYWdlTGlua3MudG9DaGFuZ2UobmV3IENoYW5nZS5JZChyZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLl9udW1iZXIoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICBoaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9LmNlbnRlcigpOwogICAgICAgICB9CkBAIC01OTcsMzUgKzQ4OSw2IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlmZkFsbEFjdGlvbnMoZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7Ci0gICAgZmluYWwgQnV0dG9uIGRpZmZBbGxTaWRlQnlTaWRlID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uRGlmZkFsbFNpZGVCeVNpZGUoKSk7Ci0gICAgZGlmZkFsbFNpZGVCeVNpZGUuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmb3IgKFBhdGNoIHAgOiBkZXRhaWwuZ2V0UGF0Y2hlcygpKSB7Ci0gICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hTaWRlQnlTaWRlKGRpZmZCYXNlSWQsIHAuZ2V0S2V5KCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGFjdGlvbnNQYW5lbC5hZGQoZGlmZkFsbFNpZGVCeVNpZGUpOwotCi0gICAgZmluYWwgQnV0dG9uIGRpZmZBbGxVbmlmaWVkID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uRGlmZkFsbFVuaWZpZWQoKSk7Ci0gICAgZGlmZkFsbFVuaWZpZWQuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmb3IgKFBhdGNoIHAgOiBkZXRhaWwuZ2V0UGF0Y2hlcygpKSB7Ci0gICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hVbmlmaWVkKGRpZmZCYXNlSWQsIHAuZ2V0S2V5KCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGFjdGlvbnNQYW5lbC5hZGQoZGlmZkFsbFVuaWZpZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coU3RyaW5nIHRva2VuKSB7Ci0gICAgU3RyaW5nIHVybCA9IFdpbmRvdy5Mb2NhdGlvbi5nZXRQYXRoKCkgKyAiIyIgKyB0b2tlbjsKLSAgICBXaW5kb3cub3Blbih1cmwsICJfYmxhbmsiLCBudWxsKTsKLSAgfQotCiAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVJldmlld0FjdGlvbigpIHsKICAgICBmaW5hbCBCdXR0b24gYiA9IG5ldyBCdXR0b24oVXRpbC5DLmJ1dHRvblJldmlldygpKTsKICAgICBiLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewpAQCAtNzM5LDI4ICs2MDIsNiBAQAogICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmhlYWRlcigpKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBvblN1Ym1pdFJlc3VsdChmaW5hbCBDaGFuZ2VEZXRhaWwgcmVzdWx0KSB7Ci0gICAgaWYgKHJlc3VsdC5nZXRDaGFuZ2UoKS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgewotICAgICAgLy8gVGhlIHN1Ym1pdCBmYWlsZWQuIFRyeSB0byBsb2NhdGUgdGhlIG1lc3NhZ2UgYW5kIGRpc3BsYXkKLSAgICAgIC8vIGl0IHRvIHRoZSB1c2VyLCBpdCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNyZWF0ZWQgYnkgR2Vycml0LgotICAgICAgLy8KLSAgICAgIENoYW5nZU1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TWVzc2FnZXMoKSAhPSBudWxsICYmIHJlc3VsdC5nZXRNZXNzYWdlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHJlc3VsdC5nZXRNZXNzYWdlcygpLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5nZXRNZXNzYWdlcygpLmdldChpKS5nZXRBdXRob3IoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtc2cgPSByZXN1bHQuZ2V0TWVzc2FnZXMoKS5nZXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG1zZyAhPSBudWxsKSB7Ci0gICAgICAgIG5ldyBTdWJtaXRGYWlsdXJlRGlhbG9nKHJlc3VsdCwgbXNnKS5jZW50ZXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGV0YWlsQ2FjaGUuc2V0KHJlc3VsdCk7Ci0gIH0KLQogICBwdWJsaWMgUGF0Y2hTZXQgZ2V0UGF0Y2hTZXQoKSB7CiAgICAgcmV0dXJuIHBhdGNoU2V0OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldHNCbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGF0Y2hTZXRzQmxvY2suamF2YQppbmRleCBiOWVkNGU3Li41YTZlNDI3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldHNCbG9jay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0c0Jsb2NrLmphdmEKQEAgLTE3Niw2ICsxNzYsNyBAQAogICAgICAgICBQYXRjaFNldENvbXBsZXhEaXNjbG9zdXJlUGFuZWwgcGF0Y2hTZXRQYW5lbCA9CiAgICAgICAgICAgICBwYXRjaFNldFBhbmVscy5nZXQocGF0Y2hTZXRJZCk7CiAgICAgICAgIHBhdGNoU2V0UGFuZWwuc2V0QWN0aXZlKHRydWUpOworICAgICAgICBwYXRjaFNldFBhbmVsLnNldE9wZW4odHJ1ZSk7CiAgICAgICAgIGFjdGl2ZVBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwogICAgICAgfQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFRhYmxlLmphdmEKaW5kZXggYjhhY2Q1Ni4uZDAwZWY4OSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGF0Y2hUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoVGFibGUuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkRpc3BhdGNoZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOwpAQCAtMjIsMTEgKzIzLDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlBhdGNoTGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldERldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaC5DaGFuZ2VUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaC5LZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoLlBhdGNoVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXIuUmVwZWF0aW5nQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CkBAIC0zNCw2ICszNCw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CkBAIC00NCw3ICs0Niw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5wcm9ncmVzcy5jbGllbnQuUHJvZ3Jlc3NCYXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXlVdGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTI0Myw4ICsyNDQsNyBAQAogCiAgICAgS2V5IHRoaXNLZXkgPSBwYXRjaC5nZXRLZXkoKTsKICAgICBQYXRjaExpbmsgbGluazsKLSAgICBpZiAocGF0Y2hUeXBlID09IFBhdGNoU2NyZWVuLlR5cGUuU0lERV9CWV9TSURFCi0gICAgICAgICYmIHBhdGNoLmdldFBhdGNoVHlwZSgpID09IFBhdGNoLlBhdGNoVHlwZS5VTklGSUVEKSB7CisgICAgaWYgKHBhdGNoVHlwZSA9PSBQYXRjaFNjcmVlbi5UeXBlLlNJREVfQllfU0lERSkgewogICAgICAgbGluayA9IG5ldyBQYXRjaExpbmsuU2lkZUJ5U2lkZSgiIiwgYmFzZSwgdGhpc0tleSwgaW5kZXgsIGRldGFpbCwgdGhpcyk7CiAgICAgfSBlbHNlIHsKICAgICAgIGxpbmsgPSBuZXcgUGF0Y2hMaW5rLlVuaWZpZWQoIiIsIGJhc2UsIHRoaXNLZXksIGluZGV4LCBkZXRhaWwsIHRoaXMpOwpAQCAtMjkzLDEwICsyOTMsNiBAQAogICAgIHJldHVybiBsaXN0ZW5hYmxlUHJlZnM7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlIHByZWZzKSB7Ci0gICAgbGlzdGVuYWJsZVByZWZzID0gcHJlZnM7Ci0gIH0KLQogICBwcml2YXRlIGNsYXNzIE15VGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8UGF0Y2g+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19QQVRIID0gMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19EUkFGVCA9IDM7CkBAIC0zOTQsMTMgKzM5MCw5IEBACiAgICAgICBzZXRSb3dJdGVtKHJvdywgcGF0Y2gpOwogCiAgICAgICBXaWRnZXQgbmFtZUNvbDsKLSAgICAgIGlmIChwYXRjaC5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuVU5JRklFRCkgewotICAgICAgICBuYW1lQ29sID0gbmV3IFBhdGNoTGluay5TaWRlQnlTaWRlKGdldERpc3BsYXlGaWxlTmFtZShwYXRjaCksIGJhc2UsCi0gICAgICAgICAgICBwYXRjaC5nZXRLZXkoKSwgcm93IC0gMSwgZGV0YWlsLCBQYXRjaFRhYmxlLnRoaXMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmFtZUNvbCA9IG5ldyBQYXRjaExpbmsuVW5pZmllZChnZXREaXNwbGF5RmlsZU5hbWUocGF0Y2gpLCBiYXNlLAotICAgICAgICAgICAgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKTsKLSAgICAgIH0KKyAgICAgIG5hbWVDb2wgPSBuZXcgUGF0Y2hMaW5rLlNpZGVCeVNpZGUoZ2V0RGlzcGxheUZpbGVOYW1lKHBhdGNoKSwgYmFzZSwKKyAgICAgICAgICBwYXRjaC5nZXRLZXkoKSwgcm93IC0gMSwgZGV0YWlsLCBQYXRjaFRhYmxlLnRoaXMpOworCiAgICAgICBpZiAocGF0Y2guZ2V0U291cmNlRmlsZU5hbWUoKSAhPSBudWxsKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0OwogICAgICAgICBpZiAocGF0Y2guZ2V0Q2hhbmdlVHlwZSgpID09IFBhdGNoLkNoYW5nZVR5cGUuUkVOQU1FRCkgewpAQCAtNDIwLDE4ICs0MTIsNDMgQEAKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfUEFUSCwgbmFtZUNvbCk7CiAKICAgICAgIGludCBDX1VOSUZJRUQgPSBDX1NJREVCWVNJREUgKyAxOwotICAgICAgaWYgKHBhdGNoLmdldFBhdGNoVHlwZSgpID09IFBhdGNoLlBhdGNoVHlwZS5VTklGSUVEKSB7Ci0gICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfU0lERUJZU0lERSwgbmV3IFBhdGNoTGluay5TaWRlQnlTaWRlKAotICAgICAgICAgICAgVXRpbC5DLnBhdGNoVGFibGVEaWZmU2lkZUJ5U2lkZSgpLCBiYXNlLCBwYXRjaC5nZXRLZXkoKSwgcm93IC0gMSwKLSAgICAgICAgICAgIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKSk7Ci0gICAgICB9IGVsc2UgaWYgKHBhdGNoLmdldFBhdGNoVHlwZSgpID09IFBhdGNoLlBhdGNoVHlwZS5CSU5BUlkpIHsKLSAgICAgICAgQ19VTklGSUVEID0gQ19TSURFQllTSURFICsgMjsKLSAgICAgIH0KKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfU0lERUJZU0lERSwgbmV3IFBhdGNoTGluay5TaWRlQnlTaWRlKAorICAgICAgICAgIFV0aWwuQy5wYXRjaFRhYmxlRGlmZlNpZGVCeVNpZGUoKSwgYmFzZSwgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsCisgICAgICAgICAgZGV0YWlsLCBQYXRjaFRhYmxlLnRoaXMpKTsKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfVU5JRklFRCwgbmV3IFBhdGNoTGluay5VbmlmaWVkKAogICAgICAgICAgIFV0aWwuQy5wYXRjaFRhYmxlRGlmZlVuaWZpZWQoKSwgYmFzZSwgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsCiAgICAgICAgICAgZGV0YWlsLCBQYXRjaFRhYmxlLnRoaXMpKTsKICAgICB9CiAKKyAgICB2b2lkIGluaXRpYWxpemVMYXN0Um93KGludCByb3cpIHsKKyAgICAgIEFuY2hvciBzaWRlQnlTaWRlID0gbmV3IEFuY2hvcihVdGlsLkMuZGlmZkFsbFNpZGVCeVNpZGUoKSk7CisgICAgICBzaWRlQnlTaWRlLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgZm9yIChQYXRjaCBwIDogZGV0YWlsLmdldFBhdGNoZXMoKSkgeworICAgICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hTaWRlQnlTaWRlKGJhc2UsIHAuZ2V0S2V5KCkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgQ19TSURFQllTSURFIC0gMiwgc2lkZUJ5U2lkZSk7CisKKyAgICAgIGludCBDX1VOSUZJRUQgPSBDX1NJREVCWVNJREUgLSAyICsgMTsKKyAgICAgIEFuY2hvciB1bmlmaWVkID0gbmV3IEFuY2hvcihVdGlsLkMuZGlmZkFsbFVuaWZpZWQoKSk7CisgICAgICB1bmlmaWVkLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICBmb3IgKFBhdGNoIHAgOiBkZXRhaWwuZ2V0UGF0Y2hlcygpKSB7CisgICAgICAgICAgICBvcGVuV2luZG93KERpc3BhdGNoZXIudG9QYXRjaFVuaWZpZWQoYmFzZSwgcC5nZXRLZXkoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0pOworICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgQ19VTklGSUVELCB1bmlmaWVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb3BlbldpbmRvdyhTdHJpbmcgdG9rZW4pIHsKKyAgICAgIFN0cmluZyB1cmwgPSBXaW5kb3cuTG9jYXRpb24uZ2V0UGF0aCgpICsgIiMiICsgdG9rZW47CisgICAgICBXaW5kb3cub3Blbih1cmwsICJfYmxhbmsiLCBudWxsKTsKKyAgICB9CisKICAgICB2b2lkIGFwcGVuZEhlYWRlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgewogICAgICAgbS5vcGVuVHIoKTsKIApAQCAtNTMwLDQ5ICs1NDcsOSBAQAogICAgICAgYXBwZW5kU2l6ZShtLCBwKTsKICAgICAgIG0uY2xvc2VUZCgpOwogCi0gICAgICBzd2l0Y2ggKHAuZ2V0UGF0Y2hUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBVTklGSUVEOgotICAgICAgICAgIG9wZW5saW5rKG0sIDIpOwotICAgICAgICAgIG0uY2xvc2VUZCgpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQklOQVJZOiB7Ci0gICAgICAgICAgU3RyaW5nIGJhc2UgPSBHV1QuZ2V0SG9zdFBhZ2VCYXNlVVJMKCk7Ci0gICAgICAgICAgYmFzZSArPSAiY2F0LyIgKyBLZXlVdGlsLmVuY29kZShwLmdldEtleSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIHN3aXRjaCAocC5nZXRDaGFuZ2VUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgREVMRVRFRDoKLSAgICAgICAgICAgIGNhc2UgTU9ESUZJRUQ6Ci0gICAgICAgICAgICAgIG9wZW5saW5rKG0sIDEpOwotICAgICAgICAgICAgICBtLm9wZW5BbmNob3IoKTsKLSAgICAgICAgICAgICAgbS5zZXRBdHRyaWJ1dGUoImhyZWYiLCBiYXNlICsgIl4xIik7Ci0gICAgICAgICAgICAgIG0uYXBwZW5kKFV0aWwuQy5wYXRjaFRhYmxlRG93bmxvYWRQcmVJbWFnZSgpKTsKLSAgICAgICAgICAgICAgY2xvc2VsaW5rKG0pOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGVtcHR5Y2VsbChtLCAxKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN3aXRjaCAocC5nZXRDaGFuZ2VUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTU9ESUZJRUQ6Ci0gICAgICAgICAgICBjYXNlIEFEREVEOgotICAgICAgICAgICAgICBvcGVubGluayhtLCAxKTsKLSAgICAgICAgICAgICAgbS5vcGVuQW5jaG9yKCk7Ci0gICAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCJocmVmIiwgYmFzZSArICJeMCIpOwotICAgICAgICAgICAgICBtLmFwcGVuZChVdGlsLkMucGF0Y2hUYWJsZURvd25sb2FkUG9zdEltYWdlKCkpOwotICAgICAgICAgICAgICBjbG9zZWxpbmsobSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgZW1wdHljZWxsKG0sIDEpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGVtcHR5Y2VsbChtLCAyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQorICAgICAgLy8gRGlmZgorICAgICAgb3BlbmxpbmsobSwgMik7CisgICAgICBtLmNsb3NlVGQoKTsKICAgICAgIG9wZW5saW5rKG0sIDEpOwogICAgICAgbS5jbG9zZVRkKCk7CiAKQEAgLTU5MSw3ICs1NjgsNyBAQAogICAgICAgbS5jbG9zZVRyKCk7CiAgICAgfQogCi0gICAgdm9pZCBhcHBlbmRUb3RhbHMoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGludCBpbnMsIGludCBkZWxzLAorICAgIHZvaWQgYXBwZW5kTGFzdFJvdyhmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgaW50IGlucywgaW50IGRlbHMsCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXZlcnNlRGlmZikgewogICAgICAgbS5vcGVuVHIoKTsKIApAQCAtNjE3LDYgKzU5NCwxMiBAQAogICAgICAgbS5hcHBlbmQoVXRpbC5NLnBhdGNoVGFibGVTaXplX01vZGlmeShpbnMsIGRlbHMpKTsKICAgICAgIG0uY2xvc2VUZCgpOwogCisgICAgICBvcGVubGluayhtLCAyKTsKKyAgICAgIG0uY2xvc2VUZCgpOworCisgICAgICBvcGVubGluayhtLCAxKTsKKyAgICAgIG0uY2xvc2VUZCgpOworCiAgICAgICBtLmNsb3NlVHIoKTsKICAgICB9CiAKQEAgLTY0OSwxNCArNjMyLDE5IEBACiAgICAgICAgICAgY2FzZSBBRERFRDoKICAgICAgICAgICAgIG0uYXBwZW5kKFV0aWwuTS5wYXRjaFRhYmxlU2l6ZV9MaW5lcyhpbnMpKTsKICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgY2FzZSBERUxFVEVEOgogICAgICAgICAgICAgbS5uYnNwKCk7CiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgIGNhc2UgTU9ESUZJRUQ6CiAgICAgICAgICAgY2FzZSBDT1BJRUQ6CiAgICAgICAgICAgY2FzZSBSRU5BTUVEOgogICAgICAgICAgICAgbS5hcHBlbmQoVXRpbC5NLnBhdGNoVGFibGVTaXplX01vZGlmeShpbnMsIGRlbHMpKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSRVdSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIG0ubmJzcCgpOwpAQCAtNjcwLDIwICs2NTgsNiBAQAogICAgICAgbS5zZXRBdHRyaWJ1dGUoImNvbHNwYW4iLCBjb2xzcGFuKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY2xvc2VsaW5rKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7Ci0gICAgICBtLmNsb3NlQW5jaG9yKCk7Ci0gICAgICBtLmNsb3NlVGQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW1wdHljZWxsKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBpbnQgY29sc3BhbikgewotICAgICAgbS5vcGVuVGQoKTsKLSAgICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7Ci0gICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZMaW5rQ2VsbCgpKTsKLSAgICAgIG0uc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgY29sc3Bhbik7Ci0gICAgICBtLm5ic3AoKTsKLSAgICAgIG0uY2xvc2VUZCgpOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBQYXRjaCBpdGVtKSB7CiAgICAgICByZXR1cm4gaXRlbS5nZXRLZXkoKTsKQEAgLTc4Nyw4ICs3NjEsOSBAQAogICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgdGFibGUuYXBwZW5kVG90YWxzKG5jLCBpbnNlcnRpb25zLCBkZWxldGlvbnMsIGlzUmV2ZXJzZURpZmYpOworICAgICAgICAgIHRhYmxlLmFwcGVuZExhc3RSb3cobmMsIGluc2VydGlvbnMsIGRlbGV0aW9ucywgaXNSZXZlcnNlRGlmZik7CiAgICAgICAgICAgdGFibGUucmVzZXRIdG1sKG5jKTsKKyAgICAgICAgICB0YWJsZS5pbml0aWFsaXplTGFzdFJvdyhyb3cgKyAxKTsKICAgICAgICAgICBuYyA9IG51bGw7CiAgICAgICAgICAgc3RhZ2UgPSAxOwogICAgICAgICAgIHJvdyA9IDA7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Qcm9qZWN0RGFzaGJvYXJkU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Qcm9qZWN0RGFzaGJvYXJkU2NyZWVuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5ZTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1Byb2plY3REYXNoYm9hcmRTY3JlZW4uamF2YQpAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0U2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0RGFzaGJvYXJkU2NyZWVuIGV4dGVuZHMgUHJvamVjdFNjcmVlbiBpbXBsZW1lbnRzIENoYW5nZUxpc3RTY3JlZW4geworICBwcml2YXRlIERhc2hib2FyZFRhYmxlIHRhYmxlOworICBwcml2YXRlIFN0cmluZyBwYXJhbXM7CisKKyAgcHVibGljIFByb2plY3REYXNoYm9hcmRTY3JlZW4oZmluYWwgUHJvamVjdC5OYW1lS2V5IHRvU2hvdywgU3RyaW5nIHBhcmFtcykgeworICAgIHN1cGVyKHRvU2hvdyk7CisgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25Jbml0VUkoKSB7CisgICAgdGFibGUgPSBuZXcgRGFzaGJvYXJkVGFibGUocGFyYW1zKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKKyAgICAgICAgc3VwZXIub25Mb2FkKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZmluaXNoRGlzcGxheSgpIHsKKyAgICAgICAgc3VwZXIuZmluaXNoRGlzcGxheSgpOworICAgICAgICBkaXNwbGF5KCk7CisgICAgICB9CisgICAgfTsKKworICAgIHN1cGVyLm9uSW5pdFVJKCk7CisKKyAgICBTdHJpbmcgdGl0bGUgPSB0YWJsZS5nZXRUaXRsZSgpOworICAgIGlmICh0aXRsZSAhPSBudWxsKSB7CisgICAgICBGbG93UGFuZWwgZnAgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgICBmcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zY3JlZW5IZWFkZXIoKSk7CisgICAgICBmcC5hZGQobmV3IElubGluZUh5cGVybGluayh0aXRsZSwgUGFnZUxpbmtzLnRvQ3VzdG9tRGFzaGJvYXJkKHBhcmFtcykpKTsKKyAgICAgIGFkZChmcCk7CisgICAgfQorCisgICAgYWRkKHRhYmxlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWdpc3RlcktleXMoKSB7CisgICAgc3VwZXIucmVnaXN0ZXJLZXlzKCk7CisgICAgdGFibGUuc2V0UmVnaXN0ZXJLZXlzKHRydWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QdWJsaXNoQ29tbWVudFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUHVibGlzaENvbW1lbnRTY3JlZW4uamF2YQppbmRleCA0NzA1YWFkLi45Nzk0OWUzIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QdWJsaXNoQ29tbWVudFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1B1Ymxpc2hDb21tZW50U2NyZWVuLmphdmEKQEAgLTE1LDI5ICsxNSwzMSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5BcHByb3ZhbEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5MYWJlbEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5Db21tZW50RWRpdG9yQ29udGFpbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLkNvbW1lbnRFZGl0b3JQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5DYWxsYmFja0dyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5OYXRpdmVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlNjcmVlbkxvYWRDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQWNjb3VudFNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudExpbmtQcm9jZXNzb3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlBhdGNoTGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU21hbGxIZWFkaW5nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2V0UHVibGlzaERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5U3RyaW5nOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZvcm1QYW5lbDsKQEAgLTQ3LDEzICs0OSwxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZlcnRpY2FsUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRBcmVhOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC02Miw2ICs2NSw3IEBACiAgIHByaXZhdGUgc3RhdGljIFNhdmVkU3RhdGUgbGFzdFN0YXRlOwogCiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKKyAgcHJpdmF0ZSBTdHJpbmcgcmV2aXNpb247CiAgIHByaXZhdGUgQ29sbGVjdGlvbjxWYWx1ZVJhZGlvQnV0dG9uPiBhcHByb3ZhbEJ1dHRvbnM7CiAgIHByaXZhdGUgQ2hhbmdlRGVzY3JpcHRpb25CbG9jayBkZXNjQmxvY2s7CiAgIHByaXZhdGUgQXBwcm92YWxUYWJsZSBhcHByb3ZhbHM7CkBAIC03Myw2ICs3Nyw3IEBACiAgIHByaXZhdGUgQnV0dG9uIGNhbmNlbDsKICAgcHJpdmF0ZSBib29sZWFuIHNhdmVTdGF0ZU9uVW5sb2FkID0gdHJ1ZTsKICAgcHJpdmF0ZSBMaXN0PENvbW1lbnRFZGl0b3JQYW5lbD4gY29tbWVudEVkaXRvcnM7CisgIHByaXZhdGUgQ2hhbmdlSW5mbyBjaGFuZ2U7CiAKICAgcHVibGljIFB1Ymxpc2hDb21tZW50U2NyZWVuKGZpbmFsIFBhdGNoU2V0LklkIHBzaSkgewogICAgIHBhdGNoU2V0SWQgPSBwc2k7CkBAIC0xNDEsNyArMTQ2LDIyIEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CiAgICAgc3VwZXIub25Mb2FkKCk7Ci0gICAgVXRpbC5ERVRBSUxfU1ZDLnBhdGNoU2V0UHVibGlzaERldGFpbChwYXRjaFNldElkLAorCisgICAgQ2FsbGJhY2tHcm91cCBjYnMgPSBuZXcgQ2FsbGJhY2tHcm91cCgpOworICAgIENoYW5nZUFwaS5yZXZpc2lvbihwYXRjaFNldElkKS52aWV3KCJyZXZpZXciKS5nZXQoY2JzLmFkZCgKKyAgICAgICAgbmV3IEFzeW5jQ2FsbGJhY2s8Q2hhbmdlSW5mbz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKENoYW5nZUluZm8gcmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQuaW5pdCgpOworICAgICAgICAgICAgY2hhbmdlID0gcmVzdWx0OworICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgICAvLyBIYW5kbGVkIGJ5IFNjcmVlbkxvYWRDYWxsYmFjay5vbkZhaWx1cmUoKS4KKyAgICAgICAgICB9CisgICAgICAgIH0pKTsKKyAgICBVdGlsLkRFVEFJTF9TVkMucGF0Y2hTZXRQdWJsaXNoRGV0YWlsKHBhdGNoU2V0SWQsIGNicy5hZGRHd3Rqc29ucnBjKAogICAgICAgICBuZXcgU2NyZWVuTG9hZENhbGxiYWNrPFBhdGNoU2V0UHVibGlzaERldGFpbD4odGhpcykgewogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoZmluYWwgUGF0Y2hTZXRQdWJsaXNoRGV0YWlsIHJlc3VsdCkgewpAQCAtMTUzLDcgKzE3Myw3IEBACiAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdERpc3BsYXkoKSB7CiAgICAgICAgICAgICBtZXNzYWdlLnNldEZvY3VzKHRydWUpOwogICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIH0pKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMjIyLDQ3ICsyNDIsNTMgQEAKICAgICBtd3JhcC5hZGQobWVzc2FnZSk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgaW5pdEFwcHJvdmFscyhmaW5hbCBQYXRjaFNldFB1Ymxpc2hEZXRhaWwgciwgZmluYWwgUGFuZWwgYm9keSkgewotICAgIEFwcHJvdmFsVHlwZXMgdHlwZXMgPSBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXBwcm92YWxUeXBlcygpOwotICAgIGZvciAoUGVybWlzc2lvblJhbmdlIHJhbmdlIDogci5nZXRMYWJlbHMoKSkgewotICAgICAgQXBwcm92YWxUeXBlIHR5cGUgPSB0eXBlcy5ieUxhYmVsKHJhbmdlLmdldExhYmVsKCkpOwotICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAvLyBMZWdhY3kgdHlwZSwgdXNlIHJhZGlvIGJ1dHRvbnMuCi0gICAgICAgIGluaXRBcHByb3ZhbFR5cGUociwgYm9keSwgdHlwZSwgcmFuZ2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVE9ETyBOZXdlciBzdHlsZSBsYWJlbC4KLSAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIGluaXRBcHByb3ZhbHMoUGFuZWwgYm9keSkgeworICAgIGZvciAoU3RyaW5nIGxhYmVsTmFtZSA6IGNoYW5nZS5sYWJlbHMoKSkgeworICAgICAgaW5pdExhYmVsKGxhYmVsTmFtZSwgYm9keSk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluaXRBcHByb3ZhbFR5cGUoZmluYWwgUGF0Y2hTZXRQdWJsaXNoRGV0YWlsIHIsCi0gICAgICBmaW5hbCBQYW5lbCBib2R5LCBmaW5hbCBBcHByb3ZhbFR5cGUgY3QsIGZpbmFsIFBlcm1pc3Npb25SYW5nZSByYW5nZSkgewotICAgIGJvZHkuYWRkKG5ldyBTbWFsbEhlYWRpbmcoY3QuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCkgKyAiOiIpKTsKKyAgcHJpdmF0ZSB2b2lkIGluaXRMYWJlbChTdHJpbmcgbGFiZWxOYW1lLCBQYW5lbCBib2R5KSB7CisgICAgaWYgKCFjaGFuZ2UuaGFzX3Blcm1pdHRlZF9sYWJlbHMoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBKc0FycmF5U3RyaW5nIG5hdGl2ZVZhbHVlcyA9IGNoYW5nZS5wZXJtaXR0ZWRfdmFsdWVzKGxhYmVsTmFtZSk7CisgICAgaWYgKG5hdGl2ZVZhbHVlcyA9PSBudWxsIHx8IG5hdGl2ZVZhbHVlcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obmF0aXZlVmFsdWVzLmxlbmd0aCgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hdGl2ZVZhbHVlcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICB2YWx1ZXMuYWRkKG5hdGl2ZVZhbHVlcy5nZXQoaSkpOworICAgIH0KKyAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHZhbHVlcyk7CisgICAgTGFiZWxJbmZvIGxhYmVsID0gY2hhbmdlLmxhYmVsKGxhYmVsTmFtZSk7CiAKLSAgICBmaW5hbCBWZXJ0aWNhbFBhbmVsIHZwID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICB2cC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hcHByb3ZhbENhdGVnb3J5TGlzdCgpKTsKLSAgICBmaW5hbCBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gbHN0ID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+KGN0LmdldFZhbHVlcygpKTsKLSAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGxzdCk7Ci0gICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBjYXRJZCA9IGN0LmdldENhdGVnb3J5KCkuZ2V0SWQoKTsKLSAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHByaW9yID0gci5nZXRDaGFuZ2VBcHByb3ZhbChjYXRJZCk7CisgICAgYm9keS5hZGQobmV3IFNtYWxsSGVhZGluZyhsYWJlbC5uYW1lKCkgKyAiOiIpKTsKIAotICAgIGZvciAoZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGJ1dHRvblZhbHVlIDogbHN0KSB7Ci0gICAgICBpZiAoIXJhbmdlLmNvbnRhaW5zKGJ1dHRvblZhbHVlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgIGNvbnRpbnVlOworICAgIFZlcnRpY2FsUGFuZWwgdnAgPSBuZXcgVmVydGljYWxQYW5lbCgpOworICAgIHZwLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxhYmVsTGlzdCgpKTsKKworICAgIFNob3J0IHByaW9yID0gbnVsbDsKKyAgICBpZiAobGFiZWwuYWxsKCkgIT0gbnVsbCkgeworICAgICAgZm9yIChBcHByb3ZhbEluZm8gYXBwIDogTmF0aXZlcy5hc0xpc3QobGFiZWwuYWxsKCkpKSB7CisgICAgICAgIGlmIChhcHAuX2FjY291bnRfaWQoKSA9PSBHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRJZCgpLmdldCgpKSB7CisgICAgICAgICAgcHJpb3IgPSBhcHAudmFsdWUoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQorICAgIH0KIAotICAgICAgZmluYWwgVmFsdWVSYWRpb0J1dHRvbiBiID0KLSAgICAgICAgICBuZXcgVmFsdWVSYWRpb0J1dHRvbihidXR0b25WYWx1ZSwgY3QuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCkpOwotICAgICAgYi5zZXRUZXh0KGJ1dHRvblZhbHVlLmZvcm1hdCgpKTsKKyAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgVmFsdWVSYWRpb0J1dHRvbiBiID0gbmV3IFZhbHVlUmFkaW9CdXR0b24obGFiZWwsIHZhbHVlKTsKKyAgICAgIFNhZmVIdG1sIGJ1ZiA9IG5ldyBTYWZlSHRtbEJ1aWxkZXIoKS5hcHBlbmQoYi5mb3JtYXQoKSk7CisgICAgICBidWYgPSBDb21tZW50TGlua1Byb2Nlc3Nvci5hcHBseShidWYpOworICAgICAgU2FmZUh0bWwuc2V0KGIsIGJ1Zik7CiAKICAgICAgIGlmIChsYXN0U3RhdGUgIT0gbnVsbCAmJiBwYXRjaFNldElkLmVxdWFscyhsYXN0U3RhdGUucGF0Y2hTZXRJZCkKLSAgICAgICAgICAmJiBsYXN0U3RhdGUuYXBwcm92YWxzLmNvbnRhaW5zS2V5KGJ1dHRvblZhbHVlLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgYi5zZXRWYWx1ZShsYXN0U3RhdGUuYXBwcm92YWxzLmdldChidXR0b25WYWx1ZS5nZXRDYXRlZ29yeUlkKCkpLmVxdWFscygKLSAgICAgICAgICAgIGJ1dHRvblZhbHVlKSk7CisgICAgICAgICAgJiYgbGFzdFN0YXRlLmFwcHJvdmFscy5jb250YWluc0tleShsYWJlbC5uYW1lKCkpKSB7CisgICAgICAgIGIuc2V0VmFsdWUobGFzdFN0YXRlLmFwcHJvdmFscy5nZXQobGFiZWwubmFtZSgpKSA9PSB2YWx1ZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBiLnNldFZhbHVlKHByaW9yICE9IG51bGwgPyBidXR0b25WYWx1ZS5nZXRWYWx1ZSgpID09IHByaW9yLmdldFZhbHVlKCkKLSAgICAgICAgICAgIDogYnV0dG9uVmFsdWUuZ2V0VmFsdWUoKSA9PSAwKTsKKyAgICAgICAgYi5zZXRWYWx1ZShiLnBhcnNlVmFsdWUoKSA9PSAocHJpb3IgIT0gbnVsbCA/IHByaW9yIDogMCkpOwogICAgICAgfQogCiAgICAgICBhcHByb3ZhbEJ1dHRvbnMuYWRkKGIpOwpAQCAtMjc0LDEzICszMDAsMTIgQEAKICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXkoZmluYWwgUGF0Y2hTZXRQdWJsaXNoRGV0YWlsIHIpIHsKICAgICBzZXRQYWdlVGl0bGUoVXRpbC5NLnB1Ymxpc2hDb21tZW50cyhyLmdldENoYW5nZSgpLmdldEtleSgpLmFiYnJldmlhdGUoKSwKICAgICAgICAgcGF0Y2hTZXRJZC5nZXQoKSkpOwotICAgIGRlc2NCbG9jay5kaXNwbGF5KHIuZ2V0Q2hhbmdlKCksIG51bGwsIHIuZ2V0UGF0Y2hTZXRJbmZvKCksIHIuZ2V0QWNjb3VudHMoKSk7CisgICAgZGVzY0Jsb2NrLmRpc3BsYXkoci5nZXRDaGFuZ2UoKSwgbnVsbCwgZmFsc2UsIHIuZ2V0UGF0Y2hTZXRJbmZvKCksIHIuZ2V0QWNjb3VudHMoKSwKKyAgICAgICAgci5nZXRTdWJtaXRUeXBlUmVjb3JkKCkpOwogCiAgICAgaWYgKHIuZ2V0Q2hhbmdlKCkuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgIGluaXRBcHByb3ZhbHMociwgYXBwcm92YWxQYW5lbCk7Ci0KLSAgICAgIGFwcHJvdmFscy5zZXRBY2NvdW50SW5mb0NhY2hlKHIuZ2V0QWNjb3VudHMoKSk7Ci0gICAgICBhcHByb3ZhbHMuZGlzcGxheShyKTsKKyAgICAgIGluaXRBcHByb3ZhbHMoYXBwcm92YWxQYW5lbCk7CisgICAgICBhcHByb3ZhbHMuZGlzcGxheShjaGFuZ2UpOwogICAgIH0gZWxzZSB7CiAgICAgICBhcHByb3ZhbHMuc2V0VmlzaWJsZShmYWxzZSk7CiAgICAgfQpAQCAtMjkxLDYgKzMxNiw3IEBACiAKICAgICBkcmFmdHNQYW5lbC5jbGVhcigpOwogICAgIGNvbW1lbnRFZGl0b3JzID0gbmV3IEFycmF5TGlzdDxDb21tZW50RWRpdG9yUGFuZWw+KCk7CisgICAgcmV2aXNpb24gPSByLmdldFBhdGNoU2V0SW5mbygpLmdldFJldklkKCk7CiAKICAgICBpZiAoIXIuZ2V0RHJhZnRzKCkuaXNFbXB0eSgpKSB7CiAgICAgICBkcmFmdHNQYW5lbC5hZGQobmV3IFNtYWxsSGVhZGluZyhVdGlsLkMuaGVhZGluZ1BhdGNoQ29tbWVudHMoKSkpOwpAQCAtMzEyLDcgKzMzOCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgQ29tbWVudEVkaXRvclBhbmVsIGVkaXRvciA9IG5ldyBDb21tZW50RWRpdG9yUGFuZWwoYyk7Ci0gICAgICAgIGVkaXRvci5zZXRBdXRob3JOYW1lVGV4dChVdGlsLk0ubGluZUhlYWRlcihjLmdldExpbmUoKSkpOworICAgICAgICBpZiAoYy5nZXRMaW5lKCkgPT0gQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5SX0hFQUQpIHsKKyAgICAgICAgICBlZGl0b3Iuc2V0QXV0aG9yTmFtZVRleHQoVXRpbC5DLmZpbGVDb21tZW50SGVhZGVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVkaXRvci5zZXRBdXRob3JOYW1lVGV4dChVdGlsLk0ubGluZUhlYWRlcihjLmdldExpbmUoKSkpOworICAgICAgICB9CiAgICAgICAgIGVkaXRvci5zZXRPcGVuKHRydWUpOwogICAgICAgICBjb21tZW50RWRpdG9ycy5hZGQoZWRpdG9yKTsKICAgICAgICAgcGFuZWwuYWRkKGVkaXRvcik7CkBAIC0zNDcsMjAgKzM3NywyMyBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIG9uU2VuZDIoZmluYWwgYm9vbGVhbiBzdWJtaXQpIHsKLSAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiB2YWx1ZXMgPQotICAgICAgICBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+KCk7CisgICAgUmV2aWV3SW5wdXQgZGF0YSA9IFJldmlld0lucHV0LmNyZWF0ZSgpOworICAgIGRhdGEubWVzc2FnZShDaGFuZ2VBcGkuZW1wdHlUb051bGwobWVzc2FnZS5nZXRUZXh0KCkudHJpbSgpKSk7CisgICAgZGF0YS5pbml0KCk7CiAgICAgZm9yIChmaW5hbCBWYWx1ZVJhZGlvQnV0dG9uIGIgOiBhcHByb3ZhbEJ1dHRvbnMpIHsKICAgICAgIGlmIChiLmdldFZhbHVlKCkpIHsKLSAgICAgICAgdmFsdWVzLnB1dChiLnZhbHVlLmdldENhdGVnb3J5SWQoKSwgYi52YWx1ZS5nZXRJZCgpKTsKKyAgICAgICAgZGF0YS5sYWJlbChiLmxhYmVsLm5hbWUoKSwgYi5wYXJzZVZhbHVlKCkpOwogICAgICAgfQogICAgIH0KIAogICAgIGVuYWJsZUZvcm0oZmFsc2UpOwotICAgIFBhdGNoVXRpbC5ERVRBSUxfU1ZDLnB1Ymxpc2hDb21tZW50cyhwYXRjaFNldElkLCBtZXNzYWdlLmdldFRleHQoKS50cmltKCksCi0gICAgICAgIG5ldyBIYXNoU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4odmFsdWVzLnZhbHVlcygpKSwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBWb2lkUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgaWYoc3VibWl0KSB7CisgICAgbmV3IFJlc3RBcGkoIi9jaGFuZ2VzLyIpCisgICAgICAuaWQoU3RyaW5nLnZhbHVlT2YocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKS5nZXQoKSkpCisgICAgICAudmlldygicmV2aXNpb25zIikuaWQocmV2aXNpb24pLnZpZXcoInJldmlldyIpCisgICAgICAucG9zdChkYXRhLCBuZXcgR2Vycml0Q2FsbGJhY2s8UmV2aWV3SW5wdXQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhSZXZpZXdJbnB1dCByZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChzdWJtaXQpIHsKICAgICAgICAgICAgICAgc3VibWl0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBzYXZlU3RhdGVPblVubG9hZCA9IGZhbHNlOwpAQCAtMzc2LDE4ICs0MDksMzkgQEAKICAgICAgICAgfSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXZpZXdJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIHN0YXRpYyBSZXZpZXdJbnB1dCBjcmVhdGUoKSB7CisgICAgICByZXR1cm4gKFJldmlld0lucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBtZXNzYWdlKFN0cmluZyBtKSAvKi17IGlmKG0pdGhpcy5tZXNzYWdlPW07IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgbGFiZWwoU3RyaW5nIG4sIHNob3J0IHYpIC8qLXsgdGhpcy5sYWJlbHNbbl09djsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBpbml0KCkgLyoteworICAgICAgdGhpcy5sYWJlbHMgPSB7fTsKKyAgICAgIHRoaXMuc3RyaWN0X2xhYmVscyA9IHRydWU7CisgICAgICB0aGlzLmRyYWZ0cyA9ICdQVUJMSVNIJzsKKyAgICB9LSovOworCisgICAgcHJvdGVjdGVkIFJldmlld0lucHV0KCkgeworICAgIH0KKyAgfQorCiAgIHByaXZhdGUgdm9pZCBzdWJtaXQoKSB7Ci0gICAgVXRpbC5NQU5BR0VfU1ZDLnN1Ym1pdChwYXRjaFNldElkLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8Q2hhbmdlRGV0YWlsPigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlRGV0YWlsIHJlc3VsdCkgeworICAgIENoYW5nZUFwaS5zdWJtaXQocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKS5nZXQoKSwgcmV2aXNpb24sCisgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8U3VibWl0SW5mbz4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFN1Ym1pdEluZm8gcmVzdWx0KSB7CiAgICAgICAgICAgICBzYXZlU3RhdGVPblVubG9hZCA9IGZhbHNlOwogICAgICAgICAgICAgZ29DaGFuZ2UoKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgZXJyKSB7CisgICAgICAgICAgICBpZiAoU3VibWl0RmFpbHVyZURpYWxvZy5pc0NvbmZsaWN0KGVycikpIHsKKyAgICAgICAgICAgICAgbmV3IFN1Ym1pdEZhaWx1cmVEaWFsb2coZXJyLmdldE1lc3NhZ2UoKSkuY2VudGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoZXJyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvQ2hhbmdlKCk7Ci0gICAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoY2F1Z2h0KTsKICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICB9CkBAIC0zOTgsMjYgKzQ1Miw0MSBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsdWVSYWRpb0J1dHRvbiBleHRlbmRzIFJhZGlvQnV0dG9uIHsKLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgdmFsdWU7CisgICAgZmluYWwgTGFiZWxJbmZvIGxhYmVsOworICAgIGZpbmFsIFN0cmluZyB2YWx1ZTsKIAotICAgIFZhbHVlUmFkaW9CdXR0b24oZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHYsIGZpbmFsIFN0cmluZyBsYWJlbCkgewotICAgICAgc3VwZXIobGFiZWwpOwotICAgICAgdmFsdWUgPSB2OworICAgIFZhbHVlUmFkaW9CdXR0b24oTGFiZWxJbmZvIGxhYmVsLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgIHN1cGVyKGxhYmVsLm5hbWUoKSk7CisgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgU3RyaW5nIGZvcm1hdCgpIHsKKyAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCcgJykKKyAgICAgICAgICAuYXBwZW5kKGxhYmVsLnZhbHVlX3RleHQodmFsdWUpKS50b1N0cmluZygpOworICAgIH0KKworICAgIHNob3J0IHBhcnNlVmFsdWUoKSB7CisgICAgICBTdHJpbmcgdmFsdWUgPSB0aGlzLnZhbHVlOworICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIiAiKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCIrIikpIHsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7CisgICAgICB9CisgICAgICByZXR1cm4gU2hvcnQucGFyc2VTaG9ydCh2YWx1ZSk7CiAgICAgfQogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2F2ZWRTdGF0ZSB7CiAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlPiBhcHByb3ZhbHM7CisgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBhcHByb3ZhbHM7CiAKICAgICBTYXZlZFN0YXRlKGZpbmFsIFB1Ymxpc2hDb21tZW50U2NyZWVuIHApIHsKICAgICAgIHBhdGNoU2V0SWQgPSBwLnBhdGNoU2V0SWQ7CiAgICAgICBtZXNzYWdlID0gcC5tZXNzYWdlLmdldFRleHQoKTsKLSAgICAgIGFwcHJvdmFscyA9IG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4oKTsKKyAgICAgIGFwcHJvdmFscyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogICAgICAgZm9yIChmaW5hbCBWYWx1ZVJhZGlvQnV0dG9uIGIgOiBwLmFwcHJvdmFsQnV0dG9ucykgewogICAgICAgICBpZiAoYi5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgYXBwcm92YWxzLnB1dChiLnZhbHVlLmdldENhdGVnb3J5SWQoKSwgYi52YWx1ZSk7CisgICAgICAgICAgYXBwcm92YWxzLnB1dChiLmxhYmVsLm5hbWUoKSwgYi52YWx1ZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9RdWVyeVNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUXVlcnlTY3JlZW4uamF2YQppbmRleCBiOTRmY2FlLi4wMWUyOTRmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9RdWVyeVNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1F1ZXJ5U2NyZWVuLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5VXRpbDsKIAogcHVibGljIGNsYXNzIFF1ZXJ5U2NyZWVuIGV4dGVuZHMgUGFnZWRTaW5nbGVMaXN0U2NyZWVuIGltcGxlbWVudHMKQEAgLTUyLDEyICs1MiwxMSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlTGlzdCByZXN1bHQpIHsKICAgICAgICAgaWYgKGlzQXR0YWNoZWQoKSkgewotICAgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpID09IDEgJiYgaXNTaW5nbGVRdWVyeShxdWVyeSkpIHsKKyAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCgpID09IDEgJiYgaXNTaW5nbGVRdWVyeShxdWVyeSkpIHsKICAgICAgICAgICAgIENoYW5nZUluZm8gYyA9IHJlc3VsdC5nZXQoMCk7CiAgICAgICAgICAgICBDaGFuZ2UuSWQgaWQgPSBjLmxlZ2FjeV9pZCgpOwogICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkoUGFnZUxpbmtzLnRvQ2hhbmdlKGlkKSwgbmV3IENoYW5nZVNjcmVlbihpZCkpOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHZXJyaXQuc2V0UXVlcnlTdHJpbmcocXVlcnkpOwogICAgICAgICAgICAgZGlzcGxheShyZXN1bHQpOwogICAgICAgICAgICAgUXVlcnlTY3JlZW4udGhpcy5kaXNwbGF5KCk7CiAgICAgICAgICAgfQpAQCAtNjcsNiArNjYsMTIgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblNob3dWaWV3KCkgeworICAgIHN1cGVyLm9uU2hvd1ZpZXcoKTsKKyAgICBHZXJyaXQuc2V0UXVlcnlTdHJpbmcocXVlcnkpOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGxvYWRQcmV2KCkgewogICAgIENoYW5nZUxpc3QucHJldihxdWVyeSwgcGFnZVNpemUsIHBvcywgbG9hZENhbGxiYWNrKCkpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdGFycmVkQ2hhbmdlcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhcnJlZENoYW5nZXMuamF2YQppbmRleCA4YjVhYTFjLi43ZDIwODRhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdGFycmVkQ2hhbmdlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N0YXJyZWRDaGFuZ2VzLmphdmEKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEJ1czsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuU2ltcGxlRXZlbnRCdXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3VyY2VzLmNsaWVudC5JbWFnZVJlc291cmNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kOwpAQCAtMzIsNyArMzAsNiBAQAogCiAvKiogU3VwcG9ydHMgdGhlIHN0YXIgaWNvbiBkaXNwbGF5ZWQgb24gY2hhbmdlcyBhbmQgdHJhY2tpbmcgdGhlIHN0YXR1cy4gKi8KIHB1YmxpYyBjbGFzcyBTdGFycmVkQ2hhbmdlcyB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEV2ZW50QnVzIGV2ZW50QnVzID0gbmV3IFNpbXBsZUV2ZW50QnVzKCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV2ZW50LlR5cGU8Q2hhbmdlU3RhckhhbmRsZXI+IFRZUEUgPQogICAgICAgbmV3IEV2ZW50LlR5cGU8Q2hhbmdlU3RhckhhbmRsZXI+KCk7CiAKQEAgLTg3LDcgKzg0LDcgQEAKICAgcHVibGljIHN0YXRpYyBIYW5kbGVyUmVnaXN0cmF0aW9uIGFkZEhhbmRsZXIoCiAgICAgICBDaGFuZ2UuSWQgc291cmNlLAogICAgICAgQ2hhbmdlU3RhckhhbmRsZXIgaGFuZGxlcikgewotICAgIHJldHVybiBldmVudEJ1cy5hZGRIYW5kbGVyVG9Tb3VyY2UoVFlQRSwgc291cmNlLCBoYW5kbGVyKTsKKyAgICByZXR1cm4gR2Vycml0LkVWRU5UX0JVUy5hZGRIYW5kbGVyVG9Tb3VyY2UoVFlQRSwgc291cmNlLCBoYW5kbGVyKTsKICAgfQogCiAgIC8qKgpAQCAtOTUsNyArOTIsNyBAQAogICAgKiBub3QgUlBDIHRvIHRoZSBzZXJ2ZXIgYW5kIGRvZXMgbm90IGFsdGVyIHRoZSBzdGFycmVkIHN0YXR1cyBvZiBhIGNoYW5nZS4KICAgICovCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlQ2hhbmdlU3RhckV2ZW50KENoYW5nZS5JZCBpZCwgYm9vbGVhbiBzdGFycmVkKSB7Ci0gICAgZXZlbnRCdXMuZmlyZUV2ZW50RnJvbVNvdXJjZSgKKyAgICBHZXJyaXQuRVZFTlRfQlVTLmZpcmVFdmVudEZyb21Tb3VyY2UoCiAgICAgICAgIG5ldyBDaGFuZ2VTdGFyRXZlbnQoaWQsIHN0YXJyZWQpLAogICAgICAgICBpZCk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N1Ym1pdEZhaWx1cmVEaWFsb2cuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N1Ym1pdEZhaWx1cmVEaWFsb2cuamF2YQppbmRleCBiZWRmYjc0Li43MGJmNGI2IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRGYWlsdXJlRGlhbG9nLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3VibWl0RmFpbHVyZURpYWxvZy5qYXZhCkBAIC0xNSwxMyArMTUsMTcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50LlJlbW90ZUpzb25FeGNlcHRpb247CiAKIGNsYXNzIFN1Ym1pdEZhaWx1cmVEaWFsb2cgZXh0ZW5kcyBFcnJvckRpYWxvZyB7Ci0gIFN1Ym1pdEZhaWx1cmVEaWFsb2coZmluYWwgQ2hhbmdlRGV0YWlsIHJlc3VsdCwgZmluYWwgQ2hhbmdlTWVzc2FnZSBtc2cpIHsKLSAgICBzdXBlcihuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKG1zZy5nZXRNZXNzYWdlKCkudHJpbSgpKS53aWtpZnkoKSk7CisgIHN0YXRpYyBib29sZWFuIGlzQ29uZmxpY3QoVGhyb3dhYmxlIGVycikgeworICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uCisgICAgICAgICYmIDQwOSA9PSAoKFJlbW90ZUpzb25FeGNlcHRpb24pIGVycikuZ2V0Q29kZSgpOworICB9CisKKyAgU3VibWl0RmFpbHVyZURpYWxvZyhTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobmV3IFNhZmVIdG1sQnVpbGRlcigpLmFwcGVuZChtc2cudHJpbSgpKS53aWtpZnkoKSk7CiAgICAgc2V0VGV4dChVdGlsLkMuc3VibWl0RmFpbGVkKCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyMDZiNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N1Ym1pdEluZm8uamF2YQpAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK2NsYXNzIFN1Ym1pdEluZm8gZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgZmluYWwgQ2hhbmdlLlN0YXR1cyBzdGF0dXMoKSB7CisgICAgcmV0dXJuIENoYW5nZS5TdGF0dXMudmFsdWVPZihzdGF0dXNSYXcoKSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgc3RhdHVzUmF3KCkgLyoteyByZXR1cm4gdGhpcy5zdGF0dXM7IH0tKi87CisKKyAgcHJvdGVjdGVkIFN1Ym1pdEluZm8oKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyZjA0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5pMThuLmNsaWVudC5Db25zdGFudHM7CisKK3B1YmxpYyBpbnRlcmZhY2UgRGFzaGJvYXJkQ29uc3RhbnRzIGV4dGVuZHMgQ29uc3RhbnRzIHsKKyAgU3RyaW5nIGRhc2hib2FyZE5hbWUoKTsKKyAgU3RyaW5nIGRhc2hib2FyZFRpdGxlKCk7CisgIFN0cmluZyBkYXNoYm9hcmREZXNjcmlwdGlvbigpOworICBTdHJpbmcgZGFzaGJvYXJkSW5oZXJpdGVkKCk7CisgIFN0cmluZyBkYXNoYm9hcmRJdGVtKCk7CisgIFN0cmluZyBkYXNoYm9hcmREZWZhdWx0VG9vbFRpcCgpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRDb25zdGFudHMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzRkZTdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkQ29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2IEBACitkYXNoYm9hcmROYW1lID0gRGFzaGJvYXJkIE5hbWUKK2Rhc2hib2FyZFRpdGxlID0gRGFzaGJvYXJkIFRpdGxlCitkYXNoYm9hcmREZXNjcmlwdGlvbiA9IERhc2hib2FyZCBEZXNjcmlwdGlvbgorZGFzaGJvYXJkSW5oZXJpdGVkID0gSW5oZXJpdGVkIEZyb20KK2Rhc2hib2FyZEl0ZW0gPSBkYXNoYm9hcmQKK2Rhc2hib2FyZERlZmF1bHRUb29sVGlwID0gUHJvamVjdCBEZWZhdWx0IERhc2hib2FyZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZEluZm8uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ3NGFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkSW5mby5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZGFzaGJvYXJkczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK3B1YmxpYyBjbGFzcyBEYXNoYm9hcmRJbmZvIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGlkKCkgLyoteyByZXR1cm4gdGhpcy5pZDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgdGl0bGUoKSAvKi17IHJldHVybiB0aGlzLnRpdGxlOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBwcm9qZWN0KCkgLyoteyByZXR1cm4gdGhpcy5wcm9qZWN0OyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBkZWZpbmluZ1Byb2plY3QoKSAvKi17IHJldHVybiB0aGlzLmRlZmluaW5nX3Byb2plY3Q7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHJlZigpIC8qLXsgcmV0dXJuIHRoaXMucmVmOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBwYXRoKCkgLyoteyByZXR1cm4gdGhpcy5wYXRoOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBkZXNjcmlwdGlvbigpIC8qLXsgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGZvcmVhY2goKSAvKi17IHJldHVybiB0aGlzLmZvcmVhY2g7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHVybCgpIC8qLXsgcmV0dXJuIHRoaXMudXJsOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gaXNEZWZhdWx0KCkgLyoteyByZXR1cm4gdGhpc1snZGVmYXVsdCddID8gdHJ1ZSA6IGZhbHNlOyB9LSovOworCisgIHByb3RlY3RlZCBEYXNoYm9hcmRJbmZvKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRMaXN0LmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5MGY5YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZExpc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKKy8qKiBQcm9qZWN0IGRhc2hib2FyZHMgZnJvbSB7QGNvZGUgL3Byb2plY3RzLzxuYW1lPi9kYXNoYm9hcmRzL30uICovCitwdWJsaWMgY2xhc3MgRGFzaGJvYXJkTGlzdCBleHRlbmRzIEpzQXJyYXk8RGFzaGJvYXJkSW5mbz4geworICBwdWJsaWMgc3RhdGljIHZvaWQgYWxsKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LAorICAgICAgQXN5bmNDYWxsYmFjazxKc0FycmF5PERhc2hib2FyZExpc3Q+PiBjYWxsYmFjaykgeworICAgIGJhc2UocHJvamVjdCkuYWRkUGFyYW1ldGVyVHJ1ZSgiaW5oZXJpdGVkIikuZ2V0KGNhbGxiYWNrKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXREZWZhdWx0KFByb2plY3QuTmFtZUtleSBwcm9qZWN0LAorICAgICAgQXN5bmNDYWxsYmFjazxEYXNoYm9hcmRJbmZvPiBjYWxsYmFjaykgeworICAgIGJhc2UocHJvamVjdCkudmlldygiZGVmYXVsdCIpLmFkZFBhcmFtZXRlclRydWUoImluaGVyaXRlZCIpLmdldChjYWxsYmFjayk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0KFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgaWQsCisgICAgICBBc3luY0NhbGxiYWNrPERhc2hib2FyZEluZm8+IGNhbGxiYWNrKSB7CisgICAgYmFzZShwcm9qZWN0KS5pZFJhdyhlbmNvZGVEYXNoYm9hcmRJZChpZCkpLmdldChjYWxsYmFjayk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIGJhc2UoUHJvamVjdC5OYW1lS2V5IHByb2plY3QpIHsKKyAgICByZXR1cm4gbmV3IFJlc3RBcGkoIi9wcm9qZWN0cy8iKS5pZChwcm9qZWN0LmdldCgpKS52aWV3KCJkYXNoYm9hcmRzIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlRGFzaGJvYXJkSWQoU3RyaW5nIGlkKSB7CisgICAgaW50IGMgPSBpZC5pbmRleE9mKCc6Jyk7CisgICAgaWYgKDAgPD0gYykgeworICAgICAgU3RyaW5nIHJlZiA9IFVSTC5lbmNvZGVRdWVyeVN0cmluZyhpZC5zdWJzdHJpbmcoMCwgYykpOworICAgICAgU3RyaW5nIHBhdGggPSBVUkwuZW5jb2RlUXVlcnlTdHJpbmcoaWQuc3Vic3RyaW5nKGMgKyAxKSk7CisgICAgICByZXR1cm4gcmVmICsgJzonICsgcGF0aDsKKyAgICB9CisgICAgcmV0dXJuIFVSTC5lbmNvZGVRdWVyeVN0cmluZyhpZCk7CisgIH0KKworICBwcm90ZWN0ZWQgRGFzaGJvYXJkTGlzdCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkc1RhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRzVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDcyMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkc1RhYmxlLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZGFzaGJvYXJkczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5OYXRpdmVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OYXZpZ2F0aW9uVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50Lkhpc3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsZXhUYWJsZS5GbGV4Q2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBEYXNoYm9hcmRzVGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8RGFzaGJvYXJkSW5mbz4geworICBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDsKKworICBwdWJsaWMgRGFzaGJvYXJkc1RhYmxlKGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0KSB7CisgICAgc3VwZXIoVXRpbC5DLmRhc2hib2FyZEl0ZW0oKSk7CisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICBpbml0Q29sdW1uSGVhZGVycygpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbHVtbkhlYWRlcnMoKSB7CisgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKyAgICBmbXQuc2V0Q29sU3BhbigwLCAwLCAyKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUhlYWRlcigpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUhlYWRlcigpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIDMsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUhlYWRlcigpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIDQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUhlYWRlcigpKTsKKworICAgIHRhYmxlLnNldFRleHQoMCwgMSwgVXRpbC5DLmRhc2hib2FyZE5hbWUoKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAyLCBVdGlsLkMuZGFzaGJvYXJkVGl0bGUoKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAzLCBVdGlsLkMuZGFzaGJvYXJkRGVzY3JpcHRpb24oKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCA0LCBVdGlsLkMuZGFzaGJvYXJkSW5oZXJpdGVkKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShEYXNoYm9hcmRMaXN0IGRhc2hlcykgeworICAgIGRpc3BsYXkoTmF0aXZlcy5hc0xpc3QoZGFzaGVzKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KEpzQXJyYXk8RGFzaGJvYXJkTGlzdD4gaW4pIHsKKyAgICBNYXA8U3RyaW5nLCBEYXNoYm9hcmRJbmZvPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERhc2hib2FyZEluZm8+KCk7CisgICAgZm9yIChEYXNoYm9hcmRMaXN0IGxpc3QgOiBOYXRpdmVzLmFzTGlzdChpbikpIHsKKyAgICAgIGZvciAoRGFzaGJvYXJkSW5mbyBkIDogTmF0aXZlcy5hc0xpc3QobGlzdCkpIHsKKyAgICAgICAgaWYgKCFtYXAuY29udGFpbnNLZXkoZC5pZCgpKSkgeworICAgICAgICAgIG1hcC5wdXQoZC5pZCgpLCBkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkaXNwbGF5KG5ldyBBcnJheUxpc3Q8RGFzaGJvYXJkSW5mbz4obWFwLnZhbHVlcygpKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KExpc3Q8RGFzaGJvYXJkSW5mbz4gbGlzdCkgeworICAgIHdoaWxlICgxIDwgdGFibGUuZ2V0Um93Q291bnQoKSkgeworICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKKyAgICB9CisKKyAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPERhc2hib2FyZEluZm8+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRGFzaGJvYXJkSW5mbyBhLCBEYXNoYm9hcmRJbmZvIGIpIHsKKyAgICAgICAgcmV0dXJuIGEuaWQoKS5jb21wYXJlVG8oYi5pZCgpKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIFN0cmluZyByZWYgPSBudWxsOworICAgIGZvcihEYXNoYm9hcmRJbmZvIGQgOiBsaXN0KSB7CisgICAgICBpZiAoIWQucmVmKCkuZXF1YWxzKHJlZikpIHsKKyAgICAgICAgcmVmID0gZC5yZWYoKTsKKyAgICAgICAgaW5zZXJ0VGl0bGVSb3codGFibGUuZ2V0Um93Q291bnQoKSwgcmVmKTsKKyAgICAgIH0KKyAgICAgIGluc2VydCh0YWJsZS5nZXRSb3dDb3VudCgpLCBkKTsKKyAgICB9CisKKyAgICBmaW5pc2hEaXNwbGF5KCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUaXRsZVJvdyhmaW5hbCBpbnQgcm93LCBTdHJpbmcgc2VjdGlvbikgeworICAgIHRhYmxlLmluc2VydFJvdyhyb3cpOworCisgICAgdGFibGUuc2V0VGV4dChyb3csIDAsIHNlY3Rpb24pOworCisgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKyAgICBmbXQuc2V0Q29sU3Bhbihyb3csIDAsIDYpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAwLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNlY3Rpb25IZWFkZXIoKSk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoZmluYWwgaW50IHJvdywgZmluYWwgRGFzaGJvYXJkSW5mbyBrKSB7CisgICAgdGFibGUuaW5zZXJ0Um93KHJvdyk7CisKKyAgICBhcHBseURhdGFSb3dTdHlsZShyb3cpOworCisgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgNCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgNSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKKworICAgIHBvcHVsYXRlKHJvdywgayk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBEYXNoYm9hcmRJbmZvIGspIHsKKyAgICBpZiAoay5pc0RlZmF1bHQoKSkgeworICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMSwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuZ3JlZW5DaGVjaygpKSk7CisgICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOworICAgICAgZm10LmdldEVsZW1lbnQocm93LCAxKS5zZXRUaXRsZShVdGlsLkMuZGFzaGJvYXJkRGVmYXVsdFRvb2xUaXAoKSk7CisgICAgfQorICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsIG5ldyBBbmNob3Ioay5wYXRoKCksICIjIgorICAgICAgICAgICAgKyBQYWdlTGlua3MudG9Qcm9qZWN0RGFzaGJvYXJkKG5ldyBQcm9qZWN0Lk5hbWVLZXkoay5wcm9qZWN0KCkpLCBrLmlkKCkpKSk7CisgICAgdGFibGUuc2V0VGV4dChyb3csIDMsIGsudGl0bGUoKSAhPSBudWxsID8gay50aXRsZSgpIDogay5wYXRoKCkpOworICAgIHRhYmxlLnNldFRleHQocm93LCA0LCBrLmRlc2NyaXB0aW9uKCkpOworICAgIGlmIChrLmRlZmluaW5nUHJvamVjdCgpICE9IG51bGwgJiYgIWsuZGVmaW5pbmdQcm9qZWN0KCkuZXF1YWxzKGsucHJvamVjdCgpKSkgeworICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgNSwgbmV3IEFuY2hvcihrLmRlZmluaW5nUHJvamVjdCgpLCAiIyIKKyAgICAgICAgICArIFBhZ2VMaW5rcy50b1Byb2plY3REYXNoYm9hcmRzKG5ldyBQcm9qZWN0Lk5hbWVLZXkoay5kZWZpbmluZ1Byb2plY3QoKSkpKSk7CisgICAgfQorICAgIHNldFJvd0l0ZW0ocm93LCBrKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJvd0l0ZW1LZXkoZmluYWwgRGFzaGJvYXJkSW5mbyBpdGVtKSB7CisgICAgcmV0dXJuIGl0ZW0uaWQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBvbk9wZW5Sb3coZmluYWwgaW50IHJvdykgeworICAgIGlmIChyb3cgPiAwKSB7CisgICAgICBtb3ZlUG9pbnRlclRvKHJvdyk7CisgICAgfQorICAgIEhpc3RvcnkubmV3SXRlbShnZXRSb3dJdGVtKHJvdykudXJsKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9VdGlsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1YmY3MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL1V0aWwuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CisKK3B1YmxpYyBjbGFzcyBVdGlsIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXNoYm9hcmRDb25zdGFudHMgQyA9IEdXVC5jcmVhdGUoRGFzaGJvYXJkQ29uc3RhbnRzLmNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZENvbW1hbmRMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzY4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kTGluay5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRvd25sb2FkOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuYXJpYS5jbGllbnQuUm9sZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5jbGlwcHkuY2xpZW50LkNvcHlhYmxlTGFiZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIERvd25sb2FkQ29tbWFuZExpbmsgZXh0ZW5kcyBBbmNob3IgaW1wbGVtZW50cyBDbGlja0hhbmRsZXIgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIENvcHlhYmxlQ29tbWFuZExpbmtGYWN0b3J5IHsKKyAgICBwcm90ZWN0ZWQgQ29weWFibGVMYWJlbCBjb3B5TGFiZWwgPSBudWxsOworICAgIHByb3RlY3RlZCBXaWRnZXQgd2lkZ2V0OworCisgICAgcHVibGljIGNsYXNzIENoZWNrb3V0Q29tbWFuZExpbmsgZXh0ZW5kcyBEb3dubG9hZENvbW1hbmRMaW5rIHsKKyAgICAgIHB1YmxpYyBDaGVja291dENvbW1hbmRMaW5rICgpIHsKKyAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLkNIRUNLT1VULCAiY2hlY2tvdXQiKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7CisgICAgICAgIHdpZGdldC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGZldGNoICIgKyBsaW5rLmdldFVybERhdGEoKQorICAgICAgICAgICAgKyAiICYmIGdpdCBjaGVja291dCBGRVRDSF9IRUFEIik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFB1bGxDb21tYW5kTGluayBleHRlbmRzIERvd25sb2FkQ29tbWFuZExpbmsgeworICAgICAgcHVibGljIFB1bGxDb21tYW5kTGluaygpIHsKKyAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLlBVTEwsICJwdWxsIik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgICAgICB3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBwdWxsICIgKyBsaW5rLmdldFVybERhdGEoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENoZXJyeVBpY2tDb21tYW5kTGluayBleHRlbmRzIERvd25sb2FkQ29tbWFuZExpbmsgeworICAgICAgcHVibGljIENoZXJyeVBpY2tDb21tYW5kTGluaygpIHsKKyAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLkNIRVJSWV9QSUNLLCAiY2hlcnJ5LXBpY2siKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7CisgICAgICAgIHdpZGdldC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGZldGNoICIgKyBsaW5rLmdldFVybERhdGEoKQorICAgICAgICAgICAgKyAiICYmIGdpdCBjaGVycnktcGljayBGRVRDSF9IRUFEIik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEZvcm1hdFBhdGNoQ29tbWFuZExpbmsgZXh0ZW5kcyBEb3dubG9hZENvbW1hbmRMaW5rIHsKKyAgICAgIHB1YmxpYyBGb3JtYXRQYXRjaENvbW1hbmRMaW5rKCkgeworICAgICAgICBzdXBlcihEb3dubG9hZENvbW1hbmQuRk9STUFUX1BBVENILCAicGF0Y2giKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7CisgICAgICAgIHdpZGdldC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGZldGNoICIgKyBsaW5rLmdldFVybERhdGEoKQorICAgICAgICAgICAgKyAiICYmIGdpdCBmb3JtYXQtcGF0Y2ggLTEgLS1zdGRvdXQgRkVUQ0hfSEVBRCIpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBSZXBvQ29tbWFuZExpbmsgZXh0ZW5kcyBEb3dubG9hZENvbW1hbmRMaW5rIHsKKyAgICAgIFN0cmluZyBwcm9qZWN0TmFtZTsKKyAgICAgIFN0cmluZyByZWY7CisgICAgICBwdWJsaWMgUmVwb0NvbW1hbmRMaW5rKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcmVmKSB7CisgICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZC5SRVBPX0RPV05MT0FELCAiY2hlY2tvdXQiKTsKKyAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3Q7CisgICAgICAgIHRoaXMucmVmID0gcmVmOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKKyAgICAgICAgd2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByLmFwcGVuZCgicmVwbyBkb3dubG9hZCAiKTsKKyAgICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOworICAgICAgICByLmFwcGVuZCgiICIpOworICAgICAgICByLmFwcGVuZChyZWYpOworICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dChyLnRvU3RyaW5nKCkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDbG9uZUNvbW1hbmRMaW5rIGV4dGVuZHMgRG93bmxvYWRDb21tYW5kTGluayB7CisgICAgICBwdWJsaWMgQ2xvbmVDb21tYW5kTGluaygpIHsKKyAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLkNIRUNLT1VULCAiY2xvbmUiKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7CisgICAgICAgIHdpZGdldC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGNsb25lICIgKyBsaW5rLmdldFVybERhdGEoKSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvcHlhYmxlQ29tbWFuZExpbmtGYWN0b3J5KENvcHlhYmxlTGFiZWwgbGFiZWwsIFdpZGdldCB3aWRnZXQpIHsKKyAgICAgIGNvcHlMYWJlbCA9IGxhYmVsOworICAgICAgdGhpcy53aWRnZXQgPSB3aWRnZXQ7CisgICAgfQorICB9CisKKyAgZmluYWwgRG93bmxvYWRDb21tYW5kIGNtZFR5cGU7CisKKyAgcHVibGljIERvd25sb2FkQ29tbWFuZExpbmsoRG93bmxvYWRDb21tYW5kIGNtZFR5cGUsCisgICAgICBTdHJpbmcgdGV4dCkgeworICAgIHN1cGVyKHRleHQpOworICAgIHRoaXMuY21kVHlwZSA9IGNtZFR5cGU7CisgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rKCkpOworICAgIFJvbGVzLmdldFRhYlJvbGUoKS5zZXQoZ2V0RWxlbWVudCgpKTsKKyAgICBhZGRDbGlja0hhbmRsZXIodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKworICAgIHNlbGVjdCgpOworCisgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKKyAgICAgIC8vIElmIHRoZSB1c2VyIGlzIHNpZ25lZC1pbiwgcmVtZW1iZXIgdGhpcyBjaG9pY2UgZm9yIGZ1dHVyZSBwYW5lbHMuCisgICAgICAvLworICAgICAgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcyBwcmVmID0KKyAgICAgICAgICBHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRHZW5lcmFsUHJlZmVyZW5jZXMoKTsKKyAgICAgIHByZWYuc2V0RG93bmxvYWRDb21tYW5kKGNtZFR5cGUpOworICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuVXRpbC5BQ0NPVU5UX1NWQy5jaGFuZ2VQcmVmZXJlbmNlcyhwcmVmLAorICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBEb3dubG9hZENvbW1hbmQgZ2V0Q21kVHlwZSgpIHsKKyAgICByZXR1cm4gY21kVHlwZTsKKyAgfQorCisgIHZvaWQgc2VsZWN0KCkgeworICAgIERvd25sb2FkQ29tbWFuZFBhbmVsIHBhcmVudCA9IChEb3dubG9hZENvbW1hbmRQYW5lbCkgZ2V0UGFyZW50KCk7CisgICAgZm9yIChXaWRnZXQgdyA6IHBhcmVudCkgeworICAgICAgaWYgKHcgIT0gdGhpcyAmJiB3IGluc3RhbmNlb2YgRG93bmxvYWRDb21tYW5kTGluaykgeworICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7CisgICAgICB9CisgICAgfQorICAgIHBhcmVudC5zZXRDdXJyZW50Q29tbWFuZCh0aGlzKTsKKyAgICBhZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtfQWN0aXZlKCkpOworICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluayk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZENvbW1hbmRQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxN2Q2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kUGFuZWwuamF2YQpAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRvd25sb2FkOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuYXJpYS5jbGllbnQuUm9sZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKKworcHVibGljIGNsYXNzIERvd25sb2FkQ29tbWFuZFBhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKKyAgcHJpdmF0ZSBEb3dubG9hZENvbW1hbmRMaW5rIGN1cnJlbnRDb21tYW5kOworICBwcml2YXRlIERvd25sb2FkVXJsTGluayBjdXJyZW50VXJsOworCisgIHB1YmxpYyBEb3dubG9hZENvbW1hbmRQYW5lbCgpIHsKKyAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtMaXN0KCkpOworICAgIFJvbGVzLmdldFRhYmxpc3RSb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgIHJldHVybiBnZXRXaWRnZXRDb3VudCgpID09IDA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZWxlY3QoQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQgY21kVHlwZSkgeworICAgIERvd25sb2FkQ29tbWFuZExpbmsgZmlyc3QgPSBudWxsOworCisgICAgZm9yIChXaWRnZXQgdyA6IHRoaXMpIHsKKyAgICAgIGlmICh3IGluc3RhbmNlb2YgRG93bmxvYWRDb21tYW5kTGluaykgeworICAgICAgICBmaW5hbCBEb3dubG9hZENvbW1hbmRMaW5rIGQgPSAoRG93bmxvYWRDb21tYW5kTGluaykgdzsKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICBmaXJzdCA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQuY21kVHlwZSA9PSBjbWRUeXBlKSB7CisgICAgICAgICAgZC5zZWxlY3QoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBub25lIG1hdGNoZWQgdGhlIHJlcXVlc3RlZCB0eXBlLCBzZWxlY3QgdGhlIGZpcnN0IGluIHRoZQorICAgIC8vIGdyb3VwIGFzIHRoYXQgd2lsbCBhdCBsZWFzdCBnaXZlIHVzIGFuIGluaXRpYWwgYmFzZWxpbmUuCisgICAgaWYgKGZpcnN0ICE9IG51bGwpIHsKKyAgICAgIGZpcnN0LnNlbGVjdCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgIGN1cnJlbnRVcmwgPSBsaW5rOworICAgIHVwZGF0ZSgpOworICB9CisKKyAgdm9pZCBzZXRDdXJyZW50Q29tbWFuZChEb3dubG9hZENvbW1hbmRMaW5rIGNtZCkgeworICAgIGN1cnJlbnRDb21tYW5kID0gY21kOworICAgIHVwZGF0ZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKKyAgICBpZiAoY3VycmVudENvbW1hbmQgIT0gbnVsbCAmJiBjdXJyZW50VXJsICE9IG51bGwpIHsKKyAgICAgIGN1cnJlbnRDb21tYW5kLnNldEN1cnJlbnRVcmwoY3VycmVudFVybCk7CisgICAgfSBlbHNlIGlmIChjdXJyZW50Q29tbWFuZCAhPSBudWxsICYmCisgICAgICAgIGN1cnJlbnRDb21tYW5kLmdldENtZFR5cGUoKS5lcXVhbHMoRG93bmxvYWRDb21tYW5kLlJFUE9fRE9XTkxPQUQpKSB7CisgICAgICBjdXJyZW50Q29tbWFuZC5zZXRDdXJyZW50VXJsKG51bGwpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAzMTNhZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOworCitwdWJsaWMgaW50ZXJmYWNlIERvd25sb2FkTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7CisgIFN0cmluZyBhbm9ueW1vdXNEb3dubG9hZChTdHJpbmcgcHJvdG9jb2wpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkTWVzc2FnZXMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNGRhMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorYW5vbnltb3VzRG93bmxvYWQgPSBBbm9ueW1vdXMgezB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBkYmVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkUGFuZWwuamF2YQpAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRvd25sb2FkOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLklubGluZUxhYmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuY2xpcHB5LmNsaWVudC5Db3B5YWJsZUxhYmVsOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIERvd25sb2FkUGFuZWwgZXh0ZW5kcyBGbG93UGFuZWwgeworICBwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lOworCisgIHByb3RlY3RlZCBTZXQ8RG93bmxvYWRTY2hlbWU+IGFsbG93ZWRTY2hlbWVzID0KKyAgICAgIEdlcnJpdC5nZXRDb25maWcoKS5nZXREb3dubG9hZFNjaGVtZXMoKTsKKyAgcHJvdGVjdGVkIFNldDxEb3dubG9hZENvbW1hbmQ+IGFsbG93ZWRDb21tYW5kcyA9CisgICAgICBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0RG93bmxvYWRDb21tYW5kcygpOworICBwcm90ZWN0ZWQgRG93bmxvYWRDb21tYW5kTGluay5Db3B5YWJsZUNvbW1hbmRMaW5rRmFjdG9yeSBjbWRMaW5rZmFjdG9yeTsKKworICBwcm90ZWN0ZWQgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZHMgPSBuZXcgRG93bmxvYWRDb21tYW5kUGFuZWwoKTsKKyAgcHJvdGVjdGVkIERvd25sb2FkVXJsUGFuZWwgdXJscyA9IG5ldyBEb3dubG9hZFVybFBhbmVsKGNvbW1hbmRzKTsKKyAgcHJvdGVjdGVkIENvcHlhYmxlTGFiZWwgY29weUxhYmVsID0gbmV3IENvcHlhYmxlTGFiZWwoIiIpOworCisgIHB1YmxpYyBEb3dubG9hZFBhbmVsKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcmVmLCBib29sZWFuIGFsbG93QW5vbnltb3VzKSB7CisgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3Q7CisKKyAgICBjb3B5TGFiZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rQ29weUxhYmVsKCkpOworICAgIHVybHMuYWRkKERvd25sb2FkVXJsTGluay5jcmVhdGVEb3dubG9hZFVybExpbmtzKHByb2plY3QsIHJlZiwgYWxsb3dBbm9ueW1vdXMpKTsKKyAgICBjbWRMaW5rZmFjdG9yeSA9IG5ldyBEb3dubG9hZENvbW1hbmRMaW5rLkNvcHlhYmxlQ29tbWFuZExpbmtGYWN0b3J5KAorICAgICAgICBjb3B5TGFiZWwsIHVybHMpOworCisgICAgcG9wdWxhdGVEb3dubG9hZENvbW1hbmRMaW5rcygpOworICAgIHNldHVwV2lkZ2V0cygpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2V0dXBXaWRnZXRzKCkgeworICAgIGlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7CisgICAgICBmaW5hbCBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzIHByZWY7CisgICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgeworICAgICAgICBwcmVmID0gR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmVmID0gbmV3IEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgcHJlZi5yZXNldFRvRGVmYXVsdHMoKTsKKyAgICAgIH0KKyAgICAgIGNvbW1hbmRzLnNlbGVjdChwcmVmLmdldERvd25sb2FkQ29tbWFuZCgpKTsKKyAgICAgIHVybHMuc2VsZWN0KHByZWYuZ2V0RG93bmxvYWRVcmwoKSk7CisKKyAgICAgIEZsb3dQYW5lbCBwID0gbmV3IEZsb3dQYW5lbCgpOworICAgICAgcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtIZWFkZXIoKSk7CisgICAgICBwLmFkZChjb21tYW5kcyk7CisgICAgICBmaW5hbCBJbmxpbmVMYWJlbCBnbHVlID0gbmV3IElubGluZUxhYmVsKCk7CisgICAgICBnbHVlLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0hlYWRlckdhcCgpKTsKKyAgICAgIHAuYWRkKGdsdWUpOworICAgICAgcC5hZGQodXJscyk7CisKKyAgICAgIGFkZChwKTsKKyAgICAgIGFkZChjb3B5TGFiZWwpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHBvcHVsYXRlRG93bmxvYWRDb21tYW5kTGlua3MoKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybExpbmsuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybExpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM4OTdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkVXJsTGluay5qYXZhCkBAIC0wLDAgKzEsMjY0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRvd25sb2FkOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZFNjaGVtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuYXJpYS5jbGllbnQuUm9sZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgRG93bmxvYWRVcmxMaW5rIGV4dGVuZHMgQW5jaG9yIGltcGxlbWVudHMgQ2xpY2tIYW5kbGVyIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3dubG9hZFJlZlVybExpbmsgZXh0ZW5kcyBEb3dubG9hZFVybExpbmsgeworICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE5hbWU7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZWY7CisKKyAgICBwcm90ZWN0ZWQgRG93bmxvYWRSZWZVcmxMaW5rKERvd25sb2FkU2NoZW1lIHVybFR5cGUsCisgICAgICAgIFN0cmluZyB0ZXh0LCBTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgICAgc3VwZXIodXJsVHlwZSwgdGV4dCk7CisgICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdDsKKyAgICAgIHRoaXMucmVmID0gcmVmOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZFJlZihTdHJpbmdCdWlsZGVyIHIpIHsKKyAgICAgIGlmIChyZWYgIT0gbnVsbCkgeworICAgICAgICByLmFwcGVuZCgiICIpOworICAgICAgICByLmFwcGVuZChyZWYpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vbkdpdExpbmsgZXh0ZW5kcyBEb3dubG9hZFJlZlVybExpbmsgeworICAgIHB1YmxpYyBBbm9uR2l0TGluayhTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgICAgc3VwZXIoRG93bmxvYWRTY2hlbWUuQU5PTl9HSVQsIFV0aWwuTS5hbm9ueW1vdXNEb3dubG9hZCgiR2l0IiksIHByb2plY3QsIHJlZik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRVcmxEYXRhKCkgeworICAgICAgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXREYWVtb25VcmwoKSk7CisgICAgICByLmFwcGVuZChwcm9qZWN0TmFtZSk7CisgICAgICBhcHBlbmRSZWYocik7CisgICAgICByZXR1cm4gci50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vbkh0dHBMaW5rIGV4dGVuZHMgRG93bmxvYWRSZWZVcmxMaW5rIHsKKyAgICBwdWJsaWMgQW5vbkh0dHBMaW5rKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcmVmKSB7CisgICAgICBzdXBlcihEb3dubG9hZFNjaGVtZS5BTk9OX0hUVFAsIFV0aWwuTS5hbm9ueW1vdXNEb3dubG9hZCgiSFRUUCIpLCBwcm9qZWN0LCByZWYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsRGF0YSgpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsKSB7CisgICAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXRIdHRwVXJsKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgci5hcHBlbmQoaG9zdFBhZ2VVcmwpOworICAgICAgfQorICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOworICAgICAgYXBwZW5kUmVmKHIpOworICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzaExpbmsgZXh0ZW5kcyBEb3dubG9hZFJlZlVybExpbmsgeworICAgIHB1YmxpYyBTc2hMaW5rKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcmVmKSB7CisgICAgICBzdXBlcihEb3dubG9hZFNjaGVtZS5TU0gsICJTU0giLCBwcm9qZWN0LCByZWYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsRGF0YSgpIHsKKyAgICAgIFN0cmluZyBzc2hBZGRyID0gR2Vycml0LmdldENvbmZpZygpLmdldFNzaGRBZGRyZXNzKCk7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgci5hcHBlbmQoInNzaDovLyIpOworICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7CisgICAgICByLmFwcGVuZCgiQCIpOworICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKjoiKSB8fCAiIi5lcXVhbHMoc3NoQWRkcikpIHsKKyAgICAgICAgci5hcHBlbmQoV2luZG93LkxvY2F0aW9uLmdldEhvc3ROYW1lKCkpOworICAgICAgfQorICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKiIpKSB7CisgICAgICAgIHNzaEFkZHIgPSBzc2hBZGRyLnN1YnN0cmluZygxKTsKKyAgICAgIH0KKyAgICAgIHIuYXBwZW5kKHNzaEFkZHIpOworICAgICAgci5hcHBlbmQoIi8iKTsKKyAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKKyAgICAgIGFwcGVuZFJlZihyKTsKKyAgICAgIHJldHVybiByLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwTGluayBleHRlbmRzIERvd25sb2FkUmVmVXJsTGluayB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYW5vbnltb3VzOworCisgICAgcHVibGljIEh0dHBMaW5rKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcmVmLCBib29sZWFuIGFub255bW91cykgeworICAgICAgc3VwZXIoRG93bmxvYWRTY2hlbWUuSFRUUCwgIkhUVFAiLCBwcm9qZWN0LCByZWYpOworICAgICAgdGhpcy5hbm9ueW1vdXMgPSBhbm9ueW1vdXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRVcmxEYXRhKCkgeworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0SHR0cFVybCgpICE9IG51bGwKKyAgICAgICAgICAmJiAoYW5vbnltb3VzIHx8IHNpdGVSZWxpZXNPbkh0dHAoKSkpIHsKKyAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmcgYmFzZSA9IGhvc3RQYWdlVXJsOworICAgICAgICBpbnQgcCA9IGJhc2UuaW5kZXhPZigiOi8vIik7CisgICAgICAgIGludCBzID0gYmFzZS5pbmRleE9mKCcvJywgcCArIDMpOworICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICBzID0gYmFzZS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgaG9zdCA9IGJhc2Uuc3Vic3RyaW5nKHAgKyAzLCBzKTsKKyAgICAgICAgaWYgKGhvc3QuY29udGFpbnMoIkAiKSkgeworICAgICAgICAgIGhvc3QgPSBob3N0LnN1YnN0cmluZyhob3N0LmluZGV4T2YoJ0AnKSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgci5hcHBlbmQoYmFzZS5zdWJzdHJpbmcoMCwgcCArIDMpKTsKKyAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7CisgICAgICAgIHIuYXBwZW5kKCdAJyk7CisgICAgICAgIHIuYXBwZW5kKGhvc3QpOworICAgICAgICByLmFwcGVuZChiYXNlLnN1YnN0cmluZyhzKSk7CisgICAgICB9CisgICAgICByLmFwcGVuZChwcm9qZWN0TmFtZSk7CisgICAgICBhcHBlbmRSZWYocik7CisgICAgICByZXR1cm4gci50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaXRlUmVsaWVzT25IdHRwKCkgeworICAgIHJldHVybiBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0SHR0cFVybCgpICE9IG51bGwKKyAgICAgICAgJiYgR2Vycml0LmdldENvbmZpZygpLmdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuQ1VTVE9NX0VYVEVOU0lPTgorICAgICAgICAmJiAhR2Vycml0LmdldENvbmZpZygpLnNpdGVIYXNVc2VybmFtZXMoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxEb3dubG9hZFVybExpbms+IGNyZWF0ZURvd25sb2FkVXJsTGlua3MoU3RyaW5nIHByb2plY3QsCisgICAgICBTdHJpbmcgcmVmLCBib29sZWFuIGFsbG93QW5vbnltb3VzKSB7CisgICAgTGlzdDxEb3dubG9hZFVybExpbms+IHVybHMgPSBuZXcgQXJyYXlMaXN0PERvd25sb2FkVXJsTGluaz4oKTsKKyAgICBTZXQ8RG93bmxvYWRTY2hlbWU+IGFsbG93ZWRTY2hlbWVzID0gR2Vycml0LmdldENvbmZpZygpLmdldERvd25sb2FkU2NoZW1lcygpOworCisgICAgaWYgKGFsbG93QW5vbnltb3VzCisgICAgICAgICYmIEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXREYWVtb25VcmwoKSAhPSBudWxsCisgICAgICAgICYmIChhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5BTk9OX0dJVCkgfHwKKyAgICAgICAgICAgIGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKKyAgICAgIHVybHMuYWRkKG5ldyBEb3dubG9hZFVybExpbmsuQW5vbkdpdExpbmsocHJvamVjdCwgcmVmKSk7CisgICAgfQorCisgICAgaWYgKGFsbG93QW5vbnltb3VzCisgICAgICAgICYmIChhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5BTk9OX0hUVFApIHx8CisgICAgICAgICAgICBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7CisgICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rLkFub25IdHRwTGluayhwcm9qZWN0LCByZWYpKTsKKyAgICB9CisKKyAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldFNzaGRBZGRyZXNzKCkgIT0gbnVsbAorICAgICAgICAmJiBoYXNVc2VyTmFtZSgpCisgICAgICAgICYmIChhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5TU0gpIHx8CisgICAgICAgICAgICBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7CisgICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rLlNzaExpbmsocHJvamVjdCwgcmVmKSk7CisgICAgfQorCisgICAgaWYgKChoYXNVc2VyTmFtZSgpIHx8IHNpdGVSZWxpZXNPbkh0dHAoKSkKKyAgICAgICAgJiYgKGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkhUVFApCisgICAgICAgICAgICB8fCBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7CisgICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rLkh0dHBMaW5rKHByb2plY3QsIHJlZiwgYWxsb3dBbm9ueW1vdXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHVybHM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc1VzZXJOYW1lKCkgeworICAgIHJldHVybiBHZXJyaXQuaXNTaWduZWRJbigpCisgICAgICAgICYmIEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldFVzZXJOYW1lKCkgIT0gbnVsbAorICAgICAgICAmJiBHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRVc2VyTmFtZSgpLmxlbmd0aCgpID4gMDsKKyAgfQorCisgIHByb3RlY3RlZCBEb3dubG9hZFNjaGVtZSB1cmxUeXBlOworICBwcm90ZWN0ZWQgU3RyaW5nIHVybERhdGE7CisgIHByb3RlY3RlZCBTdHJpbmcgaG9zdFBhZ2VVcmwgPSBHV1QuZ2V0SG9zdFBhZ2VCYXNlVVJMKCk7CisKKyAgcHVibGljIERvd25sb2FkVXJsTGluayhEb3dubG9hZFNjaGVtZSB1cmxUeXBlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHVybERhdGEpIHsKKyAgICB0aGlzKHRleHQpOworICAgIHRoaXMudXJsVHlwZSA9IHVybFR5cGU7CisgICAgdGhpcy51cmxEYXRhID0gdXJsRGF0YTsKKyAgfQorCisgIHB1YmxpYyBEb3dubG9hZFVybExpbmsoRG93bmxvYWRTY2hlbWUgdXJsVHlwZSwgU3RyaW5nIHRleHQpIHsKKyAgICB0aGlzKHRleHQpOworICAgIHRoaXMudXJsVHlwZSA9IHVybFR5cGU7CisgIH0KKworICBwdWJsaWMgRG93bmxvYWRVcmxMaW5rKFN0cmluZyB0ZXh0KSB7CisgICAgc3VwZXIodGV4dCk7CisgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rKCkpOworICAgIFJvbGVzLmdldFRhYlJvbGUoKS5zZXQoZ2V0RWxlbWVudCgpKTsKKyAgICBhZGRDbGlja0hhbmRsZXIodGhpcyk7CisKKyAgICBpZiAoIWhvc3RQYWdlVXJsLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgIGhvc3RQYWdlVXJsICs9ICIvIjsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFVybERhdGEoKSB7CisgICAgcmV0dXJuIHVybERhdGE7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKKyAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKworICAgIHNlbGVjdCgpOworCisgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKKyAgICAgIC8vIElmIHRoZSB1c2VyIGlzIHNpZ25lZC1pbiwgcmVtZW1iZXIgdGhpcyBjaG9pY2UgZm9yIGZ1dHVyZSBwYW5lbHMuCisgICAgICAvLworICAgICAgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcyBwcmVmID0KKyAgICAgICAgICBHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRHZW5lcmFsUHJlZmVyZW5jZXMoKTsKKyAgICAgIHByZWYuc2V0RG93bmxvYWRVcmwodXJsVHlwZSk7CisgICAgICBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5VdGlsLkFDQ09VTlRfU1ZDLmNoYW5nZVByZWZlcmVuY2VzKHByZWYsCisgICAgICAgICAgbmV3IEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWRSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZWxlY3QoKSB7CisgICAgRG93bmxvYWRVcmxQYW5lbCBwYXJlbnQgPSAoRG93bmxvYWRVcmxQYW5lbCkgZ2V0UGFyZW50KCk7CisgICAgZm9yIChXaWRnZXQgdyA6IHBhcmVudCkgeworICAgICAgaWYgKHcgIT0gdGhpcyAmJiB3IGluc3RhbmNlb2YgRG93bmxvYWRVcmxMaW5rKSB7CisgICAgICAgIHcucmVtb3ZlU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rX0FjdGl2ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcGFyZW50LnNldEN1cnJlbnRVcmwodGhpcyk7CisgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rX0FjdGl2ZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkVXJsUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybFBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwNzQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybFBhbmVsLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuYXJpYS5jbGllbnQuUm9sZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitwdWJsaWMgY2xhc3MgRG93bmxvYWRVcmxQYW5lbCBleHRlbmRzIEZsb3dQYW5lbCB7CisgIHByaXZhdGUgZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZFBhbmVsOworCisgIHB1YmxpYyBEb3dubG9hZFVybFBhbmVsKGZpbmFsIERvd25sb2FkQ29tbWFuZFBhbmVsIGNvbW1hbmRQYW5lbCkgeworICAgIHRoaXMuY29tbWFuZFBhbmVsID0gY29tbWFuZFBhbmVsOworICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0xpc3QoKSk7CisgICAgUm9sZXMuZ2V0VGFibGlzdFJvbGUoKS5zZXQoZ2V0RWxlbWVudCgpKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgcmV0dXJuIGdldFdpZGdldENvdW50KCkgPT0gMDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNlbGVjdChBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkU2NoZW1lIHVybFR5cGUpIHsKKyAgICBEb3dubG9hZFVybExpbmsgZmlyc3QgPSBudWxsOworCisgICAgZm9yIChXaWRnZXQgdyA6IHRoaXMpIHsKKyAgICAgIGlmICh3IGluc3RhbmNlb2YgRG93bmxvYWRVcmxMaW5rKSB7CisgICAgICAgIGZpbmFsIERvd25sb2FkVXJsTGluayBkID0gKERvd25sb2FkVXJsTGluaykgdzsKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpIHsKKyAgICAgICAgICBmaXJzdCA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQudXJsVHlwZSA9PSB1cmxUeXBlKSB7CisgICAgICAgICAgZC5zZWxlY3QoKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBub25lIG1hdGNoZWQgdGhlIHJlcXVlc3RlZCB0eXBlLCBzZWxlY3QgdGhlIGZpcnN0IGluIHRoZQorICAgIC8vIGdyb3VwIGFzIHRoYXQgd2lsbCBhdCBsZWFzdCBnaXZlIHVzIGFuIGluaXRpYWwgYmFzZWxpbmUuCisgICAgaWYgKGZpcnN0ICE9IG51bGwpIHsKKyAgICAgIGZpcnN0LnNlbGVjdCgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgIGNvbW1hbmRQYW5lbC5zZXRDdXJyZW50VXJsKGxpbmspOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkKENvbGxlY3Rpb248RG93bmxvYWRVcmxMaW5rPiBsaW5rcykgeworICAgIGZvciAoV2lkZ2V0IGxpbms6IGxpbmtzKSB7CisgICAgICBhZGQobGluayk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTAzNjFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL1V0aWwuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRvd25sb2FkOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworCitwdWJsaWMgY2xhc3MgVXRpbCB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgRG93bmxvYWRNZXNzYWdlcyBNID0gR1dULmNyZWF0ZShEb3dubG9hZE1lc3NhZ2VzLmNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9lZGl0VGV4dC5wbmcgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZWRpdFRleHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGUxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZWRpdFRleHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nZXJyaXQuY3NzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dlcnJpdC5jc3MKaW5kZXggNzUxMmQ4Yy4uOTQyNTQ0MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dlcnJpdC5jc3MKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dlcnJpdC5jc3MKQEAgLTEzLDMxICsxMywxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotQGV4dGVybmFsIC5nd3QtQnV0dG9uOwotQGV4dGVybmFsIC5nd3QtVGFiQmFyOwotQGV4dGVybmFsIC5nd3QtVGFiQmFyRmlyc3Q7Ci1AZXh0ZXJuYWwgLmd3dC1UYWJCYXJJdGVtOwotQGV4dGVybmFsIC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZDsKLUBleHRlcm5hbCAuZ3d0LVRhYkJhclJlc3Q7Ci1AZXh0ZXJuYWwgLmd3dC1UYWJQYW5lbEJvdHRvbTsKLUBleHRlcm5hbCAuZ3d0LVRleHRCb3g7Ci1AZXh0ZXJuYWwgLmd3dC1IeXBlcmxpbms7Ci1AZXh0ZXJuYWwgLmd3dC1DaGVja0JveDsKLUBleHRlcm5hbCAuZ3d0LURpc2Nsb3N1cmVQYW5lbCwgLmhlYWRlciwgLmNvbnRlbnQ7Ci1AZXh0ZXJuYWwgLmd3dC1JbmxpbmVMYWJlbDsKLUBleHRlcm5hbCAuZ3d0LUlubGluZUh5cGVybGluazsKLUBleHRlcm5hbCAuZ3d0LVJhZGlvQnV0dG9uOwotCi1AZXh0ZXJuYWwgLnNlYXJjaFBhbmVsOwotQGV4dGVybmFsIC5zbWFsbEhlYWRpbmc7Ci1AZXh0ZXJuYWwgLndkaTsKLUBleHRlcm5hbCAud2RkOwotQGV4dGVybmFsIC53ZGM7CisvKioKKyAqIE1ha2UgZXZlcnkgc2luZ2xlIGNsYXNzIGV4dGVybmFsIHNvIHVzZXJzIGNhbiByZWx5IG9uIHRoZWlyIG5hbWVzCisgKi8KK0BleHRlcm5hbCAuKjsKIAogQGRlZiBibGFjayAjMDAwMDAwOwogQGRlZiB3aGl0ZSAjZmZmZmZmOwogQGRlZiBub3JtLWZvbnQgIEFyaWFsIFVuaWNvZGUgTVMsIEFyaWFsLCBzYW5zLXNlcmlmOwotQGRlZiBtb25vLWZvbnQgJ0x1Y2lkYSBDb25zb2xlJywgJ0x1Y2lkYSBTYW5zIFR5cGV3cml0ZXInLCBNb25hY28sIG1vbm9zcGFjZTsKK0BkZWYgbW9uby1mb250ICBtb25vc3BhY2U7CiAKIEBldmFsIGJhY2tncm91bmRDb2xvciBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0LmdldFRoZW1lKCkuYmFja2dyb3VuZENvbG9yOwogQGV2YWwgdG9wTWVudUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50b3BNZW51Q29sb3I7CkBAIC01MiwyOCArMzYsMzIgQEAKICAgZ3d0LWltYWdlOiAiZ3JlZW5DaGVjayI7CiB9CiAKKy8qKiBPdmVycmlkZSB2YXJpb3VzIEdXVCBkZWZhdWx0cyAqLwogLmdlcnJpdFRvcE1lbnUgewogICBmb250LXNpemU6IDlwdDsKICAgcGFkZGluZy10b3A6IDVweDsKICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgIHBhZGRpbmctcmlnaHQ6IDVweDsKLSAgYmFja2dyb3VuZDogdG9wTWVudUNvbG9yOwotfQotLmdlcnJpdFRvcE1lbnUgLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJJdGVtLAotLmdlcnJpdFRvcE1lbnUgLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJSZXN0LAotLmdlcnJpdFRvcE1lbnUgLmd3dC1UYWJCYXIgLmd3dC1UYWJQYW5lbEJvdHRvbSB7Ci0gIGJhY2tncm91bmQ6IHRvcE1lbnVDb2xvcjsKLX0KLS5nZXJyaXRUb3BNZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yOworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKIH0KIAogLmdlcnJpdEJvZHkgewotICBmb250LXNpemU6IDExcHQ7CisgIGZvbnQtc2l6ZTogc21hbGw7CiAgIHBhZGRpbmctbGVmdDogNXB4OwogICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiB9CiAKK2EsCithOnZpc2l0ZWQgeworICBjb2xvcjogIzA2NTRhYzsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCithOmhvdmVyIHsKKyAgY29sb3I6ICMwNjU0YWM7CisgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCiAudmVyc2lvbiwKIC5rZXloZWxwIHsKICAgY29sb3I6ICNhMGFkY2M7CkBAIC0xMTgsNiArMTA2LDkgQEAKICAgcGFkZGluZzogMC4yZW0gMC4yZW0gMC4yZW0gMC41ZW07CiB9CiAKKy5saW5rIHsKKyAgY3Vyc29yOiBwb2ludGVyOworfQogCiAvKiogTWVudVNjcmVlbiAqKi8KIC5tZW51U2NyZWVuTWVudUJhciB7CkBAIC0xNDEsNiArMTMyLDkgQEAKICAgYmFja2dyb3VuZDogc2VsZWN0aW9uQ29sb3I7CiB9CiAKKy5tZW51SXRlbS5hY3RpdmVSb3cgeworICBiYWNrZ3JvdW5kOiBzZWxlY3Rpb25Db2xvcjsKK30KIAogLyoqIENvbW1lbnRQYW5lbCAqKi8KIC5jb21tZW50UGFuZWxCb3JkZXIgewpAQCAtMjM1LDYgKzIyOSw3IEBACiAgIGZvbnQtc2l6ZTogOXB0OwogICBkaXNwbGF5OiBpbmxpbmU7CiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CisgIHBhZGRpbmctbGVmdDogNnB4OwogfQogLm1lbnVJdGVtIHsKICAgcGFkZGluZy1sZWZ0OiA1cHg7CkBAIC0yNTMsMzMgKzI0OCw0NiBAQAogLnRvcG1lbnVURGdsdWUgewogICB3aWR0aDogMTAwJTsKIH0KKwogLnRvcG1lbnVNZW51TGVmdCB7CiAgIHdpZHRoOiAzMDBweDsKLSAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB0b3BNZW51Q29sb3I7Ci0gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHRvcE1lbnVDb2xvcjsKLSAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRvcE1lbnVDb2xvcjsKKyAgZm9udC1zaXplOiA5cHQ7CisgIHBhZGRpbmctdG9wOiA1cHg7CisgIHBhZGRpbmctbGVmdDogNXB4OworICBwYWRkaW5nLXJpZ2h0OiA1cHg7CisgIGJhY2tncm91bmQ6IG5vbmU7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgdG9wOiAwOworfQorLnRvcG1lbnVNZW51TGVmdCB0Ym9keSB0ciB0ZCB0YWJsZSB7CisgIGJvcmRlcjogMDsKK30KKy50b3BtZW51TWVudUxlZnQgdGJvZHkgdHIgdGQgdGFibGUuZ3d0LVRhYkJhciB7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjREREOworfQorLnRvcG1lbnVNZW51TGVmdCAuZ3d0LVRleHRCb3ggeworICB3aWR0aDogMjUwcHg7Cit9CisudG9wbWVudU1lbnVMZWZ0IC5nd3QtQnV0dG9uIHsKKyAgcGFkZGluZzogM3B4IDZweDsKIH0KIC50b3BtZW51TWVudUxlZnQgLmd3dC1UYWJCYXJGaXJzdCB7CiAgIGRpc3BsYXk6IG5vbmU7CiB9CiAudG9wbWVudU1lbnVMZWZ0IC5nd3QtVGFiQmFySXRlbSB7CiAgIG1hcmdpbjogMHB4OwotICBiYWNrZ3JvdW5kOiB0b3BNZW51Q29sb3I7CisgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICBwYWRkaW5nLXRvcDogMHB4OwogICBwYWRkaW5nLWJvdHRvbTogMXB4OwogICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgcGFkZGluZy1yaWdodDogMWVtOwotICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBibGFjazsKLX0KLS50b3BtZW51TWVudUxlZnQgLmd3dC1UYWJCYXJJdGVtLXNlbGVjdGVkIHsKLSAgYmFja2dyb3VuZDogc2VsZWN0aW9uQ29sb3I7CiB9CiAudG9wbWVudU1lbnVMZWZ0IC5nd3QtVGFiQmFyUmVzdCB7Ci0gIGJhY2tncm91bmQ6IHRvcE1lbnVDb2xvcjsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgIHBhZGRpbmctdG9wOiAwcHg7CiB9CiAudG9wbWVudU1lbnVMZWZ0IC5nd3QtVGFiUGFuZWxCb3R0b20gewotICBiYWNrZ3JvdW5kOiB0b3BNZW51Q29sb3I7CisgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICBib3JkZXItdG9wOiBub25lOwogICBib3JkZXItbGVmdDogbm9uZTsKICAgYm9yZGVyLXJpZ2h0OiBub25lOwpAQCAtMjk3LDIxICszMDUsMzcgQEAKICAgdGV4dC1hbGlnbjogcmlnaHQ7CiB9CiAubWVudUJhclVzZXJOYW1lIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgIHBhZGRpbmctbGVmdDogNXB4OwogICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9CisubWVudUJhclVzZXJOYW1lQXZhdGFyIHsKKyAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKK30KKy5tZW51QmFyVXNlck5hbWVGb2N1c1BhbmVsIHsKKyAgZGlzcGxheTogaW5saW5lOworfQorLm1lbnVCYXJVc2VyTmFtZVBhbmVsIHsKKyAgZGlzcGxheTogaW5saW5lOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGZvbnQtd2VpZ2h0OiBib2xkOworfQorLnVzZXJJbmZvUG9wdXAgeworICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKKyAgYmFja2dyb3VuZDogd2hpdGU7CisgIGJveC1zaGFkb3c6IDNweCAzcHggNXB4ICM4ODg7Cit9CiAuc2VhcmNoUGFuZWwgewogICB3aGl0ZS1zcGFjZTogbm93cmFwOworICBkaXNwbGF5OiBpbmxpbmU7CiB9CiAuc2VhcmNoUGFuZWwgLmd3dC1UZXh0Qm94IHsKLSAgZm9udC1zaXplOiA3cHQ7CisgIGZvbnQtc2l6ZTogOXB0OwogfQogLnNlYXJjaFBhbmVsIC5nd3QtQnV0dG9uIHsKLSAgZm9udC1zaXplOiA3cHQ7CisgIGZvbnQtc2l6ZTogOXB0OwogICBtYXJnaW4tbGVmdDogMnB4OwotICBwYWRkaW5nOiAxcHg7CisgIHBhZGRpbmc6IDNweCA2cHg7CiB9CiAKIC8qKiBSUEMgU3RhdHVzICoqLwpAQCAtMzIzLDYgKzM0Nyw3IEBACiB9CiAKIC5ycGNTdGF0dXMgeworICBwb3NpdGlvbjogZml4ZWQ7CiAgIHBhZGRpbmctdG9wOiA0cHg7CiAgIHBhZGRpbmctYm90dG9tOiA0cHg7CiAgIHBhZGRpbmctbGVmdDogMTBweDsKQEAgLTQ4OSw2ICs1MTQsMTIgQEAKICAgcGFkZGluZy1yaWdodDogNXB4OwogICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB0cmltQ29sb3I7CiAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmltQ29sb3I7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgIGhlaWdodDogMjBweDsKK30KKworLmNoYW5nZVRhYmxlIGEuZ3d0LUlubGluZUh5cGVybGluayB7CisgIGNvbG9yOiAjMjIyICFpbXBvcnRhbnQ7CiB9CiAKIC5hY2NvdW50RGFzaGJvYXJkLmNoYW5nZVRhYmxlIHRyIHsKQEAgLTUxMCwyMCArNTQxLDEzIEBACiAgIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yICFpbXBvcnRhbnQ7CiB9CiAKLS5jaGFuZ2VUYWJsZSAuY0lEIHsKLSAgd2lkdGg6IDMuNWVtOwotfQotLmNoYW5nZVRhYmxlIC5kYXRhQ2VsbC5jSUQgewotICBmb250LWZhbWlseTogbW9uby1mb250OwotfQotCiAuY2hhbmdlVGFibGUgLmNTVUJKRUNUIGRpdiB7CiAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICBvdmVyZmxvdzogaGlkZGVuOwogICB3aGl0ZS1zcGFjZTogbm93cmFwOwogfQogCi0uY2hhbmdlVGFibGUgLmNQUk9KRUNUIHsKKy5jaGFuZ2VUYWJsZSAuY09XTkVSIHsKICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKIH0KIApAQCAtNjAxLDYgKzYyNSwxMSBAQAogICBtYXJnaW4tcmlnaHQ6IDFlbTsKIH0KIAorLnJldmlld2VkUGFuZWxCb3R0b20geworICBmbG9hdDogcmlnaHQ7CisgIGZvbnQtc2l6ZTogc21hbGw7Cit9CisKIAogLyoqIFBhdGNoQ29udGVudFRhYmxlICoqLwogLnBhdGNoQ29udGVudFRhYmxlIHsKQEAgLTYyNiw2ICs2NTUsMTEgQEAKIC5wYXRjaENvbnRlbnRUYWJsZSAuZGlmZlRleHQgewogICB3aGl0ZS1zcGFjZTogcHJlOwogICBwYWRkaW5nLWxlZnQ6IDAuMmVtOworICBib3JkZXItbGVmdDogdGhpbiBzb2xpZCAjYjBiZGNjOworfQorCisucGF0Y2hDb250ZW50VGFibGUgLmRpZmZUZXh0Rm9yQmluYXJ5SW5TaWRlQnlTaWRlIHsKKyB3aWR0aDogNTAlOwogfQogCiAucGF0Y2hDb250ZW50VGFibGUgLmRpZmZUZXh0RmlsZUhlYWRlciB7CkBAIC02NTUsMTMgKzY4OSwxOCBAQAogLnBhdGNoQ29udGVudFRhYmxlIHRyLmNvbW1lbnRIb2xkZXIgLmljb25DZWxsIHsKICAgYmFja2dyb3VuZDogd2hpdGU7CiB9CisucGF0Y2hDb250ZW50VGFibGUgdHIuY29tbWVudEhvbGRlciAuaWNvbkNlbGxPZkZpbGVDb21tZW50Um93IHsKKyAgYmFja2dyb3VuZDogdHJpbUNvbG9yOworfQogLnBhdGNoQ29udGVudFRhYmxlIHRkLmNvbW1lbnRIb2xkZXIgewogICBwYWRkaW5nLWxlZnQ6IDA7CiAgIHBhZGRpbmctcmlnaHQ6IDA7CiAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKLSAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgYmxhY2s7CiB9CisucGF0Y2hDb250ZW50VGFibGUgdGQuY29tbWVudEhvbGRlckxlZnRtb3N0IHsKKyAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKK30KIC5wYXRjaENvbnRlbnRUYWJsZSB0ZC5jb21tZW50SG9sZGVyLmNvbW1lbnRQYW5lbExhc3QgewogICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiB9CkBAIC02ODQsOCArNzIzLDggQEAKIC5saW5lTnVtYmVyIHsKICAgcGFkZGluZy1sZWZ0OiAwLjJlbTsKICAgd2hpdGUtc3BhY2U6IHByZTsKLSAgd2lkdGg6IDMuNWVtOwotICB0ZXh0LWFsaWduOiByaWdodDsKKyAgd2lkdGg6IDEuNWVtOworICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgIHBhZGRpbmctcmlnaHQ6IDAuMmVtOwogICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHdoaXRlOwpAQCAtNjkzLDYgKzczMiw5IEBACiAubGluZU51bWJlci5yaWdodG1vc3QgewogICBib3JkZXItbGVmdDogdGhpbiBzb2xpZCAjYjBiZGNjOwogfQorLmxpbmVOdW1iZXIucmlnaHRCb3JkZXIgeworICBib3JkZXItcmlnaHQ6IHRoaW4gc29saWQgI2IwYmRjYzsKK30KIC5saW5lTnVtYmVyIGEgewogICBjb2xvcjogIzg4ODsKICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwpAQCAtNzAzLDYgKzc0NSw5IEBACiAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICB0ZXh0LWFsaWduOiBjZW50ZXI7CiB9CisucGF0Y2hDb250ZW50VGFibGUgdGQuZmlsZUNvbHVtbkhlYWRlci51bmlmaWVkVGFibGVIZWFkZXIgeworICB0ZXh0LWFsaWduOiBsZWZ0OworfQogLmxpbmVOdW1iZXIuZmlsZUNvbHVtbkhlYWRlciB7CiAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0cmltQ29sb3I7CiB9CkBAIC03NzAsNiArODE1LDExIEBACiAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogfQogCisucGF0Y2hDb250ZW50VGFibGUgdGQuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCB7CisgIGJhY2tncm91bmQ6IHRyaW1Db2xvcjsKKyAgYm9yZGVyLXRvcDogdHJpbUNvbG9yOworICBib3JkZXItYm90dG9tOiB0cmltQ29sb3I7Cit9CiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAuaWNvbkNlbGwsCiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAubGluZU51bWJlciB7CiAgIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yOwpAQCAtNzc4LDEzICs4MjgsMjIgQEAKIC5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC5saW5lTnVtYmVyLAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLmZpbGVMaW5lLAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLmRpZmZUZXh0LAorLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgdGQuY29tbWVudEhvbGRlciwKIC5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC53ZGMsCiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAud2RkLAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLndkaSwKKy5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC5pY29uQ2VsbE9mRmlsZUNvbW1lbnRSb3csCiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyB0ZC5jb21tZW50SG9sZGVyLmNvbW1lbnRQYW5lbExhc3QgIHsKICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsdWU7CiB9CiAKKy5wYXRjaENvbnRlbnRUYWJsZSAuZmlsZUNvbW1lbnRCb3JkZXIgLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdywKKy5wYXRjaENvbnRlbnRUYWJsZSAuZmlsZUNvbW1lbnRCb3JkZXIgLmxpbmVOdW1iZXIsCisucGF0Y2hDb250ZW50VGFibGUgLmZpbGVDb21tZW50Qm9yZGVyIC5kaWZmVGV4dCB7CisgIGhlaWdodDogMjBweDsKKyAgYmFja2dyb3VuZDogdHJpbUNvbG9yOworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJpbUNvbG9yOworfQogCiAvKiogQ2hhbmdlICoqLwogLmNoYW5nZVNjcmVlblN0YXJJY29uIHsKQEAgLTgyMSwxMCArODgwLDExIEBACiAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogfQogCi0uY2hhbmdlU2NyZWVuRGVzY3JpcHRpb24geworLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uLAorLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uIHRleHRhcmVhIHsKICAgd2hpdGUtc3BhY2U6IHByZTsKICAgZm9udC1mYW1pbHk6IG1vbm8tZm9udDsKLSAgZm9udC1zaXplOiA4cHQ7CisgIGZvbnQtc2l6ZTogOXB0OwogfQogLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uIHAgewogICBtYXJnaW4tdG9wOiAwcHg7CkBAIC04NjEsNiArOTIxLDE0IEBACiAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHRyaW1Db2xvcjsKIH0KIAorLnNpZGVCeVNpZGVUYWJsZUJpbmFyeUhlYWRlciB7CisgIGJvcmRlci1yaWdodDogdGhpbiBzb2xpZCAjYjBiZGNjOworICBib3JkZXItbGVmdDogIHRoaW4gc29saWQgI2IwYmRjYzsKKyAgd2lkdGg6IDEwMCU7CisgIGNvbG9yOiBncmV5OworICBmb250LXdlaWdodDogYm9sZDsKK30KKwogLmluZm9UYWJsZSB0ZC5hcHByb3ZhbHJvbGUgewogICB3aWR0aDogNWVtOwogICBib3JkZXItbGVmdDogbm9uZTsKQEAgLTg3MSw2ICs5MzksOSBAQAogLmluZm9UYWJsZSB0ZC5hcHByb3ZhbHNjb3JlIHsKICAgdGV4dC1hbGlnbjogY2VudGVyOwogfQorLmluZm9UYWJsZSB0ZC5ub3RWb3RhYmxlIHsKKyAgYmFja2dyb3VuZDogI0Y1RjVGNTsKK30KIC5pbmZvVGFibGUgdGQubmVnc2NvcmUgewogICBjb2xvcjogcmVkOwogfQpAQCAtODg4LDYgKzk1OSwxNCBAQAogICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiB9CiAKKy5jaGFuZ2VJbmZvVG9waWNQYW5lbCBpbWcgeworICBmbG9hdDogcmlnaHQ7Cit9CisKKy5jaGFuZ2VJbmZvVG9waWNQYW5lbCBhIHsKKyAgZmxvYXQ6IGxlZnQ7Cit9CisKIC5pbmZvQmxvY2sgewogICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICBib3JkZXItc3BhY2luZzogMDsKQEAgLTkwMSw2ICs5ODAsMTEgQEAKICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKIH0KIAorLmluZm9CbG9jayB0ZCB0ZCB7CisgIHBhZGRpbmctbGVmdDogMHB4OworICBib3JkZXItcmlnaHQ6IDBweDsKK30KKwogLmluZm9CbG9jayB0ZC50b3Btb3N0IHsKICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHRyaW1Db2xvcjsKIH0KQEAgLTEwNDQsNiArMTEyOCwxMyBAQAogICBwYWRkaW5nLWxlZnQ6IDBweDsKIH0KIAorLyoqIFVuaWZpZWRTY3JlZW4gKiovCisudW5pZmllZFRhYmxlIHsKKyAgd2lkdGg6IDEwMCU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNCMEJEQ0M7CisgIGRpc3BsYXk6IHRhYmxlOworfQorCiAvKiogU2lkZUJ5U2lkZVNjcmVlbiAqKi8KIC5zaWRlQnlTaWRlU2NyZWVuU2lkZUJ5U2lkZVRhYmxlIHsKICAgd2lkdGg6IDEwMCU7CkBAIC0xMDY4LDYgKzExNTksOCBAQAogICBtYXJnaW4tbGVmdDogMWVtOwogICBtYXJnaW4tcmlnaHQ6IDVlbTsKICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgIGZvbnQtc2l6ZTogbWVkaXVtOworICBmb250LWZhbWlseTogQXJpYWwgVW5pY29kZTsKIH0KIAogLyoqIFBhdGNoIEhpc3RvcnkgVGFibGUgKiovCkBAIC0xMTQzLDEyICsxMjM2LDI3IEBACiAgIGNvbG9yOiBncmV5OwogfQogCisuYWRkQnJhbmNoIHsKKyAgbWFyZ2luLXRvcDogMTBweDsKKyAgYmFja2dyb3VuZC1jb2xvcjogdHJpbUNvbG9yOworICBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7Cit9CisKIC5hZGRTc2hLZXlQYW5lbCB7CiAgIG1hcmdpbi10b3A6IDEwcHg7CiAgIGJhY2tncm91bmQtY29sb3I6IHRyaW1Db2xvcjsKICAgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OwogfQogCisuYWRkU3NoS2V5UGFuZWwgb2wgeworICBtYXJnaW4tdG9wOiAwcHg7CisgIG1hcmdpbi1ib3R0b206IDVweDsKK30KKworLmFkZFNzaEtleVBhbmVsIHRkIHsKKyAgd2lkdGg6IDEwMCU7Cit9CisKIC5jcmVhdGVHcm91cExpbmsgewogICBtYXJnaW4tYm90dG9tOiAxMHB4OwogfQpAQCAtMTIzOCwxMCArMTM0NiwxMCBAQAogICB3aWR0aDogNDVlbTsKIH0KIAotLnByb2plY3RBZG1pbkFwcHJvdmFsQ2F0ZWdvcnlSYW5nZUxpbmUgeworLnByb2plY3RBZG1pbkxhYmVsUmFuZ2VMaW5lIHsKICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKIH0KLS5wcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5VmFsdWUgeworLnByb2plY3RBZG1pbkxhYmVsVmFsdWUgewogICBmb250LWZhbWlseTogbW9uby1mb250OwogICBmb250LXNpemU6IHNtYWxsOwogfQpAQCAtMTI1Myw3ICsxMzYxLDcgQEAKICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9Ci0ucHVibGlzaENvbW1lbnRzU2NyZWVuIC5hcHByb3ZhbENhdGVnb3J5TGlzdCB7CisucHVibGlzaENvbW1lbnRzU2NyZWVuIC5sYWJlbExpc3QgewogICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICBtYXJnaW4tbGVmdDogMTBweDsKICAgYmFja2dyb3VuZDogdHJpbUNvbG9yOwpAQCAtMTI2OSw3ICsxMzc3LDcgQEAKIC5wdWJsaXNoQ29tbWVudHNTY3JlZW4gLmNvdmVyTWVzc2FnZSB0ZXh0YXJlYSB7CiAgIGZvbnQtc2l6ZTogc21hbGw7CiB9Ci0ucHVibGlzaENvbW1lbnRzU2NyZWVuIC5hcHByb3ZhbENhdGVnb3J5TGlzdCAuZ3d0LVJhZGlvQnV0dG9uIHsKKy5wdWJsaXNoQ29tbWVudHNTY3JlZW4gLmxhYmVsTGlzdCAuZ3d0LVJhZGlvQnV0dG9uIHsKICAgZm9udC1zaXplOiBzbWFsbGVyOwogfQogLnB1Ymxpc2hDb21tZW50c1NjcmVlbiAucGF0Y2hDb21tZW50cyB7CkBAIC0xMzU3LDkgKzE0NjUsNiBAQAogLmdyb3VwT3duZXJUZXh0Qm94IHsKICAgbWFyZ2luLWJvdHRvbTogMnB4OwogfQotLmdyb3VwVHlwZVBhbmVsIHsKLSAgbWFyZ2luLWJvdHRvbTogM3B4OwotfQogLmdyb3VwVHlwZVNlbGVjdExpc3RCb3ggewogICBtYXJnaW4tYm90dG9tOiAycHg7CiB9CkBAIC0xMzk3LDMgKzE1MDIsMTQgQEAKIC8qKiBQbHVnaW5MaXN0U2NyZWVuICoqLwogLnBsdWdpbnNUYWJsZSB7CiB9CisKKy8qKiBQcm9qZWN0TGlzdFNjcmVlbiAqKi8KKy5wcm9qZWN0RmlsdGVyUGFuZWwgeworICBtYXJnaW4tYm90dG9tOiAxMHB4OworfQorLnByb2plY3RGaWx0ZXJQYW5lbCBpbnB1dCB7CisgIHdpZHRoOiAyMDBweDsKK30KKy5wcm9qZWN0RmlsdGVyTGFiZWwgeworICBtYXJnaW4tcmlnaHQ6IDVweDsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBBcGkuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBBcGkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE3OGYyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cEFwaS5qYXZhCkBAIC0wLDAgKzEsMjYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3VwczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBzdGF0aWMgbWV0aG9kcyB3aGljaCB3b3JrIG9uIHRoZSBHZXJyaXQgUkVTVCBBUEkgZm9yIHNwZWNpZmljCisgKiBncm91cHMuCisgKi8KK3B1YmxpYyBjbGFzcyBHcm91cEFwaSB7CisgIC8qKiBDcmVhdGUgYSBuZXcgZ3JvdXAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUdyb3VwKFN0cmluZyBncm91cE5hbWUsIEFzeW5jQ2FsbGJhY2s8R3JvdXBJbmZvPiBjYikgeworICAgIEphdmFTY3JpcHRPYmplY3QgaW4gPSBKYXZhU2NyaXB0T2JqZWN0LmNyZWF0ZU9iamVjdCgpOworICAgIG5ldyBSZXN0QXBpKCIvZ3JvdXBzLyIpLmlkKGdyb3VwTmFtZSkuaWZOb25lTWF0Y2goKS5wdXQoaW4sIGNiKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRHcm91cERldGFpbChTdHJpbmcgZ3JvdXAsIEFzeW5jQ2FsbGJhY2s8R3JvdXBJbmZvPiBjYikgeworICAgIGdyb3VwKGdyb3VwKS52aWV3KCJkZXRhaWwiKS5nZXQoY2IpOworICB9CisKKyAgLyoqIEdldCB0aGUgbmFtZSBvZiBhIGdyb3VwICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRHcm91cE5hbWUoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsCisgICAgICBBc3luY0NhbGxiYWNrPE5hdGl2ZVN0cmluZz4gY2IpIHsKKyAgICBncm91cChncm91cCkudmlldygibmFtZSIpLmdldChjYik7CisgIH0KKworICAvKiogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBvd25lciBvZiBhIGdyb3VwICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpc0dyb3VwT3duZXIoU3RyaW5nIGdyb3VwTmFtZSwgZmluYWwgQXN5bmNDYWxsYmFjazxCb29sZWFuPiBjYikgeworICAgIEdyb3VwTWFwLm15T3duZWQoZ3JvdXBOYW1lLCBuZXcgQXN5bmNDYWxsYmFjazxHcm91cE1hcD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cE1hcCByZXN1bHQpIHsKKyAgICAgICAgY2Iub25TdWNjZXNzKCFyZXN1bHQuaXNFbXB0eSgpKTsKKyAgICAgIH0KKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgY2Iub25GYWlsdXJlKGNhdWdodCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICAvKiogUmVuYW1lIGEgZ3JvdXAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlbmFtZUdyb3VwKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU3RyaW5nIG5ld05hbWUsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2IpIHsKKyAgICBHcm91cElucHV0IGluID0gR3JvdXBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbi5uYW1lKG5ld05hbWUpOworICAgIGdyb3VwKGdyb3VwKS52aWV3KCJuYW1lIikucHV0KGluLCBjYik7CisgIH0KKworICAvKiogU2V0IGRlc2NyaXB0aW9uIGZvciBhIGdyb3VwICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRHcm91cERlc2NyaXB0aW9uKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNiKSB7CisgICAgUmVzdEFwaSBjYWxsID0gZ3JvdXAoZ3JvdXApLnZpZXcoImRlc2NyaXB0aW9uIik7CisgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKSkgeworICAgICAgR3JvdXBJbnB1dCBpbiA9IEdyb3VwSW5wdXQuY3JlYXRlKCk7CisgICAgICBpbi5kZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7CisgICAgICBjYWxsLnB1dChpbiwgY2IpOworICAgIH0gZWxzZSB7CisgICAgICBjYWxsLmRlbGV0ZShjYik7CisgICAgfQorICB9CisKKyAgLyoqIFNldCBvd25lciBmb3IgYSBncm91cCAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3JvdXBPd25lcihBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFN0cmluZyBvd25lciwgQXN5bmNDYWxsYmFjazxHcm91cEluZm8+IGNiKSB7CisgICAgR3JvdXBJbnB1dCBpbiA9IEdyb3VwSW5wdXQuY3JlYXRlKCk7CisgICAgaW4ub3duZXIob3duZXIpOworICAgIGdyb3VwKGdyb3VwKS52aWV3KCJvd25lciIpLnB1dChpbiwgY2IpOworICB9CisKKyAgLyoqIFNldCB0aGUgb3B0aW9ucyBmb3IgYSBncm91cCAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3JvdXBPcHRpb25zKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgYm9vbGVhbiBpc1Zpc2libGVUb0FsbCwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYikgeworICAgIEdyb3VwT3B0aW9uc0lucHV0IGluID0gR3JvdXBPcHRpb25zSW5wdXQuY3JlYXRlKCk7CisgICAgaW4udmlzaWJsZVRvQWxsKGlzVmlzaWJsZVRvQWxsKTsKKyAgICBncm91cChncm91cCkudmlldygib3B0aW9ucyIpLnB1dChpbiwgY2IpOworICB9CisKKyAgLyoqIEFkZCBtZW1iZXIgdG8gYSBncm91cC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lbWJlcihBY2NvdW50R3JvdXAuVVVJRCBncm91cCwgU3RyaW5nIG1lbWJlciwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8QWNjb3VudEluZm8+IGNiKSB7CisgICAgbWVtYmVycyhncm91cCkuaWQobWVtYmVyKS5wdXQoY2IpOworICB9CisKKyAgLyoqIEFkZCBtZW1iZXJzIHRvIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZW1iZXJzKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU2V0PFN0cmluZz4gbWVtYmVycywKKyAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8SnNBcnJheTxBY2NvdW50SW5mbz4+IGNiKSB7CisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKKyAgICAgIGFkZE1lbWJlcihncm91cCwKKyAgICAgICAgICBtZW1iZXJzLml0ZXJhdG9yKCkubmV4dCgpLAorICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPEFjY291bnRJbmZvPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEFjY291bnRJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgICBjYi5vblN1Y2Nlc3MoTmF0aXZlcy5hcnJheU9mKHJlc3VsdCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgICAgIGNiLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICBNZW1iZXJJbnB1dCBpbnB1dCA9IE1lbWJlcklucHV0LmNyZWF0ZSgpOworICAgICAgZm9yIChTdHJpbmcgbWVtYmVyIDogbWVtYmVycykgeworICAgICAgICBpbnB1dC5hZGRfbWVtYmVyKG1lbWJlcik7CisgICAgICB9CisgICAgICBtZW1iZXJzKGdyb3VwKS5wb3N0KGlucHV0LCBjYik7CisgICAgfQorICB9CisKKyAgLyoqIFJlbW92ZSBtZW1iZXJzIGZyb20gYSBncm91cC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lbWJlcnMoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsCisgICAgICBTZXQ8SW50ZWdlcj4gaWRzLCBmaW5hbCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNiKSB7CisgICAgaWYgKGlkcy5zaXplKCkgPT0gMSkgeworICAgICAgbWVtYmVycyhncm91cCkuaWQoaWRzLml0ZXJhdG9yKCkubmV4dCgpLnRvU3RyaW5nKCkpLmRlbGV0ZShjYik7CisgICAgfSBlbHNlIHsKKyAgICAgIE1lbWJlcklucHV0IGluID0gTWVtYmVySW5wdXQuY3JlYXRlKCk7CisgICAgICBmb3IgKEludGVnZXIgaWQgOiBpZHMpIHsKKyAgICAgICAgaW4uYWRkX21lbWJlcihpZC50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGdyb3VwKGdyb3VwKS52aWV3KCJtZW1iZXJzLmRlbGV0ZSIpLnBvc3QoaW4sIGNiKTsKKyAgICB9CisgIH0KKworICAvKiogSW5jbHVkZSBhIGdyb3VwIGludG8gYSBncm91cC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEluY2x1ZGVkR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsIFN0cmluZyBpbmNsdWRlLAorICAgICAgQXN5bmNDYWxsYmFjazxHcm91cEluZm8+IGNiKSB7CisgICAgZ3JvdXBzKGdyb3VwKS5pZChpbmNsdWRlKS5wdXQoY2IpOworICB9CisKKyAgLyoqIEluY2x1ZGUgZ3JvdXBzIGludG8gYSBncm91cC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEluY2x1ZGVkR3JvdXBzKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU2V0PFN0cmluZz4gaW5jbHVkZWRHcm91cHMsCisgICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPEpzQXJyYXk8R3JvdXBJbmZvPj4gY2IpIHsKKyAgICBpZiAoaW5jbHVkZWRHcm91cHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIGFkZEluY2x1ZGVkR3JvdXAoZ3JvdXAsCisgICAgICAgICAgaW5jbHVkZWRHcm91cHMuaXRlcmF0b3IoKS5uZXh0KCksCisgICAgICAgICAgbmV3IEFzeW5jQ2FsbGJhY2s8R3JvdXBJbmZvPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEdyb3VwSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgY2Iub25TdWNjZXNzKE5hdGl2ZXMuYXJyYXlPZihyZXN1bHQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICBjYi5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgSW5jbHVkZWRHcm91cElucHV0IGlucHV0ID0gSW5jbHVkZWRHcm91cElucHV0LmNyZWF0ZSgpOworICAgICAgZm9yIChTdHJpbmcgaW5jbHVkZWRHcm91cCA6IGluY2x1ZGVkR3JvdXBzKSB7CisgICAgICAgIGlucHV0LmFkZF9ncm91cChpbmNsdWRlZEdyb3VwKTsKKyAgICAgIH0KKyAgICAgIGdyb3Vwcyhncm91cCkucG9zdChpbnB1dCwgY2IpOworICAgIH0KKyAgfQorCisgIC8qKiBSZW1vdmUgaW5jbHVkZWQgZ3JvdXBzIGZyb20gYSBncm91cC4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUluY2x1ZGVkR3JvdXBzKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2IpIHsKKyAgICBpZiAoaWRzLnNpemUoKSA9PSAxKSB7CisgICAgICBBY2NvdW50R3JvdXAuVVVJRCBnID0gaWRzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgZ3JvdXBzKGdyb3VwKS5pZChnLmdldCgpKS5kZWxldGUoY2IpOworICAgIH0gZWxzZSB7CisgICAgICBJbmNsdWRlZEdyb3VwSW5wdXQgaW4gPSBJbmNsdWRlZEdyb3VwSW5wdXQuY3JlYXRlKCk7CisgICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGcgOiBpZHMpIHsKKyAgICAgICAgaW4uYWRkX2dyb3VwKGcuZ2V0KCkpOworICAgICAgfQorICAgICAgZ3JvdXAoZ3JvdXApLnZpZXcoImdyb3Vwcy5kZWxldGUiKS5wb3N0KGluLCBjYik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBtZW1iZXJzKEFjY291bnRHcm91cC5VVUlEIGdyb3VwKSB7CisgICAgcmV0dXJuIGdyb3VwKGdyb3VwKS52aWV3KCJtZW1iZXJzIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIGdyb3VwcyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCkgeworICAgIHJldHVybiBncm91cChncm91cCkudmlldygiZ3JvdXBzIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIGdyb3VwKEFjY291bnRHcm91cC5VVUlEIGdyb3VwKSB7CisgICAgcmV0dXJuIGdyb3VwKGdyb3VwLmdldCgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgZ3JvdXAoU3RyaW5nIGdyb3VwKSB7CisgICAgcmV0dXJuIG5ldyBSZXN0QXBpKCIvZ3JvdXBzLyIpLmlkKGdyb3VwKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwSW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBkZXNjcmlwdGlvbihTdHJpbmcgZCkgLyoteyBpZihkKXRoaXMuZGVzY3JpcHRpb249ZDsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBuYW1lKFN0cmluZyBuKSAvKi17IGlmKG4pdGhpcy5uYW1lPW47IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgb3duZXIoU3RyaW5nIG8pIC8qLXsgaWYobyl0aGlzLm93bmVyPW87IH0tKi87CisKKyAgICBzdGF0aWMgR3JvdXBJbnB1dCBjcmVhdGUoKSB7CisgICAgICByZXR1cm4gKEdyb3VwSW5wdXQpIGNyZWF0ZU9iamVjdCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBHcm91cElucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwT3B0aW9uc0lucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgdmlzaWJsZVRvQWxsKGJvb2xlYW4gdikgLyoteyBpZih2KXRoaXMudmlzaWJsZV90b19hbGw9djsgfS0qLzsKKworICAgIHN0YXRpYyBHcm91cE9wdGlvbnNJbnB1dCBjcmVhdGUoKSB7CisgICAgICByZXR1cm4gKEdyb3VwT3B0aW9uc0lucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgR3JvdXBPcHRpb25zSW5wdXQoKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVtYmVySW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBpbml0KCkgLyoteyB0aGlzLm1lbWJlcnMgPSBbXTsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBhZGRfbWVtYmVyKFN0cmluZyBuKSAvKi17IHRoaXMubWVtYmVycy5wdXNoKG4pOyB9LSovOworCisgICAgc3RhdGljIE1lbWJlcklucHV0IGNyZWF0ZSgpIHsKKyAgICAgIE1lbWJlcklucHV0IG0gPSAoTWVtYmVySW5wdXQpIGNyZWF0ZU9iamVjdCgpOworICAgICAgbS5pbml0KCk7CisgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTWVtYmVySW5wdXQoKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5jbHVkZWRHcm91cElucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgaW5pdCgpIC8qLXsgdGhpcy5ncm91cHMgPSBbXTsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBhZGRfZ3JvdXAoU3RyaW5nIG4pIC8qLXsgdGhpcy5ncm91cHMucHVzaChuKTsgfS0qLzsKKworICAgIHN0YXRpYyBJbmNsdWRlZEdyb3VwSW5wdXQgY3JlYXRlKCkgeworICAgICAgSW5jbHVkZWRHcm91cElucHV0IGcgPSAoSW5jbHVkZWRHcm91cElucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICAgIGcuaW5pdCgpOworICAgICAgcmV0dXJuIGc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEluY2x1ZGVkR3JvdXBJbnB1dCgpIHsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGFiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwSW5mby5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuVVJMOworCitwdWJsaWMgY2xhc3MgR3JvdXBJbmZvIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHB1YmxpYyBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ2V0R3JvdXBJZCgpIHsKKyAgICByZXR1cm4gbmV3IEFjY291bnRHcm91cC5JZChncm91cF9pZCgpKTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBnZXRHcm91cFVVSUQoKSB7CisgICAgcmV0dXJuIG5ldyBBY2NvdW50R3JvdXAuVVVJRChVUkwuZGVjb2RlUGF0aFNlZ21lbnQoaWQoKSkpOworICB9CisKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgaWQoKSAvKi17IHJldHVybiB0aGlzLmlkOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBuYW1lKCkgLyoteyByZXR1cm4gdGhpcy5uYW1lOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIEdyb3VwT3B0aW9uc0luZm8gb3B0aW9ucygpIC8qLXsgcmV0dXJuIHRoaXMub3B0aW9uczsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgZGVzY3JpcHRpb24oKSAvKi17IHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyB1cmwoKSAvKi17IHJldHVybiB0aGlzLnVybDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgb3duZXIoKSAvKi17IHJldHVybiB0aGlzLm93bmVyOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIHZvaWQgb3duZXIoU3RyaW5nIG8pIC8qLXsgaWYobyl0aGlzLm93bmVyPW87IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgSnNBcnJheTxBY2NvdW50SW5mbz4gbWVtYmVycygpIC8qLXsgcmV0dXJuIHRoaXMubWVtYmVyczsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBKc0FycmF5PEdyb3VwSW5mbz4gaW5jbHVkZXMoKSAvKi17IHJldHVybiB0aGlzLmluY2x1ZGVzOyB9LSovOworCisgIHByaXZhdGUgZmluYWwgbmF0aXZlIGludCBncm91cF9pZCgpIC8qLXsgcmV0dXJuIHRoaXMuZ3JvdXBfaWQ7IH0tKi87CisgIHByaXZhdGUgZmluYWwgbmF0aXZlIFN0cmluZyBvd25lcl9pZCgpIC8qLXsgcmV0dXJuIHRoaXMub3duZXJfaWQ7IH0tKi87CisgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgb3duZXJfaWQoU3RyaW5nIG8pIC8qLXsgaWYobyl0aGlzLm93bmVyX2lkPW87IH0tKi87CisKKyAgcHVibGljIGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGdldE93bmVyVVVJRCgpIHsKKyAgICBTdHJpbmcgb3duZXIgPSBvd25lcl9pZCgpOworICAgIGlmIChvd25lciAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBuZXcgQWNjb3VudEdyb3VwLlVVSUQoVVJMLmRlY29kZVBhdGhTZWdtZW50KG93bmVyKSk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIGZpbmFsIHZvaWQgc2V0T3duZXJVVUlEKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICBvd25lcl9pZChVUkwuZW5jb2RlUGF0aFNlZ21lbnQodXVpZC5nZXQoKSkpOworICB9CisKKyAgcHJvdGVjdGVkIEdyb3VwSW5mbygpIHsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBPcHRpb25zSW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBpc1Zpc2libGVUb0FsbCgpIC8qLXsgcmV0dXJuIHRoaXNbJ3Zpc2libGVfdG9fYWxsJ10gPyB0cnVlIDogZmFsc2U7IH0tKi87CisKKyAgICBwcm90ZWN0ZWQgR3JvdXBPcHRpb25zSW5mbygpIHsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBMaXN0LmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTVlNTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwTGlzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKKworLyoqIEdyb3VwcyBhdmFpbGFibGUgZnJvbSB7QGNvZGUgL2dyb3Vwcy99IG9yIHtAY29kZSAvYWNjb3VudHMve2lkfS9ncm91cHN9LiAqLworcHVibGljIGNsYXNzIEdyb3VwTGlzdCBleHRlbmRzIEpzQXJyYXk8R3JvdXBJbmZvPiB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBteShBc3luY0NhbGxiYWNrPEdyb3VwTGlzdD4gY2FsbGJhY2spIHsKKyAgICBuZXcgUmVzdEFwaSgiL2FjY291bnRzL3NlbGYvZ3JvdXBzIikuZ2V0KGNhbGxiYWNrKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbmNsdWRlZChBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8R3JvdXBMaXN0PiBjYWxsYmFjaykgeworICAgIG5ldyBSZXN0QXBpKCIvZ3JvdXBzLyIpLmlkKGdyb3VwLmdldCgpKS52aWV3KCJncm91cHMiKS5nZXQoY2FsbGJhY2spOworICB9CisKKyAgcHJvdGVjdGVkIEdyb3VwTGlzdCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cE1hcC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTAwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwTWFwLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKKy8qKiBHcm91cHMgYXZhaWxhYmxlIGZyb20ge0Bjb2RlIC9ncm91cHMvfS4gKi8KK3B1YmxpYyBjbGFzcyBHcm91cE1hcCBleHRlbmRzIE5hdGl2ZU1hcDxHcm91cEluZm8+IHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFsbChBc3luY0NhbGxiYWNrPEdyb3VwTWFwPiBjYWxsYmFjaykgeworICAgIGdyb3VwcygpLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2FsbGJhY2spKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXRjaChTdHJpbmcgbWF0Y2gsIEFzeW5jQ2FsbGJhY2s8R3JvdXBNYXA+IGNiKSB7CisgICAgaWYgKG1hdGNoID09IG51bGwgfHwgIiIuZXF1YWxzKG1hdGNoKSkgeworICAgICAgYWxsKGNiKTsKKyAgICB9IGVsc2UgeworICAgICAgZ3JvdXBzKCkuYWRkUGFyYW1ldGVyKCJtIiwgbWF0Y2gpLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2IpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbXlPd25lZChBc3luY0NhbGxiYWNrPEdyb3VwTWFwPiBjYikgeworICAgIG15T3duZWRHcm91cHMoKS5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbXlPd25lZChTdHJpbmcgZ3JvdXBOYW1lLCBBc3luY0NhbGxiYWNrPEdyb3VwTWFwPiBjYikgeworICAgIG15T3duZWRHcm91cHMoKS5hZGRQYXJhbWV0ZXIoInEiLCBncm91cE5hbWUpLmdldCgKKyAgICAgICAgTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIG15T3duZWRHcm91cHMoKSB7CisgICAgcmV0dXJuIGdyb3VwcygpLmFkZFBhcmFtZXRlclRydWUoIm93bmVkIik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIGdyb3VwcygpIHsKKyAgICByZXR1cm4gbmV3IFJlc3RBcGkoIi9ncm91cHMvIik7CisgIH0KKworICBwcm90ZWN0ZWQgR3JvdXBNYXAoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvTWVtYmVyTGlzdC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9NZW1iZXJMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4OGExZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvTWVtYmVyTGlzdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKKworcHVibGljIGNsYXNzIE1lbWJlckxpc3QgZXh0ZW5kcyBKc0FycmF5PEFjY291bnRJbmZvPiB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbGwoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsCisgICAgICBBc3luY0NhbGxiYWNrPE1lbWJlckxpc3Q+IGNhbGxiYWNrKSB7CisgICAgbmV3IFJlc3RBcGkoIi9ncm91cHMvIikuaWQoZ3JvdXAuZ2V0KCkpLnZpZXcoIm1lbWJlcnMiKS5nZXQoY2FsbGJhY2spOworICB9CisKKyAgcHJvdGVjdGVkIE1lbWJlckxpc3QoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nd3Rfb3ZlcnJpZGUuY3NzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2d3dF9vdmVycmlkZS5jc3MKaW5kZXggZWQwYjMyYy4uZjlhOGNjMCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2d3dF9vdmVycmlkZS5jc3MKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2d3dF9vdmVycmlkZS5jc3MKQEAgLTQyLDYgKzQyLDEyIEBACiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9CiAKKy5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbSwKKy5nd3QtVGFiQmFyIC5nd3QtVGFiQmFyUmVzdCwKKy5nd3QtVGFiUGFuZWxCb3R0b20geworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKwogLmd3dC1UYWJCYXIgewogICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiB9CkBAIC00OSwxNiArNTUsMjAgQEAKICAgZGlzcGxheTogbm9uZTsKIH0KIC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbSB7Ci0gIG1hcmdpbjogMHB4OworICBjb2xvcjogIzM1MzUzNTsKKyAgbWFyZ2luOiAwOwogICBiYWNrZ3JvdW5kOiB0cmltQ29sb3I7CiAgIHBhZGRpbmctdG9wOiAwLjVlbTsKICAgcGFkZGluZy1ib3R0b206IDFweDsKICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgYmxhY2s7CisgIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCB0cmFuc3BhcmVudDsKKyAgYm9yZGVyLXJpZ2h0OiAwOwogfQogLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJJdGVtLXNlbGVjdGVkIHsKKyAgY29sb3I6ICM5OTAwMDA7CiAgIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yOworICBib3JkZXItYm90dG9tLWNvbG9yOiAjOTkwMDAwOwogfQogLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJSZXN0IHsKICAgYmFja2dyb3VuZDogdHJpbUNvbG9yOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5qYXZhCmluZGV4IDI0YTJhZTUuLjhkZTMyNTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0Fic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9BYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy9Db3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTUsMTcgKzE1LDE5IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkRpc3BhdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5QYXRjaFRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OYXZpZ2F0aW9uVGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk5lZWRzU2lnbkluS2V5Q29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbW1lbnREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY2xpZW50LkNsaWVudFNpZGVGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLlByZXR0eUZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wcmV0dGlmeS5jb21tb24uU3BhcnNlRmlsZUNvbnRlbnQ7CkBAIC0zOCw2ICs0MCw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5CbHVySGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Eb3VibGVDbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRG91YmxlQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRm9jdXNFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkZvY3VzSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwpAQCAtNDUsMzMgKzQ5LDQ0IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkhhbmRsZXJSZWdpc3RyYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRE9NOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkVsZW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRm9jdXNhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxUYWJsZS5DZWxsRm9ybWF0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlVJT2JqZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5FZGl0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8T2JqZWN0PgogICAgIGltcGxlbWVudHMgQ29tbWVudEVkaXRvckNvbnRhaW5lciwgRm9jdXNIYW5kbGVyLCBCbHVySGFuZGxlciB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJfSEVBRCA9IDA7CisgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUxFX1NJREVfQSA9IChzaG9ydCkgMDsKKyAgc3RhdGljIGZpbmFsIHNob3J0IEZJTEVfU0lERV9CID0gKHNob3J0KSAxOwogICBwcm90ZWN0ZWQgUGF0Y2hUYWJsZSBmaWxlTGlzdDsKICAgcHJvdGVjdGVkIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudENhY2hlID0gQWNjb3VudEluZm9DYWNoZS5lbXB0eSgpOwogICBwcm90ZWN0ZWQgUGF0Y2guS2V5IHBhdGNoS2V5OwogICBwcm90ZWN0ZWQgUGF0Y2hTZXQuSWQgaWRTaWRlQTsKICAgcHJvdGVjdGVkIFBhdGNoU2V0LklkIGlkU2lkZUI7CiAgIHByb3RlY3RlZCBib29sZWFuIG9ubHlPbmVIdW5rOworICBwcm90ZWN0ZWQgUGF0Y2hTZXRTZWxlY3RCb3ggaGVhZGVyU2lkZUE7CisgIHByb3RlY3RlZCBQYXRjaFNldFNlbGVjdEJveCBoZWFkZXJTaWRlQjsKKyAgcHJvdGVjdGVkIEltYWdlIGljb25BOworICBwcm90ZWN0ZWQgSW1hZ2UgaWNvbkI7CiAKICAgcHJpdmF0ZSBmaW5hbCBLZXlDb21tYW5kU2V0IGtleXNDb21tZW50OwogICBwcml2YXRlIEhhbmRsZXJSZWdpc3RyYXRpb24gcmVnQ29tbWVudDsKICAgcHJpdmF0ZSBmaW5hbCBLZXlDb21tYW5kU2V0IGtleXNPcGVuQnlFbnRlcjsKICAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ09wZW5CeUVudGVyOworICBib29sZWFuIGlzRGlzcGxheUJpbmFyeTsKIAogICBwcm90ZWN0ZWQgQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZSgpIHsKICAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IFByZXZLZXlDb21tYW5kKDAsICdrJywgUGF0Y2hVdGlsLkMubGluZVByZXYoKSkpOwpAQCAtMTA1LDYgKzEyMCw1NyBAQAogICAgIHRhYmxlLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnBhdGNoQ29udGVudFRhYmxlKCkpOwogICB9CiAKKyAgYWJzdHJhY3Qgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUEoKTsKKworICBhYnN0cmFjdCB2b2lkIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQigpOworCisgIGFic3RyYWN0IFBhdGNoU2NyZWVuLlR5cGUgZ2V0UGF0Y2hTY3JlZW5UeXBlKCk7CisKKyAgcHJvdGVjdGVkIHZvaWQgaW5pdEhlYWRlcnMoUGF0Y2hTY3JpcHQgc2NyaXB0LCBQYXRjaFNldERldGFpbCBkZXRhaWwpIHsKKyAgICBQYXRjaFNjcmVlbi5UeXBlIHR5cGUgPSBnZXRQYXRjaFNjcmVlblR5cGUoKTsKKyAgICBoZWFkZXJTaWRlQSA9IG5ldyBQYXRjaFNldFNlbGVjdEJveChQYXRjaFNldFNlbGVjdEJveC5TaWRlLkEsIHR5cGUpOworICAgIGhlYWRlclNpZGVBLmRpc3BsYXkoZGV0YWlsLCBzY3JpcHQsIHBhdGNoS2V5LCBpZFNpZGVBLCBpZFNpZGVCKTsKKyAgICBoZWFkZXJTaWRlQS5hZGREb3VibGVDbGlja0hhbmRsZXIobmV3IERvdWJsZUNsaWNrSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25Eb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChoZWFkZXJTaWRlQS5pc0ZpbGVPckNvbW1pdE1lc3NhZ2UoKSkgeworICAgICAgICAgIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgaGVhZGVyU2lkZUIgPSBuZXcgUGF0Y2hTZXRTZWxlY3RCb3goUGF0Y2hTZXRTZWxlY3RCb3guU2lkZS5CLCB0eXBlKTsKKyAgICBoZWFkZXJTaWRlQi5kaXNwbGF5KGRldGFpbCwgc2NyaXB0LCBwYXRjaEtleSwgaWRTaWRlQSwgaWRTaWRlQik7CisgICAgaGVhZGVyU2lkZUIuYWRkRG91YmxlQ2xpY2tIYW5kbGVyKG5ldyBEb3VibGVDbGlja0hhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaGVhZGVyU2lkZUIuaXNGaWxlT3JDb21taXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUIoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworCisgICAgLy8gUHJlcGFyZSBpY29ucy4KKyAgICBpY29uQSA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmFkZEZpbGVDb21tZW50KCkpOworICAgIGljb25BLnNldFRpdGxlKFBhdGNoVXRpbC5DLmFkZEZpbGVDb21tZW50VG9vbFRpcCgpKTsKKyAgICBpY29uQS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5rKCkpOworICAgIGljb25BLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgY3JlYXRlRmlsZUNvbW1lbnRFZGl0b3JPblNpZGVBKCk7CisgICAgICB9CisgICAgfSk7CisgICAgaWNvbkIgPSBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5hZGRGaWxlQ29tbWVudCgpKTsKKyAgICBpY29uQi5zZXRUaXRsZShQYXRjaFV0aWwuQy5hZGRGaWxlQ29tbWVudFRvb2xUaXAoKSk7CisgICAgaWNvbkIuYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluaygpKTsKKyAgICBpY29uQi5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQigpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG5vdGlmeURyYWZ0RGVsdGEoZmluYWwgaW50IGRlbHRhKSB7CiAgICAgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKICAgICAgIGZpbGVMaXN0Lm5vdGlmeURyYWZ0RGVsdGEocGF0Y2hLZXksIGRlbHRhKTsKQEAgLTEzNyw4ICsyMDMsOCBAQAogICAgICAgICAgICAgcCA9IHAuZ2V0UGFyZW50KCk7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgaWYgKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudEhvbGRlcigpLmVxdWFscygKLSAgICAgICAgICAgICAgdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpLmdldFN0eWxlTmFtZShyb3cgLSAxLCBjZWxsKSkpIHsKKyAgICAgICAgICBpZiAodGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpLmdldFN0eWxlTmFtZShyb3cgLSAxLCBjZWxsKQorICAgICAgICAgICAgICAuY29udGFpbnMoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jb21tZW50SG9sZGVyKCkpKSB7CiAgICAgICAgICAgICB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCkuYWRkU3R5bGVOYW1lKHJvdyAtIDEsIGNlbGwsCiAgICAgICAgICAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jb21tZW50UGFuZWxMYXN0KCkpOwogICAgICAgICAgIH0KQEAgLTE2NywxMiArMjMzLDQ3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBkaXNwbGF5KGZpbmFsIFBhdGNoLktleSBrLCBmaW5hbCBQYXRjaFNldC5JZCBhLAotICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgYiwgZmluYWwgUGF0Y2hTY3JpcHQgcykgeworICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgYiwgZmluYWwgUGF0Y2hTY3JpcHQgcywgZmluYWwgUGF0Y2hTZXREZXRhaWwgZCkgewogICAgIHBhdGNoS2V5ID0gazsKICAgICBpZFNpZGVBID0gYTsKICAgICBpZFNpZGVCID0gYjsKIAotICAgIHJlbmRlcihzKTsKKyAgICByZW5kZXIocywgZCk7CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNEaWZmZXJlbmNlcyhQYXRjaFNjcmlwdCBzY3JpcHQpIHsKKyAgICByZXR1cm4gaGFzRWRpdHMoc2NyaXB0KSB8fCBoYXNNZXRhKHNjcmlwdCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1B1cmVNZXRhQ2hhbmdlKFBhdGNoU2NyaXB0IHNjcmlwdCkgeworICAgIHJldHVybiAhaGFzRWRpdHMoc2NyaXB0KSAmJiBoYXNNZXRhKHNjcmlwdCk7CisgIH0KKworICAvLyBUcnVlIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gcGF0Y2ggc2V0cworICBwcml2YXRlIGJvb2xlYW4gaGFzRWRpdHMoUGF0Y2hTY3JpcHQgc2NyaXB0KSB7CisgICAgZm9yIChFZGl0IGUgOiBzY3JpcHQuZ2V0RWRpdHMoKSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpICE9IEVkaXQuVHlwZS5FTVBUWSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gVHJ1ZSBpZiB0aGlzIGNoYW5nZSBpcyBhIG1vZGUgY2hhbmdlIG9yIGEgcHVyZSByZW5hbWUvY29weQorICBwcml2YXRlIGJvb2xlYW4gaGFzTWV0YShQYXRjaFNjcmlwdCBzY3JpcHQpIHsKKyAgICByZXR1cm4gIXNjcmlwdC5nZXRQYXRjaEhlYWRlcigpLmlzRW1wdHkoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGFwcGVuZE5vRGlmZmVyZW5jZXMoU2FmZUh0bWxCdWlsZGVyIG0pIHsKKyAgICBtLm9wZW5UcigpOworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRBdHRyaWJ1dGUoImNvbHNwYW4iLCA1KTsKKyAgICBtLm9wZW5EaXYoKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnBhdGNoTm9EaWZmZXJlbmNlKCkpOworICAgIG0uYXBwZW5kKFBhdGNoVXRpbC5DLm5vRGlmZmVyZW5jZSgpKTsKKyAgICBtLmNsb3NlRGl2KCk7CisgICAgbS5jbG9zZVRkKCk7CisgICAgbS5jbG9zZVRyKCk7CiAgIH0KIAogICBwcm90ZWN0ZWQgU3BhcnNlSHRtbEZpbGUgZ2V0U3BhcnNlSHRtbEZpbGVBKFBhdGNoU2NyaXB0IHMpIHsKQEAgLTE5MSwzMiArMjkyLDI3IEBACiAgIHByb3RlY3RlZCBTcGFyc2VIdG1sRmlsZSBnZXRTcGFyc2VIdG1sRmlsZUIoUGF0Y2hTY3JpcHQgcykgewogICAgIEFjY291bnREaWZmUHJlZmVyZW5jZSBkcCA9IG5ldyBBY2NvdW50RGlmZlByZWZlcmVuY2Uocy5nZXREaWZmUHJlZnMoKSk7CiAKKyAgICBTcGFyc2VGaWxlQ29udGVudCBiID0gcy5nZXRCKCk7CiAgICAgUHJldHR5Rm9ybWF0dGVyIGYgPSBDbGllbnRTaWRlRm9ybWF0dGVyLkZBQ1RPUlkuZ2V0KCk7CiAgICAgZi5zZXREaWZmUHJlZnMoZHApOwotICAgIGYuc2V0RmlsZU5hbWUocy5nZXRCKCkuZ2V0UGF0aCgpKTsKKyAgICBmLnNldEZpbGVOYW1lKGIuZ2V0UGF0aCgpKTsKICAgICBmLnNldEVkaXRGaWx0ZXIoUHJldHR5Rm9ybWF0dGVyLkIpOwogICAgIGYuc2V0RWRpdExpc3Qocy5nZXRFZGl0cygpKTsKIAotICAgIGlmIChkcC5pc1N5bnRheEhpZ2hsaWdodGluZygpICYmIHMuZ2V0QSgpLmlzV2hvbGVGaWxlKCkgJiYgIXMuZ2V0QigpLmlzV2hvbGVGaWxlKCkpIHsKLSAgICAgIGYuZm9ybWF0KHMuZ2V0QigpLmFwcGx5KHMuZ2V0QSgpLCBzLmdldEVkaXRzKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgZi5mb3JtYXQocy5nZXRCKCkpOworICAgIGlmIChzLmdldEEoKS5pc1dob2xlRmlsZSgpICYmICFiLmlzV2hvbGVGaWxlKCkpIHsKKyAgICAgIGIgPSBiLmFwcGx5KHMuZ2V0QSgpLCBzLmdldEVkaXRzKCkpOwogICAgIH0KKyAgICBmLmZvcm1hdChiKTsKICAgICByZXR1cm4gZjsKICAgfQogCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbmRlcihQYXRjaFNjcmlwdCBzY3JpcHQpOworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXIoUGF0Y2hTY3JpcHQgc2NyaXB0LCBmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwpOwogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uSW5zZXJ0Q29tbWVudChQYXRjaExpbmUgcGwpOwogCiAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRpc3BsYXkoQ29tbWVudERldGFpbCBjb21tZW50cywgYm9vbGVhbiBleHBhbmRDb21tZW50cyk7CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBNeUZsZXhUYWJsZSBjcmVhdGVGbGV4VGFibGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBEb3VibGVDbGlja0ZsZXhUYWJsZSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBPYmplY3QgaXRlbSkgewogICAgIHJldHVybiBudWxsOwogICB9CkBAIC0yNDAsNiArMzM2LDggQEAKICAgICAgICAgY2FzZSBJTlNFUlQ6CiAgICAgICAgIGNhc2UgUkVQTEFDRToKICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBDT05URVhUOgorICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENvbW1lbnRMaXN0KSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM2NSwxMiArNDYzLDYgQEAKICAgICByZXR1cm4gZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgQ29tbWVudExpc3Q7CiAgIH0KIAotICAvKiogSW52b2tlZCB3aGVuIHRoZSB1c2VyIGRvdWJsZSBjbGlja3Mgb24gYSB0YWJsZSBjZWxsLiAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNlbGxEb3VibGVDbGljayhpbnQgcm93LCBpbnQgY29sdW1uKTsKLQotICAvKiogSW52b2tlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIHRhYmxlIGNlbGwuICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uQ2VsbFNpbmdsZUNsaWNrKGludCByb3csIGludCBjb2x1bW4pOwotCiAgIC8qKgogICAgKiBJbnZva2VzIGNyZWF0ZUNvbW1lbnRFZGl0b3IoKSB3aXRoIGFuIGVtcHR5IHN0cmluZyBhcyB2YWx1ZSBmb3IgdGhlIGNvbW1lbnQKICAgICogcGFyZW50IFVVSUQuIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgY2FsbGVycyB0aGF0IHdhbnQgdG8gY3JlYXRlIGFuCkBAIC0zNzksNyArNDcxLDcgQEAKICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29tbWVudEVkaXRvcihmaW5hbCBpbnQgc3VnZ2VzdFJvdywgZmluYWwgaW50IGNvbHVtbiwKICAgICAgIGZpbmFsIGludCBsaW5lLCBmaW5hbCBzaG9ydCBmaWxlKSB7CiAgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKLSAgICAgIGlmICgxIDw9IGxpbmUpIHsKKyAgICAgIGlmIChSX0hFQUQgPD0gbGluZSkgewogICAgICAgICBmaW5hbCBQYXRjaC5LZXkgcGFyZW50S2V5OwogICAgICAgICBmaW5hbCBzaG9ydCBzaWRlOwogICAgICAgICBzd2l0Y2ggKGZpbGUpIHsKQEAgLTQwNiwxNSArNDk4LDIxIEBACiAgICAgICAgIG5ld0NvbW1lbnQuc2V0U2lkZShzaWRlKTsKICAgICAgICAgbmV3Q29tbWVudC5zZXRNZXNzYWdlKCIiKTsKIAotICAgICAgICBjcmVhdGVDb21tZW50RWRpdG9yKHN1Z2dlc3RSb3csIGNvbHVtbiwgbmV3Q29tbWVudCkuc2V0Rm9jdXModHJ1ZSk7CisgICAgICAgIGZpbmRPckNyZWF0ZUNvbW1lbnRFZGl0b3Ioc3VnZ2VzdFJvdywgY29sdW1uLCBuZXdDb21tZW50LCB0cnVlKQorICAgICAgICAgICAgLnNldEZvY3VzKHRydWUpOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBHZXJyaXQuZG9TaWduSW4oSGlzdG9yeS5nZXRUb2tlbigpKTsKICAgICB9CiAgIH0KIAotICBwcml2YXRlIENvbW1lbnRFZGl0b3JQYW5lbCBjcmVhdGVDb21tZW50RWRpdG9yKGZpbmFsIGludCBzdWdnZXN0Um93LAotICAgICAgZmluYWwgaW50IGNvbHVtbiwgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50KSB7CisgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1cnNvcihmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQpIHsKKyAgfQorCisgIGFic3RyYWN0IHZvaWQgaW5zZXJ0RmlsZUNvbW1lbnRSb3coZmluYWwgaW50IHJvdyk7CisKKyAgcHJpdmF0ZSBDb21tZW50RWRpdG9yUGFuZWwgZmluZE9yQ3JlYXRlQ29tbWVudEVkaXRvcihmaW5hbCBpbnQgc3VnZ2VzdFJvdywKKyAgICAgIGZpbmFsIGludCBjb2x1bW4sIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgbmV3Q29tbWVudCwgZmluYWwgYm9vbGVhbiBjcmVhdGUpIHsKICAgICBpbnQgcm93ID0gc3VnZ2VzdFJvdzsKICAgICBpbnQgc3BhbnNbXSA9IG5ldyBpbnRbY29sdW1uICsgMV07CiAgICAgRklORF9ST1c6IHdoaWxlIChyb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpKSB7CkBAIC00MjcsNyArNTI1LDkgQEAKICAgICAgICAgc3BhbnNbY29sXSA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuZ2V0Um93U3Bhbihyb3csIGNlbGwpOwogICAgICAgICBpZiAoY29sID09IGNvbHVtbikgewogICAgICAgICAgIGZpbmFsIFdpZGdldCB3ID0gdGFibGUuZ2V0V2lkZ2V0KHJvdywgY2VsbCk7Ci0gICAgICAgICAgaWYgKHcgaW5zdGFuY2VvZiBDb21tZW50RWRpdG9yUGFuZWwpIHsKKyAgICAgICAgICBpZiAodyBpbnN0YW5jZW9mIENvbW1lbnRFZGl0b3JQYW5lbAorICAgICAgICAgICAgICAmJiAoKENvbW1lbnRFZGl0b3JQYW5lbCkgdykuZ2V0Q29tbWVudCgpLmdldEtleSgpLmdldFBhcmVudEtleSgpCisgICAgICAgICAgICAgICAgICAuZXF1YWxzKG5ld0NvbW1lbnQuZ2V0S2V5KCkuZ2V0UGFyZW50S2V5KCkpKSB7CiAgICAgICAgICAgICAvLyBEb24ndCBpbnNlcnQgdHdvIGVkaXRvcnMgb24gdGhlIHNhbWUgcG9zaXRpb24sIGl0IGRvZXNuJ3QgbWFrZQogICAgICAgICAgICAgLy8gYW55IHNlbnNlIHRvIHRoZSB1c2VyLgogICAgICAgICAgICAgLy8KQEAgLTQ0MSw2ICs1NDEsNyBAQAogICAgICAgICAgICAgICBicmVhayBGSU5EX1JPVzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJvdysrOworICAgICAgICAgICAgY2VsbC0tOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBicmVhayBGSU5EX1JPVzsKICAgICAgICAgICB9CkBAIC00NDgsNyArNTQ5LDcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobmV3Q29tbWVudCA9PSBudWxsKSB7CisgICAgaWYgKG5ld0NvbW1lbnQgPT0gbnVsbCB8fCAhY3JlYXRlKSB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTQ2OSw3ICs1NzAsMTEgQEAKICAgICAgIH0KICAgICB9CiAgICAgaWYgKG5lZWRJbnNlcnQgfHwgIWlzQ29tbWVudFJvdykgewotICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICBpZiAobmV3Q29tbWVudC5nZXRMaW5lKCkgPT0gUl9IRUFEKSB7CisgICAgICAgIGluc2VydEZpbGVDb21tZW50Um93KHJvdyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIH0KICAgICAgIHN0eWxlQ29tbWVudFJvdyhyb3cpOwogICAgIH0KICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2x1bW4sIGVkKTsKQEAgLTUwNyw2ICs2MTIsNyBAQAogICAgICAgfQogICAgIH0KIAorICAgIHVwZGF0ZUN1cnNvcihuZXdDb21tZW50KTsKICAgICByZXR1cm4gZWQ7CiAgIH0KIApAQCAtNTQzLDI0ICs2NDksNDAgQEAKICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlbW92ZVJvdykgewotICAgICAgZm9yIChpbnQgciA9IHJvdyAtIDE7IDAgPD0gcjsgci0tKSB7Ci0gICAgICAgIGJvb2xlYW4gZGF0YSA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHRhYmxlLmdldENlbGxDb3VudChyKTsgYysrKSB7Ci0gICAgICAgICAgZGF0YSB8PSB0YWJsZS5nZXRXaWRnZXQociwgYykgIT0gbnVsbDsKLSAgICAgICAgICBmaW5hbCBpbnQgcyA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuZ2V0Um93U3BhbihyLCBjKSAtIDE7Ci0gICAgICAgICAgaWYgKHIgKyBzID09IHJvdykgewotICAgICAgICAgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5zZXRSb3dTcGFuKHIsIGMsIHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWRhdGEpIHsKLSAgICAgICAgICBicmVhazsKKyAgICAgIGRlc3Ryb3lDb21tZW50Um93KHJvdyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Ryb3lDb21tZW50KHJvdywgY29sLCBzcGFuKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95Q29tbWVudFJvdyhpbnQgcm93KSB7CisgICAgZm9yIChpbnQgciA9IHJvdyAtIDE7IDAgPD0gcjsgci0tKSB7CisgICAgICBib29sZWFuIGRhdGEgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgdGFibGUuZ2V0Q2VsbENvdW50KHIpOyBjKyspIHsKKyAgICAgICAgZGF0YSB8PSB0YWJsZS5nZXRXaWRnZXQociwgYykgIT0gbnVsbDsKKyAgICAgICAgZmluYWwgaW50IHMgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpLmdldFJvd1NwYW4ociwgYykgLSAxOworICAgICAgICBpZiAociArIHMgPT0gcm93KSB7CisgICAgICAgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5zZXRSb3dTcGFuKHIsIGMsIHMpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICB0YWJsZS5yZW1vdmVSb3cocm93KTsKLSAgICB9IGVsc2UgaWYgKHNwYW4gIT0gMSkgeworICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB0YWJsZS5yZW1vdmVSb3cocm93KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkZXN0cm95Q29tbWVudChpbnQgcm93LCBpbnQgY29sLCBpbnQgc3BhbikgeworICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuc2V0U3R5bGVOYW1lKC8vCisgICAgICAgIHJvdywgY29sLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOworCisgICAgaWYgKHNwYW4gIT0gMSkgewogICAgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5zZXRSb3dTcGFuKHJvdywgY29sLCAxKTsKICAgICAgIGZvciAoaW50IHIgPSByb3cgKyAxOyByIDwgcm93ICsgc3BhbjsgcisrKSB7Ci0gICAgICAgIHRhYmxlLmluc2VydENlbGwociwgY29sICsgMSk7CisgICAgICAgIHRhYmxlLmluc2VydENlbGwociwgY29sKTsKKworICAgICAgICB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpLnNldFN0eWxlTmFtZSgvLworICAgICAgICAgICAgciwgY29sLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNTc1LDcgKzY5Nyw3IEBACiAgICAgICBzdHlsZUxhc3RDb21tZW50Q2VsbChyb3csIGNvbCk7CiAKICAgICB9IGVsc2UgewotICAgICAgZmluYWwgQWNjb3VudEluZm8gYXV0aG9yID0gYWNjb3VudENhY2hlLmdldChsaW5lLmdldEF1dGhvcigpKTsKKyAgICAgIGZpbmFsIEFjY291bnRJbmZvIGF1dGhvciA9IEZvcm1hdFV0aWwuYXNJbmZvKGFjY291bnRDYWNoZS5nZXQobGluZS5nZXRBdXRob3IoKSkpOwogICAgICAgZmluYWwgUHVibGlzaGVkQ29tbWVudFBhbmVsIHBhbmVsID0KICAgICAgICAgICBuZXcgUHVibGlzaGVkQ29tbWVudFBhbmVsKGF1dGhvciwgbGluZSk7CiAgICAgICBwYW5lbC5zZXRPcGVuKGV4cGFuZENvbW1lbnQpOwpAQCAtNjMyLDYgKzc1NCw5IEBACiAgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudFBhbmVsTGFzdCgpKTsKICAgICBmbXQuc2V0U3R5bGVOYW1lKHJvdywgY29sLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNvbW1lbnRIb2xkZXIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jb21tZW50UGFuZWxMYXN0KCkpOworICAgIGlmICghZm10LmdldFN0eWxlTmFtZShyb3csIGNvbCAtIDEpLmNvbnRhaW5zKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudEhvbGRlcigpKSkgeworICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jb21tZW50SG9sZGVyTGVmdG1vc3QoKSk7CisgICAgfQogICB9CiAKICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb21tZW50TGlzdCB7CkBAIC02NDAsNDIgKzc2NSw2IEBACiAgICAgICAgIG5ldyBBcnJheUxpc3Q8UHVibGlzaGVkQ29tbWVudFBhbmVsPigpOwogICB9CiAKLSAgcHJvdGVjdGVkIGNsYXNzIERvdWJsZUNsaWNrRmxleFRhYmxlIGV4dGVuZHMgTXlGbGV4VGFibGUgewotICAgIHB1YmxpYyBEb3VibGVDbGlja0ZsZXhUYWJsZSgpIHsKLSAgICAgIHNpbmtFdmVudHMoRXZlbnQuT05EQkxDTElDSyB8IEV2ZW50Lk9OQ0xJQ0spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0gICAgICBzd2l0Y2ggKERPTS5ldmVudEdldFR5cGUoZXZlbnQpKSB7Ci0gICAgICAgIGNhc2UgRXZlbnQuT05DTElDSzogewotICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNlbGwgd2FzIGFjdHVhbGx5IGNsaWNrZWQuCi0gICAgICAgICAgZmluYWwgRWxlbWVudCB0ZCA9IGdldEV2ZW50VGFyZ2V0Q2VsbChldmVudCk7Ci0gICAgICAgICAgaWYgKHRkID09IG51bGwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaW5hbCBpbnQgcm93ID0gcm93T2YodGQpOwotICAgICAgICAgIGlmIChnZXRSb3dJdGVtKHJvdykgIT0gbnVsbCkgewotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhyb3cpOwotICAgICAgICAgICAgb25DZWxsU2luZ2xlQ2xpY2socm93T2YodGQpLCBjb2x1bW5PZih0ZCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEV2ZW50Lk9OREJMQ0xJQ0s6IHsKLSAgICAgICAgICAvLyBGaW5kIG91dCB3aGljaCBjZWxsIHdhcyBhY3R1YWxseSBjbGlja2VkLgotICAgICAgICAgIEVsZW1lbnQgdGQgPSBnZXRFdmVudFRhcmdldENlbGwoZXZlbnQpOwotICAgICAgICAgIGlmICh0ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIG9uQ2VsbERvdWJsZUNsaWNrKHJvd09mKHRkKSwgY29sdW1uT2YodGQpKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKLSAgICB9Ci0gIH0KLQogICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vT3BLZXlDb21tYW5kIGV4dGVuZHMgTmVlZHNTaWduSW5LZXlDb21tYW5kIHsKICAgICBwdWJsaWMgTm9PcEtleUNvbW1hbmQoaW50IG1hc2ssIGludCBrZXksIFN0cmluZyBoZWxwKSB7CiAgICAgICBzdXBlcihtYXNrLCBrZXksIGhlbHApOwpAQCAtODA0LDIyICs4OTMsMjIgQEAKICAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVwbHlFZGl0b3IoKSB7CiAgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQgPSBuZXdDb21tZW50KCk7CiAgICAgICBuZXdDb21tZW50LnNldE1lc3NhZ2UoIiIpOwotICAgICAgY3JlYXRlRWRpdG9yKG5ld0NvbW1lbnQpLnNldEZvY3VzKHRydWUpOworICAgICAgZmluZE9yQ3JlYXRlRWRpdG9yKG5ld0NvbW1lbnQsIHRydWUpLnNldEZvY3VzKHRydWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjYW5uZWRSZXBseShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgQ29tbWVudEVkaXRvclBhbmVsIHAgPSBjcmVhdGVFZGl0b3IobnVsbCk7CisgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQgPSBuZXdDb21tZW50KCk7CisgICAgICBuZXdDb21tZW50LnNldE1lc3NhZ2UobWVzc2FnZSk7CisgICAgICBDb21tZW50RWRpdG9yUGFuZWwgcCA9IGZpbmRPckNyZWF0ZUVkaXRvcihuZXdDb21tZW50LCBmYWxzZSk7CiAgICAgICBpZiAocCA9PSBudWxsKSB7Ci0gICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgbmV3Q29tbWVudCA9IG5ld0NvbW1lbnQoKTsKLSAgICAgICAgbmV3Q29tbWVudC5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCiAgICAgICAgIGVuYWJsZUJ1dHRvbnMoZmFsc2UpOwogICAgICAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5zYXZlRHJhZnQobmV3Q29tbWVudCwKICAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxQYXRjaExpbmVDb21tZW50PigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBQYXRjaExpbmVDb21tZW50IHJlc3VsdCkgewogICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CiAgICAgICAgICAgICAgICAgbm90aWZ5RHJhZnREZWx0YSgxKTsKLSAgICAgICAgICAgICAgICBjcmVhdGVFZGl0b3IocmVzdWx0KS5zZXRPcGVuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBmaW5kT3JDcmVhdGVFZGl0b3IocmVzdWx0LCB0cnVlKS5zZXRPcGVuKGZhbHNlKTsKICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtODM2LDEwICs5MjUsMTEgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIENvbW1lbnRFZGl0b3JQYW5lbCBjcmVhdGVFZGl0b3IoZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50KSB7CisgICAgcHJpdmF0ZSBDb21tZW50RWRpdG9yUGFuZWwgZmluZE9yQ3JlYXRlRWRpdG9yKAorICAgICAgICBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7CiAgICAgICBpbnQgcm93ID0gcm93T2YoZ2V0RWxlbWVudCgpKTsKICAgICAgIGludCBjb2x1bW4gPSBjb2x1bW5PZihnZXRFbGVtZW50KCkpOwotICAgICAgcmV0dXJuIGNyZWF0ZUNvbW1lbnRFZGl0b3Iocm93ICsgMSwgY29sdW1uLCBuZXdDb21tZW50KTsKKyAgICAgIHJldHVybiBmaW5kT3JDcmVhdGVDb21tZW50RWRpdG9yKHJvdyArIDEsIGNvbHVtbiwgbmV3Q29tbWVudCwgY3JlYXRlKTsKICAgICB9CiAKICAgICBwcml2YXRlIFBhdGNoTGluZUNvbW1lbnQgbmV3Q29tbWVudCgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0NvbW1lbnRFZGl0b3JQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQ29tbWVudEVkaXRvclBhbmVsLmphdmEKaW5kZXggYjBkODI1Yi4uYjYwOWYxNSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQ29tbWVudEVkaXRvclBhbmVsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQ29tbWVudEVkaXRvclBhbmVsLmphdmEKQEAgLTE5OCw2ICsxOTgsMTAgQEAKICAgICByZXR1cm4gY29tbWVudC5nZXRLZXkoKS5nZXQoKSA9PSBudWxsOwogICB9CiAKKyAgcHVibGljIFBhdGNoTGluZUNvbW1lbnQgZ2V0Q29tbWVudCgpIHsKKyAgICByZXR1cm4gY29tbWVudDsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBvbkRvdWJsZUNsaWNrKGZpbmFsIERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKICAgICBlZGl0KCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMuamF2YQppbmRleCA0ODAxZTY1Li44YzljNTZiIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoQ29uc3RhbnRzLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKICAgU3RyaW5nIHBhdGNoSGlzdG9yeVRpdGxlKCk7CiAgIFN0cmluZyBkaXNhYmxlZE9uTGFyZ2VGaWxlcygpOwogICBTdHJpbmcgaW50cmFsaW5lRmFpbHVyZSgpOworICBTdHJpbmcgaW50cmFsaW5lVGltZW91dCgpOwogICBTdHJpbmcgaWxsZWdhbE51bWJlck9mQ29sdW1ucygpOwogCiAgIFN0cmluZyB1cFRvQ2hhbmdlKCk7CkBAIC02Nyw2ICs2OCw4IEBACiAgIFN0cmluZyByZXZpZXdlZEFuZCgpOwogICBTdHJpbmcgbmV4dCgpOwogICBTdHJpbmcgZG93bmxvYWQoKTsKKyAgU3RyaW5nIGFkZEZpbGVDb21tZW50VG9vbFRpcCgpOworICBTdHJpbmcgYWRkRmlsZUNvbW1lbnRCeURvdWJsZUNsaWNrKCk7CiAKICAgU3RyaW5nIGJ1dHRvblJlcGx5RG9uZSgpOwogICBTdHJpbmcgY2FubmVkUmVwbHlEb25lKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMucHJvcGVydGllcwppbmRleCAxMTgyM2FjLi41YWNkYjVmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoQ29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTE4LDYgKzE4LDcgQEAKIHBhdGNoU2V0ID0gUGF0Y2ggU2V0CiBkaXNhYmxlZE9uTGFyZ2VGaWxlcyA9IERpc2FibGVkIG9uIHZlcnkgbGFyZ2Ugc291cmNlIGZpbGVzLgogaW50cmFsaW5lRmFpbHVyZSA9IEludHJhbGluZSBkaWZmZXJlbmNlIG5vdCBhdmFpbGFibGUgZHVlIHRvIHNlcnZlciBlcnJvci4KK2ludHJhbGluZVRpbWVvdXQgPSBJbnRyYWxpbmUgZGlmZmVyZW5jZSBub3QgYXZhaWxhYmxlIGR1ZSB0byB0aW1lb3V0LgogaWxsZWdhbE51bWJlck9mQ29sdW1ucyA9IFRoZSBudW1iZXIgb2YgY29sdW1ucyBjYW5ub3QgYmUgemVybyBvciBuZWdhdGl2ZQogCiB1cFRvQ2hhbmdlID0gVXAgdG8gY2hhbmdlCkBAIC00OSw2ICs1MCw4IEBACiByZXZpZXdlZEFuZCA9IFJldmlld2VkICYKIG5leHQgPSBuZXh0CiBkb3dubG9hZCA9IERvd25sb2FkCithZGRGaWxlQ29tbWVudFRvb2xUaXAgPSBDbGljayB0byBhZGQgZmlsZSBjb21tZW50CithZGRGaWxlQ29tbWVudEJ5RG91YmxlQ2xpY2sgPSBEb3VibGUgY2xpY2sgdG8gYWRkIGZpbGUgY29tbWVudAogCiBmaWxlVHlwZVN5bWxpbmsgPSBUeXBlOiBTeW1ib2xpYyBMaW5rCiBmaWxlVHlwZUdpdGxpbmsgPSBUeXBlOiBHaXQgQ29tbWl0IGluIFN1YnByb2plY3QKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNjcmVlbi5qYXZhCmluZGV4IDRmODczMWMuLjY3NmNlYTYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTY3JlZW4uamF2YQpAQCAtMjAsMTIgKzIwLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuUnBjU3RhdHVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNvbW1pdE1lc3NhZ2VCbG9jazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5QYXRjaFRhYmxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlBhdGNoVGFibGUuUGF0Y2hWYWxpZGF0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuU2NyZWVuTG9hZENhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkxpc3RlbmFibGVBY2NvdW50RGlmZlByZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNjcmlwdDsKQEAgLTM3LDIzICszNCwxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyLlNjaGVkdWxlZENvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLlZhbHVlQ2hhbmdlSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuSGFuZGxlclJlZ2lzdHJhdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXRjaFNjcmVlbiBleHRlbmRzIFNjcmVlbiBpbXBsZW1lbnRzCiAgICAgQ29tbWVudEVkaXRvckNvbnRhaW5lciB7CkBAIC0xMTAsMTQgKzk4LDEwIEBACiAgIHByb3RlY3RlZCBQYXRjaFNjcmlwdFNldHRpbmdzUGFuZWwgc2V0dGluZ3NQYW5lbDsKICAgcHJvdGVjdGVkIFRvcFZpZXcgdG9wVmlldzsKIAotICBwcml2YXRlIENoZWNrQm94IHJldmlld2VkQ2hlY2tCb3g7Ci0gIHByaXZhdGUgRmxvd1BhbmVsIHJldmlld2VkUGFuZWw7Ci0gIHByaXZhdGUgSW5saW5lSHlwZXJsaW5rIHJldmlld2VkTGluazsKKyAgcHJpdmF0ZSBSZXZpZXdlZFBhbmVscyByZXZpZXdlZFBhbmVsczsKICAgcHJpdmF0ZSBIaXN0b3J5VGFibGUgaGlzdG9yeVRhYmxlOwogICBwcml2YXRlIEZsb3dQYW5lbCB0b3BQYW5lbDsKICAgcHJpdmF0ZSBGbG93UGFuZWwgY29udGVudFBhbmVsOwotICBwcml2YXRlIFBhdGNoVGFibGVIZWFkZXIgaGVhZGVyOwotICBwcml2YXRlIExhYmVsIG5vRGlmZmVyZW5jZTsKICAgcHJpdmF0ZSBBYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlIGNvbnRlbnRUYWJsZTsKICAgcHJpdmF0ZSBDb21taXRNZXNzYWdlQmxvY2sgY29tbWl0TWVzc2FnZUJsb2NrOwogICBwcml2YXRlIE5hdkxpbmtzIHRvcE5hdjsKQEAgLTEyOSw2ICsxMTMsNyBAQAogICAvKiogVGhlIGluZGV4IG9mIHRoZSBmaWxlIHdlIGFyZSBjdXJyZW50bHkgbG9va2luZyBhdCBhbW9uZyB0aGUgZmlsZUxpc3QgKi8KICAgcHJpdmF0ZSBpbnQgcGF0Y2hJbmRleDsKICAgcHJpdmF0ZSBMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlIHByZWZzOworICBwcml2YXRlIEhhbmRsZXJSZWdpc3RyYXRpb24gcHJlZnNIYW5kbGVyOwogCiAgIC8qKiBLZXlzIHRoYXQgY2F1c2UgYW4gYWN0aW9uIG9uIHRoaXMgc2NyZWVuICovCiAgIHByaXZhdGUgS2V5Q29tbWFuZFNldCBrZXlzTmF2aWdhdGlvbjsKQEAgLTEzNiw2ICsxMjEsNyBAQAogICBwcml2YXRlIEhhbmRsZXJSZWdpc3RyYXRpb24gcmVnTmF2aWdhdGlvbjsKICAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ0FjdGlvbjsKICAgcHJpdmF0ZSBib29sZWFuIGludHJhbGluZUZhaWx1cmU7CisgIHByaXZhdGUgYm9vbGVhbiBpbnRyYWxpbmVUaW1lb3V0OwogCiAgIC8qKgogICAgKiBIb3cgdGhpcyBwYXRjaCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBwYXRjaCBzY3JlZW4uCkBAIC0xNTYsNzYgKzE0MiwxNiBAQAogICAgIGlkU2lkZUIgPSBpZC5nZXRQYXJlbnRLZXkoKTsKICAgICB0aGlzLnBhdGNoSW5kZXggPSBwYXRjaEluZGV4OwogCi0gICAgcHJlZnMgPSBmaWxlTGlzdCAhPSBudWxsID8gZmlsZUxpc3QuZ2V0UHJlZmVyZW5jZXMoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExpc3RlbmFibGVBY2NvdW50RGlmZlByZWZlcmVuY2UoKTsKKyAgICBwcmVmcyA9IGZpbGVMaXN0ICE9IG51bGwKKyAgICAgICAgPyBmaWxlTGlzdC5nZXRQcmVmZXJlbmNlcygpCisgICAgICAgIDogbmV3IExpc3RlbmFibGVBY2NvdW50RGlmZlByZWZlcmVuY2UoKTsKICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewogICAgICAgcHJlZnMucmVzZXQoKTsKICAgICB9Ci0gICAgcHJlZnMuYWRkVmFsdWVDaGFuZ2VIYW5kbGVyKAotICAgICAgICBuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPEFjY291bnREaWZmUHJlZmVyZW5jZT4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25WYWx1ZUNoYW5nZShWYWx1ZUNoYW5nZUV2ZW50PEFjY291bnREaWZmUHJlZmVyZW5jZT4gZXZlbnQpIHsKLSAgICAgICAgICAgIHVwZGF0ZShldmVudC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgcmV2aWV3ZWRQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKKyAgICByZXZpZXdlZFBhbmVscyA9IG5ldyBSZXZpZXdlZFBhbmVscygpOwogICAgIHNldHRpbmdzUGFuZWwgPSBuZXcgUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsKHByZWZzKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVJldmlld2VkUGFuZWwoKXsKLSAgICByZXZpZXdlZFBhbmVsLmNsZWFyKCk7Ci0KLSAgICByZXZpZXdlZENoZWNrQm94ID0gbmV3IENoZWNrQm94KFBhdGNoVXRpbC5DLnJldmlld2VkQW5kKCkgKyAiICIpOwotICAgIHJldmlld2VkQ2hlY2tCb3guYWRkVmFsdWVDaGFuZ2VIYW5kbGVyKG5ldyBWYWx1ZUNoYW5nZUhhbmRsZXI8Qm9vbGVhbj4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoVmFsdWVDaGFuZ2VFdmVudDxCb29sZWFuPiBldmVudCkgewotICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoZXZlbnQuZ2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICByZXZpZXdlZFBhbmVsLmFkZChyZXZpZXdlZENoZWNrQm94KTsKLSAgICByZXZpZXdlZFBhbmVsLmFkZChnZXRSZXZpZXdlZEFuY2hvcigpKTsKLSAgfQotCi0gIHByaXZhdGUgQW5jaG9yIGdldFJldmlld2VkQW5jaG9yKCkgewotICAgIFNhZmVIdG1sQnVpbGRlciB0ZXh0ID0gbmV3IFNhZmVIdG1sQnVpbGRlcigpOwotICAgIHRleHQuYXBwZW5kKFBhdGNoVXRpbC5DLm5leHQoKSk7Ci0gICAgdGV4dC5hcHBlbmQoU2FmZUh0bWwuYXNpcyhVdGlsLkMubmV4dFBhdGNoTGlua0ljb24oKSkpOwotCi0gICAgQW5jaG9yIHJldmlld2VkQW5jaG9yID0gbmV3IEFuY2hvcigiIik7Ci0gICAgU2FmZUh0bWwuc2V0KHJldmlld2VkQW5jaG9yLCB0ZXh0KTsKLQotICAgIGZpbmFsIFBhdGNoVmFsaWRhdG9yIHVucmV2aWV3ZWRWYWxpZGF0b3IgPSBuZXcgUGF0Y2hWYWxpZGF0b3IoKSB7Ci0gICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKFBhdGNoIHBhdGNoKSB7Ci0gICAgICAgIHJldHVybiAhcGF0Y2guaXNSZXZpZXdlZEJ5Q3VycmVudFVzZXIoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgaW50IG5leHRVbnJldmlld2VkUGF0Y2hJbmRleCA9Ci0gICAgICAgIGZpbGVMaXN0LmdldE5leHRQYXRjaChwYXRjaEluZGV4LCB0cnVlLCB1bnJldmlld2VkVmFsaWRhdG9yLAotICAgICAgICAgICAgZmlsZUxpc3QuUFJFRkVSRU5DRV9WQUxJREFUT1IpOwotCi0gICAgaWYgKG5leHRVbnJldmlld2VkUGF0Y2hJbmRleCA+IC0xKSB7Ci0gICAgICAvLyBDcmVhdGUgaW52aXNpYmxlIHBhdGNoIGxpbmsgdG8gY2hhbmdlIHBhZ2UKLSAgICAgIHJldmlld2VkTGluayA9Ci0gICAgICAgICAgZmlsZUxpc3QuY3JlYXRlTGluayhuZXh0VW5yZXZpZXdlZFBhdGNoSW5kZXgsIGdldFBhdGNoU2NyZWVuVHlwZSgpLAotICAgICAgICAgICAgICBudWxsLCBudWxsKTsKLSAgICAgIHJldmlld2VkTGluay5zZXRUZXh0KCIiKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV2aWV3ZWRMaW5rID0gbmV3IENoYW5nZUxpbmsoIiIsIHBhdGNoS2V5LmdldFBhcmVudEtleSgpKTsKLSAgICB9Ci0gICAgcmV2aWV3ZWRBbmNob3IuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodHJ1ZSk7Ci0gICAgICAgIHJldmlld2VkTGluay5nbygpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV0dXJuIHJldmlld2VkQW5jaG9yOwotICB9Ci0KICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG5vdGlmeURyYWZ0RGVsdGEoaW50IGRlbHRhKSB7CiAgICAgbGFzdFNjcmlwdCA9IG51bGw7CkBAIC0yMzgsMTAgKzE2NCwxMCBAQAogCiAgIHByaXZhdGUgdm9pZCB1cGRhdGUoQWNjb3VudERpZmZQcmVmZXJlbmNlIGRwKSB7CiAgICAgLy8gRGlkIHRoZSB1c2VyIGp1c3QgdHVybiBvbiBhdXRvLXJldmlldz8KLSAgICBpZiAoIXJldmlld2VkQ2hlY2tCb3guZ2V0VmFsdWUoKSAmJiBwcmVmcy5nZXRPbGQoKS5pc01hbnVhbFJldmlldygpCisgICAgaWYgKCFyZXZpZXdlZFBhbmVscy5nZXRWYWx1ZSgpICYmIHByZWZzLmdldE9sZCgpLmlzTWFudWFsUmV2aWV3KCkKICAgICAgICAgJiYgIWRwLmlzTWFudWFsUmV2aWV3KCkpIHsKLSAgICAgIHJldmlld2VkQ2hlY2tCb3guc2V0VmFsdWUodHJ1ZSk7Ci0gICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodHJ1ZSk7CisgICAgICByZXZpZXdlZFBhbmVscy5zZXRWYWx1ZSh0cnVlKTsKKyAgICAgIHJldmlld2VkUGFuZWxzLnNldFJldmlld2VkQnlDdXJyZW50VXNlcih0cnVlKTsKICAgICB9CiAKICAgICBpZiAobGFzdFNjcmlwdCAhPSBudWxsICYmIGNhblJldXNlKGRwLCBsYXN0U2NyaXB0KSkgewpAQCAtMjk0LDcgKzIyMCw3IEBACiAgICAgc3VwZXIub25Jbml0VUkoKTsKIAogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICBzZXRUaXRsZUZhckVhc3QocmV2aWV3ZWRQYW5lbCk7CisgICAgICBzZXRUaXRsZUZhckVhc3QocmV2aWV3ZWRQYW5lbHMudG9wKTsKICAgICB9CiAKICAgICBrZXlzTmF2aWdhdGlvbiA9IG5ldyBLZXlDb21tYW5kU2V0KEdlcnJpdC5DLnNlY3Rpb25OYXZpZ2F0aW9uKCkpOwpAQCAtMzE2LDEyICsyNDIsNiBAQAogICAgIHRvcFBhbmVsID0gbmV3IEZsb3dQYW5lbCgpOwogICAgIGFkZCh0b3BQYW5lbCk7CiAKLSAgICBoZWFkZXIgPSBuZXcgUGF0Y2hUYWJsZUhlYWRlcihnZXRQYXRjaFNjcmVlblR5cGUoKSk7Ci0KLSAgICBub0RpZmZlcmVuY2UgPSBuZXcgTGFiZWwoUGF0Y2hVdGlsLkMubm9EaWZmZXJlbmNlKCkpOwotICAgIG5vRGlmZmVyZW5jZS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wYXRjaE5vRGlmZmVyZW5jZSgpKTsKLSAgICBub0RpZmZlcmVuY2Uuc2V0VmlzaWJsZShmYWxzZSk7Ci0KICAgICBjb250ZW50VGFibGUgPSBjcmVhdGVDb250ZW50VGFibGUoKTsKICAgICBjb250ZW50VGFibGUuZmlsZUxpc3QgPSBmaWxlTGlzdDsKIApAQCAtMzMwLDEzICsyNTAsMTkgQEAKIAogICAgIGFkZCh0b3BOYXYpOwogICAgIGNvbnRlbnRQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBjb250ZW50UGFuZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkKLSAgICAgICAgLnNpZGVCeVNpZGVTY3JlZW5TaWRlQnlTaWRlVGFibGUoKSk7Ci0gICAgY29udGVudFBhbmVsLmFkZChoZWFkZXIpOwotICAgIGNvbnRlbnRQYW5lbC5hZGQobm9EaWZmZXJlbmNlKTsKKyAgICBpZiAoZ2V0UGF0Y2hTY3JlZW5UeXBlKCkgPT0gUGF0Y2hTY3JlZW4uVHlwZS5TSURFX0JZX1NJREUpIHsKKyAgICAgIGNvbnRlbnRQYW5lbC5zZXRTdHlsZU5hbWUoLy8KKyAgICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNpZGVCeVNpZGVTY3JlZW5TaWRlQnlTaWRlVGFibGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnRlbnRQYW5lbC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS51bmlmaWVkVGFibGUoKSk7CisgICAgfQorCiAgICAgY29udGVudFBhbmVsLmFkZChjb250ZW50VGFibGUpOwogICAgIGFkZChjb250ZW50UGFuZWwpOwogICAgIGFkZChib3R0b21OYXYpOworICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICBhZGQocmV2aWV3ZWRQYW5lbHMuYm90dG9tKTsKKyAgICB9CiAKICAgICBpZiAoZmlsZUxpc3QgIT0gbnVsbCkgewogICAgICAgdG9wTmF2LmRpc3BsYXkocGF0Y2hJbmRleCwgZ2V0UGF0Y2hTY3JlZW5UeXBlKCksIGZpbGVMaXN0KTsKQEAgLTM0NCwyNSArMjcwLDYgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHNldFJldmlld2VkQnlDdXJyZW50VXNlcihib29sZWFuIHJldmlld2VkKSB7Ci0gICAgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgIGZpbGVMaXN0LnVwZGF0ZVJldmlld2VkU3RhdHVzKHBhdGNoS2V5LCByZXZpZXdlZCk7Ci0gICAgfQotCi0gICAgUGF0Y2hVdGlsLkRFVEFJTF9TVkMuc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKHBhdGNoS2V5LCByZXZpZXdlZCwKLSAgICAgICAgbmV3IEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBhcmcwKSB7Ci0gICAgICAgICAgICAvLyBub3AKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVm9pZFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIC8vIG5vcAotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwpAQCAtMzg4LDYgKzI5NSwxMCBAQAogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvblVubG9hZCgpIHsKKyAgICBpZiAocHJlZnNIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgIHByZWZzSGFuZGxlci5yZW1vdmVIYW5kbGVyKCk7CisgICAgICBwcmVmc0hhbmRsZXIgPSBudWxsOworICAgIH0KICAgICBpZiAocmVnTmF2aWdhdGlvbiAhPSBudWxsKSB7CiAgICAgICByZWdOYXZpZ2F0aW9uLnJlbW92ZUhhbmRsZXIoKTsKICAgICAgIHJlZ05hdmlnYXRpb24gPSBudWxsOwpAQCAtNDQ5LDcgKzM2MCw3IEBACiAgICAgZmluYWwgaW50IHJwY3NlcSA9ICsrcnBjU2VxdWVuY2U7CiAgICAgbGFzdFNjcmlwdCA9IG51bGw7CiAgICAgc2V0dGluZ3NQYW5lbC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBwb3B1bGF0ZVJldmlld2VkUGFuZWwoKTsKKyAgICByZXZpZXdlZFBhbmVscy5wb3B1bGF0ZShwYXRjaEtleSwgZmlsZUxpc3QsIHBhdGNoSW5kZXgsIGdldFBhdGNoU2NyZWVuVHlwZSgpKTsKICAgICBpZiAoaXNGaXJzdCAmJiBmaWxlTGlzdCAhPSBudWxsKSB7CiAgICAgICBmaWxlTGlzdC5tb3ZlUG9pbnRlclRvKHBhdGNoS2V5KTsKICAgICB9CkBAIC01MDAsMTggKzQxMSwyMiBAQAogCiAgICAgaGlzdG9yeVRhYmxlLmRpc3BsYXkoc2NyaXB0LmdldEhpc3RvcnkoKSk7CiAKLSAgICAvLyBUcnVlIGlmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gcGF0Y2ggc2V0cwotICAgIGJvb2xlYW4gaGFzRWRpdHMgPSAhc2NyaXB0LmdldEVkaXRzKCkuaXNFbXB0eSgpOwotICAgIC8vIFRydWUgaWYgdGhpcyBjaGFuZ2UgaXMgYSBtb2RlIGNoYW5nZSBvciBhIHB1cmUgcmVuYW1lL2NvcHkKLSAgICBib29sZWFuIGhhc01ldGEgPSAhc2NyaXB0LmdldFBhdGNoSGVhZGVyKCkuaXNFbXB0eSgpOworICAgIGZvciAoUGF0Y2ggcCA6IHBhdGNoU2V0RGV0YWlsLmdldFBhdGNoZXMoKSkgeworICAgICAgaWYgKHAuZ2V0S2V5KCkuZXF1YWxzKHBhdGNoS2V5KSkgeworICAgICAgICBpZiAocC5nZXRQYXRjaFR5cGUoKS5lcXVhbHMoUGF0Y2guUGF0Y2hUeXBlLkJJTkFSWSkpIHsKKyAgICAgICAgICBjb250ZW50VGFibGUuaXNEaXNwbGF5QmluYXJ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CiAKLSAgICBib29sZWFuIGhhc0RpZmZlcmVuY2VzID0gaGFzRWRpdHMgfHwgaGFzTWV0YTsKLSAgICBib29sZWFuIHB1cmVNZXRhQ2hhbmdlID0gIWhhc0VkaXRzICYmIGhhc01ldGE7Ci0KLSAgICBpZiAoY29udGVudFRhYmxlIGluc3RhbmNlb2YgU2lkZUJ5U2lkZVRhYmxlICYmIHB1cmVNZXRhQ2hhbmdlKSB7CisgICAgaWYgKGNvbnRlbnRUYWJsZSBpbnN0YW5jZW9mIFNpZGVCeVNpZGVUYWJsZQorICAgICAgICAmJiBjb250ZW50VGFibGUuaXNQdXJlTWV0YUNoYW5nZShzY3JpcHQpCisgICAgICAgICYmICFjb250ZW50VGFibGUuaXNEaXNwbGF5QmluYXJ5KSB7CiAgICAgICAvLyBVc2VyIGFza2VkIGZvciBTaWRlQnlTaWRlIChvciBhIGxpbmsgZ3Vlc3NlZCwgd3JvbmcpIGFuZCB3ZSBjYW4ndAotICAgICAgLy8gc2hvdyBhIGJpbmFyeSBvciBwdXJlLXJlbmFtZSBjaGFuZ2UgdGhlcmUgYWNjdXJhdGVseS4gU3dpdGNoIHRvCi0gICAgICAvLyB0aGUgdW5pZmllZCB2aWV3IGluc3RlYWQuCisgICAgICAvLyBzaG93IGEgcHVyZS1yZW5hbWUgY2hhbmdlIHRoZXJlIGFjY3VyYXRlbHkuIFN3aXRjaCB0bworICAgICAgLy8gdGhlIHVuaWZpZWQgdmlldyBpbnN0ZWFkLiBVc2VyIGNhbiBzZXQgZmlsZSBjb21tZW50cyBvbiBiaW5hcnkgZmlsZQorICAgICAgLy8gaW4gU2lkZUJ5U2lkZSB2aWV3LgogICAgICAgLy8KICAgICAgIGNvbnRlbnRUYWJsZS5yZW1vdmVGcm9tUGFyZW50KCk7CiAgICAgICBjb250ZW50VGFibGUgPSBuZXcgVW5pZmllZERpZmZUYWJsZSgpOwpAQCAtNTIwLDE0ICs0MzUsMTEgQEAKICAgICAgIHNldFRva2VuKERpc3BhdGNoZXIudG9QYXRjaFVuaWZpZWQoaWRTaWRlQSwgcGF0Y2hLZXkpKTsKICAgICB9CiAKLSAgICBoZWFkZXIuZGlzcGxheShwYXRjaFNldERldGFpbCwgc2NyaXB0LCBwYXRjaEtleSwgaWRTaWRlQSwgaWRTaWRlQik7CisgICAgY29udGVudFRhYmxlLmRpc3BsYXkocGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIsIHNjcmlwdCwgcGF0Y2hTZXREZXRhaWwpOworICAgIGNvbnRlbnRUYWJsZS5kaXNwbGF5KHNjcmlwdC5nZXRDb21tZW50RGV0YWlsKCksIHNjcmlwdC5pc0V4cGFuZEFsbENvbW1lbnRzKCkpOworICAgIGNvbnRlbnRUYWJsZS5maW5pc2hEaXNwbGF5KCk7CisgICAgY29udGVudFRhYmxlLnNldFJlZ2lzdGVyS2V5cyhpc0N1cnJlbnRWaWV3KCkpOwogCi0gICAgaWYgKGhhc0RpZmZlcmVuY2VzKSB7Ci0gICAgICBjb250ZW50VGFibGUuZGlzcGxheShwYXRjaEtleSwgaWRTaWRlQSwgaWRTaWRlQiwgc2NyaXB0KTsKLSAgICAgIGNvbnRlbnRUYWJsZS5kaXNwbGF5KHNjcmlwdC5nZXRDb21tZW50RGV0YWlsKCksIHNjcmlwdC5pc0V4cGFuZEFsbENvbW1lbnRzKCkpOwotICAgICAgY29udGVudFRhYmxlLmZpbmlzaERpc3BsYXkoKTsKLSAgICB9Ci0gICAgc2hvd1BhdGNoKGhhc0RpZmZlcmVuY2VzKTsKICAgICBzZXR0aW5nc1BhbmVsLnNldEVuYWJsZVNtYWxsRmlsZUZlYXR1cmVzKCFzY3JpcHQuaXNIdWdlRmlsZSgpKTsKICAgICBzZXR0aW5nc1BhbmVsLnNldEVuYWJsZUludHJhbGluZURpZmZlcmVuY2Uoc2NyaXB0Lmhhc0ludHJhbGluZURpZmZlcmVuY2UoKSk7CiAgICAgc2V0dGluZ3NQYW5lbC5zZXRFbmFibGVkKHRydWUpOwpAQCAtNTQyLDcgKzQ1NCw3IEBACiAgICAgICBib29sZWFuIGlzUmV2aWV3ZWQgPSBmYWxzZTsKICAgICAgIGlmIChpc0ZpcnN0ICYmICFwcmVmcy5nZXQoKS5pc01hbnVhbFJldmlldygpKSB7CiAgICAgICAgIGlzUmV2aWV3ZWQgPSB0cnVlOwotICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoaXNSZXZpZXdlZCk7CisgICAgICAgIHJldmlld2VkUGFuZWxzLnNldFJldmlld2VkQnlDdXJyZW50VXNlcihpc1Jldmlld2VkKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoUGF0Y2ggcCA6IHBhdGNoU2V0RGV0YWlsLmdldFBhdGNoZXMoKSkgewogICAgICAgICAgIGlmIChwLmdldEtleSgpLmVxdWFscyhwYXRjaEtleSkpIHsKQEAgLTU1MSwzMCArNDYzLDM3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICByZXZpZXdlZENoZWNrQm94LnNldFZhbHVlKGlzUmV2aWV3ZWQpOworICAgICAgcmV2aWV3ZWRQYW5lbHMuc2V0VmFsdWUoaXNSZXZpZXdlZCk7CiAgICAgfQogCiAgICAgaW50cmFsaW5lRmFpbHVyZSA9IGlzRmlyc3QgJiYgc2NyaXB0Lmhhc0ludHJhbGluZUZhaWx1cmUoKTsKKyAgICBpbnRyYWxpbmVUaW1lb3V0ID0gaXNGaXJzdCAmJiBzY3JpcHQuaGFzSW50cmFsaW5lVGltZW91dCgpOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG9uU2hvd1ZpZXcoKSB7CiAgICAgc3VwZXIub25TaG93VmlldygpOworICAgIGlmIChwcmVmc0hhbmRsZXIgPT0gbnVsbCkgeworICAgICAgcHJlZnNIYW5kbGVyID0gcHJlZnMuYWRkVmFsdWVDaGFuZ2VIYW5kbGVyKAorICAgICAgICAgIG5ldyBWYWx1ZUNoYW5nZUhhbmRsZXI8QWNjb3VudERpZmZQcmVmZXJlbmNlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25WYWx1ZUNoYW5nZShWYWx1ZUNoYW5nZUV2ZW50PEFjY291bnREaWZmUHJlZmVyZW5jZT4gZXZlbnQpIHsKKyAgICAgICAgICAgICAgdXBkYXRlKGV2ZW50LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KICAgICBpZiAoaW50cmFsaW5lRmFpbHVyZSkgewogICAgICAgaW50cmFsaW5lRmFpbHVyZSA9IGZhbHNlOwogICAgICAgbmV3IEVycm9yRGlhbG9nKFBhdGNoVXRpbC5DLmludHJhbGluZUZhaWx1cmUoKSkuc2hvdygpOworICAgIH0gZWxzZSBpZiAoaW50cmFsaW5lVGltZW91dCkgeworICAgICAgaW50cmFsaW5lVGltZW91dCA9IGZhbHNlOworICAgICAgbmV3IEVycm9yRGlhbG9nKFBhdGNoVXRpbC5DLmludHJhbGluZVRpbWVvdXQoKSkuc2hvdygpOwogICAgIH0KICAgICBpZiAodG9wVmlldyAhPSBudWxsICYmIHByZWZzLmdldCgpLmlzUmV0YWluSGVhZGVyKCkpIHsKICAgICAgIHNldFRvcFZpZXcodG9wVmlldyk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHNob3dQYXRjaChmaW5hbCBib29sZWFuIHNob3dQYXRjaCkgewotICAgIG5vRGlmZmVyZW5jZS5zZXRWaXNpYmxlKCFzaG93UGF0Y2gpOwotICAgIGNvbnRlbnRUYWJsZS5zZXRWaXNpYmxlKHNob3dQYXRjaCk7Ci0gICAgY29udGVudFRhYmxlLnNldFJlZ2lzdGVyS2V5cyhpc0N1cnJlbnRWaWV3KCkgJiYgc2hvd1BhdGNoKTsKLSAgfQotCiAgIHB1YmxpYyB2b2lkIHNldFRvcFZpZXcoVG9wVmlldyB0dikgewogICAgIHRvcFZpZXcgPSB0djsKICAgICB0b3BQYW5lbC5jbGVhcigpOwpAQCAtNTg3LDYgKzUwNiw4IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBGSUxFUzogICAgICAgdG9wUGFuZWwuYWRkKGZpbGVMaXN0KTsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1BSU46CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCkBAIC02MjEsOSArNTQyLDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uS2V5UHJlc3MoZmluYWwgS2V5UHJlc3NFdmVudCBldmVudCkgewotICAgICAgZmluYWwgYm9vbGVhbiBpc1Jldmlld2VkID0gIXJldmlld2VkQ2hlY2tCb3guZ2V0VmFsdWUoKTsKLSAgICAgIHJldmlld2VkQ2hlY2tCb3guc2V0VmFsdWUoaXNSZXZpZXdlZCk7Ci0gICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoaXNSZXZpZXdlZCk7CisgICAgICBmaW5hbCBib29sZWFuIGlzUmV2aWV3ZWQgPSAhcmV2aWV3ZWRQYW5lbHMuZ2V0VmFsdWUoKTsKKyAgICAgIHJldmlld2VkUGFuZWxzLnNldFZhbHVlKGlzUmV2aWV3ZWQpOworICAgICAgcmV2aWV3ZWRQYW5lbHMuc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKGlzUmV2aWV3ZWQpOwogICAgIH0KICAgfQogCkBAIC02MzQsMTAgKzU1NSw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgIGlmIChyZXZpZXdlZExpbmsgIT0gbnVsbCkgewotICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodHJ1ZSk7Ci0gICAgICAgIHJldmlld2VkTGluay5nbygpOwotICAgICAgfQorICAgICAgcmV2aWV3ZWRQYW5lbHMuZ28oKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsLmphdmEKaW5kZXggYTY4OTI1OS4uOGU3NmU0NyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsLmphdmEKQEAgLTI3LDEwICsyNyw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuSGFzVmFsdWVDaGFuZ2VIYW5kbGVyczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUV2ZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLlZhbHVlQ2hhbmdlSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuSGFuZGxlclJlZ2lzdHJhdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlCaW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpSGFuZGxlcjsKQEAgLTQzLDE0ICszOSwxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKLXB1YmxpYyBjbGFzcyBQYXRjaFNjcmlwdFNldHRpbmdzUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cwotICAgIEhhc1ZhbHVlQ2hhbmdlSGFuZGxlcnM8QWNjb3VudERpZmZQcmVmZXJlbmNlPiB7CitwdWJsaWMgY2xhc3MgUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKICAgcHJpdmF0ZSBzdGF0aWMgTXlVaUJpbmRlciB1aUJpbmRlciA9IEdXVC5jcmVhdGUoTXlVaUJpbmRlci5jbGFzcyk7CiAKICAgaW50ZXJmYWNlIE15VWlCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxXaWRnZXQsIFBhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbD4gewogICB9CiAKLSAgcHJpdmF0ZSBMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlIGxpc3RlbmFibGVQcmVmczsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlIGxpc3RlbmFibGVQcmVmczsKICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZUludHJhbGluZURpZmZlcmVuY2UgPSB0cnVlOwogICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlU21hbGxGaWxlRmVhdHVyZXMgPSB0cnVlOwogCkBAIC0xMzksMTIgKzEzNCw2IEBACiAgICAgZGlzcGxheSgpOwogICB9CiAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBIYW5kbGVyUmVnaXN0cmF0aW9uIGFkZFZhbHVlQ2hhbmdlSGFuZGxlcigKLSAgICAgIFZhbHVlQ2hhbmdlSGFuZGxlcjxBY2NvdW50RGlmZlByZWZlcmVuY2U+IGhhbmRsZXIpIHsKLSAgICByZXR1cm4gc3VwZXIuYWRkSGFuZGxlcihoYW5kbGVyLCBWYWx1ZUNoYW5nZUV2ZW50LmdldFR5cGUoKSk7Ci0gIH0KLQogICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGZpbmFsIGJvb2xlYW4gb24pIHsKICAgICBpZiAob24pIHsKICAgICAgIHNldEVuYWJsZWRDb3VudGVyKys7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTZXRTZWxlY3RCb3guamF2YQppbmRleCBhZmFmN2ZkLi5kZjEyYjcwIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2V0U2VsZWN0Qm94LmphdmEKQEAgLTIxLDE4ICsyMSwyMCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRGl2RWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LlN0eWxlLkRpc3BsYXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkRvdWJsZUNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUJpbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlGaWVsZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTQ5LDcgKzUxLDkgQEAKIAogICAgIFN0cmluZyBoaWRkZW4oKTsKIAotICAgIFN0cmluZyBkb3dubG9hZExpbmsoKTsKKyAgICBTdHJpbmcgc2lkZU1hcmtlcigpOworCisgICAgU3RyaW5nIHBhdGNoU2V0TGFiZWwoKTsKICAgfQogCiAgIHB1YmxpYyBlbnVtIFNpZGUgewpAQCAtNjQsNiArNjgsNyBAQAogICBTaWRlIHNpZGU7CiAgIFBhdGNoU2NyZWVuLlR5cGUgc2NyZWVuVHlwZTsKICAgTWFwPEludGVnZXIsIEFuY2hvcj4gbGlua3M7CisgIHByaXZhdGUgTGFiZWwgcGF0Y2hTZXQ7CiAKICAgQFVpRmllbGQKICAgSFRNTFBhbmVsIGxpbmtQYW5lbDsKQEAgLTcxLDkgKzc2LDYgQEAKICAgQFVpRmllbGQKICAgQm94U3R5bGUgc3R5bGU7CiAKLSAgQFVpRmllbGQKLSAgRGl2RWxlbWVudCBzaWRlTWFya2VyOwotCiAgIHB1YmxpYyBQYXRjaFNldFNlbGVjdEJveChTaWRlIHNpZGUsIGZpbmFsIFBhdGNoU2NyZWVuLlR5cGUgdHlwZSkgewogICAgIHRoaXMuc2lkZSA9IHNpZGU7CiAgICAgdGhpcy5zY3JlZW5UeXBlID0gdHlwZTsKQEAgLTgxLDggKzgzLDggQEAKICAgICBpbml0V2lkZ2V0KHVpQmluZGVyLmNyZWF0ZUFuZEJpbmRVaSh0aGlzKSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBkaXNwbGF5KGZpbmFsIFBhdGNoU2V0RGV0YWlsIGRldGFpbCwgZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0LCBQYXRjaC5LZXkga2V5LAotICAgICAgUGF0Y2hTZXQuSWQgaWRTaWRlQSwgUGF0Y2hTZXQuSWQgaWRTaWRlQikgeworICBwdWJsaWMgdm9pZCBkaXNwbGF5KGZpbmFsIFBhdGNoU2V0RGV0YWlsIGRldGFpbCwgZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0LAorICAgICAgUGF0Y2guS2V5IGtleSwgUGF0Y2hTZXQuSWQgaWRTaWRlQSwgUGF0Y2hTZXQuSWQgaWRTaWRlQikgewogICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0OwogICAgIHRoaXMucGF0Y2hLZXkgPSBrZXk7CiAgICAgdGhpcy5pZFNpZGVBID0gaWRTaWRlQTsKQEAgLTkyLDEwICs5NCwxOCBAQAogCiAgICAgbGlua1BhbmVsLmNsZWFyKCk7CiAKKyAgICBpZiAoaXNGaWxlT3JDb21taXRNZXNzYWdlKCkpIHsKKyAgICAgIGxpbmtQYW5lbC5zZXRUaXRsZShQYXRjaFV0aWwuQy5hZGRGaWxlQ29tbWVudEJ5RG91YmxlQ2xpY2soKSk7CisgICAgfQorCisgICAgcGF0Y2hTZXQgPSBuZXcgTGFiZWwoUGF0Y2hVdGlsLkMucGF0Y2hTZXQoKSk7CisgICAgcGF0Y2hTZXQuYWRkU3R5bGVOYW1lKHN0eWxlLnBhdGNoU2V0TGFiZWwoKSk7CisgICAgbGlua1BhbmVsLmFkZChwYXRjaFNldCk7CisKICAgICBpZiAoc2NyZWVuVHlwZSA9PSBQYXRjaFNjcmVlbi5UeXBlLlVOSUZJRUQpIHsKLSAgICAgIHNpZGVNYXJrZXIuc2V0SW5uZXJUZXh0KChzaWRlID09IFNpZGUuQSkgPyAiKC0pIiA6ICIoKykiKTsKLSAgICB9IGVsc2UgewotICAgICAgc2lkZU1hcmtlci5nZXRTdHlsZSgpLnNldERpc3BsYXkoRGlzcGxheS5OT05FKTsKKyAgICAgIExhYmVsIHNpZGVNYXJrZXIgPSBuZXcgTGFiZWwoKHNpZGUgPT0gU2lkZS5BKSA/ICIoLSkiIDogIigrKSIpOworICAgICAgc2lkZU1hcmtlci5hZGRTdHlsZU5hbWUoc3R5bGUuc2lkZU1hcmtlcigpKTsKKyAgICAgIGxpbmtQYW5lbC5hZGQoc2lkZU1hcmtlcik7CiAgICAgfQogCiAgICAgQW5jaG9yIGJhc2VMaW5rID0gbnVsbDsKQEAgLTEzMyw2ICsxNDMsMTIgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0hhbmRsZXIoRG91YmxlQ2xpY2tIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICBsaW5rUGFuZWwuc2lua0V2ZW50cyhFdmVudC5PTkRCTENMSUNLKTsKKyAgICBsaW5rUGFuZWwuYWRkSGFuZGxlcihoYW5kbGVyLCBEb3VibGVDbGlja0V2ZW50LmdldFR5cGUoKSk7CisgICAgcGF0Y2hTZXQuYWRkRG91YmxlQ2xpY2tIYW5kbGVyKGhhbmRsZXIpOworICB9CisKICAgcHJpdmF0ZSBBbmNob3IgY3JlYXRlTGluayhTdHJpbmcgbGFiZWwsIGZpbmFsIFBhdGNoU2V0LklkIGlkKSB7CiAgICAgZmluYWwgQW5jaG9yIGFuY2hvciA9IG5ldyBBbmNob3IobGFiZWwpOwogICAgIGFuY2hvci5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKQEAgLTE2MSwxOCArMTc3LDIzIEBACiAgICAgcmV0dXJuIGFuY2hvcjsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpIHsKKyAgICByZXR1cm4gISgoc2lkZSA9PSBTaWRlLkEgJiYgMCA+PSBzY3JpcHQuZ2V0QSgpLnNpemUoKSkgfHwgLy8KKyAgICAoc2lkZSA9PSBTaWRlLkIgJiYgMCA+PSBzY3JpcHQuZ2V0QigpLnNpemUoKSkpOworICB9CisKICAgcHJpdmF0ZSBBbmNob3IgY3JlYXRlRG93bmxvYWRMaW5rKCkgewogICAgIGJvb2xlYW4gaXNDb21taXRNZXNzYWdlID0gUGF0Y2guQ09NTUlUX01TRy5lcXVhbHMoc2NyaXB0LmdldE5ld05hbWUoKSk7Ci0KLSAgICBpZiAoaXNDb21taXRNZXNzYWdlIHx8IChzaWRlID09IFNpZGUuQSAmJiAwID49IHNjcmlwdC5nZXRBKCkuc2l6ZSgpKQotICAgICAgICB8fCAoc2lkZSA9PSBTaWRlLkIgJiYgMCA+PSBzY3JpcHQuZ2V0QigpLnNpemUoKSkpIHsKKyAgICBpZiAoaXNDb21taXRNZXNzYWdlIHx8IC8vCisgICAgICAgIChzaWRlID09IFNpZGUuQSAmJiAwID49IHNjcmlwdC5nZXRBKCkuc2l6ZSgpKSB8fCAvLworICAgICAgICAoc2lkZSA9PSBTaWRlLkIgJiYgMCA+PSBzY3JpcHQuZ2V0QigpLnNpemUoKSkpIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIFBhdGNoLktleSBrZXkgPQotICAgICAgICAoaWRTaWRlQSA9PSBudWxsKSA/IHBhdGNoS2V5IDogKG5ldyBQYXRjaC5LZXkoaWRTaWRlQSwgcGF0Y2hLZXkuZ2V0KCkpKTsKKyAgICBQYXRjaC5LZXkga2V5ID0gKGlkQWN0aXZlID09IG51bGwpID8gLy8KKyAgICAgICAgcGF0Y2hLZXkgOiAobmV3IFBhdGNoLktleShpZEFjdGl2ZSwgcGF0Y2hLZXkuZ2V0KCkpKTsKIAotICAgIFN0cmluZyBzaWRlVVJMID0gKHNpZGUgPT0gU2lkZS5BKSA/ICIxIiA6ICIwIjsKKyAgICBTdHJpbmcgc2lkZVVSTCA9IChpZEFjdGl2ZSA9PSBudWxsKSA/ICIxIiA6ICIwIjsKICAgICBmaW5hbCBTdHJpbmcgYmFzZSA9IEdXVC5nZXRIb3N0UGFnZUJhc2VVUkwoKSArICJjYXQvIjsKIAogICAgIEltYWdlIGltYWdlID0gbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuZG93bmxvYWRJY29uKCkpOwpAQCAtMTgwLDcgKzIwMSw2IEBACiAgICAgZmluYWwgQW5jaG9yIGFuY2hvciA9IG5ldyBBbmNob3IoKTsKICAgICBhbmNob3Iuc2V0SHJlZihiYXNlICsgS2V5VXRpbC5lbmNvZGUoa2V5LnRvU3RyaW5nKCkpICsgIl4iICsgc2lkZVVSTCk7CiAgICAgYW5jaG9yLnNldFRpdGxlKFBhdGNoVXRpbC5DLmRvd25sb2FkKCkpOwotICAgIGFuY2hvci5zZXRTdHlsZU5hbWUoc3R5bGUuZG93bmxvYWRMaW5rKCkpOwogICAgIERPTS5pbnNlcnRCZWZvcmUoYW5jaG9yLmdldEVsZW1lbnQoKSwgaW1hZ2UuZ2V0RWxlbWVudCgpLAogICAgICAgICBET00uZ2V0Rmlyc3RDaGlsZChhbmNob3IuZ2V0RWxlbWVudCgpKSk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2V0U2VsZWN0Qm94LnVpLnhtbCBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2V0U2VsZWN0Qm94LnVpLnhtbAppbmRleCAyZmQxODNjLi4zMzhlOTUwIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC51aS54bWwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTZXRTZWxlY3RCb3gudWkueG1sCkBAIC0xNyw2MCArMTcsMzcgQEAKIAogPHVpOlVpQmluZGVyIHhtbG5zOnVpPSd1cm46dWk6Y29tLmdvb2dsZS5nd3QudWliaW5kZXInCiAgICAgeG1sbnM6Zz0ndXJuOmltcG9ydDpjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aSc+Ci0KLQogICA8dWk6d2l0aCBmaWVsZD0ncmVzJyB0eXBlPSdjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0UmVzb3VyY2VzJy8+Ci0gIDx1aTp3aXRoIGZpZWxkPSdjb25zJyB0eXBlPSdjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaENvbnN0YW50cycvPgogICA8dWk6c3R5bGUgdHlwZT0nY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hTZXRTZWxlY3RCb3guQm94U3R5bGUnPgogICAgIEBldmFsIHNlbGVjdGlvbkNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS5zZWxlY3Rpb25Db2xvcjsKLSAgICBAZXZhbCB0cmltQ29sb3IgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdC5nZXRUaGVtZSgpLnRyaW1Db2xvcjsKICAgICBAZXZhbCBiYWNrZ3JvdW5kQ29sb3IgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdC5nZXRUaGVtZSgpLmJhY2tncm91bmRDb2xvcjsKIAotICAgIC53cmFwcGVyIHsKLSAgICAgIHdpZHRoOiAxMDAlOwotICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgZm9udC1zaXplOiAwOyAvKiBpbmxpbmUtYmxvY2sgc3BhY2luZyBmaXggKi8KLSAgICB9Ci0KICAgICAubGlua1BhbmVsIHsKLSAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKKyAgICAgIGZvbnQtc2l6ZTogMTJweDsKKyAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgfQogCiAgICAgLmxpbmtQYW5lbCA+IGRpdiB7CisgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKKyAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKKyAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgICBmbG9hdDogbGVmdDsKLSAgICB9Ci0KLSAgICAubGlua1BhbmVsIHsKLSAgICAgIG92ZXJmbG93OiBoaWRkZW47IC8qIGRpdiBjbGVhciBmaXggKi8KLSAgICAgIGZvbnQtc2l6ZTogMTJweDsKLSAgICB9Ci0KLSAgICAubGlua1BhbmVsID4gYSB7Ci0gICAgICBwYWRkaW5nOiAzcHg7Ci0gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgICBmbG9hdDogbGVmdDsKICAgICB9CiAKICAgICAucGF0Y2hTZXRMYWJlbCB7CiAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgIGZsb2F0OiBsZWZ0OwotICAgICAgcGFkZGluZzogM3B4OwogICAgIH0KIAogICAgIC5zaWRlTWFya2VyIHsKLSAgICAgIHBhZGRpbmc6IDNweDsKKyAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgfQogCi0gICAgLmRvd25sb2FkTGluayB7Ci0gICAgICBmbG9hdDogbGVmdDsKLSAgICAgIHBhZGRpbmc6IDFweCAhaW1wb3J0YW50OwotICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKLSAgICB9Ci0KLSAgICAuZG93bmxvYWRMaW5rID4gYSB7Ci0gICAgICB0ZXh0LXNpemU6IDA7CisgICAgLmxpbmtQYW5lbCA+IGEgeworICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CisgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CisgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgIH0KIAogICAgIC5zZWxlY3RlZCB7CkBAIC03OCwyMSArNTUsMTMgQEAKICAgICAgIGJhY2tncm91bmQtY29sb3I6IHNlbGVjdGlvbkNvbG9yOwogICAgIH0KIAotICAgIC5zaWRlTWFya2VyIHsKLSAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0gICAgICBmbG9hdDogbGVmdDsKLSAgICB9Ci0KICAgICAuaGlkZGVuIHsKICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICB9CiAgIDwvdWk6c3R5bGU+CiAKLSAgPGc6SFRNTFBhbmVsIHN0eWxlTmFtZT0nd3JhcHBlcic+Ci0gICAgPGc6SFRNTFBhbmVsIHN0eWxlTmFtZT0ne3N0eWxlLmxpbmtQYW5lbH0nIHVpOmZpZWxkPSdsaW5rUGFuZWwnPgotICAgICAgPGRpdiBjbGFzcz0ne3N0eWxlLnBhdGNoU2V0TGFiZWx9Jz48dWk6dGV4dCBmcm9tPSJ7Y29ucy5wYXRjaFNldH0iIC8+PC9kaXY+Ci0gICAgICA8ZGl2IGNsYXNzPSd7c3R5bGUuc2lkZU1hcmtlcn0nIHVpOmZpZWxkPSdzaWRlTWFya2VyJz48L2Rpdj4KLSAgICA8L2c6SFRNTFBhbmVsPgorICA8ZzpIVE1MUGFuZWw+CisgICAgPGc6SFRNTFBhbmVsIHN0eWxlTmFtZT0ne3N0eWxlLmxpbmtQYW5lbH0nIHVpOmZpZWxkPSdsaW5rUGFuZWwnLz4KICAgPC9nOkhUTUxQYW5lbD4KIDwvdWk6VWlCaW5kZXI+CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoVGFibGVIZWFkZXIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoVGFibGVIZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkODkwOC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNjcmlwdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlCaW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpVGVtcGxhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ29tcG9zaXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TaW1wbGVQYW5lbDsKLQotcHVibGljIGNsYXNzIFBhdGNoVGFibGVIZWFkZXIgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0gIEBVaVRlbXBsYXRlKCJQYXRjaFRhYmxlSGVhZGVyU2lkZUJ5U2lkZS51aS54bWwiKQotICBpbnRlcmZhY2UgU2lkZUJ5U2lkZUJpbmRlciBleHRlbmRzIFVpQmluZGVyPEhUTUxQYW5lbCwgUGF0Y2hUYWJsZUhlYWRlcj4gewotICB9Ci0KLSAgQFVpVGVtcGxhdGUoIlBhdGNoVGFibGVIZWFkZXJVbmlmaWVkLnVpLnhtbCIpCi0gIGludGVyZmFjZSBVbmlmaWVkQmluZGVyIGV4dGVuZHMgVWlCaW5kZXI8SFRNTFBhbmVsLCBQYXRjaFRhYmxlSGVhZGVyPiB7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTaWRlQnlTaWRlQmluZGVyIHVpQmluZGVyUyA9IEdXVC5jcmVhdGUoU2lkZUJ5U2lkZUJpbmRlci5jbGFzcyk7Ci0gIHByaXZhdGUgc3RhdGljIFVuaWZpZWRCaW5kZXIgdWlCaW5kZXJVID0gR1dULmNyZWF0ZShVbmlmaWVkQmluZGVyLmNsYXNzKTsKLQotICBAVWlGaWVsZAotICBTaW1wbGVQYW5lbCBzaWRlQVBhbmVsOwotCi0gIEBVaUZpZWxkCi0gIFNpbXBsZVBhbmVsIHNpZGVCUGFuZWw7Ci0KLSAgUGF0Y2hTZXRTZWxlY3RCb3ggbGlzdEE7Ci0gIFBhdGNoU2V0U2VsZWN0Qm94IGxpc3RCOwotCi0gIHB1YmxpYyBQYXRjaFRhYmxlSGVhZGVyKFBhdGNoU2NyZWVuLlR5cGUgdHlwZSkgewotICAgIGxpc3RBID0gbmV3IFBhdGNoU2V0U2VsZWN0Qm94KFBhdGNoU2V0U2VsZWN0Qm94LlNpZGUuQSwgdHlwZSk7Ci0gICAgbGlzdEIgPSBuZXcgUGF0Y2hTZXRTZWxlY3RCb3goUGF0Y2hTZXRTZWxlY3RCb3guU2lkZS5CLCB0eXBlKTsKLQotICAgIGlmICh0eXBlID09IFBhdGNoU2NyZWVuLlR5cGUuU0lERV9CWV9TSURFKSB7Ci0gICAgICBpbml0V2lkZ2V0KHVpQmluZGVyUy5jcmVhdGVBbmRCaW5kVWkodGhpcykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbml0V2lkZ2V0KHVpQmluZGVyVS5jcmVhdGVBbmRCaW5kVWkodGhpcykpOwotICAgIH0KLQotICAgIHNpZGVBUGFuZWwuYWRkKGxpc3RBKTsKLSAgICBzaWRlQlBhbmVsLmFkZChsaXN0Qik7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsLCBQYXRjaFNjcmlwdCBzY3JpcHQsIGZpbmFsIFBhdGNoLktleSBwYXRjaEtleSwKLSAgICAgIGZpbmFsIFBhdGNoU2V0LklkIGlkU2lkZUEsIGZpbmFsIFBhdGNoU2V0LklkIGlkU2lkZUIpIHsKLSAgICBsaXN0QS5kaXNwbGF5KGRldGFpbCwgc2NyaXB0LCBwYXRjaEtleSwgaWRTaWRlQSwgaWRTaWRlQik7Ci0gICAgbGlzdEIuZGlzcGxheShkZXRhaWwsIHNjcmlwdCwgcGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyU2lkZUJ5U2lkZS51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyU2lkZUJ5U2lkZS51aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmQ3MTcuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclNpZGVCeVNpZGUudWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUNvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08dWk6VWlCaW5kZXIgeG1sbnM6dWk9J3Vybjp1aTpjb20uZ29vZ2xlLmd3dC51aWJpbmRlcicKLSAgICB4bWxuczpnPSd1cm46aW1wb3J0OmNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpJz4KLQotCi0gIDx1aTpzdHlsZT4KLSAgICBAZXZhbCB0cmltQ29sb3IgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdC5nZXRUaGVtZSgpLnRyaW1Db2xvcjsKLQotICAgIC53cmFwcGVyIHsKLSAgICAgIHdpZHRoOiAxMDAlOwotICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJpbUNvbG9yOwotICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgICAgIGZvbnQtc2l6ZTogMDsgLyogaW5saW5lLWJsb2NrIHNwYWNpbmcgZml4ICovCi0gICAgfQotCi0gICAgLndyYXBwZXIgLmJveCB7Ci0gICAgICB3aWR0aDogMTAwJTsKLSAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICB9Ci0KLSAgICAubGVmdFdyYXBwZXIgewotICAgICAgd2lkdGg6IDUwJTsKLSAgICAgIGZsb2F0OiBsZWZ0OwotICAgIH0KLQotICAgIC5yaWdodFdyYXBwZXIgewotICAgICAgd2lkdGg6IDUwJTsKLSAgICAgIG92ZXJmbG93OiBoaWRkZW47Ci0gICAgfQotCi0gICAgLmxlZnRCb3ggewotICAgICAgZmxvYXQ6bGVmdDsKLSAgICB9Ci0KLSAgICAucmlnaHRCb3ggewotICAgICAgZmxvYXQ6IHJpZ2h0OwotICAgIH0KLSAgPC91aTpzdHlsZT4KLQotICA8ZzpIVE1MUGFuZWwgc3R5bGVOYW1lPSJ7c3R5bGUud3JhcHBlcn0iPgotICAgIDxkaXYgY2xhc3M9J3tzdHlsZS5sZWZ0V3JhcHBlcn0nPgotICAgICAgPGc6U2ltcGxlUGFuZWwgYWRkU3R5bGVOYW1lcz0ne3N0eWxlLmJveH0ge3N0eWxlLmxlZnRCb3h9JyB1aTpmaWVsZD0nc2lkZUFQYW5lbCcvPgotICAgIDwvZGl2PgotICAgIDxkaXYgY2xhc3M9J3tzdHlsZS5yaWdodFdyYXBwZXJ9Jz4KLSAgICAgIDxnOlNpbXBsZVBhbmVsIGFkZFN0eWxlTmFtZXM9J3tzdHlsZS5ib3h9IHtzdHlsZS5yaWdodEJveH0nIHVpOmZpZWxkPSdzaWRlQlBhbmVsJy8+Ci0gICAgPC9kaXY+Ci0gIDwvZzpIVE1MUGFuZWw+Ci08L3VpOlVpQmluZGVyPgotCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyVW5pZmllZC51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyVW5pZmllZC51aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWNmYTMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclVuaWZpZWQudWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUNvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08dWk6VWlCaW5kZXIgeG1sbnM6dWk9J3Vybjp1aTpjb20uZ29vZ2xlLmd3dC51aWJpbmRlcicKLSAgICB4bWxuczpnPSd1cm46aW1wb3J0OmNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpJz4KLQotICA8dWk6c3R5bGU+Ci0gICAgQGV2YWwgdHJpbUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50cmltQ29sb3I7Ci0KLSAgICAud3JhcHBlciB7Ci0gICAgICB3aWR0aDogMTAwJTsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyaW1Db2xvcjsKLSAgICAgIGZvbnQtc2l6ZTogMDsgLyogaW5saW5lLWJsb2NrIHNwYWNpbmcgZml4ICovCi0gICAgfQotCi0gICAgLndyYXBwZXIgLmJveCB7Ci0gICAgICB3aWR0aDogMTAwJTsKLSAgICAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICAgICBtYXJnaW4tbGVmdDogM3B4OwotICAgIH0KLSAgPC91aTpzdHlsZT4KLQotICA8ZzpIVE1MUGFuZWwgc3R5bGVOYW1lPSJ7c3R5bGUud3JhcHBlcn0iPgotICAgIDxnOlNpbXBsZVBhbmVsIGFkZFN0eWxlTmFtZXM9J3tzdHlsZS5ib3h9JyB1aTpmaWVsZD0nc2lkZUFQYW5lbCcvPgotICAgIDxnOlNpbXBsZVBhbmVsIGFkZFN0eWxlTmFtZXM9J3tzdHlsZS5ib3h9JyB1aTpmaWVsZD0nc2lkZUJQYW5lbCcvPgotICA8L2c6SFRNTFBhbmVsPgotPC91aTpVaUJpbmRlcj4KLQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUmV2aWV3ZWRQYW5lbHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1Jldmlld2VkUGFuZWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1Jldmlld2VkUGFuZWxzLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlZvaWRSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUGF0Y2hUYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5QYXRjaFRhYmxlLlBhdGNoVmFsaWRhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CisKK3B1YmxpYyBjbGFzcyBSZXZpZXdlZFBhbmVscyB7CisKKyAgcHVibGljIGZpbmFsIEZsb3dQYW5lbCB0b3A7CisgIHB1YmxpYyBmaW5hbCBGbG93UGFuZWwgYm90dG9tOworCisgIHByaXZhdGUgUGF0Y2guS2V5IHBhdGNoS2V5OworICBwcml2YXRlIFBhdGNoVGFibGUgZmlsZUxpc3Q7CisgIHByaXZhdGUgSW5saW5lSHlwZXJsaW5rIHJldmlld2VkTGluazsKKyAgcHJpdmF0ZSBDaGVja0JveCBjaGVja0JveFRvcDsKKyAgcHJpdmF0ZSBDaGVja0JveCBjaGVja0JveEJvdHRvbTsKKworICBwdWJsaWMgUmV2aWV3ZWRQYW5lbHMoKSB7CisgICAgdGhpcy50b3AgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgdGhpcy5ib3R0b20gPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgdGhpcy5ib3R0b20uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmV2aWV3ZWRQYW5lbEJvdHRvbSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHBvcHVsYXRlKFBhdGNoLktleSBwaywgUGF0Y2hUYWJsZSBwdCwgaW50IHBhdGNoSW5kZXgsCisgICAgICBQYXRjaFNjcmVlbi5UeXBlIHBhdGNoU2NyZWVuVHlwZSkgeworICAgIHBhdGNoS2V5ID0gcGs7CisgICAgZmlsZUxpc3QgPSBwdDsKKyAgICByZXZpZXdlZExpbmsgPSBjcmVhdGVSZXZpZXdlZExpbmsocGF0Y2hJbmRleCwgcGF0Y2hTY3JlZW5UeXBlKTsKKworICAgIHRvcC5jbGVhcigpOworICAgIGNoZWNrQm94VG9wID0gY3JlYXRlUmV2aWV3ZWRDaGVja2JveCgpOworICAgIHRvcC5hZGQoY2hlY2tCb3hUb3ApOworICAgIHRvcC5hZGQoY3JlYXRlUmV2aWV3ZWRBbmNob3IoKSk7CisKKyAgICBib3R0b20uY2xlYXIoKTsKKyAgICBjaGVja0JveEJvdHRvbSA9IGNyZWF0ZVJldmlld2VkQ2hlY2tib3goKTsKKyAgICBib3R0b20uYWRkKGNoZWNrQm94Qm90dG9tKTsKKyAgICBib3R0b20uYWRkKGNyZWF0ZVJldmlld2VkQW5jaG9yKCkpOworICB9CisKKyAgcHJpdmF0ZSBDaGVja0JveCBjcmVhdGVSZXZpZXdlZENoZWNrYm94KCkgeworICAgIGZpbmFsIENoZWNrQm94IGNoZWNrQm94ID0gbmV3IENoZWNrQm94KFBhdGNoVXRpbC5DLnJldmlld2VkQW5kKCkgKyAiICIpOworICAgIGNoZWNrQm94LmFkZFZhbHVlQ2hhbmdlSGFuZGxlcihuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblZhbHVlQ2hhbmdlKFZhbHVlQ2hhbmdlRXZlbnQ8Qm9vbGVhbj4gZXZlbnQpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2YWx1ZSA9IGV2ZW50LmdldFZhbHVlKCk7CisgICAgICAgIHNldFJldmlld2VkQnlDdXJyZW50VXNlcih2YWx1ZSk7CisgICAgICAgIGlmIChjaGVja0JveFRvcC5nZXRWYWx1ZSgpICE9IHZhbHVlKSB7CisgICAgICAgICAgY2hlY2tCb3hUb3Auc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGVja0JveEJvdHRvbS5nZXRWYWx1ZSgpICE9IHZhbHVlKSB7CisgICAgICAgICAgY2hlY2tCb3hCb3R0b20uc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGNoZWNrQm94OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIGNoZWNrQm94VG9wLmdldFZhbHVlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBib29sZWFuIHZhbHVlKSB7CisgICAgY2hlY2tCb3hUb3Auc2V0VmFsdWUodmFsdWUpOworICAgIGNoZWNrQm94Qm90dG9tLnNldFZhbHVlKHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFJldmlld2VkQnlDdXJyZW50VXNlcihib29sZWFuIHJldmlld2VkKSB7CisgICAgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKKyAgICAgIGZpbGVMaXN0LnVwZGF0ZVJldmlld2VkU3RhdHVzKHBhdGNoS2V5LCByZXZpZXdlZCk7CisgICAgfQorCisgICAgUGF0Y2hTZXQuSWQgcHMgPSBwYXRjaEtleS5nZXRQYXJlbnRLZXkoKTsKKyAgICBSZXN0QXBpIGFwaSA9IG5ldyBSZXN0QXBpKCIvY2hhbmdlcy8iKS5pZChwcy5nZXRQYXJlbnRLZXkoKS5nZXQoKSkKKyAgICAgICAgLnZpZXcoInJldmlzaW9ucyIpLmlkKHBzLmdldCgpKQorICAgICAgICAudmlldygiZmlsZXMiKS5pZChwYXRjaEtleS5nZXRGaWxlTmFtZSgpKQorICAgICAgICAudmlldygicmV2aWV3ZWQiKTsKKworICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2IgPSBuZXcgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBhcmcwKSB7CisgICAgICAgIC8vIG5vcAorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAvLyBub3AKKyAgICAgIH0KKyAgICB9OworICAgIGlmIChyZXZpZXdlZCkgeworICAgICAgYXBpLnB1dChjYik7CisgICAgfSBlbHNlIHsKKyAgICAgIGFwaS5kZWxldGUoY2IpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGdvKCkgeworICAgIGlmIChyZXZpZXdlZExpbmsgIT0gbnVsbCkgeworICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKHRydWUpOworICAgICAgcmV2aWV3ZWRMaW5rLmdvKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBJbmxpbmVIeXBlcmxpbmsgY3JlYXRlUmV2aWV3ZWRMaW5rKGZpbmFsIGludCBwYXRjaEluZGV4LAorICAgICAgZmluYWwgUGF0Y2hTY3JlZW4uVHlwZSBwYXRjaFNjcmVlblR5cGUpIHsKKyAgICBmaW5hbCBQYXRjaFZhbGlkYXRvciB1bnJldmlld2VkVmFsaWRhdG9yID0gbmV3IFBhdGNoVmFsaWRhdG9yKCkgeworICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChQYXRjaCBwYXRjaCkgeworICAgICAgICByZXR1cm4gIXBhdGNoLmlzUmV2aWV3ZWRCeUN1cnJlbnRVc2VyKCk7CisgICAgICB9CisgICAgfTsKKworICAgIElubGluZUh5cGVybGluayByZXZpZXdlZExpbmsgPSBuZXcgQ2hhbmdlTGluaygiIiwgcGF0Y2hLZXkuZ2V0UGFyZW50S2V5KCkpOworICAgIGlmIChmaWxlTGlzdCAhPSBudWxsKSB7CisgICAgICBpbnQgbmV4dFVucmV2aWV3ZWRQYXRjaEluZGV4ID0KKyAgICAgICAgICBmaWxlTGlzdC5nZXROZXh0UGF0Y2gocGF0Y2hJbmRleCwgdHJ1ZSwgdW5yZXZpZXdlZFZhbGlkYXRvciwKKyAgICAgICAgICAgICAgZmlsZUxpc3QuUFJFRkVSRU5DRV9WQUxJREFUT1IpOworCisgICAgICBpZiAobmV4dFVucmV2aWV3ZWRQYXRjaEluZGV4ID4gLTEpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGludmlzaWJsZSBwYXRjaCBsaW5rIHRvIGNoYW5nZSBwYWdlCisgICAgICAgIHJldmlld2VkTGluayA9CisgICAgICAgICAgICBmaWxlTGlzdC5jcmVhdGVMaW5rKG5leHRVbnJldmlld2VkUGF0Y2hJbmRleCwgcGF0Y2hTY3JlZW5UeXBlLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICByZXZpZXdlZExpbmsuc2V0VGV4dCgiIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXZpZXdlZExpbms7CisgIH0KKworICBwcml2YXRlIEFuY2hvciBjcmVhdGVSZXZpZXdlZEFuY2hvcigpIHsKKyAgICBTYWZlSHRtbEJ1aWxkZXIgdGV4dCA9IG5ldyBTYWZlSHRtbEJ1aWxkZXIoKTsKKyAgICB0ZXh0LmFwcGVuZChQYXRjaFV0aWwuQy5uZXh0KCkpOworICAgIHRleHQuYXBwZW5kKFNhZmVIdG1sLmFzaXMoVXRpbC5DLm5leHRQYXRjaExpbmtJY29uKCkpKTsKKworICAgIEFuY2hvciByZXZpZXdlZEFuY2hvciA9IG5ldyBBbmNob3IoIiIpOworICAgIFNhZmVIdG1sLnNldChyZXZpZXdlZEFuY2hvciwgdGV4dCk7CisKKyAgICByZXZpZXdlZEFuY2hvci5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgIHNldFJldmlld2VkQnlDdXJyZW50VXNlcih0cnVlKTsKKyAgICAgICAgcmV2aWV3ZWRMaW5rLmdvKCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICByZXR1cm4gcmV2aWV3ZWRBbmNob3I7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1NpZGVCeVNpZGVUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvU2lkZUJ5U2lkZVRhYmxlLmphdmEKaW5kZXggZWM2M2E4My4uMTVhYjk1MSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvU2lkZUJ5U2lkZVRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvU2lkZUJ5U2lkZVRhYmxlLmphdmEKQEAgLTIzLDIzICsyMywyNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbW1lbnREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQuRmlsZU1vZGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLkVkaXRMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5TcGFyc2VIdG1sRmlsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRE9NOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkVsZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IYXNWZXJ0aWNhbEFsaWdubWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5VSU9iamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkVkaXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGNsYXNzIFNpZGVCeVNpZGVUYWJsZSBleHRlbmRzIEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQSA9IDI7CkBAIC00OCwxMCArNTEsMjEgQEAKIAogICBwcml2YXRlIFNwYXJzZUh0bWxGaWxlIGE7CiAgIHByaXZhdGUgU3BhcnNlSHRtbEZpbGUgYjsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlQ29tbWVudEJvcmRlclJvd0V4aXN0OworCisgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQSgpIHsKKyAgICBjcmVhdGVDb21tZW50RWRpdG9yKFJfSEVBRCArIDEsIEEsIFJfSEVBRCwgRklMRV9TSURFX0EpOworICAgIHJldHVybjsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQigpIHsKKyAgICBjcmVhdGVDb21tZW50RWRpdG9yKFJfSEVBRCArIDEsIEIsIFJfSEVBRCwgRklMRV9TSURFX0IpOworICAgIHJldHVybjsKKyAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkNlbGxEb3VibGVDbGljayhmaW5hbCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0gICAgaWYgKGNvbHVtbiA+IDAgJiYgZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CisgICAgaWYgKGNvbHVtbiA+IENfQVJST1cgJiYgZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CiAgICAgICBmaW5hbCBQYXRjaExpbmUgbGluZSA9IChQYXRjaExpbmUpIGdldFJvd0l0ZW0ocm93KTsKICAgICAgIGlmIChjb2x1bW4gPT0gMSB8fCBjb2x1bW4gPT0gQSkgewogICAgICAgICBjcmVhdGVDb21tZW50RWRpdG9yKHJvdyArIDEsIEEsIGxpbmUuZ2V0TGluZUEoKSwgKHNob3J0KSAwKTsKQEAgLTYzLDYgKzc3LDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25DZWxsU2luZ2xlQ2xpY2soaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIHN1cGVyLm9uQ2VsbFNpbmdsZUNsaWNrKHJvdywgY29sdW1uKTsKICAgICBpZiAoY29sdW1uID09IDEgfHwgY29sdW1uID09IDQpIHsKICAgICAgIG9uQ2VsbERvdWJsZUNsaWNrKHJvdywgY29sdW1uKTsKICAgICB9CkBAIC03NSwxMDYgKzkwLDEzOCBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHJlbmRlcihmaW5hbCBQYXRjaFNjcmlwdCBzY3JpcHQpIHsKLSAgICBhID0gZ2V0U3BhcnNlSHRtbEZpbGVBKHNjcmlwdCk7Ci0gICAgYiA9IGdldFNwYXJzZUh0bWxGaWxlQihzY3JpcHQpOworICBwcm90ZWN0ZWQgdm9pZCByZW5kZXIoZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0LCBmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwpIHsKICAgICBmaW5hbCBBcnJheUxpc3Q8T2JqZWN0PiBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwogICAgIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBuYyA9IG5ldyBTYWZlSHRtbEJ1aWxkZXIoKTsKLSAgICBmaW5hbCBib29sZWFuIGludHJhbGluZSA9Ci0gICAgICAgIHNjcmlwdC5nZXREaWZmUHJlZnMoKS5pc0ludHJhbGluZURpZmZlcmVuY2UoKQotICAgICAgICAgICAgJiYgc2NyaXB0Lmhhc0ludHJhbGluZURpZmZlcmVuY2UoKTsKLQotICAgIGlmIChzY3JpcHQuZ2V0RmlsZU1vZGVBKCkgIT0gRmlsZU1vZGUuRklMRQotICAgICAgICB8fCBzY3JpcHQuZ2V0RmlsZU1vZGVCKCkgIT0gRmlsZU1vZGUuRklMRSkgewotICAgICAgb3BlbkxpbmUobmMpOwotICAgICAgYXBwZW5kTW9kZUxpbmUobmMsIHNjcmlwdC5nZXRGaWxlTW9kZUEoKSk7Ci0gICAgICBhcHBlbmRNb2RlTGluZShuYywgc2NyaXB0LmdldEZpbGVNb2RlQigpKTsKLSAgICAgIGNsb3NlTGluZShuYyk7Ci0gICAgICBsaW5lcy5hZGQobnVsbCk7Ci0gICAgfQotCi0gICAgaW50IGxhc3RBID0gMDsKLSAgICBpbnQgbGFzdEIgPSAwOwotICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlV1MgPSBzY3JpcHQuaXNJZ25vcmVXaGl0ZXNwYWNlKCk7Ci0gICAgZm9yIChmaW5hbCBFZGl0TGlzdC5IdW5rIGh1bmsgOiBzY3JpcHQuZ2V0SHVua3MoKSkgewotICAgICAgaWYgKCFodW5rLmlzU3RhcnRPZkZpbGUoKSkgewotICAgICAgICBhcHBlbmRTa2lwTGluZShuYywgaHVuay5nZXRDdXJCKCkgLSBsYXN0Qik7Ci0gICAgICAgIGxpbmVzLmFkZChuZXcgU2tpcHBlZExpbmUobGFzdEEsIGxhc3RCLCBodW5rLmdldEN1ckIoKSAtIGxhc3RCKSk7CisgICAgYWxsb2NhdGVUYWJsZUhlYWRlcihzY3JpcHQsIG5jKTsKKyAgICBsaW5lcy5hZGQobnVsbCk7CisgICAgaWYgKCFpc0Rpc3BsYXlCaW5hcnkpIHsKKyAgICAgIGlmIChzY3JpcHQuZ2V0RmlsZU1vZGVBKCkgIT0gRmlsZU1vZGUuRklMRQorICAgICAgICAgIHx8IHNjcmlwdC5nZXRGaWxlTW9kZUIoKSAhPSBGaWxlTW9kZS5GSUxFKSB7CisgICAgICAgIG9wZW5MaW5lKG5jKTsKKyAgICAgICAgYXBwZW5kTW9kZUxpbmUobmMsIHNjcmlwdC5nZXRGaWxlTW9kZUEoKSk7CisgICAgICAgIGFwcGVuZE1vZGVMaW5lKG5jLCBzY3JpcHQuZ2V0RmlsZU1vZGVCKCkpOworICAgICAgICBjbG9zZUxpbmUobmMpOworICAgICAgICBsaW5lcy5hZGQobnVsbCk7CiAgICAgICB9CiAKLSAgICAgIHdoaWxlIChodW5rLm5leHQoKSkgewotICAgICAgICBpZiAoaHVuay5pc0NvbnRleHRMaW5lKCkpIHsKLSAgICAgICAgICBvcGVuTGluZShuYyk7Ci0gICAgICAgICAgZmluYWwgU2FmZUh0bWwgY3R4ID0gYS5nZXRTYWZlSHRtbExpbmUoaHVuay5nZXRDdXJBKCkpOwotICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQSgpLCBmYWxzZSk7Ci0gICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIENPTlRFWFQsIGN0eCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICBpZiAoaWdub3JlV1MgJiYgYi5jb250YWlucyhodW5rLmdldEN1ckIoKSkpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBDT05URVhULCBiLCBodW5rLmdldEN1ckIoKSwgZmFsc2UpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgQ09OVEVYVCwgY3R4LCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckIoKSwgdHJ1ZSk7Ci0gICAgICAgICAgY2xvc2VMaW5lKG5jKTsKLSAgICAgICAgICBodW5rLmluY0JvdGgoKTsKLSAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShDT05URVhULCBodW5rLmdldEN1ckEoKSwgaHVuay5nZXRDdXJCKCkpKTsKLQotICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNNb2RpZmllZExpbmUoKSkgewotICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVsID0gaHVuay5pc0RlbGV0ZWRBKCk7Ci0gICAgICAgICAgZmluYWwgYm9vbGVhbiBpbnMgPSBodW5rLmlzSW5zZXJ0ZWRCKCk7Ci0gICAgICAgICAgZmluYWwgYm9vbGVhbiBmdWxsID0KLSAgICAgICAgICAgICAgaW50cmFsaW5lICYmIGh1bmsuZ2V0Q3VyRWRpdCgpLmdldFR5cGUoKSAhPSBFZGl0LlR5cGUuUkVQTEFDRTsKLSAgICAgICAgICBvcGVuTGluZShuYyk7Ci0KLSAgICAgICAgICBpZiAoZGVsKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckEoKSwgZmFsc2UpOwotICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIERFTEVURSwgYSwgaHVuay5nZXRDdXJBKCksIGZ1bGwpOwotICAgICAgICAgICAgaHVuay5pbmNBKCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChodW5rLmdldEN1ckVkaXQoKS5nZXRUeXBlKCkgPT0gRWRpdC5UeXBlLlJFUExBQ0UpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGZhbHNlKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOb25lKG5jLCBERUxFVEUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgQ09OVEVYVCk7CisgICAgICBpZiAoaGFzRGlmZmVyZW5jZXMoc2NyaXB0KSkgeworICAgICAgICBpbnQgbGFzdEEgPSAwOworICAgICAgICBpbnQgbGFzdEIgPSAwOworICAgICAgICBmaW5hbCBib29sZWFuIGlnbm9yZVdTID0gc2NyaXB0LmlzSWdub3JlV2hpdGVzcGFjZSgpOworICAgICAgICBhID0gZ2V0U3BhcnNlSHRtbEZpbGVBKHNjcmlwdCk7CisgICAgICAgIGIgPSBnZXRTcGFyc2VIdG1sRmlsZUIoc2NyaXB0KTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpbnRyYWxpbmUgPQorICAgICAgICAgICAgc2NyaXB0LmdldERpZmZQcmVmcygpLmlzSW50cmFsaW5lRGlmZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgJiYgc2NyaXB0Lmhhc0ludHJhbGluZURpZmZlcmVuY2UoKTsKKyAgICAgICAgZm9yIChmaW5hbCBFZGl0TGlzdC5IdW5rIGh1bmsgOiBzY3JpcHQuZ2V0SHVua3MoKSkgeworICAgICAgICAgIGlmICghaHVuay5pc1N0YXJ0T2ZGaWxlKCkpIHsKKyAgICAgICAgICAgIGFwcGVuZFNraXBMaW5lKG5jLCBodW5rLmdldEN1ckIoKSAtIGxhc3RCKTsKKyAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgU2tpcHBlZExpbmUobGFzdEEsIGxhc3RCLCBodW5rLmdldEN1ckIoKSAtIGxhc3RCKSk7CiAgICAgICAgICAgfQogCi0gICAgICAgICAgaWYgKGlucykgewotICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIElOU0VSVCwgYiwgaHVuay5nZXRDdXJCKCksIGZ1bGwpOwotICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJCKCksIHRydWUpOwotICAgICAgICAgICAgaHVuay5pbmNCKCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChodW5rLmdldEN1ckVkaXQoKS5nZXRUeXBlKCkgPT0gRWRpdC5UeXBlLlJFUExBQ0UpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOb25lKG5jLCBJTlNFUlQpOwotICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgdHJ1ZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOb25lKG5jLCBDT05URVhUKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIHRydWUpOworICAgICAgICAgIHdoaWxlIChodW5rLm5leHQoKSkgeworICAgICAgICAgICAgaWYgKGh1bmsuaXNDb250ZXh0TGluZSgpKSB7CisgICAgICAgICAgICAgIG9wZW5MaW5lKG5jKTsKKyAgICAgICAgICAgICAgZmluYWwgU2FmZUh0bWwgY3R4ID0gYS5nZXRTYWZlSHRtbExpbmUoaHVuay5nZXRDdXJBKCkpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckEoKSwgZmFsc2UpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgQ09OVEVYVCwgY3R4LCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICBpZiAoaWdub3JlV1MgJiYgYi5jb250YWlucyhodW5rLmdldEN1ckIoKSkpIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgQ09OVEVYVCwgYiwgaHVuay5nZXRDdXJCKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgQ09OVEVYVCwgY3R4LCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQigpLCB0cnVlKTsKKyAgICAgICAgICAgICAgY2xvc2VMaW5lKG5jKTsKKyAgICAgICAgICAgICAgaHVuay5pbmNCb3RoKCk7CisgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKENPTlRFWFQsIGh1bmsuZ2V0Q3VyQSgpLCBodW5rLmdldEN1ckIoKSkpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNNb2RpZmllZExpbmUoKSkgeworICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbCA9IGh1bmsuaXNEZWxldGVkQSgpOworICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlucyA9IGh1bmsuaXNJbnNlcnRlZEIoKTsKKyAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmdWxsID0KKyAgICAgICAgICAgICAgICAgIGludHJhbGluZSAmJiBodW5rLmdldEN1ckVkaXQoKS5nZXRUeXBlKCkgIT0gRWRpdC5UeXBlLlJFUExBQ0U7CisgICAgICAgICAgICAgIG9wZW5MaW5lKG5jKTsKKworICAgICAgICAgICAgICBpZiAoZGVsKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJBKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgREVMRVRFLCBhLCBodW5rLmdldEN1ckEoKSwgZnVsbCk7CisgICAgICAgICAgICAgICAgaHVuay5pbmNBKCk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHVuay5nZXRDdXJFZGl0KCkuZ2V0VHlwZSgpID09IEVkaXQuVHlwZS5SRVBMQUNFKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgZmFsc2UpOworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOb25lKG5jLCBERUxFVEUpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgQ09OVEVYVCk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoaW5zKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIElOU0VSVCwgYiwgaHVuay5nZXRDdXJCKCksIGZ1bGwpOworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQigpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBodW5rLmluY0IoKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChodW5rLmdldEN1ckVkaXQoKS5nZXRUeXBlKCkgPT0gRWRpdC5UeXBlLlJFUExBQ0UpIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgSU5TRVJUKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCB0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgdHJ1ZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjbG9zZUxpbmUobmMpOworCisgICAgICAgICAgICAgIGlmIChkZWwgJiYgaW5zKSB7CisgICAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoUkVQTEFDRSwgaHVuay5nZXRDdXJBKCksIGh1bmsuZ2V0Q3VyQigpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsKSB7CisgICAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoREVMRVRFLCBodW5rLmdldEN1ckEoKSwgLTEpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnMpIHsKKyAgICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShJTlNFUlQsIC0xLCBodW5rLmdldEN1ckIoKSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotCi0gICAgICAgICAgY2xvc2VMaW5lKG5jKTsKLQotICAgICAgICAgIGlmIChkZWwgJiYgaW5zKSB7Ci0gICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShSRVBMQUNFLCBodW5rLmdldEN1ckEoKSwgaHVuay5nZXRDdXJCKCkpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGRlbCkgewotICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoREVMRVRFLCBodW5rLmdldEN1ckEoKSwgMCkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaW5zKSB7Ci0gICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShJTlNFUlQsIDAsIGh1bmsuZ2V0Q3VyQigpKSk7CisgICAgICAgICAgbGFzdEEgPSBodW5rLmdldEN1ckEoKTsKKyAgICAgICAgICBsYXN0QiA9IGh1bmsuZ2V0Q3VyQigpOworICAgICAgICB9CisgICAgICAgIGlmIChsYXN0QiAhPSBiLnNpemUoKSkgeworICAgICAgICAgIGFwcGVuZFNraXBMaW5lKG5jLCBiLnNpemUoKSAtIGxhc3RCKTsKKyAgICAgICAgICBsaW5lcy5hZGQobmV3IFNraXBwZWRMaW5lKGxhc3RBLCBsYXN0QiwgYi5zaXplKCkgLSBsYXN0QikpOworICAgICAgICB9CisgICAgICB9CisgICAgfWVsc2V7CisgICAgICAvLyBEaXNwbGF5IHRoZSBwYXRjaCBoZWFkZXIgZm9yIGJpbmFyeQorICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbGluZSA6IHNjcmlwdC5nZXRQYXRjaEhlYWRlcigpKSB7CisgICAgICAgIGFwcGVuZEZpbGVIZWFkZXIobmMsIGxpbmUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWhhc0RpZmZlcmVuY2VzKHNjcmlwdCkpIHsKKyAgICAgIGFwcGVuZE5vRGlmZmVyZW5jZXMobmMpOworICAgIH0KKyAgICByZXNldEh0bWwobmMpOworICAgIHBvcHVsYXRlVGFibGVIZWFkZXIoc2NyaXB0LCBkZXRhaWwpOworICAgIGlmIChoYXNEaWZmZXJlbmNlcyhzY3JpcHQpKSB7CisgICAgICBpbml0U2NyaXB0KHNjcmlwdCk7CisgICAgICBpZiAoIWlzRGlzcGxheUJpbmFyeSkgeworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBsaW5lcy5zaXplKCk7IHJvdysrKSB7CisgICAgICAgICAgc2V0Um93SXRlbShyb3csIGxpbmVzLmdldChyb3cpKTsKKyAgICAgICAgICBpZiAobGluZXMuZ2V0KHJvdykgaW5zdGFuY2VvZiBTa2lwcGVkTGluZSkgeworICAgICAgICAgICAgY3JlYXRlU2tpcExpbmUocm93LCAoU2tpcHBlZExpbmUpIGxpbmVzLmdldChyb3cpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGxhc3RBID0gaHVuay5nZXRDdXJBKCk7Ci0gICAgICBsYXN0QiA9IGh1bmsuZ2V0Q3VyQigpOwogICAgIH0KLSAgICBpZiAobGFzdEIgIT0gYi5zaXplKCkpIHsKLSAgICAgIGFwcGVuZFNraXBMaW5lKG5jLCBiLnNpemUoKSAtIGxhc3RCKTsKLSAgICAgIGxpbmVzLmFkZChuZXcgU2tpcHBlZExpbmUobGFzdEEsIGxhc3RCLCBiLnNpemUoKSAtIGxhc3RCKSk7Ci0gICAgfQotICAgIHJlc2V0SHRtbChuYyk7Ci0gICAgaW5pdFNjcmlwdChzY3JpcHQpOworICB9CiAKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBsaW5lcy5zaXplKCk7IHJvdysrKSB7Ci0gICAgICBzZXRSb3dJdGVtKHJvdywgbGluZXMuZ2V0KHJvdykpOwotICAgICAgaWYgKGxpbmVzLmdldChyb3cpIGluc3RhbmNlb2YgU2tpcHBlZExpbmUpIHsKLSAgICAgICAgY3JlYXRlU2tpcExpbmUocm93LCAoU2tpcHBlZExpbmUpIGxpbmVzLmdldChyb3cpKTsKLSAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVIZWFkZXIoZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0LAorICAgICAgZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CisgICAgaW5pdEhlYWRlcnMoc2NyaXB0LCBkZXRhaWwpOworICAgIHRhYmxlLnNldFdpZGdldChSX0hFQUQsIEEsIGhlYWRlclNpZGVBKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQoUl9IRUFELCBCLCBoZWFkZXJTaWRlQik7CisKKyAgICAvLyBQb3B1bGF0ZSBpY29ucyB0byBsaW5lTnVtYmVyIGNvbHVtbiBoZWFkZXIuCisgICAgaWYgKGhlYWRlclNpZGVBLmlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQoUl9IRUFELCBBIC0gMSwgaWNvbkEpOworICAgIH0KKyAgICBpZiAoaGVhZGVyU2lkZUIuaXNGaWxlT3JDb21taXRNZXNzYWdlKCkpIHsKKyAgICAgIHRhYmxlLnNldFdpZGdldChSX0hFQUQsIEIgKyAxLCBpY29uQik7CiAgICAgfQogICB9CiAKQEAgLTIwMiw2ICsyNDksMTEgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgUGF0Y2hTY3JlZW4uVHlwZSBnZXRQYXRjaFNjcmVlblR5cGUoKSB7CisgICAgcmV0dXJuIFBhdGNoU2NyZWVuLlR5cGUuU0lERV9CWV9TSURFOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgQ29tbWVudERldGFpbCBjZCwgYm9vbGVhbiBleHBhbmRDb21tZW50cykgewogICAgIGlmIChjZC5pc0VtcHR5KCkpIHsKICAgICAgIHJldHVybjsKQEAgLTIwOSw1MSArMjYxLDE2MyBAQAogICAgIHNldEFjY291bnRJbmZvQ2FjaGUoY2QuZ2V0QWNjb3VudHMoKSk7CiAKICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpOykgewotICAgICAgaWYgKGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgeworICAgICAgZmluYWwgSXRlcmF0b3I8UGF0Y2hMaW5lQ29tbWVudD4gYWk7CisgICAgICBmaW5hbCBJdGVyYXRvcjxQYXRjaExpbmVDb21tZW50PiBiaTsKKworICAgICAgaWYgKHJvdyA9PSBSX0hFQUQpIHsKKyAgICAgICAgYWkgPSBjZC5nZXRGb3JBKFJfSEVBRCkuaXRlcmF0b3IoKTsKKyAgICAgICAgYmkgPSBjZC5nZXRGb3JCKFJfSEVBRCkuaXRlcmF0b3IoKTsKKyAgICAgIH0gZWxzZSBpZiAoZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CiAgICAgICAgIGZpbmFsIFBhdGNoTGluZSBwTGluZSA9IChQYXRjaExpbmUpIGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBmb3JhID0gY2QuZ2V0Rm9yQShwTGluZS5nZXRMaW5lQSgpKTsKLSAgICAgICAgZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBmb3JiID0gY2QuZ2V0Rm9yQihwTGluZS5nZXRMaW5lQigpKTsKLSAgICAgICAgcm93Kys7Ci0KLSAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0Y2hMaW5lQ29tbWVudD4gYWkgPSBmb3JhLml0ZXJhdG9yKCk7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+IGJpID0gZm9yYi5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYWkuaGFzTmV4dCgpICYmIGJpLmhhc05leHQoKSkgewotICAgICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYWMgPSBhaS5uZXh0KCk7Ci0gICAgICAgICAgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBiYyA9IGJpLm5leHQoKTsKLSAgICAgICAgICBpbnNlcnRSb3cocm93KTsKLSAgICAgICAgICBiaW5kQ29tbWVudChyb3csIEEsIGFjLCAhYWkuaGFzTmV4dCgpLCBleHBhbmRDb21tZW50cyk7Ci0gICAgICAgICAgYmluZENvbW1lbnQocm93LCBCLCBiYywgIWJpLmhhc05leHQoKSwgZXhwYW5kQ29tbWVudHMpOwotICAgICAgICAgIHJvdysrOwotICAgICAgICB9Ci0KLSAgICAgICAgcm93ID0gZmluaXNoKGFpLCByb3csIEEsIGV4cGFuZENvbW1lbnRzKTsKLSAgICAgICAgcm93ID0gZmluaXNoKGJpLCByb3csIEIsIGV4cGFuZENvbW1lbnRzKTsKKyAgICAgICAgYWkgPSBjZC5nZXRGb3JBKHBMaW5lLmdldExpbmVBKCkpLml0ZXJhdG9yKCk7CisgICAgICAgIGJpID0gY2QuZ2V0Rm9yQihwTGluZS5nZXRMaW5lQigpKS5pdGVyYXRvcigpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgcm93Kys7CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQorCisgICAgICByb3crKzsKKyAgICAgIHdoaWxlIChhaS5oYXNOZXh0KCkgJiYgYmkuaGFzTmV4dCgpKSB7CisgICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYWMgPSBhaS5uZXh0KCk7CisgICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYmMgPSBiaS5uZXh0KCk7CisgICAgICAgIGlmIChhYy5nZXRMaW5lKCkgPT0gUl9IRUFEKSB7CisgICAgICAgICAgaW5zZXJ0RmlsZUNvbW1lbnRSb3cocm93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgICAgfQorICAgICAgICBiaW5kQ29tbWVudChyb3csIEEsIGFjLCAhYWkuaGFzTmV4dCgpLCBleHBhbmRDb21tZW50cyk7CisgICAgICAgIGJpbmRDb21tZW50KHJvdywgQiwgYmMsICFiaS5oYXNOZXh0KCksIGV4cGFuZENvbW1lbnRzKTsKKyAgICAgICAgcm93Kys7CisgICAgICB9CisKKyAgICAgIHJvdyA9IGZpbmlzaChhaSwgcm93LCBBLCBleHBhbmRDb21tZW50cyk7CisgICAgICByb3cgPSBmaW5pc2goYmksIHJvdywgQiwgZXhwYW5kQ29tbWVudHMpOwogICAgIH0KICAgfQogCisgIHByaXZhdGUgdm9pZCBkZWZhdWx0U3R5bGUoZmluYWwgaW50IHJvdywgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQpIHsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSAtIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKKyAgICBpZiAoaXNEaXNwbGF5QmluYXJ5KSB7CisgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dEZvckJpbmFyeUluU2lkZUJ5U2lkZSgpKTsKKyAgICB9CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEIgKyAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEIgKyAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnJpZ2h0bW9zdCgpKTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBpbnNlcnRSb3coZmluYWwgaW50IHJvdykgewogICAgIHN1cGVyLmluc2VydFJvdyhyb3cpOwogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBBIC0gMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBBLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBCLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBCICsgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIGRlZmF1bHRTdHlsZShyb3csIGZtdCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RmlsZUNvbW1lbnRSb3coZmluYWwgaW50IHJvdykgeworICAgIHRhYmxlLmluc2VydFJvdyhyb3cpOworICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0FSUk9XLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpKTsKKyAgICBkZWZhdWx0U3R5bGUocm93LCBmbXQpOworCisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfQVJST1csIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSAtIDEsIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQiArIDEsIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpKTsKKyAgICBjcmVhdGVGaWxlQ29tbWVudEJvcmRlclJvdyhyb3cpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVDb21tZW50Qm9yZGVyUm93KGZpbmFsIGludCByb3cpIHsKKyAgICBpZiAocm93ID09IDEgJiYgIWlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdCkgeworICAgICAgaXNGaWxlQ29tbWVudEJvcmRlclJvd0V4aXN0ID0gdHJ1ZTsKKyAgICAgIHRhYmxlLmluc2VydFJvdyhSX0hFQUQgKyAyKTsKKworICAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CisKKyAgICAgIGZtdC5hZGRTdHlsZU5hbWUoUl9IRUFEICsgMiwgQ19BUlJPVywgLy8KKyAgICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpKTsKKyAgICAgIGRlZmF1bHRTdHlsZShSX0hFQUQgKyAyLCBmbXQpOworCisgICAgICBmaW5hbCBFbGVtZW50IGljb25DZWxsID0gZm10LmdldEVsZW1lbnQoUl9IRUFEICsgMiwgQ19BUlJPVyk7CisgICAgICBVSU9iamVjdC5zZXRTdHlsZU5hbWUoRE9NLmdldFBhcmVudChpY29uQ2VsbCksIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkKKyAgICAgICAgICAuZmlsZUNvbW1lbnRCb3JkZXIoKSwgdHJ1ZSk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSBpbnQgZmluaXNoKGZpbmFsIEl0ZXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+IGksIGludCByb3csIGZpbmFsIGludCBjb2wsIGJvb2xlYW4gZXhwYW5kQ29tbWVudCkgewogICAgIHdoaWxlIChpLmhhc05leHQoKSkgewogICAgICAgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBjID0gaS5uZXh0KCk7Ci0gICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIGlmIChjLmdldExpbmUoKSA9PSBSX0hFQUQpIHsKKyAgICAgICAgaW5zZXJ0RmlsZUNvbW1lbnRSb3cocm93KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluc2VydFJvdyhyb3cpOworICAgICAgfQogICAgICAgYmluZENvbW1lbnQocm93LCBjb2wsIGMsICFpLmhhc05leHQoKSwgZXhwYW5kQ29tbWVudCk7CiAgICAgICByb3crKzsKICAgICB9CiAgICAgcmV0dXJuIHJvdzsKICAgfQogCisgIHByaXZhdGUgdm9pZCBhbGxvY2F0ZVRhYmxlSGVhZGVyKFBhdGNoU2NyaXB0IHNjcmlwdCwgZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKKyAgICBtLm9wZW5UcigpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLm5ic3AoKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29sdW1uSGVhZGVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUxpbmUoKSk7CisgICAgbS5jbG9zZVRkKCk7CisKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVMaW5lKCkpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29sdW1uSGVhZGVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRtb3N0KCkpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5jbG9zZVRyKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXBwZW5kRmlsZUhlYWRlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgU3RyaW5nIGxpbmUpIHsKKyAgICBtLm9wZW5UcigpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgbS5uYnNwKCk7CisgICAgbS5jbG9zZVRkKCk7CisKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2lkZUJ5U2lkZVRhYmxlQmluYXJ5SGVhZGVyKCkpOworICAgIG0uc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgMik7CisgICAgbS5hcHBlbmQobGluZSk7CisgICAgbS5jbG9zZVRkKCk7CisKKyAgICBtLm9wZW5UZCgpOworICAgIG0ubmJzcCgpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5jbG9zZVRyKCk7CisgIH0KKwogICBwcml2YXRlIHZvaWQgYXBwZW5kU2tpcExpbmUoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGZpbmFsIGludCBza2lwQ250KSB7CiAgICAgbS5vcGVuVHIoKTsKIApAQCAtMzEwLDkgKzQ3NCw3IEBACiAKICAgICBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKICAgICBmb3IgKGludCBpID0gMCArIG9mZnNldDsgaSA8IGxvb3BUbyArIG9mZnNldDsgaSsrKSB7Ci0gICAgICAvLyBUaGUgb3ZlcnJpZGRlbiB2ZXJzaW9uIG9mIGluc2VydFJvdyBhZGRzIHNvbWUgY3NzIGNsYXNzZXMgd2UgZG9uJ3QKLSAgICAgIC8vIHdhbnQuCi0gICAgICBzdXBlci5pbnNlcnRSb3cocm93ICsgaSk7CisgICAgICBpbnNlcnRSb3cocm93ICsgaSk7CiAgICAgICB0YWJsZS5nZXRSb3dGb3JtYXR0ZXIoKS5zZXRWZXJ0aWNhbEFsaWduKHJvdyArIGksCiAgICAgICAgICAgSGFzVmVydGljYWxBbGlnbm1lbnQuQUxJR05fVE9QKTsKICAgICAgIGludCBsaW5lQSA9IGxpbmUuZ2V0U3RhcnRBKCkgKyBpOwpAQCAtNDM4LDYgKzYwMCw4IEBACiAgICAgICAgICAgbS5hZGRTdHlsZU5hbWUoIndkaSIpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVBMQUNFOgorICAgICAgICBicmVhazsKICAgICB9CiAgICAgbS5hcHBlbmQobGluZUh0bWwpOwogICAgIG0uY2xvc2VUZCgpOwpAQCAtNDYzLDQgKzYyNywxMyBAQAogICBwcml2YXRlIHZvaWQgY2xvc2VMaW5lKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CiAgICAgbS5jbG9zZVRyKCk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveUNvbW1lbnRSb3coZmluYWwgaW50IHJvdykgeworICAgIHN1cGVyLmRlc3Ryb3lDb21tZW50Um93KHJvdyk7CisgICAgaWYgKHJvdyA9PSBSX0hFQUQgKyAxKSB7CisgICAgICB0YWJsZS5yZW1vdmVSb3cocm93KTsKKyAgICAgIGlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdCA9IGZhbHNlOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvVW5pZmllZERpZmZUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvVW5pZmllZERpZmZUYWJsZS5qYXZhCmluZGV4IGYwZjYxOWUuLjgyZGY1NGEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1VuaWZpZWREaWZmVGFibGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9VbmlmaWVkRGlmZlRhYmxlLmphdmEKQEAgLTIyLDEyICsyMiwxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbW1lbnREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQuRGlzcGxheU1ldGhvZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldERldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wcmV0dGlmeS5jb21tb24uRWRpdExpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLkVkaXRMaXN0Lkh1bms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLlNwYXJzZUh0bWxGaWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlVJT2JqZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxUYWJsZS5DZWxsRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKQEAgLTQ4LDkgKzUzLDE0IEBACiAgICAgICAgIH0KICAgICAgIH07CiAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlQ29tbWVudEJvcmRlclJvd0V4aXN0OworICAvLyBDdXJzb3JzLgorICBwcm90ZWN0ZWQgaW50IHJvd09mVGFibGVIZWFkZXJCOworICBwcm90ZWN0ZWQgaW50IGJvcmRlclJvd09mRmlsZUNvbW1lbnQ7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uQ2VsbERvdWJsZUNsaWNrKGZpbmFsIGludCByb3csIGZpbmFsIGludCBjb2x1bW4pIHsKLSAgICBpZiAoZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CisgICAgaWYgKGNvbHVtbiA+IENfQVJST1cgJiYgZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CiAgICAgICBmaW5hbCBQYXRjaExpbmUgcGwgPSAoUGF0Y2hMaW5lKSBnZXRSb3dJdGVtKHJvdyk7CiAgICAgICBzd2l0Y2ggKHBsLmdldFR5cGUoKSkgewogICAgICAgICBjYXNlIERFTEVURToKQEAgLTYwLDEyICs3MCw0MiBAQAogICAgICAgICBjYXNlIElOU0VSVDoKICAgICAgICAgICBjcmVhdGVDb21tZW50RWRpdG9yKHJvdyArIDEsIFBDLCBwbC5nZXRMaW5lQigpLCAoc2hvcnQpIDEpOwogICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFUExBQ0U6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUN1cnNvcihmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQpIHsKKyAgICBpZiAobmV3Q29tbWVudC5nZXRMaW5lKCkgPT0gUl9IRUFEKSB7CisgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc0lkID0KKyAgICAgICAgICBuZXdDb21tZW50LmdldEtleSgpLmdldFBhcmVudEtleSgpLmdldFBhcmVudEtleSgpOworICAgICAgc3dpdGNoIChuZXdDb21tZW50LmdldFNpZGUoKSkgeworICAgICAgICBjYXNlIEZJTEVfU0lERV9BOgorICAgICAgICAgIGlmIChpZFNpZGVBID09IG51bGwgJiYgaWRTaWRlQi5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIHJvd09mVGFibGVIZWFkZXJCKys7CisgICAgICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50Kys7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTEVfU0lERV9COgorICAgICAgICAgIGlmIChpZFNpZGVBICE9IG51bGwgJiYgaWRTaWRlQS5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIHJvd09mVGFibGVIZWFkZXJCKys7CisgICAgICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50Kys7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpZFNpZGVCLmVxdWFscyhwc0lkKSkgeworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudCsrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25DZWxsU2luZ2xlQ2xpY2soaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIHN1cGVyLm9uQ2VsbFNpbmdsZUNsaWNrKHJvdywgY29sdW1uKTsKICAgICBpZiAoY29sdW1uID09IDEgfHwgY29sdW1uID09IDIpIHsKICAgICAgIGlmICghIiIuZXF1YWxzKHRhYmxlLmdldFRleHQocm93LCBjb2x1bW4pKSkgewogICAgICAgICBvbkNlbGxEb3VibGVDbGljayhyb3csIGNvbHVtbik7CkBAIC03NCw2ICsxMTQsNDMgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkZXN0cm95Q29tbWVudFJvdyhmaW5hbCBpbnQgcm93KSB7CisgICAgc3VwZXIuZGVzdHJveUNvbW1lbnRSb3cocm93KTsKKyAgICBpZiAodGhpcy5yb3dPZlRhYmxlSGVhZGVyQiArIDEgPT0gcm93ICYmIHJvdyArIDEgPT0gYm9yZGVyUm93T2ZGaWxlQ29tbWVudCkgeworICAgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7CisgICAgICBpc0ZpbGVDb21tZW50Qm9yZGVyUm93RXhpc3QgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVtb3ZlKENvbW1lbnRFZGl0b3JQYW5lbCBwYW5lbCkgeworICAgIHN1cGVyLnJlbW92ZShwYW5lbCk7CisgICAgaWYgKHBhbmVsLmdldENvbW1lbnQoKS5nZXRMaW5lKCkgPT0gQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5SX0hFQUQpIHsKKyAgICAgIGZpbmFsIFBhdGNoU2V0LklkIHBzSWQgPQorICAgICAgICAgIHBhbmVsLmdldENvbW1lbnQoKS5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRQYXJlbnRLZXkoKTsKKyAgICAgIHN3aXRjaCAocGFuZWwuZ2V0Q29tbWVudCgpLmdldFNpZGUoKSkgeworICAgICAgICBjYXNlIEZJTEVfU0lERV9BOgorICAgICAgICAgIGlmIChpZFNpZGVBID09IG51bGwgJiYgaWRTaWRlQi5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIHJvd09mVGFibGVIZWFkZXJCLS07CisgICAgICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50LS07CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZJTEVfU0lERV9COgorICAgICAgICAgIGlmIChpZFNpZGVBICE9IG51bGwgJiYgaWRTaWRlQS5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIHJvd09mVGFibGVIZWFkZXJCLS07CisgICAgICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50LS07CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpZFNpZGVCLmVxdWFscyhwc0lkKSkgeworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudC0tOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25JbnNlcnRDb21tZW50KGZpbmFsIFBhdGNoTGluZSBwbCkgewogICAgIGZpbmFsIGludCByb3cgPSBnZXRDdXJyZW50Um93KCk7CiAgICAgc3dpdGNoIChwbC5nZXRUeXBlKCkpIHsKQEAgLTg0LDYgKzE2MSw4IEBACiAgICAgICBjYXNlIElOU0VSVDoKICAgICAgICAgY3JlYXRlQ29tbWVudEVkaXRvcihyb3cgKyAxLCBQQywgcGwuZ2V0TGluZUIoKSwgKHNob3J0KSAxKTsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFUExBQ0U6CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCkBAIC05MywxMjMgKzE3MiwxNzggQEAKICAgICBuYy5jbG9zZUVsZW1lbnQoImltZyIpOwogICB9CiAKKyAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZUNvbW1lbnRFZGl0b3JPblNpZGVBKCkgeworICAgIGNyZWF0ZUNvbW1lbnRFZGl0b3IoUl9IRUFEICsgMSwgUEMsIFJfSEVBRCwgRklMRV9TSURFX0EpOworICAgIHJldHVybjsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQigpIHsKKyAgICBjcmVhdGVDb21tZW50RWRpdG9yKHJvd09mVGFibGVIZWFkZXJCICsgMSwgUEMsIFJfSEVBRCwgRklMRV9TSURFX0IpOworICAgIGNyZWF0ZUZpbGVDb21tZW50Qm9yZGVyUm93KCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcG9wdWxhdGVUYWJsZUhlYWRlcihmaW5hbCBQYXRjaFNjcmlwdCBzY3JpcHQsCisgICAgICBmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwpIHsKKyAgICBpbml0SGVhZGVycyhzY3JpcHQsIGRldGFpbCk7CisgICAgdGFibGUuc2V0V2lkZ2V0KFJfSEVBRCwgUEMsIGhlYWRlclNpZGVBKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQocm93T2ZUYWJsZUhlYWRlckIsIFBDLCBoZWFkZXJTaWRlQik7CisgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5hZGRTdHlsZU5hbWUoUl9IRUFELCBQQywKKyAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS51bmlmaWVkVGFibGVIZWFkZXIoKSk7CisgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5hZGRTdHlsZU5hbWUocm93T2ZUYWJsZUhlYWRlckIsIFBDLAorICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnVuaWZpZWRUYWJsZUhlYWRlcigpKTsKKworICAgIC8vIEFkZCBpY29ucyB0byBsaW5lTnVtYmVyIGNvbHVtbiBoZWFkZXIKKyAgICBpZiAoaGVhZGVyU2lkZUEuaXNGaWxlT3JDb21taXRNZXNzYWdlKCkpIHsKKyAgICAgIHRhYmxlLnNldFdpZGdldChSX0hFQUQsIDEsIGljb25BKTsKKyAgICB9CisgICAgaWYgKGhlYWRlclNpZGVCLmlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQocm93T2ZUYWJsZUhlYWRlckIsIDIsIGljb25CKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWxsb2NhdGVUYWJsZUhlYWRlcihTYWZlSHRtbEJ1aWxkZXIgbmMpIHsKKyAgICByb3dPZlRhYmxlSGVhZGVyQiA9IDE7CisgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudCA9IDI7CisgICAgZm9yIChpbnQgaSA9IFJfSEVBRDsgaSA8IGJvcmRlclJvd09mRmlsZUNvbW1lbnQ7IGkrKykgeworICAgICAgb3BlblRhYmxlSGVhZGVyTGluZShuYyk7CisgICAgICBwYWRMaW5lTnVtYmVyT25UYWJsZUhlYWRlckZvclNpZGVBKG5jKTsKKyAgICAgIHBhZExpbmVOdW1iZXJPblRhYmxlSGVhZGVyRm9yU2lkZUIobmMpOworICAgICAgbmMub3BlblRkKCk7CisgICAgICBuYy5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlTGluZSgpKTsKKyAgICAgIG5jLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgICBuYy5jbG9zZVRkKCk7CisgICAgICBjbG9zZUxpbmUobmMpOworICAgIH0KKyAgfQorCiAgIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCByZW5kZXIoZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0KSB7Ci0gICAgZmluYWwgU3BhcnNlSHRtbEZpbGUgYSA9IGdldFNwYXJzZUh0bWxGaWxlQShzY3JpcHQpOwotICAgIGZpbmFsIFNwYXJzZUh0bWxGaWxlIGIgPSBnZXRTcGFyc2VIdG1sRmlsZUIoc2NyaXB0KTsKKyAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyKGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCwgZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CiAgICAgZmluYWwgU2FmZUh0bWxCdWlsZGVyIG5jID0gbmV3IFNhZmVIdG1sQnVpbGRlcigpOworICAgIGFsbG9jYXRlVGFibGVIZWFkZXIobmMpOwogCiAgICAgLy8gRGlzcGxheSB0aGUgcGF0Y2ggaGVhZGVyCiAgICAgZm9yIChmaW5hbCBTdHJpbmcgbGluZSA6IHNjcmlwdC5nZXRQYXRjaEhlYWRlcigpKSB7CiAgICAgICBhcHBlbmRGaWxlSGVhZGVyKG5jLCBsaW5lKTsKICAgICB9Ci0KLSAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RBKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcKLSAgICAgICAgfHwgc2NyaXB0LmdldERpc3BsYXlNZXRob2RCKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcpIHsKLSAgICAgIGZpbmFsIFN0cmluZyByYXdCYXNlID0gR1dULmdldEhvc3RQYWdlQmFzZVVSTCgpICsgImNhdC8iOwotCi0gICAgICBuYy5vcGVuVHIoKTsKLSAgICAgIG5jLnNldEF0dHJpYnV0ZSgidmFsaWduIiwgImNlbnRlciIpOwotICAgICAgbmMuc2V0QXR0cmlidXRlKCJhbGlnbiIsICJjZW50ZXIiKTsKLQotICAgICAgbmMub3BlblRkKCk7Ci0gICAgICBuYy5uYnNwKCk7Ci0gICAgICBuYy5jbG9zZVRkKCk7Ci0KLSAgICAgIG5jLm9wZW5UZCgpOwotICAgICAgbmMubmJzcCgpOwotICAgICAgbmMuY2xvc2VUZCgpOwotCi0gICAgICBuYy5vcGVuVGQoKTsKLSAgICAgIG5jLm5ic3AoKTsKLSAgICAgIG5jLmNsb3NlVGQoKTsKLQotICAgICAgbmMub3BlblRkKCk7Ci0gICAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RBKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcpIHsKLSAgICAgICAgaWYgKGlkU2lkZUEgPT0gbnVsbCkgewotICAgICAgICAgIGFwcGVuZEltZ1RhZyhuYywgcmF3QmFzZSArIEtleVV0aWwuZW5jb2RlKHBhdGNoS2V5LnRvU3RyaW5nKCkpICsgIl4xIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgUGF0Y2guS2V5IGsgPSBuZXcgUGF0Y2guS2V5KGlkU2lkZUEsIHBhdGNoS2V5LmdldCgpKTsKLSAgICAgICAgICBhcHBlbmRJbWdUYWcobmMsIHJhd0Jhc2UgKyBLZXlVdGlsLmVuY29kZShrLnRvU3RyaW5nKCkpICsgIl4wIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChzY3JpcHQuZ2V0RGlzcGxheU1ldGhvZEIoKSA9PSBEaXNwbGF5TWV0aG9kLklNRykgewotICAgICAgICBhcHBlbmRJbWdUYWcobmMsIHJhd0Jhc2UgKyBLZXlVdGlsLmVuY29kZShwYXRjaEtleS50b1N0cmluZygpKSArICJeMCIpOwotICAgICAgfQotICAgICAgbmMuY2xvc2VUZCgpOwotCi0gICAgICBuYy5jbG9zZVRyKCk7Ci0gICAgfQotCi0gICAgZmluYWwgYm9vbGVhbiBzeW50YXhIaWdobGlnaHRpbmcgPQotICAgICAgICBzY3JpcHQuZ2V0RGlmZlByZWZzKCkuaXNTeW50YXhIaWdobGlnaHRpbmcoKTsKICAgICBmaW5hbCBBcnJheUxpc3Q8UGF0Y2hMaW5lPiBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hMaW5lPigpOwotICAgIGZvciAoZmluYWwgRWRpdExpc3QuSHVuayBodW5rIDogc2NyaXB0LmdldEh1bmtzKCkpIHsKLSAgICAgIGFwcGVuZEh1bmtIZWFkZXIobmMsIGh1bmspOwotICAgICAgd2hpbGUgKGh1bmsubmV4dCgpKSB7Ci0gICAgICAgIGlmIChodW5rLmlzQ29udGV4dExpbmUoKSkgewotICAgICAgICAgIG9wZW5MaW5lKG5jKTsKLSAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckEoKSk7Ci0gICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJCKCkpOwotICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBmYWxzZSwgQ09OVEVYVCwgYSwgaHVuay5nZXRDdXJBKCkpOwotICAgICAgICAgIGNsb3NlTGluZShuYyk7Ci0gICAgICAgICAgaHVuay5pbmNCb3RoKCk7Ci0gICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoQ09OVEVYVCwgaHVuay5nZXRDdXJBKCksIGh1bmsuZ2V0Q3VyQigpKSk7CisgICAgaWYgKCFpc0Rpc3BsYXlCaW5hcnkpIHsKKyAgICAgIGZpbmFsIFNwYXJzZUh0bWxGaWxlIGEgPSBnZXRTcGFyc2VIdG1sRmlsZUEoc2NyaXB0KTsKKyAgICAgIGZpbmFsIFNwYXJzZUh0bWxGaWxlIGIgPSBnZXRTcGFyc2VIdG1sRmlsZUIoc2NyaXB0KTsKKyAgICAgIGlmIChzY3JpcHQuZ2V0RGlzcGxheU1ldGhvZEEoKSA9PSBEaXNwbGF5TWV0aG9kLklNRworICAgICAgICAgIHx8IHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQigpID09IERpc3BsYXlNZXRob2QuSU1HKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByYXdCYXNlID0gR1dULmdldEhvc3RQYWdlQmFzZVVSTCgpICsgImNhdC8iOwogCi0gICAgICAgIH0gZWxzZSBpZiAoaHVuay5pc0RlbGV0ZWRBKCkpIHsKLSAgICAgICAgICBvcGVuTGluZShuYyk7Ci0gICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJBKCkpOwotICAgICAgICAgIHBhZExpbmVOdW1iZXIobmMpOwotICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBzeW50YXhIaWdobGlnaHRpbmcsIERFTEVURSwgYSwgaHVuay5nZXRDdXJBKCkpOwotICAgICAgICAgIGNsb3NlTGluZShuYyk7Ci0gICAgICAgICAgaHVuay5pbmNBKCk7Ci0gICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoREVMRVRFLCBodW5rLmdldEN1ckEoKSwgMCkpOwotICAgICAgICAgIGlmIChhLnNpemUoKSA9PSBodW5rLmdldEN1ckEoKQotICAgICAgICAgICAgICAmJiBzY3JpcHQuZ2V0QSgpLmlzTWlzc2luZ05ld2xpbmVBdEVuZCgpKSB7Ci0gICAgICAgICAgICBhcHBlbmROb0xGKG5jKTsKKyAgICAgICAgbmMub3BlblRyKCk7CisgICAgICAgIG5jLnNldEF0dHJpYnV0ZSgidmFsaWduIiwgImNlbnRlciIpOworICAgICAgICBuYy5zZXRBdHRyaWJ1dGUoImFsaWduIiwgImNlbnRlciIpOworCisgICAgICAgIG5jLm9wZW5UZCgpOworICAgICAgICBuYy5uYnNwKCk7CisgICAgICAgIG5jLmNsb3NlVGQoKTsKKworICAgICAgICBuYy5vcGVuVGQoKTsKKyAgICAgICAgbmMubmJzcCgpOworICAgICAgICBuYy5jbG9zZVRkKCk7CisKKyAgICAgICAgbmMub3BlblRkKCk7CisgICAgICAgIG5jLm5ic3AoKTsKKyAgICAgICAgbmMuY2xvc2VUZCgpOworCisgICAgICAgIG5jLm9wZW5UZCgpOworICAgICAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RBKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcpIHsKKyAgICAgICAgICBpZiAoaWRTaWRlQSA9PSBudWxsKSB7CisgICAgICAgICAgICBhcHBlbmRJbWdUYWcobmMsIHJhd0Jhc2UgKyBLZXlVdGlsLmVuY29kZShwYXRjaEtleS50b1N0cmluZygpKSArICJeMSIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQYXRjaC5LZXkgayA9IG5ldyBQYXRjaC5LZXkoaWRTaWRlQSwgcGF0Y2hLZXkuZ2V0KCkpOworICAgICAgICAgICAgYXBwZW5kSW1nVGFnKG5jLCByYXdCYXNlICsgS2V5VXRpbC5lbmNvZGUoay50b1N0cmluZygpKSArICJeMCIpOwogICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RCKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcpIHsKKyAgICAgICAgICBhcHBlbmRJbWdUYWcobmMsIHJhd0Jhc2UgKyBLZXlVdGlsLmVuY29kZShwYXRjaEtleS50b1N0cmluZygpKSArICJeMCIpOworICAgICAgICB9CisgICAgICAgIG5jLmNsb3NlVGQoKTsKIAotICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNJbnNlcnRlZEIoKSkgewotICAgICAgICAgIG9wZW5MaW5lKG5jKTsKLSAgICAgICAgICBwYWRMaW5lTnVtYmVyKG5jKTsKLSAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckIoKSk7Ci0gICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIHN5bnRheEhpZ2hsaWdodGluZywgSU5TRVJULCBiLCBodW5rLmdldEN1ckIoKSk7Ci0gICAgICAgICAgY2xvc2VMaW5lKG5jKTsKLSAgICAgICAgICBodW5rLmluY0IoKTsKLSAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShJTlNFUlQsIDAsIGh1bmsuZ2V0Q3VyQigpKSk7Ci0gICAgICAgICAgaWYgKGIuc2l6ZSgpID09IGh1bmsuZ2V0Q3VyQigpCi0gICAgICAgICAgICAgICYmIHNjcmlwdC5nZXRCKCkuaXNNaXNzaW5nTmV3bGluZUF0RW5kKCkpIHsKLSAgICAgICAgICAgIGFwcGVuZE5vTEYobmMpOworICAgICAgICBuYy5jbG9zZVRyKCk7CisgICAgICB9CisKKyAgICAgIGlmIChoYXNEaWZmZXJlbmNlcyhzY3JpcHQpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3ludGF4SGlnaGxpZ2h0aW5nID0KKyAgICAgICAgICAgIHNjcmlwdC5nZXREaWZmUHJlZnMoKS5pc1N5bnRheEhpZ2hsaWdodGluZygpOworICAgICAgICBmb3IgKGZpbmFsIEVkaXRMaXN0Lkh1bmsgaHVuayA6IHNjcmlwdC5nZXRIdW5rcygpKSB7CisgICAgICAgICAgYXBwZW5kSHVua0hlYWRlcihuYywgaHVuayk7CisgICAgICAgICAgd2hpbGUgKGh1bmsubmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoaHVuay5pc0NvbnRleHRMaW5lKCkpIHsKKyAgICAgICAgICAgICAgb3BlbkxpbmUobmMpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyRm9yU2lkZUEobmMsIGh1bmsuZ2V0Q3VyQSgpKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlckZvclNpZGVCKG5jLCBodW5rLmdldEN1ckIoKSk7CisgICAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBmYWxzZSwgQ09OVEVYVCwgYSwgaHVuay5nZXRDdXJBKCkpOworICAgICAgICAgICAgICBjbG9zZUxpbmUobmMpOworICAgICAgICAgICAgICBodW5rLmluY0JvdGgoKTsKKyAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoQ09OVEVYVCwgaHVuay5nZXRDdXJBKCksIGh1bmsuZ2V0Q3VyQigpKSk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHVuay5pc0RlbGV0ZWRBKCkpIHsKKyAgICAgICAgICAgICAgb3BlbkxpbmUobmMpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyRm9yU2lkZUEobmMsIGh1bmsuZ2V0Q3VyQSgpKTsKKyAgICAgICAgICAgICAgcGFkTGluZU51bWJlckZvclNpZGVCKG5jKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIHN5bnRheEhpZ2hsaWdodGluZywgREVMRVRFLCBhLCBodW5rLmdldEN1ckEoKSk7CisgICAgICAgICAgICAgIGNsb3NlTGluZShuYyk7CisgICAgICAgICAgICAgIGh1bmsuaW5jQSgpOworICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShERUxFVEUsIGh1bmsuZ2V0Q3VyQSgpLCAtMSkpOworICAgICAgICAgICAgICBpZiAoYS5zaXplKCkgPT0gaHVuay5nZXRDdXJBKCkKKyAgICAgICAgICAgICAgICAgICYmIHNjcmlwdC5nZXRBKCkuaXNNaXNzaW5nTmV3bGluZUF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhcHBlbmROb0xGKG5jKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNJbnNlcnRlZEIoKSkgeworICAgICAgICAgICAgICBvcGVuTGluZShuYyk7CisgICAgICAgICAgICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQShuYyk7CisgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXJGb3JTaWRlQihuYywgaHVuay5nZXRDdXJCKCkpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgc3ludGF4SGlnaGxpZ2h0aW5nLCBJTlNFUlQsIGIsIGh1bmsuZ2V0Q3VyQigpKTsKKyAgICAgICAgICAgICAgY2xvc2VMaW5lKG5jKTsKKyAgICAgICAgICAgICAgaHVuay5pbmNCKCk7CisgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKElOU0VSVCwgLTEsIGh1bmsuZ2V0Q3VyQigpKSk7CisgICAgICAgICAgICAgIGlmIChiLnNpemUoKSA9PSBodW5rLmdldEN1ckIoKQorICAgICAgICAgICAgICAgICAgJiYgc2NyaXB0LmdldEIoKS5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKSkgeworICAgICAgICAgICAgICAgIGFwcGVuZE5vTEYobmMpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorICAgIGlmICghaGFzRGlmZmVyZW5jZXMoc2NyaXB0KSkgeworICAgICAgYXBwZW5kTm9EaWZmZXJlbmNlcyhuYyk7CisgICAgfQogICAgIHJlc2V0SHRtbChuYyk7Ci0gICAgaW5pdFNjcmlwdChzY3JpcHQpOwotCi0gICAgaW50IHJvdyA9IHNjcmlwdC5nZXRQYXRjaEhlYWRlcigpLnNpemUoKTsKLSAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKLSAgICBmaW5hbCBJdGVyYXRvcjxQYXRjaExpbmU+IGlMaW5lID0gbGluZXMuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaUxpbmUuaGFzTmV4dCgpKSB7Ci0gICAgICBmaW5hbCBQYXRjaExpbmUgbCA9IGlMaW5lLm5leHQoKTsKLSAgICAgIGZpbmFsIFN0cmluZyBuOwotICAgICAgc3dpdGNoIChsLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIENPTlRFWFQ6Ci0gICAgICAgICAgbiA9IEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHRDT05URVhUKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVMRVRFOgotICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0REVMRVRFKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5TRVJUOgotICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0SU5TRVJUKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgY29udGludWU7CisgICAgcG9wdWxhdGVUYWJsZUhlYWRlcihzY3JpcHQsIGRldGFpbCk7CisgICAgaWYgKGhhc0RpZmZlcmVuY2VzKHNjcmlwdCkpIHsKKyAgICAgIGluaXRTY3JpcHQoc2NyaXB0KTsKKyAgICAgIGlmICghaXNEaXNwbGF5QmluYXJ5KSB7CisgICAgICAgIGludCByb3cgPSBzY3JpcHQuZ2V0UGF0Y2hIZWFkZXIoKS5zaXplKCk7CisgICAgICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOworICAgICAgICBmaW5hbCBJdGVyYXRvcjxQYXRjaExpbmU+IGlMaW5lID0gbGluZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGlMaW5lLmhhc05leHQoKSkgeworICAgICAgICAgIGZpbmFsIFBhdGNoTGluZSBsID0gaUxpbmUubmV4dCgpOworICAgICAgICAgIGZpbmFsIFN0cmluZyBuOworICAgICAgICAgIHN3aXRjaCAobC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ09OVEVYVDoKKyAgICAgICAgICAgICAgbiA9IEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHRDT05URVhUKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0REVMRVRFKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlNFUlQ6CisgICAgICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0SU5TRVJUKCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlICghZm10LmdldFN0eWxlTmFtZShyb3csIFBDKS5jb250YWlucyhuKSkgeworICAgICAgICAgICAgcm93Kys7CisgICAgICAgICAgfQorICAgICAgICAgIHNldFJvd0l0ZW0ocm93KyssIGwpOworICAgICAgICB9CiAgICAgICB9Ci0gICAgICB3aGlsZSAoIWZtdC5nZXRTdHlsZU5hbWUocm93LCBQQykuY29udGFpbnMobikpIHsKLSAgICAgICAgcm93Kys7Ci0gICAgICB9Ci0gICAgICBzZXRSb3dJdGVtKHJvdysrLCBsKTsKICAgICB9CiAgIH0KIApAQCAtMjIyLDEwICszNTYsMjggQEAKIAogICAgIGZpbmFsIEFycmF5TGlzdDxQYXRjaExpbmVDb21tZW50PiBhbGwgPSBuZXcgQXJyYXlMaXN0PFBhdGNoTGluZUNvbW1lbnQ+KCk7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgdGFibGUuZ2V0Um93Q291bnQoKTspIHsKLSAgICAgIGlmIChnZXRSb3dJdGVtKHJvdykgaW5zdGFuY2VvZiBQYXRjaExpbmUpIHsKKyAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYTsKKyAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYjsKKyAgICAgIGlmIChyb3cgPT0gUl9IRUFEKSB7CisgICAgICAgIGZvcmEgPSBjZC5nZXRGb3JBKFJfSEVBRCk7CisgICAgICAgIGZvcmIgPSBjZC5nZXRGb3JCKFJfSEVBRCk7CisgICAgICAgIHJvdysrOworCisgICAgICAgIGlmICghZm9yYS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICByb3cgPSBpbnNlcnQoZm9yYSwgcm93LCBleHBhbmRDb21tZW50cyk7CisgICAgICAgIH0KKyAgICAgICAgcm93T2ZUYWJsZUhlYWRlckIgPSByb3c7CisgICAgICAgIGJvcmRlclJvd09mRmlsZUNvbW1lbnQgPSByb3cgKyAxOworICAgICAgICBpZiAoIWZvcmIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgcm93Kys7Ly8gU2tpcCB0aGUgSGVhZGVyIG9mIHNpZGVCLgorICAgICAgICAgIHJvdyA9IGluc2VydChmb3JiLCByb3csIGV4cGFuZENvbW1lbnRzKTsKKyAgICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50ID0gcm93OworICAgICAgICAgIGNyZWF0ZUZpbGVDb21tZW50Qm9yZGVyUm93KCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CiAgICAgICAgIGZpbmFsIFBhdGNoTGluZSBwTGluZSA9IChQYXRjaExpbmUpIGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBmb3JhID0gY2QuZ2V0Rm9yQShwTGluZS5nZXRMaW5lQSgpKTsKLSAgICAgICAgZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBmb3JiID0gY2QuZ2V0Rm9yQihwTGluZS5nZXRMaW5lQigpKTsKKyAgICAgICAgZm9yYSA9IGNkLmdldEZvckEocExpbmUuZ2V0TGluZUEoKSk7CisgICAgICAgIGZvcmIgPSBjZC5nZXRGb3JCKHBMaW5lLmdldExpbmVCKCkpOwogICAgICAgICByb3crKzsKIAogICAgICAgICBpZiAoIWZvcmEuaXNFbXB0eSgpICYmICFmb3JiLmlzRW1wdHkoKSkgewpAQCAtMjQzLDM2ICszOTUsODQgQEAKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgcm93Kys7CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgIH0KICAgfQogCisgIHByaXZhdGUgdm9pZCBkZWZhdWx0U3R5bGUoZmluYWwgaW50IHJvdywgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQpIHsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMgLSAyLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDIC0gMiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodEJvcmRlcigpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMgLSAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGluc2VydFJvdyhmaW5hbCBpbnQgcm93KSB7CiAgICAgc3VwZXIuaW5zZXJ0Um93KHJvdyk7CiAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDIC0gMiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBQQyAtIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CisgICAgZGVmYXVsdFN0eWxlKHJvdywgZm10KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgUGF0Y2hTY3JlZW4uVHlwZSBnZXRQYXRjaFNjcmVlblR5cGUoKSB7CisgICAgcmV0dXJuIFBhdGNoU2NyZWVuLlR5cGUuVU5JRklFRDsKICAgfQogCiAgIHByaXZhdGUgaW50IGluc2VydChmaW5hbCBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGluLCBpbnQgcm93LCBib29sZWFuIGV4cGFuZENvbW1lbnQpIHsKICAgICBmb3IgKEl0ZXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+IGNpID0gaW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOykgewogICAgICAgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBjID0gY2kubmV4dCgpOwotICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICBpZiAoYy5nZXRMaW5lKCkgPT0gUl9IRUFEKSB7CisgICAgICAgIGluc2VydEZpbGVDb21tZW50Um93KHJvdyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIH0KICAgICAgIGJpbmRDb21tZW50KHJvdywgUEMsIGMsICFjaS5oYXNOZXh0KCksIGV4cGFuZENvbW1lbnQpOwogICAgICAgcm93Kys7CiAgICAgfQogICAgIHJldHVybiByb3c7CiAgIH0KIAorICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RmlsZUNvbW1lbnRSb3coZmluYWwgaW50IHJvdykgeworICAgIHRhYmxlLmluc2VydFJvdyhyb3cpOworICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOworCisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfQVJST1csIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkNlbGxPZkZpbGVDb21tZW50Um93KCkpOworICAgIGRlZmF1bHRTdHlsZShyb3csIGZtdCk7CisKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19BUlJPVywgLy8KKyAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jZWxsc05leHRUb0ZpbGVDb21tZW50KCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBQQyAtIDIsIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMgLSAxLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY3JlYXRlRmlsZUNvbW1lbnRCb3JkZXJSb3coKSB7CisgICAgaWYgKCFpc0ZpbGVDb21tZW50Qm9yZGVyUm93RXhpc3QpIHsKKyAgICAgIGlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdCA9IHRydWU7CisgICAgICB0YWJsZS5pbnNlcnRSb3coYm9yZGVyUm93T2ZGaWxlQ29tbWVudCk7CisgICAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKKyAgICAgIGZtdC5hZGRTdHlsZU5hbWUoYm9yZGVyUm93T2ZGaWxlQ29tbWVudCwgQ19BUlJPVywgLy8KKyAgICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpKTsKKyAgICAgIGRlZmF1bHRTdHlsZShib3JkZXJSb3dPZkZpbGVDb21tZW50LCBmbXQpOworCisgICAgICBmaW5hbCBFbGVtZW50IGljb25DZWxsID0KKyAgICAgICAgICBmbXQuZ2V0RWxlbWVudChib3JkZXJSb3dPZkZpbGVDb21tZW50LCBDX0FSUk9XKTsKKyAgICAgIFVJT2JqZWN0LnNldFN0eWxlTmFtZShET00uZ2V0UGFyZW50KGljb25DZWxsKSwgLy8KKyAgICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb21tZW50Qm9yZGVyKCksIHRydWUpOworICAgIH0KKyAgfQorCiAgIHByaXZhdGUgdm9pZCBhcHBlbmRGaWxlSGVhZGVyKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBTdHJpbmcgbGluZSkgewogICAgIG9wZW5MaW5lKG0pOwotICAgIHBhZExpbmVOdW1iZXIobSk7Ci0gICAgcGFkTGluZU51bWJlcihtKTsKKyAgICBwYWRMaW5lTnVtYmVyRm9yU2lkZUEobSk7CisgICAgcGFkTGluZU51bWJlckZvclNpZGVCKG0pOwogCiAgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVMaW5lKCkpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CiAgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dEZpbGVIZWFkZXIoKSk7CiAgICAgbS5hcHBlbmQobGluZSk7CkBAIC0yODIsMTAgKzQ4MiwxMSBAQAogCiAgIHByaXZhdGUgdm9pZCBhcHBlbmRIdW5rSGVhZGVyKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBIdW5rIGh1bmspIHsKICAgICBvcGVuTGluZShtKTsKLSAgICBwYWRMaW5lTnVtYmVyKG0pOwotICAgIHBhZExpbmVOdW1iZXIobSk7CisgICAgcGFkTGluZU51bWJlckZvclNpZGVBKG0pOworICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQihtKTsKIAogICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlTGluZSgpKTsKICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHRIdW5rSGVhZGVyKCkpOwogICAgIG0uYXBwZW5kKCJAQCAtIik7CkBAIC0zMjMsNiArNTI0LDcgQEAKICAgICAgIGZpbmFsIFNwYXJzZUh0bWxGaWxlIHNyYywgZmluYWwgaW50IGkpIHsKICAgICBmaW5hbCBTYWZlSHRtbCB0ZXh0ID0gc3JjLmdldFNhZmVIdG1sTGluZShpKTsKICAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUxpbmUoKSk7CiAgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgIGNhc2UgQ09OVEVYVDoKQEAgLTM0NiwxNCArNTQ4LDE2IEBACiAgICAgICAgIG0uYXBwZW5kKCIrIik7CiAgICAgICAgIG0uYXBwZW5kKHRleHQpOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVQTEFDRToKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG0uY2xvc2VUZCgpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGFwcGVuZE5vTEYoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKICAgICBvcGVuTGluZShtKTsKLSAgICBwYWRMaW5lTnVtYmVyKG0pOwotICAgIHBhZExpbmVOdW1iZXIobSk7CisgICAgcGFkTGluZU51bWJlckZvclNpZGVBKG0pOworICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQihtKTsKICAgICBtLm9wZW5UZCgpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CiAgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dE5vTEYoKSk7CkBAIC0zNzAsMjAgKzU3NCw1OCBAQAogICAgIG0uY2xvc2VUZCgpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIG9wZW5UYWJsZUhlYWRlckxpbmUoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKKyAgICBtLm9wZW5UcigpOworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgbS5jbG9zZVRkKCk7CisgIH0KKwogICBwcml2YXRlIHZvaWQgY2xvc2VMaW5lKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CiAgICAgbS5jbG9zZVRyKCk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgcGFkTGluZU51bWJlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgeworICBwcml2YXRlIHZvaWQgcGFkTGluZU51bWJlckZvclNpZGVCKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CiAgICAgbS5vcGVuVGQoKTsKICAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CiAgICAgbS5jbG9zZVRkKCk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgYXBwZW5kTGluZU51bWJlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgaW50IGlkeCkgeworICBwcml2YXRlIHZvaWQgcGFkTGluZU51bWJlckZvclNpZGVBKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodEJvcmRlcigpKTsKKyAgICBtLmNsb3NlVGQoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHBlbmRMaW5lTnVtYmVyRm9yU2lkZUIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGZpbmFsIGludCBpZHgpIHsKICAgICBtLm9wZW5UZCgpOwogICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKICAgICBtLmFwcGVuZChTYWZlSHRtbC5hc2lzKCI8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+IisgKGlkeCArIDEpICsgIjwvYT4iKSk7CiAgICAgbS5jbG9zZVRkKCk7CiAgIH0KKworICBwcml2YXRlIHZvaWQgYXBwZW5kTGluZU51bWJlckZvclNpZGVBKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBpbnQgaWR4KSB7CisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodEJvcmRlcigpKTsKKyAgICBtLmFwcGVuZChTYWZlSHRtbC5hc2lzKCI8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+IisgKGlkeCArIDEpICsgIjwvYT4iKSk7CisgICAgbS5jbG9zZVRkKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcGFkTGluZU51bWJlck9uVGFibGVIZWFkZXJGb3JTaWRlQihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgeworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmNsb3NlVGQoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBwYWRMaW5lTnVtYmVyT25UYWJsZUhlYWRlckZvclNpZGVBKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29sdW1uSGVhZGVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRCb3JkZXIoKSk7CisgICAgbS5jbG9zZVRkKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wbHVnaW5zL1BsdWdpbk1hcC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BsdWdpbnMvUGx1Z2luTWFwLmphdmEKaW5kZXggNmVjYTIwNi4uZTRjNTE1OSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BsdWdpbnMvUGx1Z2luTWFwLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BsdWdpbnMvUGx1Z2luTWFwLmphdmEKQEAgLTE2LDEzICsxNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5OYXRpdmVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKIAogLyoqIFBsdWdpbnMgYXZhaWxhYmxlIGZyb20ge0Bjb2RlIC9wbHVnaW5zL30uICovCiBwdWJsaWMgY2xhc3MgUGx1Z2luTWFwIGV4dGVuZHMgTmF0aXZlTWFwPFBsdWdpbkluZm8+IHsKICAgcHVibGljIHN0YXRpYyB2b2lkIGFsbChBc3luY0NhbGxiYWNrPFBsdWdpbk1hcD4gY2FsbGJhY2spIHsKLSAgICBuZXcgUmVzdEFwaSgiL3BsdWdpbnMvIikuYWRkUGFyYW1ldGVyVHJ1ZSgiYWxsIikKLSAgICAgICAgLnNlbmQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CisgICAgbmV3IFJlc3RBcGkoIi9wbHVnaW5zLyIpCisgICAgICAuYWRkUGFyYW1ldGVyVHJ1ZSgiYWxsIikKKyAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CiAgIH0KIAogICBwcm90ZWN0ZWQgUGx1Z2luTWFwKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3Byb2plY3RzL1Byb2plY3RBcGkuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wcm9qZWN0cy9Qcm9qZWN0QXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2NzZkYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wcm9qZWN0cy9Qcm9qZWN0QXBpLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKKworcHVibGljIGNsYXNzIFByb2plY3RBcGkgeworICAvKiogQ3JlYXRlIGEgbmV3IHByb2plY3QgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcGFyZW50LAorICAgICAgQm9vbGVhbiBjcmVhdGVFbXB0eUNjb21taXQsIEJvb2xlYW4gcGVybWlzc2lvbnNPbmx5LAorICAgICAgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBhc3luY0NhbGxiYWNrKSB7CisgICAgUHJvamVjdElucHV0IGlucHV0ID0gUHJvamVjdElucHV0LmNyZWF0ZSgpOworICAgIGlucHV0LnNldE5hbWUocHJvamVjdE5hbWUpOworICAgIGlucHV0LnNldFBhcmVudChwYXJlbnQpOworICAgIGlucHV0LnNldFBlcm1pc3Npb25zT25seShwZXJtaXNzaW9uc09ubHkpOworICAgIGlucHV0LnNldENyZWF0ZUVtcHR5Q29tbWl0KGNyZWF0ZUVtcHR5Q2NvbW1pdCk7CisgICAgbmV3IFJlc3RBcGkoIi9wcm9qZWN0cy8iKS5pZChwcm9qZWN0TmFtZSkuaWZOb25lTWF0Y2goKQorICAgICAgICAucHV0KGlucHV0LCBhc3luY0NhbGxiYWNrKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIHN0YXRpYyBQcm9qZWN0SW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChQcm9qZWN0SW5wdXQpIGNyZWF0ZU9iamVjdCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQcm9qZWN0SW5wdXQoKSB7CisgICAgfQorCisgICAgZmluYWwgbmF0aXZlIHZvaWQgc2V0TmFtZShTdHJpbmcgbikgLyoteyBpZihuKXRoaXMubmFtZT1uOyB9LSovOworCisgICAgZmluYWwgbmF0aXZlIHZvaWQgc2V0UGFyZW50KFN0cmluZyBwKSAvKi17IGlmKHApdGhpcy5wYXJlbnQ9cDsgfS0qLzsKKworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIHNldFBlcm1pc3Npb25zT25seShib29sZWFuIHBvKSAvKi17IGlmKHBvKXRoaXMucGVybWlzc2lvbnNfb25seT1wbzsgfS0qLzsKKworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIHNldENyZWF0ZUVtcHR5Q29tbWl0KGJvb2xlYW4gY2MpIC8qLXsgaWYoY2MpdGhpcy5jcmVhdGVfZW1wdHlfY29tbWl0PWNjOyB9LSovOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcHJvamVjdHMvUHJvamVjdE1hcC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3Byb2plY3RzL1Byb2plY3RNYXAuamF2YQppbmRleCA0MDg5MTllLi5iYmVhYmQzIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcHJvamVjdHMvUHJvamVjdE1hcC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wcm9qZWN0cy9Qcm9qZWN0TWFwLmphdmEKQEAgLTE2LDggKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuVVJMOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogCiAvKiogUHJvamVjdHMgYXZhaWxhYmxlIGZyb20ge0Bjb2RlIC9wcm9qZWN0cy99LiAqLwogcHVibGljIGNsYXNzIFByb2plY3RNYXAgZXh0ZW5kcyBOYXRpdmVNYXA8UHJvamVjdEluZm8+IHsKQEAgLTI2LDcgKzI1LDcgQEAKICAgICAgICAgLmFkZFBhcmFtZXRlclJhdygidHlwZSIsICJBTEwiKQogICAgICAgICAuYWRkUGFyYW1ldGVyVHJ1ZSgiYWxsIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImQiKSAvLyBkZXNjcmlwdGlvbgotICAgICAgICAuc2VuZChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2FsbGJhY2spKTsKKyAgICAgICAgLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2FsbGJhY2spKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwZXJtaXNzaW9ucyhBc3luY0NhbGxiYWNrPFByb2plY3RNYXA+IGNhbGxiYWNrKSB7CkBAIC0zNCw3ICszMyw3IEBACiAgICAgICAgIC5hZGRQYXJhbWV0ZXJSYXcoInR5cGUiLCAiUEVSTUlTU0lPTlMiKQogICAgICAgICAuYWRkUGFyYW1ldGVyVHJ1ZSgiYWxsIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImQiKSAvLyBkZXNjcmlwdGlvbgotICAgICAgICAuc2VuZChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2FsbGJhY2spKTsKKyAgICAgICAgLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2FsbGJhY2spKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYXJlbnRDYW5kaWRhdGVzKEFzeW5jQ2FsbGJhY2s8UHJvamVjdE1hcD4gY2FsbGJhY2spIHsKQEAgLTQyLDE1ICs0MSwyOCBAQAogICAgICAgICAuYWRkUGFyYW1ldGVyUmF3KCJ0eXBlIiwgIlBBUkVOVF9DQU5ESURBVEVTIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImFsbCIpCiAgICAgICAgIC5hZGRQYXJhbWV0ZXJUcnVlKCJkIikgLy8gZGVzY3JpcHRpb24KLSAgICAgICAgLnNlbmQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CisgICAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgc3VnZ2VzdChTdHJpbmcgcHJlZml4LCBpbnQgbGltaXQsIEFzeW5jQ2FsbGJhY2s8UHJvamVjdE1hcD4gY2IpIHsKLSAgICBuZXcgUmVzdEFwaSgiL3Byb2plY3RzLyIgKyBVUkwuZW5jb2RlKHByZWZpeCkucmVwbGFjZUFsbCgiWz9dIiwgIiUzRiIpKQotICAgICAgICAuYWRkUGFyYW1ldGVyUmF3KCJ0eXBlIiwgIkFMTCIpCisgICAgbmV3IFJlc3RBcGkoIi9wcm9qZWN0cy8iKQorICAgICAgICAuYWRkUGFyYW1ldGVyKCJwIiwgcHJlZml4KQogICAgICAgICAuYWRkUGFyYW1ldGVyKCJuIiwgbGltaXQpCisgICAgICAgIC5hZGRQYXJhbWV0ZXJSYXcoInR5cGUiLCAiQUxMIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImQiKSAvLyBkZXNjcmlwdGlvbgotICAgICAgICAuc2VuZChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2IpKTsKKyAgICAgICAgLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2IpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXRjaChTdHJpbmcgbWF0Y2gsIEFzeW5jQ2FsbGJhY2s8UHJvamVjdE1hcD4gY2IpIHsKKyAgICBpZiAobWF0Y2ggPT0gbnVsbCB8fCAiIi5lcXVhbHMobWF0Y2gpKSB7CisgICAgICBhbGwoY2IpOworICAgIH0gZWxzZSB7CisgICAgICBuZXcgUmVzdEFwaSgiL3Byb2plY3RzLyIpCisgICAgICAgICAgLmFkZFBhcmFtZXRlcigibSIsIG1hdGNoKQorICAgICAgICAgIC5hZGRQYXJhbWV0ZXJSYXcoInR5cGUiLCAiQUxMIikKKyAgICAgICAgICAuYWRkUGFyYW1ldGVyVHJ1ZSgiZCIpIC8vIGRlc2NyaXB0aW9uCisgICAgICAgICAgLmdldChOYXRpdmVNYXAuY29weUtleXNJbnRvQ2hpbGRyZW4oY2IpKTsKKyAgICB9CiAgIH0KIAogICBwcm90ZWN0ZWQgUHJvamVjdE1hcCgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9xdWVyeUljb24ucG5nIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3F1ZXJ5SWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhY2U1MQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9xdWVyeUljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvQ2FsbGJhY2tHcm91cC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9DYWxsYmFja0dyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxZjkwNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvQ2FsbGJhY2tHcm91cC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIENsYXNzIGZvciBncm91cGluZyB0b2dldGhlciBjYWxsYmFja3MgYW5kIGNhbGxpbmcgdGhlbSBpbiBvcmRlci4KKyAqIDxwPgorICogQ2FsbGJhY2tzIGFyZSBhZGRlZCB0byB0aGUgZ3JvdXAgd2l0aCB7QGxpbmsgI2FkZChBc3luY0NhbGxiYWNrKX0sIHdoaWNoCisgKiByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFjayBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBhbiBhc3luY2hyb25vdXMgUlBDIGNhbGwuCisgKiBUaGUgZW5jbG9zaW5nIGdyb3VwIGJ1ZmZlcnMgcmV0dXJuZWQgcmVzdWx0cyBhbmQgZW5zdXJlcyB0aGF0CisgKiB7QGNvZGUgb25TdWNjZXNzfSBpcyBjYWxsZWQgZXhhY3RseSBvbmNlIGZvciBlYWNoIGNhbGxiYWNrIGluIHRoZSBncm91cCwgaW4KKyAqIHRoZSBzYW1lIG9yZGVyIHRoYXQgY2FsbGJhY2tzIHdlcmUgYWRkZWQuIFRoaXMgYWxsb3dzIGNhbGxlcnMgdG8sIGZvcgorICogZXhhbXBsZSwgdXNlIGEge0BsaW5rIFNjcmVlbkxvYWRDYWxsYmFja30gYXMgdGhlIGxhc3QgY2FsbGJhY2sgaW4gdGhlIGxpc3QKKyAqIGFuZCBvbmx5IGRpc3BsYXkgdGhlIHNjcmVlbiBvbmNlIGFsbCBjYWxsYmFja3MgaGF2ZSBzdWNjZWVkZWQuCisgKiA8cD4KKyAqIEluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUsIHRoZSA8ZW0+Zmlyc3Q8L2VtPiBjYXVnaHQgZXhjZXB0aW9uIGlzIHNlbnQgdG8KKyAqIDxlbT5hbGw8L2VtPiBjYWxsYmFja3MnIHtAY29kZSBvbkZhaWx1cmV9IG1ldGhvZHMsIGluIG9yZGVyOyBzdWJzZXF1ZW50CisgKiBzdWNjZXNzZXMgb3IgZmFpbHVyZXMgYXJlIGFsbCBpZ25vcmVkLiBOb3RlIHRoYXQgdGhpcyBtZWFucworICoge0Bjb2RlIG9uRmFpbHVyZX0gbWF5IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiB1bnJlbGF0ZWQgdG8gdGhlIGNhbGxiYWNrCisgKiBwcm9jZXNzaW5nIGl0LgorICovCitwdWJsaWMgY2xhc3MgQ2FsbGJhY2tHcm91cCB7CisgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3Q+IGNhbGxiYWNrczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHJlc3VsdHM7CisgIHByaXZhdGUgYm9vbGVhbiBmYWlsZWQ7CisKKyAgcHVibGljIENhbGxiYWNrR3JvdXAoKSB7CisgICAgY2FsbGJhY2tzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgcmVzdWx0cyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworICB9CisKKyAgcHVibGljIDxUPiBBc3luY0NhbGxiYWNrPFQ+IGFkZChmaW5hbCBBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgY2FsbGJhY2tzLmFkZChjYik7CisgICAgcmV0dXJuIG5ldyBBc3luY0NhbGxiYWNrPFQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVCByZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0cy5wdXQoY2IsIHJlc3VsdCk7CisgICAgICAgIENhbGxiYWNrR3JvdXAudGhpcy5vblN1Y2Nlc3MoKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICBDYWxsYmFja0dyb3VwLnRoaXMub25GYWlsdXJlKGNhdWdodCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHB1YmxpYyA8VD4gY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPFQ+IGFkZEd3dGpzb25ycGMoCisgICAgICBmaW5hbCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKKyAgICBjYWxsYmFja3MuYWRkKGNiKTsKKyAgICByZXR1cm4gbmV3IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazxUPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFQgcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdHMucHV0KGNiLCByZXN1bHQpOworICAgICAgICBDYWxsYmFja0dyb3VwLnRoaXMub25TdWNjZXNzKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgQ2FsbGJhY2tHcm91cC50aGlzLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIHZvaWQgb25TdWNjZXNzKCkgeworICAgIGlmIChyZXN1bHRzLnNpemUoKSA8IGNhbGxiYWNrcy5zaXplKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChPYmplY3QgbyA6IGNhbGxiYWNrcykgeworICAgICAgT2JqZWN0IHJlc3VsdCA9IHJlc3VsdHMuZ2V0KG8pOworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBc3luY0NhbGxiYWNrKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBBc3luY0NhbGxiYWNrPE9iamVjdD4gY2IgPSAoQXN5bmNDYWxsYmFjazxPYmplY3Q+KSBvOworICAgICAgICBjYi5vblN1Y2Nlc3MocmVzdWx0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8T2JqZWN0PiBjYiA9CisgICAgICAgICAgICAoY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPE9iamVjdD4pIG87CisgICAgICAgIGNiLm9uU3VjY2VzcyhyZXN1bHQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICBmb3IgKE9iamVjdCBvIDogY2FsbGJhY2tzKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEFzeW5jQ2FsbGJhY2spIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEFzeW5jQ2FsbGJhY2s8T2JqZWN0PiBjYiA9IChBc3luY0NhbGxiYWNrPE9iamVjdD4pIG87CisgICAgICAgIGNiLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazxPYmplY3Q+IGNiID0KKyAgICAgICAgICAgIChjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8T2JqZWN0PikgbzsKKyAgICAgICAgY2Iub25GYWlsdXJlKGNhdWdodCk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL0dlcnJpdENhbGxiYWNrLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL0dlcnJpdENhbGxiYWNrLmphdmEKaW5kZXggZGNlNWJiNi4uMDZkMWYwYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9HZXJyaXRDYWxsYmFjay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvR2Vycml0Q2FsbGJhY2suamF2YQpAQCAtMjQsMTQgKzI0LDE1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vdFNpZ25lZEluRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkludm9jYXRpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5SZW1vdGVKc29uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuU2VydmVyVW5hdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Kc29uQ29uc3RhbnRzOwogCiAvKiogQWJzdHJhY3QgY2FsbGJhY2sgaGFuZGxpbmcgZ2VuZXJpYyBlcnJvciBjb25kaXRpb25zIGF1dG9tYXRpY2FsbHkgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZXJyaXRDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEFzeW5jQ2FsbGJhY2s8VD4geworcHVibGljIGFic3RyYWN0IGNsYXNzIEdlcnJpdENhbGxiYWNrPFQ+IGltcGxlbWVudHMKKyAgICBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8VD4sCisgICAgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s8VD4gewogICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewogICAgIGlmIChpc05vdFNpZ25lZEluKGNhdWdodCkgfHwgaXNJbnZhbGlkWFNSRihjYXVnaHQpKSB7CiAgICAgICBuZXcgTm90U2lnbmVkSW5EaWFsb2coKS5jZW50ZXIoKTsKQEAgLTUzLDcgKzU0LDkgQEAKICAgICAgIGQuY2VudGVyKCk7CiAKICAgICB9IGVsc2UgaWYgKGlzTmFtZUFscmVhZHlVc2VkKGNhdWdodCkpIHsKLSAgICAgIG5ldyBFcnJvckRpYWxvZyhHZXJyaXQuQy5uYW1lQWxyZWFkeVVzZWRCb2R5KCkpLmNlbnRlcigpOworICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGNhdWdodC5nZXRNZXNzYWdlKCk7CisgICAgICBmaW5hbCBTdHJpbmcgYWxyZWFkeVVzZWROYW1lID0gbXNnLnN1YnN0cmluZyhOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uTUVTU0FHRS5sZW5ndGgoKSk7CisgICAgICBuZXcgRXJyb3JEaWFsb2coR2Vycml0Lk0ubmFtZUFscmVhZHlVc2VkQm9keShhbHJlYWR5VXNlZE5hbWUpKS5jZW50ZXIoKTsKIAogICAgIH0gZWxzZSBpZiAoaXNOb1N1Y2hHcm91cChjYXVnaHQpKSB7CiAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gY2F1Z2h0LmdldE1lc3NhZ2UoKTsKQEAgLTc2LDE0ICs3OSwxNiBAQAogICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhKc29uQ29uc3RhbnRzLkVSUk9SX0lOVkFMSURfWFNSRik7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm90U2lnbmVkSW4oZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgIHJldHVybiBjYXVnaHQgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uCi0gICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKE5vdFNpZ25lZEluRXhjZXB0aW9uLk1FU1NBR0UpOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm90U2lnbmVkSW4oVGhyb3dhYmxlIGNhdWdodCkgeworICAgIHJldHVybiBSZXN0QXBpLmlzTm90U2lnbmVkSW4oY2F1Z2h0KQorICAgICAgICB8fCAoY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgorICAgICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhOb3RTaWduZWRJbkV4Y2VwdGlvbi5NRVNTQUdFKSk7CiAgIH0KIAotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNOb1N1Y2hFbnRpdHkoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgIHJldHVybiBjYXVnaHQgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uCi0gICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKE5vU3VjaEVudGl0eUV4Y2VwdGlvbi5NRVNTQUdFKTsKKyAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9TdWNoRW50aXR5KFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICByZXR1cm4gUmVzdEFwaS5pc05vdEZvdW5kKGNhdWdodCkKKyAgICAgICAgfHwgKGNhdWdodCBpbnN0YW5jZW9mIFJlbW90ZUpzb25FeGNlcHRpb24KKyAgICAgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKE5vU3VjaEVudGl0eUV4Y2VwdGlvbi5NRVNTQUdFKSk7CiAgIH0KIAogICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNJbmFjdGl2ZUFjY291bnQoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewpAQCAtOTgsNyArMTAzLDcgQEAKIAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTmFtZUFscmVhZHlVc2VkKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKICAgICByZXR1cm4gY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uTUVTU0FHRSk7CisgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uTUVTU0FHRSk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9TdWNoR3JvdXAoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVMaXN0LmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyMGZlMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKiBBIHJlYWQtb25seSBsaXN0IG9mIG5hdGl2ZSBKYXZhU2NyaXB0IG9iamVjdHMgc3RvcmVkIGluIGEgSlNPTiBhcnJheS4gKi8KLXB1YmxpYyBjbGFzcyBOYXRpdmVMaXN0PFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgewotICBwcm90ZWN0ZWQgTmF0aXZlTGlzdCgpIHsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBMaXN0PFQ+IGFzTGlzdCgpIHsKLSAgICByZXR1cm4gbmV3IEFic3RyYWN0TGlzdDxUPigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFQgc2V0KGludCBpbmRleCwgVCBlbGVtZW50KSB7Ci0gICAgICAgIFQgb2xkID0gTmF0aXZlTGlzdC50aGlzLmdldChpbmRleCk7Ci0gICAgICAgIE5hdGl2ZUxpc3QudGhpcy5zZXQwKGluZGV4LCBlbGVtZW50KTsKLSAgICAgICAgcmV0dXJuIG9sZDsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgVCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBOYXRpdmVMaXN0LnRoaXMuZ2V0KGluZGV4KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBOYXRpdmVMaXN0LnRoaXMuc2l6ZSgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiBzaXplKCkgPT0gMDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBuYXRpdmUgaW50IHNpemUoKSAvKi17IHJldHVybiB0aGlzLmxlbmd0aDsgfS0qLzsKLSAgcHVibGljIGZpbmFsIG5hdGl2ZSBUIGdldChpbnQgaSkgLyoteyByZXR1cm4gdGhpc1tpXTsgfS0qLzsKLSAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBzZXQwKGludCBpLCBUIHYpIC8qLXsgdGhpc1tpXSA9IHY7IH0tKi87Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZU1hcC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVNYXAuamF2YQppbmRleCBjZGU5MDQxLi5kNTZlZWFmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZU1hcC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlTWFwLmphdmEKQEAgLTE1LDcgKzE1LDggQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYzsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCkBAIC01Myw3ICs1NCw3IEBACiAgICAgcmV0dXJuIE5hdGl2ZXMua2V5cyh0aGlzKTsKICAgfQogCi0gIHB1YmxpYyBmaW5hbCBuYXRpdmUgTmF0aXZlTGlzdDxUPiB2YWx1ZXMoKQorICBwdWJsaWMgZmluYWwgbmF0aXZlIEpzQXJyYXk8VD4gdmFsdWVzKCkKICAgLyotewogICAgIHZhciBzID0gdGhpczsKICAgICB2YXIgdiA9IFtdOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVTdHJpbmcuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczYzVlNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlU3RyaW5nLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworCisvKiogV3JhcHMgYSBTdHJpbmcgdGhhdCB3YXMgcmV0dXJuZWQgZnJvbSBhIEpTT04gQVBJLiAqLworcHVibGljIGZpbmFsIGNsYXNzIE5hdGl2ZVN0cmluZyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICBzdGF0aWMgTmF0aXZlU3RyaW5nIHdyYXAoU3RyaW5nIHZhbHVlKSB7CisgICAgTmF0aXZlU3RyaW5nIG5zID0gKE5hdGl2ZVN0cmluZykgY3JlYXRlT2JqZWN0KCk7CisgICAgbnMuc2V0KHZhbHVlKTsKKyAgICByZXR1cm4gbnM7CisgIH0KKworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBhc1N0cmluZygpIC8qLXsgcmV0dXJuIHRoaXMuczsgfS0qLzsKKyAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgdm9pZCBzZXQoU3RyaW5nIHYpIC8qLXsgdGhpcy5zID0gdjsgfS0qLzsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzeW5jQ2FsbGJhY2s8TmF0aXZlU3RyaW5nPgorICB1bndyYXAoZmluYWwgQXN5bmNDYWxsYmFjazxTdHJpbmc+IGNiKSB7CisgICAgcmV0dXJuIG5ldyBBc3luY0NhbGxiYWNrPE5hdGl2ZVN0cmluZz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhOYXRpdmVTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgIGNiLm9uU3VjY2VzcyhyZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5hc1N0cmluZygpIDogbnVsbCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgY2Iub25GYWlsdXJlKGNhdWdodCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByb3RlY3RlZCBOYXRpdmVTdHJpbmcoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVzLmphdmEKaW5kZXggYTZjNjA5Yy4uNDFmMGYyMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVzLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVzLmphdmEKQEAgLTE1LDkgKzE1LDEyIEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuanNvbi5jbGllbnQuSlNPTk9iamVjdDsKIAoraW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBOYXRpdmVzIHsKQEAgLTMyLDE2ICszNSw1MSBAQAogICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IFQgcGFyc2VKU09OKFN0cmluZyBqc29uKSB7Ci0gICAgaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0gICAgICBwYXJzZXIgPSBiZXN0SnNvblBhcnNlcigpOworICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gTGlzdDxUPiBhc0xpc3QoCisgICAgICBmaW5hbCBKc0FycmF5PFQ+IGFycikgeworICAgIGlmIChhcnIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQotICAgIC8vIGphdmFjIGdlbmVyaWNzIGJ1ZwotICAgIHJldHVybiBOYXRpdmVzLjxUPnBhcnNlMChwYXJzZXIsIGpzb24pOworICAgIHJldHVybiBuZXcgQWJzdHJhY3RMaXN0PFQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKKyAgICAgICAgVCBvbGQgPSBhcnIuZ2V0KGluZGV4KTsKKyAgICAgICAgYXJyLnNldChpbmRleCwgZWxlbWVudCk7CisgICAgICAgIHJldHVybiBvbGQ7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gYXJyLmdldChpbmRleCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gYXJyLmxlbmd0aCgpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gSnNBcnJheTxUPiBhcnJheU9mKFQgZWxlbWVudCkgeworICAgIEpzQXJyYXk8VD4gYXJyID0gSmF2YVNjcmlwdE9iamVjdC5jcmVhdGVBcnJheSgpLmNhc3QoKTsKKyAgICBhcnIucHVzaChlbGVtZW50KTsKKyAgICByZXR1cm4gYXJyOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBUIHBhcnNlSlNPTihTdHJpbmcganNvbikgeworICAgIGlmIChqc29uLnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgIHJldHVybiAoVCkgTmF0aXZlU3RyaW5nLndyYXAocGFyc2VTdHJpbmcocGFyc2VyLCBqc29uKSk7CisgICAgfQorICAgIHJldHVybiBOYXRpdmVzLjxUPiBwYXJzZU9iamVjdChwYXJzZXIsIGpzb24pOyAvLyBqYXZhYyBnZW5lcmljcyBidWcKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+Ci0gIFQgcGFyc2UwKEphdmFTY3JpcHRPYmplY3QgcCwgU3RyaW5nIHMpCisgIFQgcGFyc2VPYmplY3QoSmF2YVNjcmlwdE9iamVjdCBwLCBTdHJpbmcgcykKKyAgLyoteyByZXR1cm4gcChzKTsgfS0qLzsKKworICBwcml2YXRlIHN0YXRpYyBuYXRpdmUKKyAgU3RyaW5nIHBhcnNlU3RyaW5nKEphdmFTY3JpcHRPYmplY3QgcCwgU3RyaW5nIHMpCiAgIC8qLXsgcmV0dXJuIHAocyk7IH0tKi87CiAKICAgcHJpdmF0ZSBzdGF0aWMgSmF2YVNjcmlwdE9iamVjdCBwYXJzZXI7CkBAIC01Miw2ICs5MCwxMCBAQAogICAgIHJldHVybiBmdW5jdGlvbihzKSB7IHJldHVybiBldmFsKCcoJyArIHMgKyAnKScpOyB9OwogICB9LSovOwogCisgIHN0YXRpYyB7CisgICAgcGFyc2VyID0gYmVzdEpzb25QYXJzZXIoKTsKKyAgfQorCiAgIHByaXZhdGUgTmF0aXZlcygpIHsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9SZXN0QXBpLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1Jlc3RBcGkuamF2YQppbmRleCA2NTBjYWNkLi40ZWU2M2M2IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1Jlc3RBcGkuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1Jlc3RBcGkuamF2YQpAQCAtMTQsMjMgKzE0LDM4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYzsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXF1ZXN0QnVpbGRlci5ERUxFVEU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyLkdFVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXIuUE9TVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXIuUFVUOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuUnBjU3RhdHVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXIuTWV0aG9kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlc3BvbnNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5qc29uLmNsaWVudC5KU09ORXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmpzb24uY2xpZW50LkpTT05PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuanNvbi5jbGllbnQuSlNPTlBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5qc29uLmNsaWVudC5KU09OVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLlN0YXR1c0NvZGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5SZW1vdGVKc29uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuU2VydmVyVW5hdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uSnNvbkNvbnN0YW50czsKIAogLyoqIE1ha2VzIGEgUkVTVCBBUEkgY2FsbCB0byB0aGUgc2VydmVyLiAqLwogcHVibGljIGNsYXNzIFJlc3RBcGkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NfVU5BVkFJTEFCTEUgPSAyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NfQkFEX1RSQU5TUE9SVCA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ19CQURfUkVTUE9OU0UgPSA0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9UWVBFID0gImFwcGxpY2F0aW9uL2pzb24iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9VVEY4ID0gSlNPTl9UWVBFICsgIjsgY2hhcnNldD11dGYtOCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RZUEUgPSAidGV4dC9wbGFpbiI7CisKICAgLyoqCiAgICAqIEV4cGVjdGVkIEpTT04gY29udGVudCBib2R5IHByZWZpeCB0aGF0IHByZXZlbnRzIFhTU0kuCiAgICAqIDxwPgpAQCAtNDIsNzUgKzU3LDEzMSBAQAogICAgKi8KICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fTUFHSUMgPSAiKV19J1xuIjsKIAotICBwcml2YXRlIGNsYXNzIE15UmVxdWVzdENhbGxiYWNrPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBpbXBsZW1lbnRzCi0gICAgICBSZXF1ZXN0Q2FsbGJhY2sgewotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB3YXNHZXQ7CisgIC8qKiBUcnVlIGlmIGVyciBpcyBhIFN0YXR1c0NvZGVFeGNlcHRpb24gcmVwb3J0aW5nIE5vdCBGb3VuZC4gKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm90Rm91bmQoVGhyb3dhYmxlIGVycikgeworICAgIHJldHVybiBpc1N0YXR1cyhlcnIsIFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CisgIH0KKworICAvKiogVHJ1ZSBpZiBlcnIgaXMgZGVzY3JpYmluZyBhIHVzZXIgdGhhdCBpcyBjdXJyZW50bHkgYW5vbnltb3VzLiAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOb3RTaWduZWRJbihUaHJvd2FibGUgZXJyKSB7CisgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN0YXR1c0NvZGVFeGNlcHRpb24pIHsKKyAgICAgIFN0YXR1c0NvZGVFeGNlcHRpb24gc2NlID0gKFN0YXR1c0NvZGVFeGNlcHRpb24pIGVycjsKKyAgICAgIGlmIChzY2UuZ2V0U3RhdHVzQ29kZSgpID09IFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzY2UuZ2V0U3RhdHVzQ29kZSgpID09IFJlc3BvbnNlLlNDX0ZPUkJJRERFTgorICAgICAgICAgICYmIChzY2UuZ2V0RW5jb2RlZFJlc3BvbnNlKCkuZXF1YWxzKCJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpCisgICAgICAgICAgICAgIHx8IHNjZS5nZXRFbmNvZGVkUmVzcG9uc2UoKS5zdGFydHNXaXRoKCJNdXN0IGJlIHNpZ25lZC1pbiIpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLyoqIFRydWUgaWYgZXJyIGlzIGEgU3RhdHVzQ29kZUV4Y2VwdGlvbiB3aXRoIGEgc3BlY2lmaWMgSFRUUCBjb2RlLiAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGF0dXMoVGhyb3dhYmxlIGVyciwgaW50IHN0YXR1cykgeworICAgIHJldHVybiBlcnIgaW5zdGFuY2VvZiBTdGF0dXNDb2RlRXhjZXB0aW9uCisgICAgICAgICYmICgoU3RhdHVzQ29kZUV4Y2VwdGlvbikgZXJyKS5nZXRTdGF0dXNDb2RlKCkgPT0gc3RhdHVzOworICB9CisKKyAgLyoqIElzIHRoZSBHZXJyaXQgQ29kZSBSZXZpZXcgc2VydmVyIGxpa2VseSB0byByZXR1cm4gdGhpcyBzdGF0dXM/ICovCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4cGVjdGVkKGludCBzdGF0dXNDb2RlKSB7CisgICAgc3dpdGNoIChzdGF0dXNDb2RlKSB7CisgICAgICBjYXNlIFNDX1VOQVZBSUxBQkxFOgorICAgICAgY2FzZSA0MDA6IC8vIEJhZCBSZXF1ZXN0CisgICAgICBjYXNlIDQwMTogLy8gVW5hdXRob3JpemVkCisgICAgICBjYXNlIDQwMzogLy8gRm9yYmlkZGVuCisgICAgICBjYXNlIDQwNDogLy8gTm90IEZvdW5kCisgICAgICBjYXNlIDQwNTogLy8gTWV0aG9kIE5vdCBBbGxvd2VkCisgICAgICBjYXNlIDQwOTogLy8gQ29uZmxpY3QKKyAgICAgIGNhc2UgNDEyOiAvLyBQcmVjb25kaXRpb24gRmFpbGVkCisgICAgICBjYXNlIDQyOTogLy8gVG9vIE1hbnkgUmVxdWVzdHMgKFJGQyA2NTg1KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gQXNzdW1lIGFueSBvdGhlciBjb2RlIGlzIG5vdCBleHBlY3RlZC4gVGhlc2UgbWF5IGJlCisgICAgICAgIC8vIGxvY2FsIHByb3h5IHNlcnZlciBlcnJvcnMgb3V0c2lkZSBvZiBvdXIgY29udHJvbC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBDYWxsYmFjazxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4KKyAgICAgIGltcGxlbWVudHMgUmVxdWVzdENhbGxiYWNrIHsKICAgICBwcml2YXRlIGZpbmFsIEFzeW5jQ2FsbGJhY2s8VD4gY2I7CiAKLSAgICBwdWJsaWMgTXlSZXF1ZXN0Q2FsbGJhY2soYm9vbGVhbiB3YXNHZXQsIEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKLSAgICAgIHRoaXMud2FzR2V0ID0gd2FzR2V0OworICAgIEh0dHBDYWxsYmFjayhBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CiAgICAgICB0aGlzLmNiID0gY2I7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25SZXNwb25zZVJlY2VpdmVkKFJlcXVlc3QgcmVxLCBSZXNwb25zZSByZXMpIHsKICAgICAgIGludCBzdGF0dXMgPSByZXMuZ2V0U3RhdHVzQ29kZSgpOwotICAgICAgaWYgKHN0YXR1cyAhPSAyMDApIHsKKyAgICAgIGlmIChzdGF0dXMgPT0gUmVzcG9uc2UuU0NfTk9fQ09OVEVOVCkgeworICAgICAgICBjYi5vblN1Y2Nlc3MobnVsbCk7CiAgICAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY0NvbXBsZXRlKCk7Ci0gICAgICAgIGlmICgoNDAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCA2MDApICYmIGlzVGV4dEJvZHkocmVzKSkgewotICAgICAgICAgIGNiLm9uRmFpbHVyZShuZXcgUmVtb3RlSnNvbkV4Y2VwdGlvbihyZXMuZ2V0VGV4dCgpLCBzdGF0dXMsIG51bGwpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFN0YXR1c0NvZGVFeGNlcHRpb24oc3RhdHVzLCByZXMuZ2V0U3RhdHVzVGV4dCgpKSk7CisKKyAgICAgIH0gZWxzZSBpZiAoMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCAzMDApIHsKKyAgICAgICAgaWYgKCFpc0pzb25Cb2R5KHJlcykpIHsKKyAgICAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOworICAgICAgICAgIGNiLm9uRmFpbHVyZShuZXcgU3RhdHVzQ29kZUV4Y2VwdGlvbihTQ19CQURfUkVTUE9OU0UsICJFeHBlY3RlZCAiCisgICAgICAgICAgICAgICsgSlNPTl9UWVBFICsgIjsgcmVjZWl2ZWQgQ29udGVudC1UeXBlOiAiCisgICAgICAgICAgICAgICsgcmVzLmdldEhlYWRlcigiQ29udGVudC1UeXBlIikpKTsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQogCi0gICAgICBpZiAoIWlzSnNvbkJvZHkocmVzKSkgeworICAgICAgICBUIGRhdGE7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgLy8gamF2YWMgZ2VuZXJpY3MgYnVnCisgICAgICAgICAgZGF0YSA9IFJlc3RBcGkuPFQ+Y2FzdChwYXJzZUpzb24ocmVzKSk7CisgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgeworICAgICAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY0NvbXBsZXRlKCk7CisgICAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTdGF0dXNDb2RlRXhjZXB0aW9uKFNDX0JBRF9SRVNQT05TRSwKKyAgICAgICAgICAgICAgIkludmFsaWQgSlNPTjogIiArIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2Iub25TdWNjZXNzKGRhdGEpOwogICAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwotICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFJlbW90ZUpzb25FeGNlcHRpb24oIkludmFsaWQgSlNPTiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQogCi0gICAgICBTdHJpbmcganNvbiA9IHJlcy5nZXRUZXh0KCk7Ci0gICAgICBpZiAoIWpzb24uc3RhcnRzV2l0aChKU09OX01BR0lDKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3RyaW5nIG1zZzsKKyAgICAgICAgaWYgKGlzVGV4dEJvZHkocmVzKSkgeworICAgICAgICAgIG1zZyA9IHJlcy5nZXRUZXh0KCkudHJpbSgpOworICAgICAgICB9IGVsc2UgaWYgKGlzSnNvbkJvZHkocmVzKSkgeworICAgICAgICAgIEpTT05WYWx1ZSB2OworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2ID0gcGFyc2VKc29uKHJlcyk7CisgICAgICAgICAgfSBjYXRjaCAoSlNPTkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB2ID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LmlzU3RyaW5nKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbXNnID0gdi5pc1N0cmluZygpLnN0cmluZ1ZhbHVlKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZyA9IHRyaW1Kc29uTWFnaWMocmVzLmdldFRleHQoKSkudHJpbSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtc2cgPSByZXMuZ2V0U3RhdHVzVGV4dCgpOworICAgICAgICB9CisKICAgICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKLSAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBSZW1vdGVKc29uRXhjZXB0aW9uKCJJbnZhbGlkIEpTT04iKSk7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTdGF0dXNDb2RlRXhjZXB0aW9uKHN0YXR1cywgbXNnKSk7CiAgICAgICB9Ci0gICAgICBqc29uID0ganNvbi5zdWJzdHJpbmcoSlNPTl9NQUdJQy5sZW5ndGgoKSk7Ci0KLSAgICAgIGlmICh3YXNHZXQgJiYganNvbi5zdGFydHNXaXRoKCJ7XCJfYXV0aGtleVwiOiIpKSB7Ci0gICAgICAgIFJlc3RBcGkudGhpcy5yZXNlbmRQb3N0KGNiLCBqc29uKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBUIGRhdGE7Ci0gICAgICB0cnkgewotICAgICAgICAvLyBqYXZhYyBnZW5lcmljcyBidWcKLSAgICAgICAgZGF0YSA9IE5hdGl2ZXMuPFQ+IHBhcnNlSlNPTihqc29uKTsKLSAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwotICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFJlbW90ZUpzb25FeGNlcHRpb24oIkludmFsaWQgSlNPTiIpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBjYi5vblN1Y2Nlc3MoZGF0YSk7Ci0gICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoUmVxdWVzdCByZXEsIFRocm93YWJsZSBlcnIpIHsKICAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY0NvbXBsZXRlKCk7CiAgICAgICBpZiAoZXJyLmdldE1lc3NhZ2UoKS5jb250YWlucygiWG1sSHR0cFJlcXVlc3Quc3RhdHVzIikpIHsKLSAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTZXJ2ZXJVbmF2YWlsYWJsZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTdGF0dXNDb2RlRXhjZXB0aW9uKAorICAgICAgICAgICAgU0NfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICBScGNDb25zdGFudHMuQy5lcnJvclNlcnZlclVuYXZhaWxhYmxlKCkpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNiLm9uRmFpbHVyZShlcnIpOworICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFN0YXR1c0NvZGVFeGNlcHRpb24oU0NfQkFEX1RSQU5TUE9SVCwgZXJyLmdldE1lc3NhZ2UoKSkpOwogICAgICAgfQogICAgIH0KICAgfQogCiAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciB1cmw7CiAgIHByaXZhdGUgYm9vbGVhbiBoYXNRdWVyeVBhcmFtczsKKyAgcHJpdmF0ZSBTdHJpbmcgaWZOb25lTWF0Y2g7CiAKICAgLyoqCiAgICAqIEluaXRpYWxpemUgYSBuZXcgQVBJIGNhbGwuCkBAIC0xMzEsMTAgKzIwMiw0MCBAQAogICAgIHVybC5hcHBlbmQobmFtZSk7CiAgIH0KIAorICBwdWJsaWMgUmVzdEFwaSB2aWV3KFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGlkUmF3KG5hbWUpOworICB9CisKKyAgcHVibGljIFJlc3RBcGkgaWQoU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIGlkUmF3KFVSTC5lbmNvZGVRdWVyeVN0cmluZyhpZCkpOworICB9CisKKyAgcHVibGljIFJlc3RBcGkgaWQoaW50IGlkKSB7CisgICAgcmV0dXJuIGlkUmF3KEludGVnZXIudG9TdHJpbmcoaWQpKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0QXBpIGlkUmF3KFN0cmluZyBuYW1lKSB7CisgICAgaWYgKGhhc1F1ZXJ5UGFyYW1zKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGgoKSAtIDEpICE9ICcvJykgeworICAgICAgdXJsLmFwcGVuZCgnLycpOworICAgIH0KKyAgICB1cmwuYXBwZW5kKG5hbWUpOworICAgIHJldHVybiB0aGlzOworICB9CisKICAgcHVibGljIFJlc3RBcGkgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgICByZXR1cm4gYWRkUGFyYW1ldGVyUmF3KG5hbWUsIFVSTC5lbmNvZGVRdWVyeVN0cmluZyh2YWx1ZSkpOwogICB9CiAKKyAgcHVibGljIFJlc3RBcGkgYWRkUGFyYW1ldGVyKFN0cmluZyBuYW1lLCBTdHJpbmcuLi4gdmFsdWUpIHsKKyAgICBmb3IgKFN0cmluZyB2YWwgOiB2YWx1ZSkgeworICAgICAgYWRkUGFyYW1ldGVyKG5hbWUsIHZhbCk7CisgICAgfQorICAgIHJldHVybiB0aGlzOworICB9CisKICAgcHVibGljIFJlc3RBcGkgYWRkUGFyYW1ldGVyVHJ1ZShTdHJpbmcgbmFtZSkgewogICAgIHJldHVybiBhZGRQYXJhbWV0ZXJSYXcobmFtZSwgbnVsbCk7CiAgIH0KQEAgLTE2NSw0MCArMjY2LDg3IEBACiAgICAgcmV0dXJuIHRoaXM7CiAgIH0KIAotICBwdWJsaWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHNlbmQoZmluYWwgQXN5bmNDYWxsYmFjazxUPiBjYikgewotICAgIFJlcXVlc3RCdWlsZGVyIHJlcSA9IG5ldyBSZXF1ZXN0QnVpbGRlcihSZXF1ZXN0QnVpbGRlci5HRVQsIHVybC50b1N0cmluZygpKTsKLSAgICByZXEuc2V0SGVhZGVyKCJBY2NlcHQiLCBKc29uQ29uc3RhbnRzLkpTT05fVFlQRSk7Ci0gICAgcmVxLnNldENhbGxiYWNrKG5ldyBNeVJlcXVlc3RDYWxsYmFjazxUPih0cnVlLCBjYikpOworICBwdWJsaWMgUmVzdEFwaSBpZk5vbmVNYXRjaCgpIHsKKyAgICByZXR1cm4gaWZOb25lTWF0Y2goIioiKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0QXBpIGlmTm9uZU1hdGNoKFN0cmluZyBldGFnKSB7CisgICAgaWZOb25lTWF0Y2ggPSBldGFnOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIFN0cmluZyB1cmwoKSB7CisgICAgcmV0dXJuIHVybC50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBnZXQoQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIHNlbmQoR0VULCBjYik7CisgIH0KKworICBwdWJsaWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIGRlbGV0ZShBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgc2VuZChERUxFVEUsIGNiKTsKKyAgfQorCisgIHByaXZhdGUgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHNlbmQoCisgICAgICBNZXRob2QgbWV0aG9kLCBBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgSHR0cENhbGxiYWNrPFQ+IGh0dHBDYWxsYmFjayA9IG5ldyBIdHRwQ2FsbGJhY2s8VD4oY2IpOwogICAgIHRyeSB7CiAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNTdGFydCgpOwotICAgICAgcmVxLnNlbmQoKTsKKyAgICAgIHJlcXVlc3QobWV0aG9kKS5zZW5kUmVxdWVzdChudWxsLCBodHRwQ2FsbGJhY2spOwogICAgIH0gY2F0Y2ggKFJlcXVlc3RFeGNlcHRpb24gZSkgewotICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKLSAgICAgIGNiLm9uRmFpbHVyZShlKTsKKyAgICAgIGh0dHBDYWxsYmFjay5vbkVycm9yKG51bGwsIGUpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHJlc2VuZFBvc3QoCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPFQ+IGNiLCBTdHJpbmcgdG9rZW4pIHsKLSAgICBSZXF1ZXN0QnVpbGRlciByZXEgPSBuZXcgUmVxdWVzdEJ1aWxkZXIoUmVxdWVzdEJ1aWxkZXIuUE9TVCwgdXJsLnRvU3RyaW5nKCkpOwotICAgIHJlcS5zZXRIZWFkZXIoIkFjY2VwdCIsIEpzb25Db25zdGFudHMuSlNPTl9UWVBFKTsKLSAgICByZXEuc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBKc29uQ29uc3RhbnRzLkpTT05fVFlQRSk7Ci0gICAgcmVxLnNldFJlcXVlc3REYXRhKHRva2VuKTsKLSAgICByZXEuc2V0Q2FsbGJhY2sobmV3IE15UmVxdWVzdENhbGxiYWNrPFQ+KGZhbHNlLCBjYikpOworICBwdWJsaWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHBvc3QoCisgICAgICBKYXZhU2NyaXB0T2JqZWN0IGNvbnRlbnQsCisgICAgICBBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgc2VuZEpTT04oUE9TVCwgY29udGVudCwgY2IpOworICB9CisKKyAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBwdXQoQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIHNlbmQoUFVULCBjYik7CisgIH0KKworICBwdWJsaWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHB1dCgKKyAgICAgIEphdmFTY3JpcHRPYmplY3QgY29udGVudCwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKKyAgICBzZW5kSlNPTihQVVQsIGNvbnRlbnQsIGNiKTsKKyAgfQorCisgIHByaXZhdGUgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiB2b2lkIHNlbmRKU09OKAorICAgICAgTWV0aG9kIG1ldGhvZCwgSmF2YVNjcmlwdE9iamVjdCBjb250ZW50LAorICAgICAgQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIEh0dHBDYWxsYmFjazxUPiBodHRwQ2FsbGJhY2sgPSBuZXcgSHR0cENhbGxiYWNrPFQ+KGNiKTsKICAgICB0cnkgewotICAgICAgcmVxLnNlbmQoKTsKKyAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY1N0YXJ0KCk7CisgICAgICBTdHJpbmcgYm9keSA9IG5ldyBKU09OT2JqZWN0KGNvbnRlbnQpLnRvU3RyaW5nKCk7CisgICAgICBSZXF1ZXN0QnVpbGRlciByZXEgPSByZXF1ZXN0KG1ldGhvZCk7CisgICAgICByZXEuc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBKU09OX1VURjgpOworICAgICAgcmVxLnNlbmRSZXF1ZXN0KGJvZHksIGh0dHBDYWxsYmFjayk7CiAgICAgfSBjYXRjaCAoUmVxdWVzdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwotICAgICAgY2Iub25GYWlsdXJlKGUpOworICAgICAgaHR0cENhbGxiYWNrLm9uRXJyb3IobnVsbCwgZSk7CiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBSZXF1ZXN0QnVpbGRlciByZXF1ZXN0KE1ldGhvZCBtZXRob2QpIHsKKyAgICBSZXF1ZXN0QnVpbGRlciByZXEgPSBuZXcgUmVxdWVzdEJ1aWxkZXIobWV0aG9kLCB1cmwoKSk7CisgICAgaWYgKGlmTm9uZU1hdGNoICE9IG51bGwpIHsKKyAgICAgIHJlcS5zZXRIZWFkZXIoIklmLU5vbmUtTWF0Y2giLCBpZk5vbmVNYXRjaCk7CisgICAgfQorICAgIHJlcS5zZXRIZWFkZXIoIkFjY2VwdCIsIEpTT05fVFlQRSk7CisgICAgaWYgKEdlcnJpdC5nZXRYR2Vycml0QXV0aCgpICE9IG51bGwpIHsKKyAgICAgIHJlcS5zZXRIZWFkZXIoIlgtR2Vycml0LUF1dGgiLCBHZXJyaXQuZ2V0WEdlcnJpdEF1dGgoKSk7CisgICAgfQorICAgIHJldHVybiByZXE7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSnNvbkJvZHkoUmVzcG9uc2UgcmVzKSB7Ci0gICAgcmV0dXJuIGlzQ29udGVudFR5cGUocmVzLCBKc29uQ29uc3RhbnRzLkpTT05fVFlQRSk7CisgICAgcmV0dXJuIGlzQ29udGVudFR5cGUocmVzLCBKU09OX1RZUEUpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RleHRCb2R5KFJlc3BvbnNlIHJlcykgewotICAgIHJldHVybiBpc0NvbnRlbnRUeXBlKHJlcywgInRleHQvcGxhaW4iKTsKKyAgICByZXR1cm4gaXNDb250ZW50VHlwZShyZXMsIFRFWFRfVFlQRSk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ29udGVudFR5cGUoUmVzcG9uc2UgcmVzLCBTdHJpbmcgd2FudCkgewpAQCAtMjEyLDQgKzM2MCwzNSBAQAogICAgIH0KICAgICByZXR1cm4gd2FudC5lcXVhbHModHlwZSk7CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBKU09OVmFsdWUgcGFyc2VKc29uKFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICBTdHJpbmcganNvbiA9IHRyaW1Kc29uTWFnaWMocmVzLmdldFRleHQoKSk7CisgICAgaWYgKGpzb24uaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgSlNPTkV4Y2VwdGlvbigicmVzcG9uc2Ugd2FzIGVtcHR5Iik7CisgICAgfQorICAgIHJldHVybiBKU09OUGFyc2VyLnBhcnNlU3RyaWN0KGpzb24pOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRyaW1Kc29uTWFnaWMoU3RyaW5nIGpzb24pIHsKKyAgICBpZiAoanNvbi5zdGFydHNXaXRoKEpTT05fTUFHSUMpKSB7CisgICAgICBqc29uID0ganNvbi5zdWJzdHJpbmcoSlNPTl9NQUdJQy5sZW5ndGgoKSk7CisgICAgfQorICAgIHJldHVybiBqc29uOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gVCBjYXN0KEpTT05WYWx1ZSB2YWwpIHsKKyAgICBpZiAodmFsLmlzT2JqZWN0KCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIChUKSB2YWwuaXNPYmplY3QoKS5nZXRKYXZhU2NyaXB0T2JqZWN0KCk7CisgICAgfSBlbHNlIGlmICh2YWwuaXNBcnJheSgpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAoVCkgdmFsLmlzQXJyYXkoKS5nZXRKYXZhU2NyaXB0T2JqZWN0KCk7CisgICAgfSBlbHNlIGlmICh2YWwuaXNTdHJpbmcoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gKFQpIE5hdGl2ZVN0cmluZy53cmFwKHZhbC5pc1N0cmluZygpLnN0cmluZ1ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodmFsLmlzTnVsbCgpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgSlNPTkV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgSlNPTiB0eXBlIik7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1NjcmVlbkxvYWRDYWxsYmFjay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9TY3JlZW5Mb2FkQ2FsbGJhY2suamF2YQppbmRleCBlYjEzODM0Li5iOGI5MjA5IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1NjcmVlbkxvYWRDYWxsYmFjay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvU2NyZWVuTG9hZENhbGxiYWNrLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lk5vdEZvdW5kU2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Ob3RTaWduZWRJbkRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwogCkBAIC00Myw3ICs0NCwxMSBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKICAgICBpZiAoaXNOb1N1Y2hFbnRpdHkoY2F1Z2h0KSkgewotICAgICAgR2Vycml0LmRpc3BsYXkoc2NyZWVuLmdldFRva2VuKCksIG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKKyAgICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICAgIEdlcnJpdC5kaXNwbGF5KHNjcmVlbi5nZXRUb2tlbigpLCBuZXcgTm90Rm91bmRTY3JlZW4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBuZXcgTm90U2lnbmVkSW5EaWFsb2coKS5jZW50ZXIoKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9UcmFuc2Zvcm1DYWxsYmFjay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9UcmFuc2Zvcm1DYWxsYmFjay5qYXZhCmluZGV4IDJjZDIyY2IuLjkzYzg2YTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvVHJhbnNmb3JtQ2FsbGJhY2suamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1RyYW5zZm9ybUNhbGxiYWNrLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogCiAvKiogVHJhbnNmb3JtcyBhIHZhbHVlIGFuZCBwYXNzZXMgaXQgb24gdG8gYW5vdGhlciBjYWxsYmFjay4gKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmFuc2Zvcm1DYWxsYmFjazxJLCBPPiBpbXBsZW1lbnRzIEFzeW5jQ2FsbGJhY2s8ST57CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUuamF2YQppbmRleCA1ZGEwMGNkLi4yNzhlMTU5IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50R3JvdXBTdWdnZXN0T3JhY2xlLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlN1Z2dlc3RPcmFjbGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0yOCwxNCArMjcsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKiogU3VnZ2VzdGlvbiBPcmFjbGUgZm9yIEFjY291bnRHcm91cCBlbnRpdGllcy4gKi8KLXB1YmxpYyBjbGFzcyBBY2NvdW50R3JvdXBTdWdnZXN0T3JhY2xlIGV4dGVuZHMgSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZSB7CitwdWJsaWMgY2xhc3MgQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZSBleHRlbmRzIFN1Z2dlc3RBZnRlclR5cGluZ05DaGFyc09yYWNsZSB7CiAgIHByaXZhdGUgTWFwPFN0cmluZywgQWNjb3VudEdyb3VwLlVVSUQ+IHByaW9yUmVzdWx0cyA9CiAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEFjY291bnRHcm91cC5VVUlEPigpOwogCiAgIHByaXZhdGUgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lOwogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcSwgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgcHVibGljIHZvaWQgX29uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBDYWxsYmFjayBjYWxsYmFjaykgewogICAgIFJwY1N0YXR1cy5oaWRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgU3VnZ2VzdFV0aWwuU1ZDLnN1Z2dlc3RBY2NvdW50R3JvdXBGb3JQcm9qZWN0KApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudExpbmsuamF2YQppbmRleCA3OTAxMDJjLi5mZDUyNzc3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudExpbmsuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudExpbmsuamF2YQpAQCAtMTYsMzIgKzE2LDUxIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm9DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Vc2VySWRlbnRpdHk7CiAKIC8qKiBMaW5rIHRvIGFueSB1c2VyJ3MgYWNjb3VudCBkYXNoYm9hcmQuICovCiBwdWJsaWMgY2xhc3MgQWNjb3VudExpbmsgZXh0ZW5kcyBJbmxpbmVIeXBlcmxpbmsgewogICAvKiogQ3JlYXRlIGEgbGluayBhZnRlciBsb2NhdGluZyBhY2NvdW50IGRldGFpbHMgZnJvbSBhbiBhY3RpdmUgY2FjaGUuICovCi0gIHB1YmxpYyBzdGF0aWMgQWNjb3VudExpbmsgbGluayhmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGNhY2hlLAotICAgICAgZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgIGZpbmFsIEFjY291bnRJbmZvIGFpID0gY2FjaGUuZ2V0KGlkKTsKKyAgcHVibGljIHN0YXRpYyBBY2NvdW50TGluayBsaW5rKEFjY291bnRJbmZvQ2FjaGUgY2FjaGUsIEFjY291bnQuSWQgaWQpIHsKKyAgICBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbyBhaSA9IGNhY2hlLmdldChpZCk7CiAgICAgcmV0dXJuIGFpICE9IG51bGwgPyBuZXcgQWNjb3VudExpbmsoYWkpIDogbnVsbDsKICAgfQogCi0gIHB1YmxpYyBBY2NvdW50TGluayhmaW5hbCBBY2NvdW50SW5mbyBhaSkgewotICAgIHN1cGVyKEZvcm1hdFV0aWwubmFtZShhaSksIFBhZ2VMaW5rcy50b0FjY291bnRRdWVyeShvd25lcihhaSkpKTsKLSAgICBzZXRUaXRsZShGb3JtYXRVdGlsLm5hbWVFbWFpbChhaSkpOworICBwdWJsaWMgQWNjb3VudExpbmsoY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm8gYWkpIHsKKyAgICB0aGlzKEZvcm1hdFV0aWwuYXNJbmZvKGFpKSk7CisgIH0KKworICBwdWJsaWMgQWNjb3VudExpbmsoVXNlcklkZW50aXR5IGlkZW50KSB7CisgICAgdGhpcyhBY2NvdW50SW5mby5jcmVhdGUoCisgICAgICAgIGlkZW50LmdldEFjY291bnQoKS5nZXQoKSwKKyAgICAgICAgaWRlbnQuZ2V0TmFtZSgpLAorICAgICAgICBpZGVudC5nZXRFbWFpbCgpKSk7CisgIH0KKworICBwdWJsaWMgQWNjb3VudExpbmsoQWNjb3VudEluZm8gaW5mbykgeworICAgIHRoaXMoaW5mbywgQ2hhbmdlLlN0YXR1cy5ORVcpOworICB9CisKKyAgcHVibGljIEFjY291bnRMaW5rKEFjY291bnRJbmZvIGluZm8sIENoYW5nZS5TdGF0dXMgc3RhdHVzKSB7CisgICAgc3VwZXIoRm9ybWF0VXRpbC5uYW1lKGluZm8pLCBQYWdlTGlua3MudG9BY2NvdW50UXVlcnkob3duZXIoaW5mbyksIHN0YXR1cykpOworICAgIHNldFRpdGxlKEZvcm1hdFV0aWwubmFtZUVtYWlsKGluZm8pKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBvd25lcihBY2NvdW50SW5mbyBhaSkgewotICAgIGlmIChhaS5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBhaS5nZXRQcmVmZXJyZWRFbWFpbCgpOwotICAgIH0gZWxzZSBpZiAoYWkuZ2V0RnVsbE5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gYWkuZ2V0RnVsbE5hbWUoKTsKKyAgICBpZiAoYWkuZW1haWwoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gYWkuZW1haWwoKTsKKyAgICB9IGVsc2UgaWYgKGFpLm5hbWUoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gYWkubmFtZSgpOworICAgIH0gZWxzZSBpZiAoYWkuX2FjY291bnRfaWQoKSAhPSAwKSB7CisgICAgICByZXR1cm4gIiIgKyBhaS5fYWNjb3VudF9pZCgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHJldHVybiAiIiArIGFpLmdldElkKCkuZ2V0KCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50U3VnZ2VzdE9yYWNsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRTdWdnZXN0T3JhY2xlLmphdmEKaW5kZXggYmNmNjQzOC4uMGJmMGVhOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRTdWdnZXN0T3JhY2xlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRTdWdnZXN0T3JhY2xlLmphdmEKQEAgLTE5LDE1ICsxOSwxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdE9yYWNsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5IaWdobGlnaHRTdWdnZXN0T3JhY2xlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqIFN1Z2dlc3Rpb24gT3JhY2xlIGZvciBBY2NvdW50IGVudGl0aWVzLiAqLwotcHVibGljIGNsYXNzIEFjY291bnRTdWdnZXN0T3JhY2xlIGV4dGVuZHMgSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZSB7CitwdWJsaWMgY2xhc3MgQWNjb3VudFN1Z2dlc3RPcmFjbGUgZXh0ZW5kcyBTdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUgewogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgIHB1YmxpYyB2b2lkIF9vblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcSwgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICBScGNTdGF0dXMuaGlkZShuZXcgUnVubmFibGUoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIFN1Z2dlc3RVdGlsLlNWQy5zdWdnZXN0QWNjb3VudChyZXEuZ2V0UXVlcnkoKSwgQm9vbGVhbi5UUlVFLApAQCAtNTQsMTEgKzUzLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKGluZm8pOworICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKEZvcm1hdFV0aWwuYXNJbmZvKGluZm8pKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKGluZm8pOworICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKEZvcm1hdFV0aWwuYXNJbmZvKGluZm8pKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BZGRNZW1iZXJCb3guamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BZGRNZW1iZXJCb3guamF2YQppbmRleCA3MmEwMTFmLi5kNGFhYTRjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWRkTWVtYmVyQm94LmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FkZE1lbWJlckJveC5qYXZhCkBAIC03Miw2ICs3Miw3IEBACiAgICAgbmFtZVR4dC5hZGRTZWxlY3Rpb25IYW5kbGVyKG5ldyBTZWxlY3Rpb25IYW5kbGVyPFN1Z2dlc3Rpb24+KCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdGlvbihTZWxlY3Rpb25FdmVudDxTdWdnZXN0aW9uPiBldmVudCkgeworICAgICAgICBuYW1lVHh0Qm94LnNldEZvY3VzKHRydWUpOwogICAgICAgICBpZiAoc3VibWl0T25TZWxlY3Rpb24pIHsKICAgICAgICAgICBzdWJtaXRPblNlbGVjdGlvbiA9IGZhbHNlOwogICAgICAgICAgIGRvQWRkKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWFuZE1lbnVJdGVtLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWFuZE1lbnVJdGVtLmphdmEKaW5kZXggZmRiNWM1Ni4uNzJiZjA2YyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1hbmRNZW51SXRlbS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tYW5kTWVudUl0ZW0uamF2YQpAQCAtMTUsMTAgKzE1LDEwIEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuYXJpYS5jbGllbnQuUm9sZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkNvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQWNjZXNzaWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CiAKIHB1YmxpYyBjbGFzcyBDb21tYW5kTWVudUl0ZW0gZXh0ZW5kcyBBbmNob3IgaW1wbGVtZW50cyBDbGlja0hhbmRsZXIgewpAQCAtMjcsNyArMjcsNyBAQAogICBwdWJsaWMgQ29tbWFuZE1lbnVJdGVtKGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBDb21tYW5kIGNtZCkgewogICAgIHN1cGVyKHRleHQpOwogICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLm1lbnVJdGVtKCkpOwotICAgIEFjY2Vzc2liaWxpdHkuc2V0Um9sZShnZXRFbGVtZW50KCksIEFjY2Vzc2liaWxpdHkuUk9MRV9NRU5VSVRFTSk7CisgICAgUm9sZXMuZ2V0TWVudWl0ZW1Sb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CiAgICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOwogICAgIGNvbW1hbmQgPSBjbWQ7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50UGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50UGFuZWwuamF2YQppbmRleCBkZGQyYjI3Li44ZjhjN2VhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWVudFBhbmVsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1lbnRQYW5lbC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQmx1ckV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQmx1ckhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1lbnRlZEFjdGlvbkRpYWxvZy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1lbnRlZEFjdGlvbkRpYWxvZy5qYXZhCmluZGV4IDI2YjYxZjUuLjI2MzcwM2UgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50ZWRBY3Rpb25EaWFsb2cuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWVudGVkQWN0aW9uRGlhbG9nLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb2N1c1dpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Qb3B1cFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5HbG9iYWxLZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEFyZWE7CkBAIC0zOCw2ICszOSw3IEBACiAgIHByb3RlY3RlZCBmaW5hbCBCdXR0b24gY2FuY2VsQnV0dG9uOwogICBwcm90ZWN0ZWQgZmluYWwgRmxvd1BhbmVsIGJ1dHRvblBhbmVsOwogICBwcm90ZWN0ZWQgQXN5bmNDYWxsYmFjazxUPiBjYWxsYmFjazsKKyAgcHJvdGVjdGVkIEZvY3VzV2lkZ2V0IGZvY3VzT247CiAKICAgcHJvdGVjdGVkIGJvb2xlYW4gc2VudCA9IGZhbHNlOwogCkBAIC00NSw3ICs0Nyw2IEBACiAgICAgICBBc3luY0NhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CiAgICAgc3VwZXIoLyogYXV0byBoaWRlICovZmFsc2UsIC8qIG1vZGFsICovdHJ1ZSk7CiAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwotCiAgICAgc2V0R2xhc3NFbmFibGVkKHRydWUpOwogICAgIHNldFRleHQodGl0bGUpOwogCkBAIC01NSw3ICs1Niw3IEBACiAgICAgbWVzc2FnZS5zZXRDaGFyYWN0ZXJXaWR0aCg2MCk7CiAgICAgbWVzc2FnZS5zZXRWaXNpYmxlTGluZXMoMTApOwogICAgIERPTS5zZXRFbGVtZW50UHJvcGVydHlCb29sZWFuKG1lc3NhZ2UuZ2V0RWxlbWVudCgpLCAic3BlbGxjaGVjayIsIHRydWUpOwotCisgICAgc2V0Rm9jdXNPbihtZXNzYWdlKTsKICAgICBzZW5kQnV0dG9uID0gbmV3IEJ1dHRvbihVdGlsLkMuY29tbWVudGVkQWN0aW9uQnV0dG9uU2VuZCgpKTsKICAgICBzZW5kQnV0dG9uLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCkBAIC05MSw2ICs5MiwxMCBAQAogICAgIGFkZENsb3NlSGFuZGxlcih0aGlzKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldEZvY3VzT24oRm9jdXNXaWRnZXQgZm9jdXNXaWRnZXQpIHsKKyAgICBmb2N1c09uID0gZm9jdXNXaWRnZXQ7CisgIH0KKwogICBwdWJsaWMgdm9pZCBlbmFibGVCdXR0b25zKGJvb2xlYW4gZW5hYmxlKSB7CiAgICAgc2VuZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7CiAgICAgY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKQEAgLTEwMCw3ICsxMDUsOSBAQAogICBwdWJsaWMgdm9pZCBjZW50ZXIoKSB7CiAgICAgc3VwZXIuY2VudGVyKCk7CiAgICAgR2xvYmFsS2V5LmRpYWxvZyh0aGlzKTsKLSAgICBtZXNzYWdlLnNldEZvY3VzKHRydWUpOworICAgIGlmIChmb2N1c09uICE9IG51bGwpIHsKKyAgICAgIGZvY3VzT24uc2V0Rm9jdXModHJ1ZSk7CisgICAgfQogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvRmlsdGVyZWRVc2VySW50ZXJmYWNlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvRmlsdGVyZWRVc2VySW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNDRkMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9GaWx0ZXJlZFVzZXJJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitwdWJsaWMgaW50ZXJmYWNlIEZpbHRlcmVkVXNlckludGVyZmFjZSB7CisgIC8qKgorICAgKiBSZXR1cm4gdGhlIHZhbHVlIGJ5IHdoaWNoIHRoZSB1c2VyIGludGVyZmFjZSBpcyBjdXJyZW50bHkgZmlsdGVyZWQuCisgICAqCisgICAqIEByZXR1cm4gdmFsdWUgYnkgd2hpY2ggdGhlIHVzZXIgaW50ZXJmYWNlIGlzIGN1cnJlbnRseSBmaWx0ZXJlZCwKKyAgICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSBTdHJpbmcgaWYgY3VycmVudGx5IG5vIGZpbHRlciBpcyBhcHBsaWVkCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRGaWx0ZXIoKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9IaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbmsuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9IaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgyNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0hpZ2hsaWdodGluZ0lubGluZUh5cGVybGluay5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKKworcHVibGljIGNsYXNzIEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayBleHRlbmRzIElubGluZUh5cGVybGluayB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgdG9IaWdobGlnaHQ7CisKKyAgcHVibGljIEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayhmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgU3RyaW5nIHRva2VuLAorICAgICAgZmluYWwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgc3VwZXIodGV4dCwgdG9rZW4pOworICAgIHRoaXMudG9IaWdobGlnaHQgPSB0b0hpZ2hsaWdodDsKKyAgICBoaWdobGlnaHQodGV4dCwgdG9IaWdobGlnaHQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKKyAgICBzdXBlci5zZXRUZXh0KHRleHQpOworICAgIGhpZ2hsaWdodCh0ZXh0LCB0b0hpZ2hsaWdodCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgaGlnaGxpZ2h0KGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBTdHJpbmcgdG9IaWdobGlnaHQpIHsKKyAgICBzZXRIVE1MKFV0aWwuaGlnaGxpZ2h0KHRleHQsIHRvSGlnaGxpZ2h0KSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9IaWdobGlnaHRpbmdQcm9qZWN0c1RhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSGlnaGxpZ2h0aW5nUHJvamVjdHNUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjAzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSGlnaGxpZ2h0aW5nUHJvamVjdHNUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lSFRNTDsKKworcHVibGljIGNsYXNzIEhpZ2hsaWdodGluZ1Byb2plY3RzVGFibGUgZXh0ZW5kcyBQcm9qZWN0c1RhYmxlIHsKKyAgcHJpdmF0ZSBTdHJpbmcgdG9IaWdobGlnaHQ7CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBQcm9qZWN0TWFwIHByb2plY3RzLCBmaW5hbCBTdHJpbmcgdG9IaWdobGlnaHQpIHsKKyAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gdG9IaWdobGlnaHQ7CisgICAgc3VwZXIuZGlzcGxheShwcm9qZWN0cyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgUHJvamVjdEluZm8gaykgeworICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsCisgICAgICAgIG5ldyBJbmxpbmVIVE1MKFV0aWwuaGlnaGxpZ2h0KGsubmFtZSgpLCB0b0hpZ2hsaWdodCkpKTsKKyAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgay5kZXNjcmlwdGlvbigpKTsKKworICAgIHNldFJvd0l0ZW0ocm93LCBrKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0lnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0lnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2FkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CisKKy8qKgorICogR2Vycml0Q2FsbGJhY2sgdG8gYmUgdXNlZCBvbiB1c2VyIGludGVyZmFjZXMgdGhhdCBhbGxvdyBmaWx0ZXJpbmcgdG8gaGFuZGxlCisgKiBSUEMncyB0aGF0IHJlcXVlc3QgZmlsdGVyaW5nLiBUaGUgdXNlciBtYXkgY2hhbmdlIHRoZSBmaWx0ZXIgcXVpY2tseSBzbyB0aGF0CisgKiBhIHJlc3BvbnNlIG1heSBiZSBvdXRkYXRlZCB3aGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgaXQuIEluIHRoaXMgY2FzZSB0aGUKKyAqIHJlc3BvbnNlIG11c3QgYmUgaWdub3JlZCBiZWNhdXNlIHRoZSByZXNwb25zZXMgdG8gUkNQJ3MgbWF5IGNvbWUgb3V0LW9mLW9yZGVyCisgKiBhbmQgYW4gb3V0ZGF0ZWQgcmVzcG9uc2Ugd291bGQgb3ZlcndyaXRlIHRoZSBjb3JyZWN0IHJlc3VsdCB3aGljaCB3YXMKKyAqIHJlY2VpdmVkIGJlZm9yZS4KKyAqLworcHVibGljIGNsYXNzIElnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjxUPiBleHRlbmRzIEdlcnJpdENhbGxiYWNrPFQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBGaWx0ZXJlZFVzZXJJbnRlcmZhY2UgZmlsdGVyZWRVSTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbXlGaWx0ZXI7CisgIHByaXZhdGUgZmluYWwgR2Vycml0Q2FsbGJhY2s8VD4gY2I7CisKKyAgcHVibGljIElnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcigKKyAgICAgIGZpbmFsIEZpbHRlcmVkVXNlckludGVyZmFjZSBmaWx0ZXJlZFVJLCBmaW5hbCBHZXJyaXRDYWxsYmFjazxUPiBjYikgeworICAgIHRoaXMuZmlsdGVyZWRVSSA9IGZpbHRlcmVkVUk7CisgICAgdGhpcy5teUZpbHRlciA9IGZpbHRlcmVkVUkuZ2V0Q3VycmVudEZpbHRlcigpOworICAgIHRoaXMuY2IgPSBjYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVCByZXN1bHQpIHsKKyAgICBpZiAoKG15RmlsdGVyID09IG51bGwgJiYgZmlsdGVyZWRVSS5nZXRDdXJyZW50RmlsdGVyKCkgPT0gbnVsbCkKKyAgICAgICAgfHwgKG15RmlsdGVyICE9IG51bGwgJiYgbXlGaWx0ZXIuZXF1YWxzKGZpbHRlcmVkVUkuZ2V0Q3VycmVudEZpbHRlcigpKSkpIHsKKyAgICAgIGNiLm9uU3VjY2VzcyhyZXN1bHQpOworICAgIH0KKyAgICAvLyBFbHNlIGlnbm9yZSB0aGUgcmVzdWx0LCB0aGUgdXNlciBoYXMgYWxyZWFkeSBjaGFuZ2VkIHRoZSBmaWx0ZXIKKyAgICAvLyBhbmQgdGhlIHJlc3VsdCBpcyBub3QgcmVsZXZhbnQgYW55bW9yZS4gSWYgbXVsdGlwbGUgUlBDJ3MgYXJlCisgICAgLy8gZmlyZWQgdGhlIHJlc3VsdHMgbWF5IGNvbWUgYmFjayBvdXQtb2Ytb3JkZXIgYW5kIGEgbm9uLXJlbGV2YW50CisgICAgLy8gcmVzdWx0IGNvdWxkIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCByZXN1bHQgaWYgbm90IGlnbm9yZWQuCisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUJhci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51QmFyLmphdmEKaW5kZXggMDM1MzI4MS4uZmU3ZmZlOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51QmFyLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51QmFyLmphdmEKQEAgLTE1LDIwICsxNSwyMSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkNvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQWNjZXNzaWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIAotcHVibGljIGNsYXNzIExpbmtNZW51QmFyIGV4dGVuZHMgQ29tcG9zaXRlIHsKK3B1YmxpYyBjbGFzcyBMaW5rTWVudUJhciBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIFNjcmVlbkxvYWRIYW5kbGVyIHsKICAgcHJpdmF0ZSBmaW5hbCBGbG93UGFuZWwgYm9keTsKIAogICBwdWJsaWMgTGlua01lbnVCYXIoKSB7CiAgICAgYm9keSA9IG5ldyBGbG93UGFuZWwoKTsKICAgICBpbml0V2lkZ2V0KGJvZHkpOwogICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmtNZW51QmFyKCkpOwotICAgIEFjY2Vzc2liaWxpdHkuc2V0Um9sZShnZXRFbGVtZW50KCksIEFjY2Vzc2liaWxpdHkuUk9MRV9NRU5VQkFSKTsKKyAgICBSb2xlcy5nZXRNZW51YmFyUm9sZSgpLnNldChnZXRFbGVtZW50KCkpOworICAgIEdlcnJpdC5FVkVOVF9CVVMuYWRkSGFuZGxlcihTY3JlZW5Mb2FkRXZlbnQuVFlQRSwgdGhpcyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRJdGVtKGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBDb21tYW5kIGltcCkgewpAQCAtNjYsNCArNjcsNyBAQAogICAgIH0KICAgICBib2R5LmFkZChpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIG9uU2NyZWVuTG9hZChTY3JlZW5Mb2FkRXZlbnQgZXZlbnQpIHsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51SXRlbS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51SXRlbS5qYXZhCmluZGV4IGYwNzZhMmMuLjIwNTY5YzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUl0ZW0uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlua01lbnVJdGVtLmphdmEKQEAgLTE1LDE0ICsxNSwxNSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuQW5jaG9yRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BY2Nlc3NpYmlsaXR5OwogCi1wdWJsaWMgY2xhc3MgTGlua01lbnVJdGVtIGV4dGVuZHMgSW5saW5lSHlwZXJsaW5rIHsKK3B1YmxpYyBjbGFzcyBMaW5rTWVudUl0ZW0gZXh0ZW5kcyBJbmxpbmVIeXBlcmxpbmsgaW1wbGVtZW50cyBTY3JlZW5Mb2FkSGFuZGxlciB7CiAgIHB1YmxpYyBMaW5rTWVudUl0ZW0oZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyB0YXJnZXRIaXN0b3J5VG9rZW4pIHsKICAgICBzdXBlcih0ZXh0LCB0YXJnZXRIaXN0b3J5VG9rZW4pOwogICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLm1lbnVJdGVtKCkpOwotICAgIEFjY2Vzc2liaWxpdHkuc2V0Um9sZShnZXRFbGVtZW50KCksIEFjY2Vzc2liaWxpdHkuUk9MRV9NRU5VSVRFTSk7CisgICAgUm9sZXMuZ2V0TWVudWl0ZW1Sb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CisgICAgR2Vycml0LkVWRU5UX0JVUy5hZGRIYW5kbGVyKFNjcmVlbkxvYWRFdmVudC5UWVBFLCB0aGlzKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMzAsNCArMzEsMTIgQEAKICAgICBzdXBlci5nbygpOwogICAgIEFuY2hvckVsZW1lbnQuYXMoZ2V0RWxlbWVudCgpKS5ibHVyKCk7CiAgIH0KKworICBwdWJsaWMgdm9pZCBvblNjcmVlbkxvYWQoU2NyZWVuTG9hZEV2ZW50IGV2ZW50KSB7CisgICAgaWYgKGV2ZW50LmdldFNjcmVlbigpLmdldFRva2VuKCkuZXF1YWxzKGdldFRhcmdldEhpc3RvcnlUb2tlbigpKSl7CisgICAgICBhZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY3RpdmVSb3coKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFjdGl2ZVJvdygpKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaXN0ZW5hYmxlT2xkVmFsdWUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaXN0ZW5hYmxlT2xkVmFsdWUuamF2YQppbmRleCA1YzNlMTI3Li40N2JjYTJiIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlzdGVuYWJsZU9sZFZhbHVlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpc3RlbmFibGVPbGRWYWx1ZS5qYXZhCkBAIC0yMyw4ICsyMywxMSBAQAogICB9CiAKICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIFQgdmFsdWUpIHsKLSAgICBvbGRWYWx1ZSA9IGdldCgpOwotICAgIHN1cGVyLnNldCh2YWx1ZSk7Ci0gICAgb2xkVmFsdWUgPSBudWxsOyAvLyBhbGxvdyBpdCB0byBiZSBnY2VkIGJlZm9yZSB0aGUgbmV4dCBldmVudAorICAgIHRyeSB7CisgICAgICBvbGRWYWx1ZSA9IGdldCgpOworICAgICAgc3VwZXIuc2V0KHZhbHVlKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgb2xkVmFsdWUgPSBudWxsOyAvLyBhbGxvdyBpdCB0byBiZSBnY2VkIGJlZm9yZSB0aGUgbmV4dCBldmVudAorICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL05hdmlnYXRpb25UYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL05hdmlnYXRpb25UYWJsZS5qYXZhCmluZGV4IDhkNzRiYzMuLjYzYzI2MzYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9OYXZpZ2F0aW9uVGFibGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTmF2aWdhdGlvblRhYmxlLmphdmEKQEAgLTE2LDEwICsxNiwxMiBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkRvY3VtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5IYW5kbGVyUmVnaXN0cmF0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxUYWJsZS5DZWxsRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlNjcm9sbFBhbmVsOwpAQCAtMzQsNiArMzYsNDEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmF2aWdhdGlvblRhYmxlPFJvd0l0ZW0+IGV4dGVuZHMgRmFuY3lGbGV4VGFibGU8Um93SXRlbT4geworICBwcm90ZWN0ZWQgY2xhc3MgTXlGbGV4VGFibGUgZXh0ZW5kcyBGYW5jeUZsZXhUYWJsZS5NeUZsZXhUYWJsZSB7CisgICAgcHVibGljIE15RmxleFRhYmxlKCkgeworICAgICAgc2lua0V2ZW50cyhFdmVudC5PTkRCTENMSUNLIHwgRXZlbnQuT05DTElDSyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Ccm93c2VyRXZlbnQoZmluYWwgRXZlbnQgZXZlbnQpIHsKKyAgICAgIHN3aXRjaCAoRE9NLmV2ZW50R2V0VHlwZShldmVudCkpIHsKKyAgICAgICAgY2FzZSBFdmVudC5PTkNMSUNLOiB7CisgICAgICAgICAgLy8gRmluZCBvdXQgd2hpY2ggY2VsbCB3YXMgYWN0dWFsbHkgY2xpY2tlZC4KKyAgICAgICAgICBmaW5hbCBFbGVtZW50IHRkID0gZ2V0RXZlbnRUYXJnZXRDZWxsKGV2ZW50KTsKKyAgICAgICAgICBpZiAodGQgPT0gbnVsbCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsIGludCByb3cgPSByb3dPZih0ZCk7CisgICAgICAgICAgaWYgKGdldFJvd0l0ZW0ocm93KSAhPSBudWxsKSB7CisgICAgICAgICAgICBvbkNlbGxTaW5nbGVDbGljayhyb3dPZih0ZCksIGNvbHVtbk9mKHRkKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRXZlbnQuT05EQkxDTElDSzogeworICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNlbGwgd2FzIGFjdHVhbGx5IGNsaWNrZWQuCisgICAgICAgICAgRWxlbWVudCB0ZCA9IGdldEV2ZW50VGFyZ2V0Q2VsbChldmVudCk7CisgICAgICAgICAgaWYgKHRkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgb25DZWxsRG91YmxlQ2xpY2socm93T2YodGQpLCBjb2x1bW5PZih0ZCkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3VwZXIub25Ccm93c2VyRXZlbnQoZXZlbnQpOworICAgIH0KKyAgfQorCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBzYXZlZFBvc2l0aW9ucyA9CiAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oMTAsIDAuNzVmLCB0cnVlKSB7CkBAIC01NCw2ICs5MSwxNSBAQAogICBwcml2YXRlIGJvb2xlYW4gY29tcHV0ZWRTY3JvbGxUeXBlOwogICBwcml2YXRlIFNjcm9sbFBhbmVsIHBhcmVudFNjcm9sbFBhbmVsOwogCisgIHByb3RlY3RlZCBOYXZpZ2F0aW9uVGFibGUoU3RyaW5nIGl0ZW1IZWxwTmFtZSkgeworICAgIHRoaXMoKTsKKyAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IFByZXZLZXlDb21tYW5kKDAsICdrJywgVXRpbC5NLmhlbHBMaXN0UHJldihpdGVtSGVscE5hbWUpKSk7CisgICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBOZXh0S2V5Q29tbWFuZCgwLCAnaicsIFV0aWwuTS5oZWxwTGlzdE5leHQoaXRlbUhlbHBOYW1lKSkpOworICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgT3BlbktleUNvbW1hbmQoMCwgJ28nLCBVdGlsLk0uaGVscExpc3RPcGVuKGl0ZW1IZWxwTmFtZSkpKTsKKyAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsIEtleUNvZGVzLktFWV9FTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5NLmhlbHBMaXN0T3BlbihpdGVtSGVscE5hbWUpKSk7CisgIH0KKwogICBwcm90ZWN0ZWQgTmF2aWdhdGlvblRhYmxlKCkgewogICAgIHBvaW50ZXIgPSBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5hcnJvd1JpZ2h0KCkpOwogICAgIGtleXNOYXZpZ2F0aW9uID0gbmV3IEtleUNvbW1hbmRTZXQoR2Vycml0LkMuc2VjdGlvbk5hdmlnYXRpb24oKSk7CkBAIC05MSw2ICsxMzcsMTYgQEAKICAgICB9CiAgIH0KIAorICAvKiogSW52b2tlZCB3aGVuIHRoZSB1c2VyIGRvdWJsZSBjbGlja3Mgb24gYSB0YWJsZSBjZWxsLiAqLworICBwcm90ZWN0ZWQgdm9pZCBvbkNlbGxEb3VibGVDbGljayhpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgb25PcGVuUm93KHJvdyk7CisgIH0KKworICAvKiogSW52b2tlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIHRhYmxlIGNlbGwuICovCisgIHByb3RlY3RlZCB2b2lkIG9uQ2VsbFNpbmdsZUNsaWNrKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBtb3ZlUG9pbnRlclRvKHJvdyk7CisgIH0KKwogICBwcm90ZWN0ZWQgaW50IGdldEN1cnJlbnRSb3coKSB7CiAgICAgcmV0dXJuIGN1cnJlbnRSb3c7CiAgIH0KQEAgLTI1OSw2ICszMTUsMTEgQEAKICAgICBzdXBlci5vblVubG9hZCgpOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBNeUZsZXhUYWJsZSBjcmVhdGVGbGV4VGFibGUoKSB7CisgICAgcmV0dXJuIG5ldyBNeUZsZXhUYWJsZSgpOworICB9CisKICAgcHVibGljIGNsYXNzIFByZXZLZXlDb21tYW5kIGV4dGVuZHMgS2V5Q29tbWFuZCB7CiAgICAgcHVibGljIFByZXZLZXlDb21tYW5kKGludCBtYXNrLCBjaGFyIGtleSwgU3RyaW5nIGhlbHApIHsKICAgICAgIHN1cGVyKG1hc2ssIGtleSwgaGVscCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvT25FZGl0RW5hYmxlci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL09uRWRpdEVuYWJsZXIuamF2YQppbmRleCBiNTc0ZGIxLi5hN2Q0OWE0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvT25FZGl0RW5hYmxlci5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9PbkVkaXRFbmFibGVyLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb2N1c1dpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MaXN0Qm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlRleHRCb3hCYXNlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZhbHVlQm94QmFzZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xMzksNiArMTQwLDE3IEBACiAgICAgaWYgKHdpZGdldC5pc0VuYWJsZWQoKSB8fAogICAgICAgICAhIChlLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgRm9jdXNXaWRnZXQpIHx8CiAgICAgICAgICEgKChGb2N1c1dpZGdldCkgZS5nZXRTb3VyY2UoKSkuaXNFbmFibGVkKCkgKSB7CisgICAgICBpZiAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFZhbHVlQm94QmFzZSkgeworICAgICAgICBmaW5hbCBUZXh0Qm94QmFzZSBib3ggPSAoKFRleHRCb3hCYXNlKSBlLmdldFNvdXJjZSgpKTsKKyAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgICAgIGlmIChib3guZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICB3aWRnZXQuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TGlzdFBvcHVwLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdExpc3RQb3B1cC5qYXZhCmluZGV4IDIxN2NhNWEuLmNhYzc2NjcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TGlzdFBvcHVwLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RMaXN0UG9wdXAuamF2YQpAQCAtMTQsMzYgKzE0LDQ2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0TWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlVcEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LldpbmRvdzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhvcml6b250YWxQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Qb3B1cFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlNjcm9sbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5HbG9iYWxLZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50LkhpZGVQb3B1cFBhbmVsQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0Qm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkudXNlci5jbGllbnQuUGx1Z2luU2FmZURpYWxvZ0JveDsKIAogLyoqIEl0IGNyZWF0ZXMgYSBwb3B1cCBjb250YWluaW5nIGFsbCB0aGUgcHJvamVjdHMuICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdExpc3RQb3B1cCB7Ci0gIHByaXZhdGUgUHJvamVjdHNUYWJsZSBwcm9qZWN0c1RhYjsKK3B1YmxpYyBjbGFzcyBQcm9qZWN0TGlzdFBvcHVwIGltcGxlbWVudHMgRmlsdGVyZWRVc2VySW50ZXJmYWNlIHsKKyAgcHJpdmF0ZSBIaWdobGlnaHRpbmdQcm9qZWN0c1RhYmxlIHByb2plY3RzVGFiOwogICBwcml2YXRlIFBsdWdpblNhZmVEaWFsb2dCb3ggcG9wdXA7CisgIHByaXZhdGUgTnBUZXh0Qm94IGZpbHRlclR4dDsKKyAgcHJpdmF0ZSBIb3Jpem9udGFsUGFuZWwgZmlsdGVyUGFuZWw7CisgIHByaXZhdGUgU3RyaW5nIHN1Ym5hbWU7CiAgIHByaXZhdGUgQnV0dG9uIGNsb3NlOwogICBwcml2YXRlIFNjcm9sbFBhbmVsIHNwOwogICBwcml2YXRlIFBvcHVwUGFuZWwuUG9zaXRpb25DYWxsYmFjayBwb3B1cFBvc2l0aW9uOwogICBwcml2YXRlIGludCBwcmVmZXJyZWRUb3A7CiAgIHByaXZhdGUgaW50IHByZWZlcnJlZExlZnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBwb3BpbmdVcDsKKyAgcHJpdmF0ZSBib29sZWFuIHBvcHBpbmdVcDsKICAgcHJpdmF0ZSBib29sZWFuIGZpcnN0UG9wdXBMb2FkID0gdHJ1ZTsKIAogICBwdWJsaWMgdm9pZCBpbml0UG9wdXAoZmluYWwgU3RyaW5nIHBvcHVwVGV4dCwgZmluYWwgU3RyaW5nIGN1cnJlbnRQYWdlTGluaykgewogICAgIGNyZWF0ZVdpZGdldHMocG9wdXBUZXh0LCBjdXJyZW50UGFnZUxpbmspOwogICAgIGZpbmFsIEZsb3dQYW5lbCBwZnAgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgcGZwLmFkZChmaWx0ZXJQYW5lbCk7CiAgICAgc3AgPSBuZXcgU2Nyb2xsUGFuZWwocHJvamVjdHNUYWIpOwogICAgIHNwLnNldFNpemUoIjEwMCUiLCAiMTAwJSIpOwogICAgIHBmcC5hZGQoc3ApOwpAQCAtODQsMTMgKzk0LDMwIEBACiAgIHByb3RlY3RlZCB2b2lkIG9wZW5Sb3coU3RyaW5nIHByb2plY3ROYW1lKSB7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBpc1BvcGluZ1VwKCkgewotICAgIHJldHVybiBwb3BpbmdVcDsKKyAgcHVibGljIGJvb2xlYW4gaXNQb3BwaW5nVXAoKSB7CisgICAgcmV0dXJuIHBvcHBpbmdVcDsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBjcmVhdGVXaWRnZXRzKGZpbmFsIFN0cmluZyBwb3B1cFRleHQsCiAgICAgICBmaW5hbCBTdHJpbmcgY3VycmVudFBhZ2VMaW5rKSB7Ci0gICAgcHJvamVjdHNUYWIgPSBuZXcgUHJvamVjdHNUYWJsZSgpIHsKKyAgICBmaWx0ZXJQYW5lbCA9IG5ldyBIb3Jpem9udGFsUGFuZWwoKTsKKyAgICBmaWx0ZXJQYW5lbC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyUGFuZWwoKSk7CisgICAgZmluYWwgTGFiZWwgZmlsdGVyTGFiZWwgPQorICAgICAgICBuZXcgTGFiZWwoY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlV0aWwuQy5wcm9qZWN0RmlsdGVyKCkpOworICAgIGZpbHRlckxhYmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnByb2plY3RGaWx0ZXJMYWJlbCgpKTsKKyAgICBmaWx0ZXJQYW5lbC5hZGQoZmlsdGVyTGFiZWwpOworICAgIGZpbHRlclR4dCA9IG5ldyBOcFRleHRCb3goKTsKKyAgICBmaWx0ZXJUeHQuc2V0VmFsdWUoc3VibmFtZSk7CisgICAgZmlsdGVyVHh0LmFkZEtleVVwSGFuZGxlcihuZXcgS2V5VXBIYW5kbGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbktleVVwKEtleVVwRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgc3VibmFtZSA9IGZpbHRlclR4dC5nZXRWYWx1ZSgpOworICAgICAgICBwb3B1bGF0ZVByb2plY3RzKCk7CisgICAgICB9CisgICAgfSk7CisgICAgZmlsdGVyUGFuZWwuYWRkKGZpbHRlclR4dCk7CisKKyAgICBwcm9qZWN0c1RhYiA9IG5ldyBIaWdobGlnaHRpbmdQcm9qZWN0c1RhYmxlKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBtb3ZlUG9pbnRlclRvKGZpbmFsIGludCByb3csIGZpbmFsIGJvb2xlYW4gc2Nyb2xsKSB7CiAgICAgICAgIHN1cGVyLm1vdmVQb2ludGVyVG8ocm93LCBzY3JvbGwpOwpAQCAtMTE5LDcgKzE0Niw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBkaXNwbGF5UG9wdXAoKSB7Ci0gICAgcG9waW5nVXAgPSB0cnVlOworICAgIHBvcHBpbmdVcCA9IHRydWU7CiAgICAgaWYgKGZpcnN0UG9wdXBMb2FkKSB7IC8vIEZvciBzaXppbmcvcG9zaXRpb25pbmcsIGRlbGF5IGRpc3BsYXkgdW50aWwgbG9hZGVkCiAgICAgICBwb3B1bGF0ZVByb2plY3RzKCk7CiAgICAgfSBlbHNlIHsKQEAgLTEzMiw3ICsxNTksOCBAQAogICAgICAgfQogICAgICAgcHJvamVjdHNUYWIuc2V0UmVnaXN0ZXJLZXlzKHRydWUpOwogICAgICAgcHJvamVjdHNUYWIuZmluaXNoRGlzcGxheSgpOwotICAgICAgcG9waW5nVXAgPSBmYWxzZTsKKyAgICAgIGZpbHRlclR4dC5zZXRGb2N1cyh0cnVlKTsKKyAgICAgIHBvcHBpbmdVcCA9IGZhbHNlOwogICAgIH0KICAgfQogCkBAIC0xNDYsMTUgKzE3NCwyMiBAQAogICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQcm9qZWN0cygpIHsKLSAgICBQcm9qZWN0TWFwLmFsbChuZXcgR2Vycml0Q2FsbGJhY2s8UHJvamVjdE1hcD4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBQcm9qZWN0TWFwIHJlc3VsdCkgewotICAgICAgICBwcm9qZWN0c1RhYi5kaXNwbGF5KHJlc3VsdCk7Ci0gICAgICAgIGlmIChmaXJzdFBvcHVwTG9hZCkgeyAvLyBEaXNwbGF5IHdhcyBkZWxheWVkIHVudGlsIHRhYmxlIHdhcyBsb2FkZWQKLSAgICAgICAgICBmaXJzdFBvcHVwTG9hZCA9IGZhbHNlOwotICAgICAgICAgIGRpc3BsYXlQb3B1cCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7CisgICAgUHJvamVjdE1hcC5tYXRjaChzdWJuYW1lLAorICAgICAgICBuZXcgSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyPFByb2plY3RNYXA+KHRoaXMsCisgICAgICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UHJvamVjdE1hcD4oKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgUHJvamVjdE1hcCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0c1RhYi5kaXNwbGF5KHJlc3VsdCwgc3VibmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0UG9wdXBMb2FkKSB7IC8vIERpc3BsYXkgd2FzIGRlbGF5ZWQgdW50aWwgdGFibGUgd2FzIGxvYWRlZAorICAgICAgICAgICAgICAgICAgZmlyc3RQb3B1cExvYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgIGRpc3BsYXlQb3B1cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudEZpbHRlcigpIHsKKyAgICByZXR1cm4gc3VibmFtZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3ROYW1lU3VnZ2VzdE9yYWNsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3ROYW1lU3VnZ2VzdE9yYWNsZS5qYXZhCmluZGV4IDI1ZWQyNTguLjgwMzY0Y2YgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TmFtZVN1Z2dlc3RPcmFjbGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlLmphdmEKQEAgLTE3LDEyICsxNywxMiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ScGNTdGF0dXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5IaWdobGlnaHRTdWdnZXN0T3JhY2xlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKIAogLyoqIFN1Z2dlc3Rpb24gT3JhY2xlIGZvciBQcm9qZWN0Lk5hbWVLZXkgZW50aXRpZXMuICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlIGV4dGVuZHMgSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZSB7CitwdWJsaWMgY2xhc3MgUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlIGV4dGVuZHMgU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlIHsKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBDYWxsYmFjayBjYWxsYmFjaykgeworICBwdWJsaWMgdm9pZCBfb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgUnBjU3RhdHVzLmhpZGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UHJvamVjdE1hcD4oKSB7CiAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoUHJvamVjdE1hcCBtYXApIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vblN1Z2dlc3Rpb25zUmVhZHkocmVxLCBuZXcgUmVzcG9uc2UobWFwLnZhbHVlcygpLmFzTGlzdCgpKSk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sub25TdWdnZXN0aW9uc1JlYWR5KHJlcSwgbmV3IFJlc3BvbnNlKE5hdGl2ZXMuYXNMaXN0KG1hcC52YWx1ZXMoKSkpKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdFNlYXJjaExpbmsuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0U2VhcmNoTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTI5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdFNlYXJjaExpbmsuamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKKworcHVibGljIGNsYXNzIFByb2plY3RTZWFyY2hMaW5rIGV4dGVuZHMgSW5saW5lSHlwZXJsaW5rIHsKKworICBwdWJsaWMgUHJvamVjdFNlYXJjaExpbmsoUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lKSB7CisgICAgc3VwZXIoIiAiLCBQYWdlTGlua3MudG9Qcm9qZWN0RGFzaGJvYXJkKHByb2plY3ROYW1lLCAiZGVmYXVsdCIpKTsKKyAgICBzZXRUaXRsZShVdGlsLkMucHJvamVjdExpc3RRdWVyeUxpbmsoKSk7CisgICAgZmluYWwgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5xdWVyeUljb24oKSk7CisgICAgRE9NLmluc2VydEJlZm9yZShnZXRFbGVtZW50KCksIGltYWdlLmdldEVsZW1lbnQoKSwKKyAgICAgICAgRE9NLmdldEZpcnN0Q2hpbGQoZ2V0RWxlbWVudCgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0c1RhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdHNUYWJsZS5qYXZhCmluZGV4IDBjYmUxOTQuLmEzYTUwNTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0c1RhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RzVGFibGUuamF2YQpAQCAtMTcsMTAgKzE3LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdE1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGUuRmxleENlbGxGb3JtYXR0ZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zMCwxMSArMjcsNyBAQAogcHVibGljIGNsYXNzIFByb2plY3RzVGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8UHJvamVjdEluZm8+IHsKIAogICBwdWJsaWMgUHJvamVjdHNUYWJsZSgpIHsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IFByZXZLZXlDb21tYW5kKDAsICdrJywgVXRpbC5DLnByb2plY3RMaXN0UHJldigpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBOZXh0S2V5Q29tbWFuZCgwLCAnaicsIFV0aWwuQy5wcm9qZWN0TGlzdE5leHQoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgT3BlbktleUNvbW1hbmQoMCwgJ28nLCBVdGlsLkMucHJvamVjdExpc3RPcGVuKCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsIEtleUNvZGVzLktFWV9FTlRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5DLnByb2plY3RMaXN0T3BlbigpKSk7CisgICAgc3VwZXIoVXRpbC5DLnByb2plY3RJdGVtSGVscCgpKTsKICAgICBpbml0Q29sdW1uSGVhZGVycygpOwogICB9CiAKQEAgLTQ4LDQzICs0MSw2IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIE15RmxleFRhYmxlIGNyZWF0ZUZsZXhUYWJsZSgpIHsKLSAgICBNeUZsZXhUYWJsZSB0YWJsZSA9IG5ldyBNeUZsZXhUYWJsZSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Ccm93c2VyRXZlbnQoZmluYWwgRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChET00uZXZlbnRHZXRUeXBlKGV2ZW50KSkgewotICAgICAgICAgIGNhc2UgRXZlbnQuT05DTElDSzogewotICAgICAgICAgICAgLy8gRmluZCBvdXQgd2hpY2ggY2VsbCB3YXMgYWN0dWFsbHkgY2xpY2tlZC4KLSAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgdGQgPSBnZXRFdmVudFRhcmdldENlbGwoZXZlbnQpOwotICAgICAgICAgICAgaWYgKHRkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcm93ID0gcm93T2YodGQpOwotICAgICAgICAgICAgaWYgKGdldFJvd0l0ZW0ocm93KSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIFByb2plY3RzVGFibGUudGhpcy5tb3ZlUG9pbnRlclRvKHJvdyk7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIEV2ZW50Lk9OREJMQ0xJQ0s6IHsKLSAgICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNlbGwgd2FzIGFjdHVhbGx5IGNsaWNrZWQuCi0gICAgICAgICAgICBFbGVtZW50IHRkID0gZ2V0RXZlbnRUYXJnZXRDZWxsKGV2ZW50KTsKLSAgICAgICAgICAgIGlmICh0ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9uT3BlblJvdyhyb3dPZih0ZCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdXBlci5vbkJyb3dzZXJFdmVudChldmVudCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHRhYmxlLnNpbmtFdmVudHMoRXZlbnQuT05EQkxDTElDSyB8IEV2ZW50Lk9OQ0xJQ0spOwotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0gIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJvd0l0ZW1LZXkoZmluYWwgUHJvamVjdEluZm8gaXRlbSkgewogICAgIHJldHVybiBpdGVtLm5hbWUoKTsKICAgfQpAQCAtMTAwLDcgKzU2LDcgQEAKICAgICB3aGlsZSAoMSA8IHRhYmxlLmdldFJvd0NvdW50KCkpCiAgICAgICB0YWJsZS5yZW1vdmVSb3codGFibGUuZ2V0Um93Q291bnQoKSAtIDEpOwogCi0gICAgTGlzdDxQcm9qZWN0SW5mbz4gbGlzdCA9IHByb2plY3RzLnZhbHVlcygpLmFzTGlzdCgpOworICAgIExpc3Q8UHJvamVjdEluZm8+IGxpc3QgPSBOYXRpdmVzLmFzTGlzdChwcm9qZWN0cy52YWx1ZXMoKSk7CiAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcjxQcm9qZWN0SW5mbz4oKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShQcm9qZWN0SW5mbyBhLCBQcm9qZWN0SW5mbyBiKSB7CkBAIC0xMjAsNyArNzYsNiBAQAogCiAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jUFJPSkVDVCgpKTsKICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKIAogICAgIHBvcHVsYXRlKHJvdywgayk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUmV2aWV3ZXJTdWdnZXN0T3JhY2xlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUmV2aWV3ZXJTdWdnZXN0T3JhY2xlLmphdmEKaW5kZXggNzQ3ZWY0MC4uM2YxZGUyYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Jldmlld2VyU3VnZ2VzdE9yYWNsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9SZXZpZXdlclN1Z2dlc3RPcmFjbGUuamF2YQpAQCAtMjIsMTggKzIyLDE3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3ZXJJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdE9yYWNsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5IaWdobGlnaHRTdWdnZXN0T3JhY2xlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqIFN1Z2dlc3Rpb24gT3JhY2xlIGZvciByZXZpZXdlcnMuICovCi1wdWJsaWMgY2xhc3MgUmV2aWV3ZXJTdWdnZXN0T3JhY2xlIGV4dGVuZHMgSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZSB7CitwdWJsaWMgY2xhc3MgUmV2aWV3ZXJTdWdnZXN0T3JhY2xlIGV4dGVuZHMgU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlIHsKIAogICBwcml2YXRlIENoYW5nZS5JZCBjaGFuZ2VJZDsKIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgIHByb3RlY3RlZCB2b2lkIF9vblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcSwgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICBScGNTdGF0dXMuaGlkZShuZXcgUnVubmFibGUoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIFN1Z2dlc3RVdGlsLlNWQy5zdWdnZXN0Q2hhbmdlUmV2aWV3ZXIoY2hhbmdlSWQsIHJlcS5nZXRRdWVyeSgpLApAQCAtNjYsNyArNjUsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKICAgICAgIGZpbmFsIEFjY291bnRJbmZvIGFjY291bnRJbmZvID0gcmV2aWV3ZXJJbmZvLmdldEFjY291bnRJbmZvKCk7CiAgICAgICBpZiAoYWNjb3VudEluZm8gIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gRm9ybWF0VXRpbC5uYW1lRW1haWwoYWNjb3VudEluZm8pOworICAgICAgICByZXR1cm4gRm9ybWF0VXRpbC5uYW1lRW1haWwoRm9ybWF0VXRpbC5hc0luZm8oYWNjb3VudEluZm8pKTsKICAgICAgIH0KICAgICAgIHJldHVybiByZXZpZXdlckluZm8uZ2V0R3JvdXAoKS5nZXROYW1lKCkgKyAiICgiCiAgICAgICAgICAgKyBVdGlsLkMuc3VnZ2VzdGVkR3JvdXBMYWJlbCgpICsgIikiOwpAQCAtNzUsNyArNzQsNyBAQAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7CiAgICAgICBmaW5hbCBBY2NvdW50SW5mbyBhY2NvdW50SW5mbyA9IHJldmlld2VySW5mby5nZXRBY2NvdW50SW5mbygpOwogICAgICAgaWYgKGFjY291bnRJbmZvICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKGFjY291bnRJbmZvKTsKKyAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKEZvcm1hdFV0aWwuYXNJbmZvKGFjY291bnRJbmZvKSk7CiAgICAgICB9CiAgICAgICByZXR1cm4gcmV2aWV3ZXJJbmZvLmdldEdyb3VwKCkuZ2V0TmFtZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW4uamF2YQppbmRleCA4NDVhMDQ2Li5lN2MyZDg0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbi5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAgIHByaXZhdGUgU3RyaW5nIHRva2VuOwogICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNTaWduSW47CiAgIHByaXZhdGUgU3RyaW5nIHdpbmRvd1RpdGxlOworICBwcml2YXRlIFdpZGdldCB0aXRsZVdpZGdldDsKIAogICBwcm90ZWN0ZWQgU2NyZWVuKCkgewogICAgIGluaXRXaWRnZXQobmV3IEZsb3dQYW5lbCgpKTsKQEAgLTY1LDggKzY2LDEyIEBACiAgICAgbWUuYWRkKGhlYWRlciA9IG5ldyBHcmlkKDEsIENvbHMudmFsdWVzKCkubGVuZ3RoKSk7CiAgICAgbWUuYWRkKGJvZHkgPSBuZXcgRmxvd1BhbmVsKCkpOwogCisgICAgaGVhZGVyVGV4dCA9IG5ldyBJbmxpbmVMYWJlbCgpOworICAgIGlmICh0aXRsZVdpZGdldCA9PSBudWxsKSB7CisgICAgICB0aXRsZVdpZGdldCA9IGhlYWRlclRleHQ7CisgICAgfQogICAgIEZsb3dQYW5lbCB0aXRsZSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICB0aXRsZS5hZGQoaGVhZGVyVGV4dCA9IG5ldyBJbmxpbmVMYWJlbCgpKTsKKyAgICB0aXRsZS5hZGQodGl0bGVXaWRnZXQpOwogICAgIHRpdGxlLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNjcmVlbkhlYWRlcigpKTsKICAgICBoZWFkZXIuc2V0V2lkZ2V0KDAsIENvbHMuVGl0bGUub3JkaW5hbCgpLCB0aXRsZSk7CiAKQEAgLTk5LDYgKzEwNCwxMCBAQAogICAgIGhlYWRlci5zZXRWaXNpYmxlKHZhbHVlKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGZpbmFsIFdpZGdldCB3KSB7CisgICAgdGl0bGVXaWRnZXQgPSB3OworICB9CisKICAgcHJvdGVjdGVkIHZvaWQgc2V0VGl0bGVFYXN0KGZpbmFsIFdpZGdldCB3KSB7CiAgICAgaGVhZGVyLnNldFdpZGdldCgwLCBDb2xzLkVhc3Qub3JkaW5hbCgpLCB3KTsKICAgfQpAQCAtMTU1LDYgKzE2NCw4IEBACiAgICAgICBHZXJyaXQuc2V0V2luZG93VGl0bGUodGhpcywgd2luZG93VGl0bGUpOwogICAgIH0KICAgICBHZXJyaXQudXBkYXRlTWVudXModGhpcyk7CisgICAgR2Vycml0LkVWRU5UX0JVUy5maXJlRXZlbnQobmV3IFNjcmVlbkxvYWRFdmVudCh0aGlzKSk7CisgICAgR2Vycml0LnNldFF1ZXJ5U3RyaW5nKG51bGwpOwogICAgIHJlZ2lzdGVyS2V5cygpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuTG9hZEV2ZW50LmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuTG9hZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyZTUzYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW5Mb2FkRXZlbnQuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkd3dEV2ZW50OworCitwdWJsaWMgY2xhc3MgU2NyZWVuTG9hZEV2ZW50IGV4dGVuZHMgR3d0RXZlbnQ8U2NyZWVuTG9hZEhhbmRsZXI+IHsKKyAgcHJpdmF0ZSBmaW5hbCBTY3JlZW4gc2NyZWVuOworCisgIHB1YmxpYyBTY3JlZW5Mb2FkRXZlbnQoU2NyZWVuIHNjcmVlbikgeworICAgIHN1cGVyKCk7CisgICAgdGhpcy5zY3JlZW4gPSBzY3JlZW47CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGU8U2NyZWVuTG9hZEhhbmRsZXI+IFRZUEUgPSBuZXcgVHlwZTxTY3JlZW5Mb2FkSGFuZGxlcj4oKTsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2goU2NyZWVuTG9hZEhhbmRsZXIgaGFuZGxlcikgeworICAgIGhhbmRsZXIub25TY3JlZW5Mb2FkKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHd3RFdmVudC5UeXBlPFNjcmVlbkxvYWRIYW5kbGVyPiBnZXRBc3NvY2lhdGVkVHlwZSgpIHsKKyAgICByZXR1cm4gVFlQRTsKKyAgfQorCisgIHB1YmxpYyBTY3JlZW4gZ2V0U2NyZWVuKCl7CisgICAgcmV0dXJuIHNjcmVlbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbkxvYWRIYW5kbGVyLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuTG9hZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFiZWNmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbkxvYWRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5FdmVudEhhbmRsZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgU2NyZWVuTG9hZEhhbmRsZXIgZXh0ZW5kcyBFdmVudEhhbmRsZXIgeworICBwdWJsaWMgdm9pZCBvblNjcmVlbkxvYWQoU2NyZWVuTG9hZEV2ZW50IGV2ZW50KTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjU0YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1N1Z2dlc3RBZnRlclR5cGluZ05DaGFyc09yYWNsZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LkhpZ2hsaWdodFN1Z2dlc3RPcmFjbGU7CisKKy8qKgorICogU3VnZ2VzdCBvcmFjbGUgdGhhdCBvbmx5IHByb3ZpZGVzIHN1Z2dlc3Rpb25zIGlmIHRoZSB1c2VyIGhhcyB0eXBlZCBhdCBsZWFzdAorICogYXMgbWFueSBjaGFyYWN0ZXJzIGFzIGNvbmZpZ3VyZWQgYnkgJ3N1Z2dlc3QuZnJvbScuIElmICdzdWdnZXN0LmZyb20nIGlzIHNldAorICogdG8gMCwgc3VnZ2VzdGlvbnMgd2lsbCBhbHdheXMgYmUgcHJvdmlkZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUgZXh0ZW5kcyBIaWdobGlnaHRTdWdnZXN0T3JhY2xlIHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBDYWxsYmFjayBkb25lKSB7CisgICAgZmluYWwgaW50IHN1Z2dlc3RGcm9tID0gR2Vycml0LmdldENvbmZpZygpLmdldFN1Z2dlc3RGcm9tKCk7CisgICAgaWYgKHN1Z2dlc3RGcm9tID09IDAgfHwgcmVxdWVzdC5nZXRRdWVyeSgpLmxlbmd0aCgpID49IHN1Z2dlc3RGcm9tKSB7CisgICAgICBfb25SZXF1ZXN0U3VnZ2VzdGlvbnMocmVxdWVzdCwgZG9uZSk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgX29uUmVxdWVzdFN1Z2dlc3Rpb25zKFJlcXVlc3QgcmVxdWVzdCwgQ2FsbGJhY2sgZG9uZSk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVGV4dEJveENoYW5nZUxpc3RlbmVyLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVGV4dEJveENoYW5nZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4ZWExZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9UZXh0Qm94Q2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRm9jdXNFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkZvY3VzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleURvd25FdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleURvd25IYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50Lk1vdXNlVXBFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50Lk1vdXNlVXBIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94QmFzZTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFRleHRCb3hDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIEtleVByZXNzSGFuZGxlciwgS2V5RG93bkhhbmRsZXIsIE1vdXNlVXBIYW5kbGVyIHsKKworICBwcml2YXRlIFN0cmluZyBvbGRUZXh0OworCisgIHB1YmxpYyBUZXh0Qm94Q2hhbmdlTGlzdGVuZXIoZmluYWwgVGV4dEJveEJhc2UgdGIpIHsKKyAgICBvbGRUZXh0ID0gdGIuZ2V0VGV4dCgpOworCisgICAgdGIuYWRkS2V5UHJlc3NIYW5kbGVyKHRoaXMpOworCisgICAgLy8gSXMgdGhlcmUgYW5vdGhlciB3YXkgdG8gY2FwdHVyZSBtaWRkbGUgYnV0dG9uIFgxMSBwYXN0ZXMgaW4gYnJvd3NlcnMKKyAgICAvLyB3aGljaCBkbyBub3QgeWV0IHN1cHBvcnQgT05QQVNURSBldmVudHMgKEZpcmVmb3gpPworICAgIHRiLmFkZE1vdXNlVXBIYW5kbGVyKHRoaXMpOworCisgICAgLy8gUmVzZXR0aW5nIHRoZSAib3JpZ2luYWwgdGV4dCIgb24gZm9jdXMgZW5zdXJlcyB0aGF0IHdlIGFyZQorICAgIC8vIHVwIHRvIGRhdGUgd2l0aCBub24tdXNlciB1cGRhdGVzIG9mIHRoZSB0ZXh0IChjYWxscyB0bworICAgIC8vIHNldFRleHQoKS4uLikgYW5kIGFsc28gdXAgdG8gZGF0ZSB3aXRoIHVzZXIgY2hhbmdlcyB3aGljaAorICAgIC8vIG9jY3VycmVkIGFmdGVyIGVuYWJsaW5nICJ3aWRnZXQiLgorICAgIHRiLmFkZEZvY3VzSGFuZGxlcihuZXcgRm9jdXNIYW5kbGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Gb2N1cyhGb2N1c0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgb2xkVGV4dCA9IHRiLmdldFRleHQoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAvLyBDVFJMLVYgUGFzdGVzIGluIENocm9tZSBzZWVtIG9ubHkgZGV0ZWN0YWJsZSB2aWEgQnJvd3NlckV2ZW50cyBvcgorICAgIC8vIEtleURvd25FdmVudHMsIHRoZSBsYXR0ZXIgaXMgYmV0dGVyLgorICAgIHRiLmFkZEtleURvd25IYW5kbGVyKHRoaXMpOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25LZXlQcmVzcyhmaW5hbCBLZXlQcmVzc0V2ZW50IGUpIHsKKyAgICBvbihlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbktleURvd24oZmluYWwgS2V5RG93bkV2ZW50IGUpIHsKKyAgICBvbihlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbk1vdXNlVXAoZmluYWwgTW91c2VVcEV2ZW50IGUpIHsKKyAgICBvbihlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBvbihmaW5hbCBHd3RFdmVudDw/PiBlKSB7CisgICAgZmluYWwgVGV4dEJveEJhc2UgdGIgPSAoVGV4dEJveEJhc2UpIGUuZ2V0U291cmNlKCk7CisKKyAgICBpZiAoIXRiLmdldFRleHQoKS5lcXVhbHMob2xkVGV4dCkpIHsKKyAgICAgIG9uVGV4dENoYW5nZWQodGIuZ2V0VGV4dCgpKTsKKyAgICAgIG9sZFRleHQgPSB0Yi5nZXRUZXh0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSB0ZXh0IGFwcGVhcnMgdG8gbm90IGFsd2F5cyBnZXQgdXBkYXRlZCB1bnRpbCB0aGUgaGFuZGxlcnMgY29tcGxldGUuCisgICAgICBTY2hlZHVsZXIuZ2V0KCkuc2NoZWR1bGVEZWZlcnJlZChuZXcgU2NoZWR1bGVkQ29tbWFuZCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgaWYgKCF0Yi5nZXRUZXh0KCkuZXF1YWxzKG9sZFRleHQpKSB7CisgICAgICAgICAgICBvblRleHRDaGFuZ2VkKHRiLmdldFRleHQoKSk7CisgICAgICAgICAgICBvbGRUZXh0ID0gdGIuZ2V0VGV4dCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGFic3RyYWN0IHZvaWQgb25UZXh0Q2hhbmdlZChTdHJpbmcgbmV3VGV4dCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSUNvbnN0YW50cy5qYXZhCmluZGV4IGViYmIwNDkuLjE5MTljZDMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSUNvbnN0YW50cy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSUNvbnN0YW50cy5qYXZhCkBAIC0yMiw3ICsyMiw1IEBACiAKICAgU3RyaW5nIHByb2plY3ROYW1lKCk7CiAgIFN0cmluZyBwcm9qZWN0RGVzY3JpcHRpb24oKTsKLSAgU3RyaW5nIHByb2plY3RMaXN0T3BlbigpOwotICBTdHJpbmcgcHJvamVjdExpc3RQcmV2KCk7Ci0gIFN0cmluZyBwcm9qZWN0TGlzdE5leHQoKTsKKyAgU3RyaW5nIHByb2plY3RJdGVtSGVscCgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMucHJvcGVydGllcwppbmRleCBhYTAwY2VlLi44YTcyMzU1IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMucHJvcGVydGllcwpAQCAtMyw2ICszLDQgQEAKIAogcHJvamVjdE5hbWUgPSBQcm9qZWN0IE5hbWUKIHByb2plY3REZXNjcmlwdGlvbiA9IFByb2plY3QgRGVzY3JpcHRpb24KLXByb2plY3RMaXN0T3BlbiA9IFNlbGVjdCBwcm9qZWN0Ci1wcm9qZWN0TGlzdFByZXYgPSBQcmV2aW91cyBwcm9qZWN0Ci1wcm9qZWN0TGlzdE5leHQgPSBOZXh0IHByb2plY3QKK3Byb2plY3RJdGVtSGVscCA9IHByb2plY3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlNZXNzYWdlcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I4NDZmNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOworCitwdWJsaWMgaW50ZXJmYWNlIFVJTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7CisgIFN0cmluZyBoZWxwTGlzdE9wZW4oU3RyaW5nIGl0ZW0pOworICBTdHJpbmcgaGVscExpc3RQcmV2KFN0cmluZyBpdGVtKTsKKyAgU3RyaW5nIGhlbHBMaXN0TmV4dChTdHJpbmcgaXRlbSk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM5MjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJTWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK2hlbHBMaXN0T3BlbiA9IFNlbGVjdCB7MH0KK2hlbHBMaXN0UHJldiA9IFByZXZpb3VzIHswfQoraGVscExpc3ROZXh0ID0gTmV4dCB7MH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VdGlsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVXRpbC5qYXZhCmluZGV4IDk4ZjEzZWYuLjgwNGVlZTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VdGlsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1V0aWwuamF2YQpAQCAtMTUsNyArMTUsMzUgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LlNhZmVIdG1sQnVpbGRlcjsKIAogcHVibGljIGNsYXNzIFV0aWwgewogICBwdWJsaWMgc3RhdGljIGZpbmFsIFVJQ29uc3RhbnRzIEMgPSBHV1QuY3JlYXRlKFVJQ29uc3RhbnRzLmNsYXNzKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBVSU1lc3NhZ2VzIE0gPSBHV1QuY3JlYXRlKFVJTWVzc2FnZXMuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhpZ2hsaWdodChmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgZmluYWwgU2FmZUh0bWxCdWlsZGVyIGIgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCk7CisgICAgaWYgKHRvSGlnaGxpZ2h0ID09IG51bGwgfHwgIiIuZXF1YWxzKHRvSGlnaGxpZ2h0KSkgeworICAgICAgYi5hcHBlbmQodGV4dCk7CisgICAgICByZXR1cm4gYi50b1NhZmVIdG1sKCkuYXNTdHJpbmcoKTsKKyAgICB9CisKKyAgICBpbnQgcG9zID0gMDsKKyAgICBpbnQgZW5kUG9zID0gMDsKKyAgICB3aGlsZSAoKHBvcyA9IHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKAorICAgICAgICB0b0hpZ2hsaWdodC50b0xvd2VyQ2FzZSgpLCBwb3MpKSA+IC0xKSB7CisgICAgICBpZiAocG9zID4gZW5kUG9zKSB7CisgICAgICAgIGIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGVuZFBvcywgcG9zKSk7CisgICAgICB9CisgICAgICBlbmRQb3MgPSBwb3MgKyB0b0hpZ2hsaWdodC5sZW5ndGgoKTsKKyAgICAgIGIub3BlbkVsZW1lbnQoImIiKTsKKyAgICAgIGIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHBvcywgZW5kUG9zKSk7CisgICAgICBiLmNsb3NlRWxlbWVudCgiYiIpOworICAgICAgcG9zID0gZW5kUG9zOworICAgIH0KKyAgICBpZiAoZW5kUG9zIDwgdGV4dC5sZW5ndGgoKSkgeworICAgICAgYi5hcHBlbmQodGV4dC5zdWJzdHJpbmcoZW5kUG9zKSk7CisgICAgfQorICAgIHJldHVybiBiLnRvU2FmZUh0bWwoKS5hc1N0cmluZygpOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvcG9tLnhtbCBiL2dlcnJpdC1odHRwZC9wb20ueG1sCmluZGV4IGNlYWNiNjYuLjY1NjQxYWEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9wb20ueG1sCisrKyBiL2dlcnJpdC1odHRwZC9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtaHR0cGQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9DYWNoZUJhc2VkV2ViU2Vzc2lvbi5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvQ2FjaGVCYXNlZFdlYlNlc3Npb24uamF2YQppbmRleCBjYTNkMjg3Li45Njc5MmYwIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9DYWNoZUJhc2VkV2ViU2Vzc2lvbi5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NhY2hlQmFzZWRXZWJTZXNzaW9uLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhNZXRob2Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2FjaGUuQ2FjaGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwpAQCAtMzYsNiArMzUsOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5HaXRTbWFydEh0dHBUb29sczsKIAoraW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwpAQCAtNjcsMTIgKzY4LDEyIEBACiAgIHByaXZhdGUgZmluYWwgQXV0aENvbmZpZyBhdXRoQ29uZmlnOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFub255bW91c1VzZXI+IGFub255bW91c1Byb3ZpZGVyOwogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLlJlcXVlc3RGYWN0b3J5IGlkZW50aWZpZWQ7Ci0gIHByaXZhdGUgQWNjZXNzUGF0aCBhY2Nlc3NQYXRoOworICBwcml2YXRlIGZpbmFsIEVudW1TZXQ8QWNjZXNzUGF0aD4gb2tQYXRocyA9IEVudW1TZXQub2YoQWNjZXNzUGF0aC5VTktOT1dOKTsKICAgcHJpdmF0ZSBDb29raWUgb3V0Q29va2llOwotICBwcml2YXRlIEF1dGhNZXRob2QgYXV0aE1ldGhvZDsKIAogICBwcml2YXRlIEtleSBrZXk7CiAgIHByaXZhdGUgVmFsIHZhbDsKKyAgcHJpdmF0ZSBDdXJyZW50VXNlciB1c2VyOwogCiAgIEBJbmplY3QKICAgQ2FjaGVCYXNlZFdlYlNlc3Npb24oZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCkBAIC04NywzMSArODgsMjIgQEAKICAgICB0aGlzLmFub255bW91c1Byb3ZpZGVyID0gYW5vbnltb3VzUHJvdmlkZXI7CiAgICAgdGhpcy5pZGVudGlmaWVkID0gaWRlbnRpZmllZDsKIAotICAgIGlmIChHaXRTbWFydEh0dHBUb29scy5pc0dpdENsaWVudChyZXF1ZXN0KSkgewotICAgICAgYWNjZXNzUGF0aCA9IEFjY2Vzc1BhdGguR0lUOwotICAgIH0gZWxzZSB7Ci0gICAgICBhY2Nlc3NQYXRoID0gQWNjZXNzUGF0aC5XRUJfVUk7Ci0gICAgfQorICAgIGlmICghR2l0U21hcnRIdHRwVG9vbHMuaXNHaXRDbGllbnQocmVxdWVzdCkpIHsKKyAgICAgIFN0cmluZyBjb29raWUgPSByZWFkQ29va2llKCk7CisgICAgICBpZiAoY29va2llICE9IG51bGwpIHsKKyAgICAgICAga2V5ID0gbmV3IEtleShjb29raWUpOworICAgICAgICB2YWwgPSBtYW5hZ2VyLmdldChrZXkpOworICAgICAgICBpZiAodmFsICE9IG51bGwgJiYgdmFsLm5lZWRzQ29va2llUmVmcmVzaCgpKSB7CisgICAgICAgICAgLy8gQ29va2llIGlzIG1vcmUgdGhhbiBoYWxmIG9sZC4gU2VuZCB0aGUgY29va2llIGFnYWluIHRvIHRoZQorICAgICAgICAgIC8vIGNsaWVudCB3aXRoIGFuIHVwZGF0ZWQgZXhwaXJhdGlvbiBkYXRlLgorICAgICAgICAgIHZhbCA9IG1hbmFnZXIuY3JlYXRlVmFsKGtleSwgdmFsKTsKKyAgICAgICAgfQogCi0gICAgZmluYWwgU3RyaW5nIGNvb2tpZSA9IHJlYWRDb29raWUoKTsKLSAgICBpZiAoY29va2llICE9IG51bGwpIHsKLSAgICAgIGtleSA9IG5ldyBLZXkoY29va2llKTsKLSAgICAgIHZhbCA9IG1hbmFnZXIuZ2V0KGtleSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGtleSA9IG51bGw7Ci0gICAgICB2YWwgPSBudWxsOwotICAgIH0KLSAgICBhdXRoTWV0aG9kID0gaXNTaWduZWRJbigpID8gQXV0aE1ldGhvZC5DT09LSUUgOiBBdXRoTWV0aG9kLk5PTkU7Ci0KLSAgICBpZiAoaXNTaWduZWRJbigpICYmIHZhbC5uZWVkc0Nvb2tpZVJlZnJlc2goKSkgewotICAgICAgLy8gQ29va2llIGlzIG1vcmUgdGhhbiBoYWxmIG9sZC4gU2VuZCB0aGUgY29va2llIGFnYWluIHRvIHRoZQotICAgICAgLy8gY2xpZW50IHdpdGggYW4gdXBkYXRlZCBleHBpcmF0aW9uIGRhdGUuIFdlIGRvbid0IGRhcmUgdG8KLSAgICAgIC8vIGNoYW5nZSB0aGUga2V5IHRva2VuIGhlcmUgYmVjYXVzZSB0aGVyZSBtYXkgYmUgb3RoZXIgUlBDcwotICAgICAgLy8gcXVldWVkIHVwIGluIHRoZSBicm93c2VyIHdob3NlIHhzcmZLZXkgd291bGQgbm90IGdldCB1cGRhdGVkCi0gICAgICAvLyB3aXRoIHRoZSBuZXcgdG9rZW4sIGNhdXNpbmcgdGhlbSB0byBmYWlsLgotICAgICAgLy8KLSAgICAgIHZhbCA9IG1hbmFnZXIuY3JlYXRlVmFsKGtleSwgdmFsKTsKLSAgICAgIHNhdmVDb29raWUoKTsKKyAgICAgICAgU3RyaW5nIHRva2VuID0gcmVxdWVzdC5nZXRIZWFkZXIoIlgtR2Vycml0LUF1dGgiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHRva2VuICE9IG51bGwgJiYgdG9rZW4uZXF1YWxzKHZhbC5nZXRBdXRoKCkpKSB7CisgICAgICAgICAgb2tQYXRocy5hZGQoQWNjZXNzUGF0aC5SRVNUX0FQSSk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtMTI4LDMzICsxMjAsNTQgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiBpc1NpZ25lZEluKCkgewogICAgIHJldHVybiB2YWwgIT0gbnVsbDsKICAgfQogCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7Ci0gICAgcmV0dXJuIGlzU2lnbmVkSW4oKSA/IHZhbC5nZXRYc3JmVG9rZW4oKSA6IG51bGw7CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFhHZXJyaXRBdXRoKCkgeworICAgIHJldHVybiBpc1NpZ25lZEluKCkgPyB2YWwuZ2V0QXV0aCgpIDogbnVsbDsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGlzVG9rZW5WYWxpZChmaW5hbCBTdHJpbmcgaW5wdXRUb2tlbikgewotICAgIHJldHVybiBpc1NpZ25lZEluKCkgLy8KLSAgICAgICAgJiYgdmFsLmdldFhzcmZUb2tlbigpICE9IG51bGwgLy8KLSAgICAgICAgJiYgdmFsLmdldFhzcmZUb2tlbigpLmVxdWFscyhpbnB1dFRva2VuKTsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYR2Vycml0QXV0aChTdHJpbmcga2V5SW4pIHsKKyAgICByZXR1cm4ga2V5SW4uZXF1YWxzKGdldFhHZXJyaXRBdXRoKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzQWNjZXNzUGF0aE9rKEFjY2Vzc1BhdGggcGF0aCkgeworICAgIHJldHVybiBva1BhdGhzLmNvbnRhaW5zKHBhdGgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoIHBhdGgsIGJvb2xlYW4gb2spIHsKKyAgICBpZiAob2spIHsKKyAgICAgIG9rUGF0aHMuYWRkKHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBva1BhdGhzLnJlbW92ZShwYXRoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIEFjY291bnRFeHRlcm5hbElkLktleSBnZXRMYXN0TG9naW5FeHRlcm5hbElkKCkgewogICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC5nZXRFeHRlcm5hbElkKCkgOiBudWxsOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpIHsKLSAgICBpZiAoaXNTaWduZWRJbigpKSB7Ci0gICAgICByZXR1cm4gaWRlbnRpZmllZC5jcmVhdGUoYWNjZXNzUGF0aCwgdmFsLmdldEFjY291bnRJZCgpKTsKKyAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICBpZiAoaXNTaWduZWRJbigpKSB7CisgICAgICAgIHVzZXIgPSBpZGVudGlmaWVkLmNyZWF0ZSh2YWwuZ2V0QWNjb3VudElkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdXNlciA9IGFub255bW91c1Byb3ZpZGVyLmdldCgpOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gYW5vbnltb3VzUHJvdmlkZXIuZ2V0KCk7CisgICAgcmV0dXJuIHVzZXI7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBsb2dpbihmaW5hbCBBdXRoUmVzdWx0IHJlcywgZmluYWwgQXV0aE1ldGhvZCBtZXRoLAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlbWVtYmVyTWUpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGxvZ2luKGZpbmFsIEF1dGhSZXN1bHQgcmVzLCBmaW5hbCBib29sZWFuIHJlbWVtYmVyTWUpIHsKICAgICBmaW5hbCBBY2NvdW50LklkIGlkID0gcmVzLmdldEFjY291bnRJZCgpOwogICAgIGZpbmFsIEFjY291bnRFeHRlcm5hbElkLktleSBpZGVudGl0eSA9IHJlcy5nZXRFeHRlcm5hbElkKCk7CiAKQEAgLTE2MywxOSArMTc2LDE4IEBACiAgICAgfQogCiAgICAga2V5ID0gbWFuYWdlci5jcmVhdGVLZXkoaWQpOwotICAgIHZhbCA9IG1hbmFnZXIuY3JlYXRlVmFsKGtleSwgaWQsIHJlbWVtYmVyTWUsIGlkZW50aXR5LCBudWxsKTsKKyAgICB2YWwgPSBtYW5hZ2VyLmNyZWF0ZVZhbChrZXksIGlkLCByZW1lbWJlck1lLCBpZGVudGl0eSwgbnVsbCwgbnVsbCk7CiAgICAgc2F2ZUNvb2tpZSgpOwotCi0gICAgYXV0aE1ldGhvZCA9IG1ldGg7CiAgIH0KIAogICAvKiogU2V0IHRoZSB1c2VyIGFjY291bnQgZm9yIHRoaXMgY3VycmVudCByZXF1ZXN0IG9ubHkuICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZXJBY2NvdW50SWQoQWNjb3VudC5JZCBpZCwgQXV0aE1ldGhvZCBtZXRob2QpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFVzZXJBY2NvdW50SWQoQWNjb3VudC5JZCBpZCkgewogICAgIGtleSA9IG5ldyBLZXkoImlkOiIgKyBpZCk7Ci0gICAgdmFsID0gbmV3IFZhbChpZCwgMCwgZmFsc2UsIG51bGwsICIiLCAwKTsKLSAgICBhdXRoTWV0aG9kID0gbWV0aG9kOworICAgIHZhbCA9IG5ldyBWYWwoaWQsIDAsIGZhbHNlLCBudWxsLCAwLCBudWxsLCBudWxsKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBsb2dvdXQoKSB7CiAgICAgaWYgKHZhbCAhPSBudWxsKSB7CiAgICAgICBtYW5hZ2VyLmRlc3Ryb3koa2V5KTsKQEAgLTE4NSw2ICsxOTcsMTEgQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgcmV0dXJuIHZhbCAhPSBudWxsID8gdmFsLmdldFNlc3Npb25JZCgpIDogbnVsbDsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCBzYXZlQ29va2llKCkgewogICAgIGZpbmFsIFN0cmluZyB0b2tlbjsKICAgICBmaW5hbCBpbnQgYWdlU2Vjb25kczsKQEAgLTIyMCw4ICsyMzcsNCBAQAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2VjdXJlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKICAgICByZXR1cm4gcmVxLmlzU2VjdXJlKCkgfHwgImh0dHBzIi5lcXVhbHMocmVxLmdldFNjaGVtZSgpKTsKICAgfQotCi0gIHB1YmxpYyBBdXRoTWV0aG9kIGdldEF1dGhNZXRob2QoKSB7Ci0gICAgcmV0dXJuIGF1dGhNZXRob2Q7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NvbnRhaW5lckF1dGhGaWx0ZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NvbnRhaW5lckF1dGhGaWx0ZXIuamF2YQppbmRleCA5Y2UyMjk4Li40MzNiNGY1IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Db250YWluZXJBdXRoRmlsdGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvQ29udGFpbmVyQXV0aEZpbHRlci5qYXZhCkBAIC0xNyw5ICsxNyw5IEBACiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRTdGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKQEAgLTEwMCw5ICsxMDAsMTAgQEAKICAgICAgIHJzcC5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVEKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgc2Vzc2lvbi5nZXQoKS5zZXRVc2VyQWNjb3VudElkKAotICAgICAgICB3aG8uZ2V0QWNjb3VudCgpLmdldElkKCksCi0gICAgICAgIEF1dGhNZXRob2QuUEFTU1dPUkQpOworICAgIFdlYlNlc3Npb24gd3MgPSBzZXNzaW9uLmdldCgpOworICAgIHdzLnNldFVzZXJBY2NvdW50SWQod2hvLmdldEFjY291bnQoKS5nZXRJZCgpKTsKKyAgICB3cy5zZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aC5HSVQsIHRydWUpOworICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLlJFU1RfQVBJLCB0cnVlKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2Vycml0Q29uZmlnUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dlcnJpdENvbmZpZ1Byb3ZpZGVyLmphdmEKaW5kZXggYzFmM2FlNC4uYWE1NmFlOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2Vycml0Q29uZmlnUHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRDb25maWdQcm92aWRlci5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdlcnJpdENvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HaXR3ZWJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CkBAIC01Miw3ICs1MSw2IEBACiAgIHByaXZhdGUgZmluYWwgR2l0V2ViQ29uZmlnIGdpdFdlYkNvbmZpZzsKICAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgd2lsZFByb2plY3Q7CiAgIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKIAogICBwcml2YXRlIEVtYWlsU2VuZGVyIGVtYWlsU2VuZGVyOwogICBwcml2YXRlIGZpbmFsIENvbnRhY3RTdG9yZSBjb250YWN0U3RvcmU7CkBAIC02Miw3ICs2MCw3IEBACiAgIEBJbmplY3QKICAgR2Vycml0Q29uZmlnUHJvdmlkZXIoZmluYWwgUmVhbG0gciwgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgZ3NjLAogICAgICAgZmluYWwgQXV0aENvbmZpZyBhYywgZmluYWwgR2l0V2ViQ29uZmlnIGd3YywgZmluYWwgQWxsUHJvamVjdHNOYW1lIHdwLAotICAgICAgZmluYWwgU3NoSW5mbyBzaSwgZmluYWwgQXBwcm92YWxUeXBlcyBhdCwgZmluYWwgQ29udGFjdFN0b3JlIGNzLAorICAgICAgZmluYWwgU3NoSW5mbyBzaSwgZmluYWwgQ29udGFjdFN0b3JlIGNzLAogICAgICAgZmluYWwgU2VydmxldENvbnRleHQgc2MsIGZpbmFsIERvd25sb2FkQ29uZmlnIGRjLAogICAgICAgZmluYWwgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFjbikgewogICAgIHJlYWxtID0gcjsKQEAgLTcyLDcgKzcwLDYgQEAKICAgICBnaXRXZWJDb25maWcgPSBnd2M7CiAgICAgc3NoSW5mbyA9IHNpOwogICAgIHdpbGRQcm9qZWN0ID0gd3A7Ci0gICAgYXBwcm92YWxUeXBlcyA9IGF0OwogICAgIGNvbnRhY3RTdG9yZSA9IGNzOwogICAgIHNlcnZsZXRDb250ZXh0ID0gc2M7CiAgICAgYW5vbnltb3VzQ293YXJkTmFtZSA9IGFjbjsKQEAgLTg2LDI1ICs4MywyNyBAQAogICBwcml2YXRlIEdlcnJpdENvbmZpZyBjcmVhdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKICAgICBmaW5hbCBHZXJyaXRDb25maWcgY29uZmlnID0gbmV3IEdlcnJpdENvbmZpZygpOwogICAgIHN3aXRjaCAoYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIE9QRU5JRDoKLSAgICAgICAgY29uZmlnLnNldEFsbG93ZWRPcGVuSURzKGF1dGhDb25maWcuZ2V0QWxsb3dlZE9wZW5JRHMoKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE9QRU5JRF9TU086Ci0gICAgICAgIGNvbmZpZy5zZXRPcGVuSWRTc29VcmwoYXV0aENvbmZpZy5nZXRPcGVuSWRTc29VcmwoKSk7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgICBjYXNlIExEQVA6CiAgICAgICBjYXNlIExEQVBfQklORDoKICAgICAgICAgY29uZmlnLnNldFJlZ2lzdGVyVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAicmVnaXN0ZXJ1cmwiKSk7CisgICAgICAgIGNvbmZpZy5zZXRSZWdpc3RlclRleHQoY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJyZWdpc3RlcnRleHQiKSk7CiAgICAgICAgIGNvbmZpZy5zZXRFZGl0RnVsbE5hbWVVcmwoY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJlZGl0RnVsbE5hbWVVcmwiKSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046CiAgICAgICAgIGNvbmZpZy5zZXRSZWdpc3RlclVybChjZmcuZ2V0U3RyaW5nKCJhdXRoIiwgbnVsbCwgInJlZ2lzdGVydXJsIikpOworICAgICAgICBjb25maWcuc2V0UmVnaXN0ZXJUZXh0KGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAicmVnaXN0ZXJ0ZXh0IikpOwogICAgICAgICBjb25maWcuc2V0RWRpdEZ1bGxOYW1lVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAiZWRpdEZ1bGxOYW1lVXJsIikpOwogICAgICAgICBjb25maWcuc2V0SHR0cFBhc3N3b3JkVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAiaHR0cFBhc3N3b3JkVXJsIikpOwogICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKKyAgICAgIGNhc2UgREVWRUxPUE1FTlRfQkVDT01FX0FOWV9BQ0NPVU5UOgorICAgICAgY2FzZSBIVFRQOgorICAgICAgY2FzZSBIVFRQX0xEQVA6CisgICAgICBjYXNlIE9QRU5JRDoKKyAgICAgIGNhc2UgT1BFTklEX1NTTzoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNvbmZpZy5zZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoY2ZnLmdldEJvb2xlYW4oImF1dGgiLAogICAgICAgICAiY29udHJpYnV0b3JhZ3JlZW1lbnRzIiwgZmFsc2UpKTsKQEAgLTExNSwxMiArMTE0LDEyIEBACiAgICAgY29uZmlnLnNldERvd25sb2FkQ29tbWFuZHMoZG93bmxvYWRDb25maWcuZ2V0RG93bmxvYWRDb21tYW5kcygpKTsKICAgICBjb25maWcuc2V0QXV0aFR5cGUoYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKTsKICAgICBjb25maWcuc2V0V2lsZFByb2plY3Qod2lsZFByb2plY3QpOwotICAgIGNvbmZpZy5zZXRBcHByb3ZhbFR5cGVzKGFwcHJvdmFsVHlwZXMpOwogICAgIGNvbmZpZy5zZXREb2N1bWVudGF0aW9uQXZhaWxhYmxlKHNlcnZsZXRDb250ZXh0CiAgICAgICAgIC5nZXRSZXNvdXJjZSgiL0RvY3VtZW50YXRpb24vaW5kZXguaHRtbCIpICE9IG51bGwpOwogICAgIGNvbmZpZy5zZXRUZXN0Q2hhbmdlTWVyZ2UoY2ZnLmdldEJvb2xlYW4oImNoYW5nZU1lcmdlIiwKICAgICAgICAgInRlc3QiLCBmYWxzZSkpOwogICAgIGNvbmZpZy5zZXRBbm9ueW1vdXNDb3dhcmROYW1lKGFub255bW91c0Nvd2FyZE5hbWUpOworICAgIGNvbmZpZy5zZXRTdWdnZXN0RnJvbShjZmcuZ2V0SW50KCJzdWdnZXN0IiwgImZyb20iLCAwKSk7CiAKICAgICBjb25maWcuc2V0UmVwb3J0QnVnVXJsKGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJyZXBvcnRCdWdVcmwiKSk7CiAgICAgaWYgKGNvbmZpZy5nZXRSZXBvcnRCdWdVcmwoKSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRVaU9wdGlvbnMuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dlcnJpdFVpT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDczMjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRVaU9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CisKK3B1YmxpYyBjbGFzcyBHZXJyaXRVaU9wdGlvbnMgeworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGVhZGxlc3M7CisKKyAgcHVibGljIEdlcnJpdFVpT3B0aW9ucyhib29sZWFuIGhlYWRsZXNzKSB7CisgICAgdGhpcy5oZWFkbGVzcyA9IGhlYWRsZXNzOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlRGVmYXVsdFVpKCkgeworICAgIHJldHVybiAhaGVhZGxlc3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dpdE92ZXJIdHRwU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKaW5kZXggNmJkMzVkZC4uZGFkOWI4MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKQEAgLTE4LDEwICsxOCwxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNhcGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Bbm9ueW1vdXNVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQXN5bmNSZWNlaXZlQ29tbWl0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkNoYW5nZUNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZWNlaXZlQ29tbWl0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRhZ0NhY2hlOwpAQCAtMTU2LDggKzE1OSwxMiBAQAogICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlcnIpIHsKICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihwcm9qZWN0TmFtZSk7CiAgICAgICB9CisKKyAgICAgIEN1cnJlbnRVc2VyIHVzZXIgPSBwYy5nZXRDdXJyZW50VXNlcigpOworICAgICAgdXNlci5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguR0lUKTsKKwogICAgICAgaWYgKCFwYy5pc1Zpc2libGUoKSkgewotICAgICAgICBpZiAocGMuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIEFub255bW91c1VzZXIpIHsKKyAgICAgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNVc2VyKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uKCk7CkBAIC0xNzYsMTIgKzE4MywxMCBAQAogCiAgIHN0YXRpYyBjbGFzcyBVcGxvYWRGYWN0b3J5IGltcGxlbWVudHMgVXBsb2FkUGFja0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXF1ZXN0PiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlckNvbmZpZyBjb25maWc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiBzZXNzaW9uOwogCiAgICAgQEluamVjdAotICAgIFVwbG9hZEZhY3RvcnkoVHJhbnNmZXJDb25maWcgdGMsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb24pIHsKKyAgICBVcGxvYWRGYWN0b3J5KFRyYW5zZmVyQ29uZmlnIHRjKSB7CiAgICAgICB0aGlzLmNvbmZpZyA9IHRjOwotICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5NiwxMSArMjAxLDEzIEBACiAgIHN0YXRpYyBjbGFzcyBVcGxvYWRGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOwogICAgIHByaXZhdGUgZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKIAogICAgIEBJbmplY3QKLSAgICBVcGxvYWRGaWx0ZXIoUHJvdmlkZXI8UmV2aWV3RGI+IGRiLCBUYWdDYWNoZSB0YWdDYWNoZSkgeworICAgIFVwbG9hZEZpbHRlcihQcm92aWRlcjxSZXZpZXdEYj4gZGIsIFRhZ0NhY2hlIHRhZ0NhY2hlLCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZSkgewogICAgICAgdGhpcy5kYiA9IGRiOwogICAgICAgdGhpcy50YWdDYWNoZSA9IHRhZ0NhY2hlOworICAgICAgdGhpcy5jaGFuZ2VDYWNoZSA9IGNoYW5nZUNhY2hlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjE5LDcgKzIyNiw3IEBACiAgICAgICB9CiAKICAgICAgIGlmICghcGMuYWxsUmVmc0FyZVZpc2libGUoKSkgewotICAgICAgICB1cC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgVmlzaWJsZVJlZkZpbHRlcih0YWdDYWNoZSwgcmVwbywgcGMsIGRiLmdldCgpLCB0cnVlKSk7CisgICAgICAgIHVwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCBjaGFuZ2VDYWNoZSwgcmVwbywgcGMsIGRiLmdldCgpLCB0cnVlKSk7CiAgICAgICB9CiAKICAgICAgIG5leHQuZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwpAQCAtMjM2LDE0ICsyNDMsMTEgQEAKIAogICBzdGF0aWMgY2xhc3MgUmVjZWl2ZUZhY3RvcnkgaW1wbGVtZW50cyBSZWNlaXZlUGFja0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXF1ZXN0PiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBBc3luY1JlY2VpdmVDb21taXRzLkZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb247CiAgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlckNvbmZpZyBjb25maWc7CiAKICAgICBASW5qZWN0Ci0gICAgUmVjZWl2ZUZhY3RvcnkoQXN5bmNSZWNlaXZlQ29tbWl0cy5GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb24sIFRyYW5zZmVyQ29uZmlnIGNvbmZpZykgeworICAgIFJlY2VpdmVGYWN0b3J5KEFzeW5jUmVjZWl2ZUNvbW1pdHMuRmFjdG9yeSBmYWN0b3J5LCBUcmFuc2ZlckNvbmZpZyBjb25maWcpIHsKICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwogICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CiAgICAgfQogCkBAIC0yODUsNiArMjg5LDcgQEAKIAogICAgICAgUmVjZWl2ZUNvbW1pdHMgcmMgPSAoUmVjZWl2ZUNvbW1pdHMpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEFUVF9SQyk7CiAgICAgICBSZWNlaXZlUGFjayBycCA9IHJjLmdldFJlY2VpdmVQYWNrKCk7CisgICAgICBycC5nZXRBZHZlcnRpc2VSZWZzSG9vaygpLmFkdmVydGlzZVJlZnMocnApOwogICAgICAgUHJvamVjdENvbnRyb2wgcGMgPSAoUHJvamVjdENvbnRyb2wpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEFUVF9DT05UUk9MKTsKICAgICAgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSA9IHBjLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0bWxEb21VdGlsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9IdG1sRG9tVXRpbC5qYXZhCmluZGV4IDBhOTNmODAuLmM0NzU1MmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0bWxEb21VdGlsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHRtbERvbVV0aWwuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogCiAgIC8qKiBET0NUWVBFIGZvciBhIHN0YW5kYXJkcyBtb2RlIEhUTUwgZG9jdW1lbnQuICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU1RSSUNUID0KLSAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiOworICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiOwogCiAgIC8qKiBDb252ZXJ0IGEgZG9jdW1lbnQgdG8gYSBVVEYtOCBieXRlIHNlcXVlbmNlLiAqLwogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b1VURjgoZmluYWwgRG9jdW1lbnQgaG9zdERvYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBMb2dvdXRTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9IdHRwTG9nb3V0U2VydmxldC5qYXZhCmluZGV4IGU5YjM1MDAuLjg3OWRmYTMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBMb2dvdXRTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cExvZ291dFNlcnZsZXQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogICBwcm90ZWN0ZWQgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICBmaW5hbCBTdHJpbmcgc2lkID0gd2ViU2Vzc2lvbi5nZXQoKS5nZXRUb2tlbigpOworICAgIGZpbmFsIFN0cmluZyBzaWQgPSB3ZWJTZXNzaW9uLmdldCgpLmdldFNlc3Npb25JZCgpOwogICAgIGZpbmFsIEN1cnJlbnRVc2VyIGN1cnJlbnRVc2VyID0gd2ViU2Vzc2lvbi5nZXQoKS5nZXRDdXJyZW50VXNlcigpOwogICAgIGZpbmFsIFN0cmluZyB3aGF0ID0gInNpZ24gb3V0IjsKICAgICBmaW5hbCBsb25nIHdoZW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBSZXF1ZXN0Q29udGV4dC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKaW5kZXggOGVmODI2Yi4uMmRiMzUzNCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKQEAgLTE0LDIwICsxNCwzMSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogY2xhc3MgSHR0cFJlcXVlc3RDb250ZXh0IGltcGxlbWVudHMgUmVxdWVzdENvbnRleHQgewogICBwcml2YXRlIGZpbmFsIFdlYlNlc3Npb24gc2Vzc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlciBwcm92aWRlcjsKIAogICBASW5qZWN0Ci0gIEh0dHBSZXF1ZXN0Q29udGV4dChmaW5hbCBXZWJTZXNzaW9uIHNlc3Npb24pIHsKKyAgSHR0cFJlcXVlc3RDb250ZXh0KFdlYlNlc3Npb24gc2Vzc2lvbiwKKyAgICAgIFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyIHByb3ZpZGVyKSB7CiAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgewogICAgIHJldHVybiBzZXNzaW9uLmdldEN1cnJlbnRVc2VyKCk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCkgeworICAgIHJldHVybiBwcm92aWRlcjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdEJhc2ljQXV0aEZpbHRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdEJhc2ljQXV0aEZpbHRlci5qYXZhCmluZGV4IDViMzljYjIuLjNkOWY0YzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Byb2plY3RCYXNpY0F1dGhGaWx0ZXIuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0QmFzaWNBdXRoRmlsdGVyLmphdmEKQEAgLTE4LDExICsxOCwxMSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKQEAgLTEwNCwxMCArMTA0LDkgQEAKICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXNwb25zZSByc3ApCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIFN0cmluZyBoZHIgPSByZXEuZ2V0SGVhZGVyKEFVVEhPUklaQVRJT04pOwotICAgIGlmIChoZHIgPT0gbnVsbCkgeworICAgIGlmIChoZHIgPT0gbnVsbCB8fCAhaGRyLnN0YXJ0c1dpdGgoTElUX0JBU0lDKSkgewogICAgICAgLy8gQWxsb3cgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24gdGhyb3VnaCwgb3IgaXQgbWlnaHQgYmUgdXNpbmcgYQogICAgICAgLy8gc2Vzc2lvbiBjb29raWUgaW5zdGVhZCBvZiBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLSAgICAgIC8vCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTE0Myw4ICsxNDIsMTAgQEAKIAogICAgIHRyeSB7CiAgICAgICBBdXRoUmVzdWx0IHdob0F1dGhSZXN1bHQgPSBhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUod2hvQXV0aCk7Ci0gICAgICBzZXNzaW9uLmdldCgpLnNldFVzZXJBY2NvdW50SWQod2hvQXV0aFJlc3VsdC5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBBdXRoTWV0aG9kLlBBU1NXT1JEKTsKKyAgICAgIFdlYlNlc3Npb24gd3MgPSBzZXNzaW9uLmdldCgpOworICAgICAgd3Muc2V0VXNlckFjY291bnRJZCh3aG9BdXRoUmVzdWx0LmdldEFjY291bnRJZCgpKTsKKyAgICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLkdJVCwgdHJ1ZSk7CisgICAgICB3cy5zZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aC5SRVNUX0FQSSwgdHJ1ZSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGNhdGNoIChBY2NvdW50RXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy53YXJuKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICIgKyB1c2VybmFtZSwgZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0RGlnZXN0RmlsdGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0RGlnZXN0RmlsdGVyLmphdmEKaW5kZXggODRhYTUzMi4uYzM4NDI1ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdERpZ2VzdEZpbHRlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Byb2plY3REaWdlc3RGaWx0ZXIuamF2YQpAQCAtMjAsOSArMjAsOSBAQAogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlNpZ25lZFRva2VuOwpAQCAtMTEwLDEwICsxMTAsOSBAQAogICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlc3BvbnNlIHJzcCkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgU3RyaW5nIGhkciA9IHJlcS5nZXRIZWFkZXIoQVVUSE9SSVpBVElPTik7Ci0gICAgaWYgKGhkciA9PSBudWxsKSB7CisgICAgaWYgKGhkciA9PSBudWxsIHx8ICFoZHIuc3RhcnRzV2l0aCgiRGlnZXN0ICIpKSB7CiAgICAgICAvLyBBbGxvdyBhbiBhbm9ueW1vdXMgY29ubmVjdGlvbiB0aHJvdWdoLCBvciBpdCBtaWdodCBiZSB1c2luZyBhCiAgICAgICAvLyBzZXNzaW9uIGNvb2tpZSBpbnN0ZWFkIG9mIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KLSAgICAgIC8vCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTE2NSw5ICsxNjQsMTAgQEAKICAgICBpZiAoZXhwZWN0LmVxdWFscyhyZXNwb25zZSkpIHsKICAgICAgIHRyeSB7CiAgICAgICAgIGlmICh0b2tlbnMuY2hlY2tUb2tlbihub25jZSwgIiIpICE9IG51bGwpIHsKLSAgICAgICAgICBzZXNzaW9uLmdldCgpLnNldFVzZXJBY2NvdW50SWQoCi0gICAgICAgICAgICAgIHdoby5nZXRBY2NvdW50KCkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgQXV0aE1ldGhvZC5QQVNTV09SRCk7CisgICAgICAgICAgV2ViU2Vzc2lvbiB3cyA9IHNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgd3Muc2V0VXNlckFjY291bnRJZCh3aG8uZ2V0QWNjb3VudCgpLmdldElkKCkpOworICAgICAgICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLkdJVCwgdHJ1ZSk7CisgICAgICAgICAgd3Muc2V0QWNjZXNzUGF0aE9rKEFjY2Vzc1BhdGguUkVTVF9BUEksIHRydWUpOwogICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMzIsMTIgKzIzMiw2IEBACiAgIH0KIAogICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyc2VBdXRob3JpemF0aW9uKFN0cmluZyBhdXRoKSB7Ci0gICAgaWYgKCFhdXRoLnN0YXJ0c1dpdGgoIkRpZ2VzdCAiKSkgewotICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzY2hlbWUsIGRlbnkgdGhlIHJlc3QuCi0gICAgICAvLwotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfQotCiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgaW50IG5leHQgPSAiRGlnZXN0ICIubGVuZ3RoKCk7CiAgICAgd2hpbGUgKG5leHQgPCBhdXRoLmxlbmd0aCgpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0QXBpU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUmVzdEFwaVNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkYjJmMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0QXBpU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZDsKLQotaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47Ci1pbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC51dGlsLmNsaS5DbWRMaW5lUGFyc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uSnNvbkNvbnN0YW50czsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzdEFwaVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KLSAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKLQotICAvKiogTUlNRSB0eXBlIHVzZWQgZm9yIGEgSlNPTiByZXNwb25zZSBib2R5LiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEUgPSBKc29uQ29uc3RhbnRzLkpTT05fVFlQRTsKLQotICAvKioKLSAgICogR2FyYmFnZSBwcmVmaXggaW5zZXJ0ZWQgYmVmb3JlIEpTT04gb3V0cHV0IHRvIHByZXZlbnQgWFNTSS4KLSAgICogPHA+Ci0gICAqIFRoaXMgcHJlZml4IGlzICIpXX0nXG4iIGFuZCBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IGEgd2ViIGJyb3dzZXIgZnJvbQotICAgKiBleGVjdXRpbmcgdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlIHJlc291cmNlIFVSSSB3ZXJlIHRvIGJlIHJlZmVyZW5jZWQgdXNpbmcKLSAgICogYSAmbHQ7c2NyaXB0IHNyYz0iLi4uJmd0OyBIVE1MIHRhZyBmcm9tIGFub3RoZXIgd2ViIHNpdGUuIENsaWVudHMgdXNpbmcgdGhlCi0gICAqIEhUVFAgaW50ZXJmYWNlIHdpbGwgbmVlZCB0byBhbHdheXMgc3RyaXAgdGhlIGZpcnN0IGxpbmUgb2YgcmVzcG9uc2UgZGF0YSB0bwotICAgKiByZW1vdmUgdGhpcyBtYWdpYyBoZWFkZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBKU09OX01BR0lDOwotCi0gIHN0YXRpYyB7Ci0gICAgdHJ5IHsKLSAgICAgIEpTT05fTUFHSUMgPSAiKV19J1xuIi5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXI7Ci0KLSAgQEluamVjdAotICBwcm90ZWN0ZWQgUmVzdEFwaVNlcnZsZXQoZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyKSB7Ci0gICAgdGhpcy5jdXJyZW50VXNlciA9IGN1cnJlbnRVc2VyOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIHJlcy5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQiKTsKLQotICAgIHRyeSB7Ci0gICAgICBjaGVja1JlcXVpcmVzQ2FwYWJpbGl0eSgpOwotICAgICAgc3VwZXIuc2VydmljZShyZXEsIHJlcyk7Ci0gICAgfSBjYXRjaCAoUmVxdWlyZUNhcGFiaWxpdHlFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBzZW5kRXJyb3IocmVzLCBTQ19GT1JCSURERU4sIGVyci5nZXRNZXNzYWdlKCkpOwotICAgIH0gY2F0Y2ggKEVycm9yIGVycikgewotICAgICAgaGFuZGxlRXhjZXB0aW9uKGVyciwgcmVxLCByZXMpOwotICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBoYW5kbGVFeGNlcHRpb24oZXJyLCByZXEsIHJlcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZXNDYXBhYmlsaXR5KCkgdGhyb3dzIFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uIHsKLSAgICBSZXF1aXJlc0NhcGFiaWxpdHkgcmMgPSBnZXRDbGFzcygpLmdldEFubm90YXRpb24oUmVxdWlyZXNDYXBhYmlsaXR5LmNsYXNzKTsKLSAgICBpZiAocmMgIT0gbnVsbCkgewotICAgICAgQ3VycmVudFVzZXIgdXNlciA9IGN1cnJlbnRVc2VyLmdldCgpOwotICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wgY3RsID0gdXNlci5nZXRDYXBhYmlsaXRpZXMoKTsKLSAgICAgIGlmICghY3RsLmNhblBlcmZvcm0ocmMudmFsdWUoKSkgJiYgIWN0bC5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgewotICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAiZmF0YWw6ICVzIGRvZXMgbm90IGhhdmUgXCIlc1wiIGNhcGFiaWxpdHkuIiwKLSAgICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbCgKLSAgICAgICAgICAgIHVzZXIuZ2V0VXNlck5hbWUoKSwKLSAgICAgICAgICAgIHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcgotICAgICAgICAgICAgICA/ICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldE5hbWVFbWFpbCgpCi0gICAgICAgICAgICAgIDogdXNlci50b1N0cmluZygpKSwKLSAgICAgICAgICByYy52YWx1ZSgpKTsKLSAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uKG1zZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGVyciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFN0cmluZyB1cmkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOwotICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHJlcS5nZXRRdWVyeVN0cmluZygpKSkgewotICAgICAgdXJpICs9ICI/IiArIHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgIH0KLSAgICBsb2cuZXJyb3IoU3RyaW5nLmZvcm1hdCgiRXJyb3IgaW4gJXMgJXMiLCByZXEuZ2V0TWV0aG9kKCksIHVyaSksIGVycik7Ci0KLSAgICBpZiAoIXJlcy5pc0NvbW1pdHRlZCgpKSB7Ci0gICAgICByZXMucmVzZXQoKTsKLSAgICAgIHNlbmRFcnJvcihyZXMsIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIkludGVybmFsIFNlcnZlciBFcnJvciIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0gICAgICBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXMuc2V0U3RhdHVzKHN0YXR1c0NvZGUpOwotICAgIHNlbmRUZXh0KG51bGwsIHJlcywgbXNnKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgU3RyaW5nIGFjY2VwdCA9IHJlcS5nZXRIZWFkZXIoIkFjY2VwdCIpOwotICAgIGlmIChhY2NlcHQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoSlNPTl9UWVBFLmVxdWFscyhhY2NlcHQpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGFjY2VwdC5zdGFydHNXaXRoKEpTT05fVFlQRSArICIsIikpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBmb3IgKFN0cmluZyBwIDogYWNjZXB0LnNwbGl0KCJbICw7XVsgLDtdKiIpKSB7Ci0gICAgICBpZiAoSlNPTl9UWVBFLmVxdWFscyhwKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlbmRUZXh0KEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLSAgICBzZW5kKHJlcSwgcmVzLCBkYXRhLmdldEJ5dGVzKCJVVEYtOCIpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZW5kKEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChkYXRhLmxlbmd0aCA+IDI1NiAmJiByZXEgIT0gbnVsbAotICAgICAgICAmJiBSUENTZXJ2bGV0VXRpbHMuYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEpKSB7Ci0gICAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKLSAgICAgIGRhdGEgPSBIdG1sRG9tVXRpbC5jb21wcmVzcyhkYXRhKTsKLSAgICB9Ci0gICAgcmVzLnNldENvbnRlbnRMZW5ndGgoZGF0YS5sZW5ndGgpOwotICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgdHJ5IHsKLSAgICAgIG91dC53cml0ZShkYXRhKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJQYXJzZXIgewotICAgIHByaXZhdGUgZmluYWwgQ21kTGluZVBhcnNlci5GYWN0b3J5IHBhcnNlckZhY3Rvcnk7Ci0KLSAgICBASW5qZWN0Ci0gICAgUGFyYW1ldGVyUGFyc2VyKENtZExpbmVQYXJzZXIuRmFjdG9yeSBwZikgewotICAgICAgdGhpcy5wYXJzZXJGYWN0b3J5ID0gcGY7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBib29sZWFuIHBhcnNlKFQgcGFyYW0sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHBhcnNlKHBhcmFtLCByZXEsIHJlcywgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IGJvb2xlYW4gcGFyc2UoVCBwYXJhbSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFNldDxTdHJpbmc+IGFyZ05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgQ21kTGluZVBhcnNlciBjbHAgPSBwYXJzZXJGYWN0b3J5LmNyZWF0ZShwYXJhbSk7Ci0gICAgICB0cnkgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtZXRlck1hcCA9IHJlcS5nZXRQYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgY2xwLnBhcnNlT3B0aW9uTWFwKHBhcmFtZXRlck1hcCwgYXJnTmFtZXMpOwotICAgICAgfSBjYXRjaCAoQ21kTGluZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGlmICghY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7Ci0gICAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgICBzZW5kVGV4dChyZXEsIHJlcywgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGNscC5wcmludFF1ZXJ5U3RyaW5nVXNhZ2UocmVxLmdldFJlcXVlc3RVUkkoKSwgbXNnKTsKLSAgICAgICAgbXNnLndyaXRlKCdcbicpOwotICAgICAgICBtc2cud3JpdGUoJ1xuJyk7Ci0gICAgICAgIGNscC5wcmludFVzYWdlKG1zZywgbnVsbCk7Ci0gICAgICAgIG1zZy53cml0ZSgnXG4nKTsKLSAgICAgICAgc2VuZFRleHQocmVxLCByZXMsIG1zZy50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikgLy8gTmV2ZXIgc2VyaWFsaXplZCBvciB0aHJvd24gb3V0IG9mIHRoaXMgY2xhc3MuCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgUmVxdWlyZUNhcGFiaWxpdHlFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Jlc3RUb2tlblZlcmlmaWVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0VG9rZW5WZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNlYmM3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Jlc3RUb2tlblZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWdpc3Rlck5ld0VtYWlsU2VuZGVyOwotCi0vKiogVmVyaWZpZXMgdGhlIHRva2VuIHNlbnQgYnkge0BsaW5rIFJlZ2lzdGVyTmV3RW1haWxTZW5kZXJ9LiAqLwotcHVibGljIGludGVyZmFjZSBSZXN0VG9rZW5WZXJpZmllciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSB0b2tlbiB0byB2ZXJpZnkgYSBSRVNUIFBVVCByZXF1ZXN0LgotICAgKgotICAgKiBAcGFyYW0gdXNlciB0aGUgY2FsbGVyIHRoYXQgd2FudHMgdG8gbWFrZSBhIFBVVCByZXF1ZXN0Ci0gICAqIEBwYXJhbSB1cmwgdGhlIFVSTCBiZWluZyByZXF1ZXN0ZWQKLSAgICogQHJldHVybiBhbiB1bmZvcmdlYWJsZSBzdHJpbmcgdG8gc2VuZCB0byB0aGUgdXNlciBhcyB0aGUgYm9keSBvZiBhIEdFVAotICAgKiAgICAgICAgIHJlcXVlc3QuIFByZXNlbnRpbmcgdGhlIHN0cmluZyBpbiBhIGZvbGxvdy11cCBQT1NUIHJlcXVlc3QgcHJvdmlkZXMKLSAgICogICAgICAgICBwcm9vZiB0aGUgdXNlciBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBtZXNzYWdlcyBzZW50IHRvIHRoaWVyCi0gICAqICAgICAgICAgYnJvd3NlciBhbmQgdGhleSBsaWtlbHkgYXJlbid0IG1ha2luZyB0aGUgcmVxdWVzdCB2aWEgWFNSRi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2lnbihBY2NvdW50LklkIHVzZXIsIFN0cmluZyB1cmwpOwotCi0gIC8qKgotICAgKiBEZWNvZGUgYSB0b2tlbiBwcmV2aW91c2x5IGNyZWF0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIG1ha2luZyB0aGUgdmVyaWZ5IHJlcXVlc3QuCi0gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzLgotICAgKiBAcGFyYW0gdG9rZW4gdGhlIHN0cmluZyBjcmVhdGVkIGJ5IHNpZ24uCi0gICAqIEB0aHJvd3MgSW52YWxpZFRva2VuRXhjZXB0aW9uIHRoZSB0b2tlbiBpcyBpbnZhbGlkLCBleHBpcmVkLCBtYWxmb3JtZWQsCi0gICAqICAgICAgICAgZXRjLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmVyaWZ5KEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCwgU3RyaW5nIHRva2VuKQotICAgICAgdGhyb3dzIEludmFsaWRUb2tlbkV4Y2VwdGlvbjsKLQotICAvKiogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgdG9rZW4gZG9lcyBub3QgcGFyc2UgY29ycmVjdGx5LiAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgSW52YWxpZFRva2VuRXhjZXB0aW9uKCkgewotICAgICAgc3VwZXIoIkludmFsaWQgdG9rZW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52YWxpZFRva2VuRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgc3VwZXIoIkludmFsaWQgdG9rZW4iLCBjYXVzZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9TaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9TaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDZjYWEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvU2lnbmVkVG9rZW5SZXN0VG9rZW5WZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuU2lnbmVkVG9rZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5WYWxpZFRva2VuOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuWHNyZkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0vKiogVmVyaWZpZXMgdGhlIHRva2VuIHNlbnQgYnkge0BsaW5rIFJlc3RBcGlTZXJ2bGV0fS4gKi8KLXB1YmxpYyBjbGFzcyBTaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyIGltcGxlbWVudHMgUmVzdFRva2VuVmVyaWZpZXIgewotICBwcml2YXRlIGZpbmFsIFNpZ25lZFRva2VuIHJlc3RUb2tlbjsKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICBiaW5kKFJlc3RUb2tlblZlcmlmaWVyLmNsYXNzKS50byhTaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmNsYXNzKTsKLSAgICB9Ci0gIH0KLQotICBASW5qZWN0Ci0gIFNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXIoQXV0aENvbmZpZyBjb25maWcpIHsKLSAgICByZXN0VG9rZW4gPSBjb25maWcuZ2V0UmVzdFRva2VuKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBzaWduKEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCkgewotICAgIHRyeSB7Ci0gICAgICBTdHJpbmcgcGF5bG9hZCA9IFN0cmluZy5mb3JtYXQoIiVzOiVzIiwgdXNlciwgdXJsKTsKLSAgICAgIGJ5dGVbXSB1dGY4ID0gcGF5bG9hZC5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlQnl0ZXModXRmOCk7Ci0gICAgICByZXR1cm4gcmVzdFRva2VuLm5ld1Rva2VuKGJhc2U2NCk7Ci0gICAgfSBjYXRjaCAoWHNyZkV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgdmVyaWZ5KEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCwgU3RyaW5nIHRva2VuU3RyaW5nKQotICAgICAgdGhyb3dzIEludmFsaWRUb2tlbkV4Y2VwdGlvbiB7Ci0gICAgVmFsaWRUb2tlbiB0b2tlbjsKLSAgICB0cnkgewotICAgICAgdG9rZW4gPSByZXN0VG9rZW4uY2hlY2tUb2tlbih0b2tlblN0cmluZywgbnVsbCk7Ci0gICAgfSBjYXRjaCAoWHNyZkV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FeGNlcHRpb24oZXJyKTsKLSAgICB9Ci0gICAgaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4uZ2V0RGF0YSgpID09IG51bGwgfHwgdG9rZW4uZ2V0RGF0YSgpLmlzRW1wdHkoKSkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIFN0cmluZyBwYXlsb2FkOwotICAgIHRyeSB7Ci0gICAgICBwYXlsb2FkID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKHRva2VuLmdldERhdGEoKSksICJVVEYtOCIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXJyKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKGVycik7Ci0gICAgfQotCi0gICAgaW50IGNvbG9uUG9zID0gcGF5bG9hZC5pbmRleE9mKCc6Jyk7Ci0gICAgaWYgKGNvbG9uUG9zID09IC0xKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQWNjb3VudC5JZCB0b2tlblVzZXI7Ci0gICAgdHJ5IHsKLSAgICAgIHRva2VuVXNlciA9IEFjY291bnQuSWQucGFyc2UocGF5bG9hZC5zdWJzdHJpbmcoMCwgY29sb25Qb3MpKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXJyKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKGVycik7Ci0gICAgfQotCi0gICAgU3RyaW5nIHRva2VuVXJsID0gcGF5bG9hZC5zdWJzdHJpbmcoY29sb25Qb3MrMSk7Ci0KLSAgICBpZiAoIXRva2VuVXNlci5lcXVhbHModXNlcikgfHwgIXRva2VuVXJsLmVxdWFscyh1cmwpKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Ub2tlblZlcmlmaWVkUmVzdEFwaVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Rva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGExYjU3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Rva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZDsKLQotaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5SZXN0VG9rZW5WZXJpZmllci5JbnZhbGlkVG9rZW5FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0VOQ09ERUQgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhLRVlfTkFNRSA9ICJfYXV0aGtleSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIS0VZX0hFQURFUiA9ICJYLWF1dGhrZXkiOwotCi0gIHByaXZhdGUgZmluYWwgR3NvbiBnc29uOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyUHJvdmlkZXI7Ci0gIHByaXZhdGUgZmluYWwgUmVzdFRva2VuVmVyaWZpZXIgdmVyaWZpZXI7Ci0KLSAgQEluamVjdAotICBwcm90ZWN0ZWQgVG9rZW5WZXJpZmllZFJlc3RBcGlTZXJ2bGV0KFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyUHJvdmlkZXIsCi0gICAgICBSZXN0VG9rZW5WZXJpZmllciB2ZXJpZmllcikgewotICAgIHN1cGVyKHVzZXJQcm92aWRlcik7Ci0gICAgdGhpcy5nc29uID0gT3V0cHV0Rm9ybWF0LkpTT05fQ09NUEFDVC5uZXdHc29uKCk7Ci0gICAgdGhpcy51c2VyUHJvdmlkZXIgPSB1c2VyUHJvdmlkZXI7Ci0gICAgdGhpcy52ZXJpZmllciA9IHZlcmlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgdGhlIChwb3NzaWJseSBzdGF0ZSBjaGFuZ2luZykgcmVxdWVzdC4KLSAgICoKLSAgICogQHBhcmFtIHJlcSBpbmNvbWluZyBIVFRQIHJlcXVlc3QuCi0gICAqIEBwYXJhbSByZXMgb3V0Z29pbmcgcmVzcG9uc2UuCi0gICAqIEBwYXJhbSByZXF1ZXN0RGF0YSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXJzLgotICAgKiAgICAgICAgTnVsbCBpZiB0aGUgcmVxdWVzdCBib2R5IHdhcyBub3Qgc3VwcGxpZWQgaW4gSlNPTiBmb3JtYXQuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAotICAgICAgQE51bGxhYmxlIEpzb25PYmplY3QgcmVxdWVzdERhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIEN1cnJlbnRVc2VyIHVzZXIgPSB1c2VyUHJvdmlkZXIuZ2V0KCk7Ci0gICAgaWYgKCEodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSkgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfVU5BVVRIT1JJWkVELCAiQVBJIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVG9rZW5JbmZvIGluZm8gPSBuZXcgVG9rZW5JbmZvKCk7Ci0gICAgaW5mby5fYXV0aGtleSA9IHZlcmlmaWVyLnNpZ24oCi0gICAgICAgICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldEFjY291bnRJZCgpLAotICAgICAgICBjb21wdXRlVXJsKHJlcSkpOwotCi0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBTdHJpbmcgdHlwZTsKLSAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIHR5cGUgPSBKU09OX1RZUEU7Ci0gICAgICBidWYud3JpdGUoZ3Nvbi50b0pzb24oaW5mbykuZ2V0Qnl0ZXMoVVRGXzgpKTsKLSAgICB9IGVsc2UgewotICAgICAgdHlwZSA9IEZPUk1fRU5DT0RFRDsKLSAgICAgIGJ1Zi53cml0ZShTdHJpbmcuZm9ybWF0KCIlcz0lcyIsCi0gICAgICAgICAgQVVUSEtFWV9OQU1FLAotICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGluZm8uX2F1dGhrZXksIFVURl84KSkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLSAgICB9Ci0KLSAgICByZXMuc2V0Q29udGVudFR5cGUodHlwZSk7Ci0gICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKFVURl84KTsKLSAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQiKTsKLSAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICBDdXJyZW50VXNlciB1c2VyID0gdXNlclByb3ZpZGVyLmdldCgpOwotICAgIGlmICghKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikpIHsKLSAgICAgIHNlbmRFcnJvcihyZXMsIFNDX1VOQVVUSE9SSVpFRCwgIkFQSSByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFBhcnNlZEJvZHkgYm9keTsKLSAgICBpZiAoSlNPTl9UWVBFLmVxdWFscyhyZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKLSAgICAgIGJvZHkgPSBwYXJzZUpzb24ocmVxLCByZXMpOwotICAgIH0gZWxzZSBpZiAoRk9STV9FTkNPREVELmVxdWFscyhyZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKLSAgICAgIGJvZHkgPSBwYXJzZUZvcm0ocmVxLCByZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZW5kRXJyb3IocmVzLCBTQ19CQURfUkVRVUVTVCwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAiRXhwZWN0ZWQgQ29udGVudC1UeXBlOiAlcyBvciAlcyIsCi0gICAgICAgICAgSlNPTl9UWVBFLCBGT1JNX0VOQ09ERUQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYm9keSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShib2R5Ll9hdXRoa2V5KSkgewotICAgICAgU3RyaW5nIGggPSByZXEuZ2V0SGVhZGVyKEFVVEhLRVlfSEVBREVSKTsKLSAgICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaCkpIHsKLSAgICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAiRXhwZWN0ZWQgJXMgaW4gcmVxdWVzdCBib2R5IG9yICVzIGluIEhUVFAgaGVhZGVycyIsCi0gICAgICAgICAgICBBVVRIS0VZX05BTUUsIEFVVEhLRVlfSEVBREVSKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJvZHkuX2F1dGhrZXkgPSBVUkxEZWNvZGVyLmRlY29kZShoLCBVVEZfOCk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHZlcmlmaWVyLnZlcmlmeSgKLSAgICAgICAgICAoKElkZW50aWZpZWRVc2VyKSB1c2VyKS5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBjb21wdXRlVXJsKHJlcSksCi0gICAgICAgICAgYm9keS5fYXV0aGtleSk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFRva2VuRXhjZXB0aW9uIGVycikgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsCi0gICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBvciBleHBpcmVkICVzIiwgQVVUSEtFWV9OQU1FKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZG9SZXF1ZXN0KGJvZHkucmVxLCByZXMsIGJvZHkuanNvbik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBQYXJzZWRCb2R5IHBhcnNlSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIEpzb25FbGVtZW50IGVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlcS5nZXRSZWFkZXIoKSk7Ci0gICAgICBpZiAoIWVsZW1lbnQuaXNKc29uT2JqZWN0KCkpIHsKLSAgICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsICJFeHBlY3RlZCBKU09OIG9iamVjdCBpbiByZXF1ZXN0IGJvZHkiKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIFBhcnNlZEJvZHkgYm9keSA9IG5ldyBQYXJzZWRCb2R5KCk7Ci0gICAgICBib2R5LnJlcSA9IHJlcTsKLSAgICAgIGJvZHkuanNvbiA9IChKc29uT2JqZWN0KSBlbGVtZW50OwotICAgICAgSnNvbkVsZW1lbnQgYXV0aEtleSA9IGJvZHkuanNvbi5yZW1vdmUoQVVUSEtFWV9OQU1FKTsKLSAgICAgIGlmIChhdXRoS2V5ICE9IG51bGwKLSAgICAgICAgICAmJiBhdXRoS2V5LmlzSnNvblByaW1pdGl2ZSgpCi0gICAgICAgICAgJiYgYXV0aEtleS5nZXRBc0pzb25QcmltaXRpdmUoKS5pc1N0cmluZygpKSB7Ci0gICAgICAgIGJvZHkuX2F1dGhrZXkgPSBhdXRoS2V5LmdldEFzU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYm9keTsKLSAgICB9IGNhdGNoIChKc29uUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsICJJbnZhbGlkIEpTT04gb2JqZWN0IGluIHJlcXVlc3QgYm9keSIpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUGFyc2VkQm9keSBwYXJzZUZvcm0oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFBhcnNlZEJvZHkgYm9keSA9IG5ldyBQYXJzZWRCb2R5KCk7Ci0gICAgYm9keS5yZXEgPSBuZXcgV3JhcHBlZFJlcXVlc3QocmVxKTsKLSAgICBib2R5Ll9hdXRoa2V5ID0gcmVxLmdldFBhcmFtZXRlcihBVVRIS0VZX05BTUUpOwotICAgIHJldHVybiBib2R5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIFN0cmluZ0J1ZmZlciB1cmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpOwotICAgIFN0cmluZyBxcyA9IHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHFzKSkgewotICAgICAgdXJsLmFwcGVuZCgnPycpLmFwcGVuZChxcyk7Ci0gICAgfQotICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFRva2VuSW5mbyB7Ci0gICAgU3RyaW5nIF9hdXRoa2V5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyc2VkQm9keSB7Ci0gICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKLSAgICBTdHJpbmcgX2F1dGhrZXk7Ci0gICAgSnNvbk9iamVjdCBqc29uOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHBlZFJlcXVlc3QgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlcnM7Ci0KLSAgICBXcmFwcGVkUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgICBzdXBlcihyZXEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAoQVVUSEtFWV9OQU1FLmVxdWFscyhuYW1lKSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgewotICAgICAgaWYgKEFVVEhLRVlfTkFNRS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7Ci0gICAgICBNYXAgbSA9IHBhcmFtZXRlcnM7Ci0gICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgIG0gPSBzdXBlci5nZXRQYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgaWYgKG0uY29udGFpbnNLZXkoQVVUSEtFWV9OQU1FKSkgewotICAgICAgICAgIG0gPSBNYXBzLm5ld0hhc2hNYXAobSk7Ci0gICAgICAgICAgbS5yZW1vdmUoQVVUSEtFWV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbWV0ZXJzID0gbTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgewotICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5hc0VudW1lcmF0aW9uKGdldFBhcmFtZXRlck1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCkpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9VcmxNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCmluZGV4IGE3ZmRlOWIuLmI5M2RmNDMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCkBAIC0yNCwxMCArMjQsMTEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXcuU3NoSW5mb1NlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmF3LlN0YXRpY1NlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmF3LlRvb2xTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50LkFjY291bnRDYXBhYmlsaXRpZXNTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50LkFjY291bnRzUmVzdEFwaVNlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZS5DaGFuZ2VzUmVzdEFwaVNlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZS5EZXByZWNhdGVkQ2hhbmdlUXVlcnlTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2UuTGlzdENoYW5nZXNTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0Lkxpc3RQcm9qZWN0c1NlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmdyb3VwLkdyb3Vwc1Jlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0LlByb2plY3RzUmVzdEFwaVNlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKQEAgLTM5LDYgKzQwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlNlcnZsZXRNb2R1bGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtNTcsOSArNTksMTEgQEAKICAgfQogCiAgIHByaXZhdGUgZmluYWwgVXJsQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zOwogCi0gIFVybE1vZHVsZShVcmxDb25maWcgY2ZnKSB7CisgIFVybE1vZHVsZShVcmxDb25maWcgY2ZnLCBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zKSB7CiAgICAgdGhpcy5jZmcgPSBjZmc7CisgICAgdGhpcy51aU9wdGlvbnMgPSB1aU9wdGlvbnM7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY3LDkgKzcxLDExIEBACiAgICAgZmlsdGVyKCIvKiIpLnRocm91Z2goS2V5LmdldChDYWNoZUNvbnRyb2xGaWx0ZXIuY2xhc3MpKTsKICAgICBiaW5kKEtleS5nZXQoQ2FjaGVDb250cm9sRmlsdGVyLmNsYXNzKSkuaW4oU0lOR0xFVE9OKTsKIAotICAgIHNlcnZlKCIvIikud2l0aChIb3N0UGFnZVNlcnZsZXQuY2xhc3MpOwotICAgIHNlcnZlKCIvR2Vycml0Iikud2l0aChMZWdhY3lHZXJyaXRTZXJ2bGV0LmNsYXNzKTsKLSAgICBzZXJ2ZSgiL0dlcnJpdC8qIikud2l0aChsZWdhY3lHZXJyaXRTY3JlZW4oKSk7CisgICAgaWYgKHVpT3B0aW9ucy5lbmFibGVEZWZhdWx0VWkoKSkgeworICAgICAgc2VydmUoIi8iKS53aXRoKEhvc3RQYWdlU2VydmxldC5jbGFzcyk7CisgICAgICBzZXJ2ZSgiL0dlcnJpdCIpLndpdGgoTGVnYWN5R2Vycml0U2VydmxldC5jbGFzcyk7CisgICAgICBzZXJ2ZSgiL0dlcnJpdC8qIikud2l0aChsZWdhY3lHZXJyaXRTY3JlZW4oKSk7CisgICAgfQogICAgIHNlcnZlKCIvY2F0LyoiKS53aXRoKENhdFNlcnZsZXQuY2xhc3MpOwogICAgIHNlcnZlKCIvbG9nb3V0Iikud2l0aChIdHRwTG9nb3V0U2VydmxldC5jbGFzcyk7CiAgICAgc2VydmUoIi9zaWdub3V0Iikud2l0aChIdHRwTG9nb3V0U2VydmxldC5jbGFzcyk7CkBAIC05NCw5ICsxMDAsMTAgQEAKICAgICBzZXJ2ZVJlZ2V4KCJeL3IvKC4rKS8/JCIpLndpdGgoRGlyZWN0Q2hhbmdlQnlDb21taXQuY2xhc3MpOwogCiAgICAgZmlsdGVyKCIvYS8qIikudGhyb3VnaChSZXF1aXJlSWRlbnRpZmllZFVzZXJGaWx0ZXIuY2xhc3MpOwotICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzJCIpLndpdGgoQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQuY2xhc3MpOwotICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2NoYW5nZXMvJCIpLndpdGgoTGlzdENoYW5nZXNTZXJ2bGV0LmNsYXNzKTsKLSAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9wcm9qZWN0cy8oLiopPyQiKS53aXRoKExpc3RQcm9qZWN0c1NlcnZsZXQuY2xhc3MpOworICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2FjY291bnRzLyguKikkIikud2l0aChBY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKKyAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9jaGFuZ2VzLyguKikkIikud2l0aChDaGFuZ2VzUmVzdEFwaVNlcnZsZXQuY2xhc3MpOworICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2dyb3Vwcy8oLiopPyQiKS53aXRoKEdyb3Vwc1Jlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKKyAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9wcm9qZWN0cy8oLiopPyQiKS53aXRoKFByb2plY3RzUmVzdEFwaVNlcnZsZXQuY2xhc3MpOwogCiAgICAgaWYgKGNmZy5kZXByZWNhdGVkUXVlcnkpIHsKICAgICAgIHNlcnZlKCIvcXVlcnkiKS53aXRoKERlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuY2xhc3MpOwpAQCAtMTQ4LDcgKzE1NSwxMSBAQAogICAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBDaGFuZ2UuSWQgaWQgPSBDaGFuZ2UuSWQucGFyc2UocmVxLmdldFBhdGhJbmZvKCkpOworICAgICAgICAgIFN0cmluZyBpZFN0cmluZyA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgICAgICAgIGlmIChpZFN0cmluZy5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBpZFN0cmluZyA9IGlkU3RyaW5nLnN1YnN0cmluZygwLCBpZFN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBDaGFuZ2UuSWQgaWQgPSBDaGFuZ2UuSWQucGFyc2UoaWRTdHJpbmcpOwogICAgICAgICAgIHRvR2Vycml0KFBhZ2VMaW5rcy50b0NoYW5nZShpZCksIHJlcSwgcnNwKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGVycikgewogICAgICAgICAgIHJzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwpAQCAtMTczLDggKzE4NCw5IEBACiAgICAgICAgIHdoaWxlIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuZ2l0IikpIHsKLSAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDQpOworICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7CisgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIC8vCisgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkgLSBDb25zdGFudHMuRE9UX0dJVF9FWFQubGVuZ3RoKCkpOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQppbmRleCAxYTQ4YmI1Li5mN2JhNmRmIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQpAQCAtMTQsMTEgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMucmVnaXN0ZXJJblBhcmVudEluamVjdG9yczsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdlcnJpdENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZS5CZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aS5XZWJVaVBsdWdpbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZS5CZWNvbWVBbnlBY2NvdW50TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyLkh0dHBBdXRoTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyLkh0dHBzQ2xpZW50U3NsQ2VydE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXAuTGRhcEF1dGhNb2R1bGU7CkBAIC0yNyw4ICsyOSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ21kTGluZVBhcnNlck1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVtb3RlUGVlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DaGFuZ2VVc2VyTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DbGVhclBhc3N3b3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkdlbmVyYXRlUGFzc3dvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0UmVxdWVzdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29udGFjdC5Db250YWN0U3RvcmU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbnRhY3QuQ29udGFjdFN0b3JlUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Bc3luY1JlY2VpdmVDb21taXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLkd1aWNlUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwpAQCAtNDQsNyArNDUsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlJlcXVlc3RTY29wZWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3Quc2VydmxldC5TZXJ2bGV0TW9kdWxlOwogCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIApAQCAtNTUsMTUgKzU1LDE4IEBACiAgIHByaXZhdGUgZmluYWwgVXJsTW9kdWxlLlVybENvbmZpZyB1cmxDb25maWc7CiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB3YW50U1NMOwogICBwcml2YXRlIGZpbmFsIEdpdFdlYkNvbmZpZyBnaXRXZWJDb25maWc7CisgIHByaXZhdGUgZmluYWwgR2Vycml0VWlPcHRpb25zIHVpT3B0aW9uczsKIAogICBASW5qZWN0CiAgIFdlYk1vZHVsZShmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcsCiAgICAgICBmaW5hbCBVcmxNb2R1bGUuVXJsQ29uZmlnIHVybENvbmZpZywKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxVcmwsCisgICAgICBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zLAogICAgICAgZmluYWwgSW5qZWN0b3IgY3JlYXRpbmdJbmplY3RvcikgewogICAgIHRoaXMuYXV0aENvbmZpZyA9IGF1dGhDb25maWc7CiAgICAgdGhpcy51cmxDb25maWcgPSB1cmxDb25maWc7CiAgICAgdGhpcy53YW50U1NMID0gY2Fub25pY2FsVXJsICE9IG51bGwgJiYgY2Fub25pY2FsVXJsLnN0YXJ0c1dpdGgoImh0dHBzOiIpOworICAgIHRoaXMudWlPcHRpb25zID0gdWlPcHRpb25zOwogCiAgICAgdGhpcy5naXRXZWJDb25maWcgPQogICAgICAgICBjcmVhdGluZ0luamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobmV3IEFic3RyYWN0TW9kdWxlKCkgewpAQCAtOTksMTIgKzEwMiw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgaW5zdGFsbChuZXcgU2VydmxldE1vZHVsZSgpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICAgICAgICAgIHNlcnZlKCIvYmVjb21lIikud2l0aChCZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0LmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBpbnN0YWxsKG5ldyBCZWNvbWVBbnlBY2NvdW50TW9kdWxlKCkpOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBPUEVOSUQ6CkBAIC0xMTYsNyArMTE0LDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgbG9naW5UeXBlOiAiICsgYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKTsKICAgICB9CiAKLSAgICBpbnN0YWxsKG5ldyBVcmxNb2R1bGUodXJsQ29uZmlnKSk7CisgICAgaW5zdGFsbChuZXcgVXJsTW9kdWxlKHVybENvbmZpZywgdWlPcHRpb25zKSk7CiAgICAgaW5zdGFsbChuZXcgVWlScGNNb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgR2Vycml0UmVxdWVzdE1vZHVsZSgpKTsKICAgICBpbnN0YWxsKG5ldyBHaXRPdmVySHR0cFNlcnZsZXQuTW9kdWxlKCkpOwpAQCAtMTMwLDExICsxMjgsMTAgQEAKICAgICAgICAgU0lOR0xFVE9OKTsKICAgICBiaW5kKEdlcnJpdENvbmZpZ1Byb3ZpZGVyLmNsYXNzKTsKICAgICBiaW5kKEdlcnJpdENvbmZpZy5jbGFzcykudG9Qcm92aWRlcihHZXJyaXRDb25maWdQcm92aWRlci5jbGFzcyk7CisgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgV2ViVWlQbHVnaW4uY2xhc3MpOwogCi0gICAgYmluZChBY2NvdW50TWFuYWdlci5jbGFzcyk7Ci0gICAgYmluZChDaGFuZ2VVc2VyTmFtZS5DdXJyZW50VXNlci5jbGFzcyk7Ci0gICAgZmFjdG9yeShDaGFuZ2VVc2VyTmFtZS5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KENsZWFyUGFzc3dvcmQuRmFjdG9yeS5jbGFzcyk7CisgICAgaW5zdGFsbChuZXcgQXN5bmNSZWNlaXZlQ29tbWl0cy5Nb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgQ21kTGluZVBhcnNlck1vZHVsZSgpKTsKICAgICBmYWN0b3J5KEdlbmVyYXRlUGFzc3dvcmQuRmFjdG9yeS5jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YQppbmRleCA0NDkyMGE0OC4uMzM0OWNjMSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU2Vzc2lvbi5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YQpAQCAtMTYsMjcgKzE2LDIzIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhNZXRob2Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlc3VsdDsKIAogcHVibGljIGludGVyZmFjZSBXZWJTZXNzaW9uIHsKLSAgcHVibGljIEF1dGhNZXRob2QgZ2V0QXV0aE1ldGhvZCgpOwotCiAgIHB1YmxpYyBib29sZWFuIGlzU2lnbmVkSW4oKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNUb2tlblZhbGlkKFN0cmluZyBpbnB1dFRva2VuKTsKLQorICBwdWJsaWMgU3RyaW5nIGdldFhHZXJyaXRBdXRoKCk7CisgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYR2Vycml0QXV0aChTdHJpbmcga2V5SW4pOwogICBwdWJsaWMgQWNjb3VudEV4dGVybmFsSWQuS2V5IGdldExhc3RMb2dpbkV4dGVybmFsSWQoKTsKLQogICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKTsKLQotICBwdWJsaWMgdm9pZCBsb2dpbihBdXRoUmVzdWx0IHJlcywgQXV0aE1ldGhvZCBtZXRoLCBib29sZWFuIHJlbWVtYmVyTWUpOworICBwdWJsaWMgdm9pZCBsb2dpbihBdXRoUmVzdWx0IHJlcywgYm9vbGVhbiByZW1lbWJlck1lKTsKIAogICAvKiogU2V0IHRoZSB1c2VyIGFjY291bnQgZm9yIHRoaXMgY3VycmVudCByZXF1ZXN0IG9ubHkuICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZXJBY2NvdW50SWQoQWNjb3VudC5JZCBpZCwgQXV0aE1ldGhvZCBtZXRob2QpOworICBwdWJsaWMgdm9pZCBzZXRVc2VyQWNjb3VudElkKEFjY291bnQuSWQgaWQpOworICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoIHBhdGgpOworICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aCBwYXRoLCBib29sZWFuIG9rKTsKIAogICBwdWJsaWMgdm9pZCBsb2dvdXQoKTsKKyAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb25NYW5hZ2VyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJTZXNzaW9uTWFuYWdlci5qYXZhCmluZGV4IDRiNGVkZjQuLmE1MzM4ZjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb25NYW5hZ2VyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU2Vzc2lvbk1hbmFnZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5IT1VSUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSU5VVEVTOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CkBAIC0zNiw2ICszNyw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lZDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQ3LDYgKzUwLDcgQEAKIAogQFNpbmdsZXRvbgogY2xhc3MgV2ViU2Vzc2lvbk1hbmFnZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV2ViU2Vzc2lvbk1hbmFnZXIuY2xhc3MpOwogICBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX05BTUUgPSAid2ViX3Nlc3Npb25zIjsKIAogICBzdGF0aWMgbG9uZyBub3coKSB7CkBAIC02MywxMiArNjcsMjIgQEAKICAgICBwcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogICAgIHNlbGYgPSBjYWNoZTsKIAotICAgIHNlc3Npb25NYXhBZ2VNaWxsaXMgPSBNSU5VVEVTLnRvTWlsbGlzKENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLAorICAgIHNlc3Npb25NYXhBZ2VNaWxsaXMgPSBTRUNPTkRTLnRvTWlsbGlzKENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLAogICAgICAgICAiY2FjaGUiLCBDQUNIRV9OQU1FLCAibWF4QWdlIiwKLSAgICAgICAgTUFYX0FHRV9NSU5VVEVTLCBNSU5VVEVTKSk7CisgICAgICAgIFNFQ09ORFMuY29udmVydChNQVhfQUdFX01JTlVURVMsIE1JTlVURVMpLCBTRUNPTkRTKSk7CisgICAgaWYgKHNlc3Npb25NYXhBZ2VNaWxsaXMgPCBNSU5VVEVTLnRvTWlsbGlzKDUpKSB7CisgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJjYWNoZS4lcy5tYXhBZ2UgaXMgc2V0IHRvICVkIG1pbGxpc2Vjb25kczsiICsKKyAgICAgICAgICAiIGl0IHNob3VsZCBiZSBhdCBsZWFzdCA1IG1pbnV0ZXMuIiwKKyAgICAgICAgICBDQUNIRV9OQU1FLCBzZXNzaW9uTWF4QWdlTWlsbGlzKSk7CisgICAgfQogICB9CiAKICAgS2V5IGNyZWF0ZUtleShmaW5hbCBBY2NvdW50LklkIHdobykgeworICAgIHJldHVybiBuZXcgS2V5KG5ld1VuaXF1ZVRva2VuKHdobykpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbmV3VW5pcXVlVG9rZW4oZmluYWwgQWNjb3VudC5JZCB3aG8pIHsKICAgICB0cnkgewogICAgICAgZmluYWwgaW50IG5vbmNlTGVuID0gMjA7CiAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmOwpAQCAtODAsNyArOTQsNyBAQAogICAgICAgd3JpdGVWYXJJbnQzMihidWYsIHdoby5nZXQoKSk7CiAgICAgICB3cml0ZUJ5dGVzKGJ1Ziwgcm5kKTsKIAotICAgICAgcmV0dXJuIG5ldyBLZXkoQ29va2llQmFzZTY0LmVuY29kZShidWYudG9CeXRlQXJyYXkoKSkpOworICAgICAgcmV0dXJuIENvb2tpZUJhc2U2NC5lbmNvZGUoYnVmLnRvQnl0ZUFycmF5KCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgcHJvZHVjZSBuZXcgYWNjb3VudCBjb29raWUiLCBlKTsKICAgICB9CkBAIC05MCwxMyArMTA0LDExIEBACiAgICAgZmluYWwgQWNjb3VudC5JZCB3aG8gPSB2YWwuZ2V0QWNjb3VudElkKCk7CiAgICAgZmluYWwgYm9vbGVhbiByZW1lbWJlciA9IHZhbC5pc1BlcnNpc3RlbnRDb29raWUoKTsKICAgICBmaW5hbCBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgbGFzdExvZ2luID0gdmFsLmdldEV4dGVybmFsSWQoKTsKLSAgICBmaW5hbCBTdHJpbmcgeHNyZlRva2VuID0gdmFsLmdldFhzcmZUb2tlbigpOwotCi0gICAgcmV0dXJuIGNyZWF0ZVZhbChrZXksIHdobywgcmVtZW1iZXIsIGxhc3RMb2dpbiwgeHNyZlRva2VuKTsKKyAgICByZXR1cm4gY3JlYXRlVmFsKGtleSwgd2hvLCByZW1lbWJlciwgbGFzdExvZ2luLCB2YWwuc2Vzc2lvbklkLCB2YWwuYXV0aCk7CiAgIH0KIAogICBWYWwgY3JlYXRlVmFsKGZpbmFsIEtleSBrZXksIGZpbmFsIEFjY291bnQuSWQgd2hvLCBmaW5hbCBib29sZWFuIHJlbWVtYmVyLAotICAgICAgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGxhc3RMb2dpbiwgU3RyaW5nIHhzcmZUb2tlbikgeworICAgICAgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGxhc3RMb2dpbiwgU3RyaW5nIHNpZCwgU3RyaW5nIGF1dGgpIHsKICAgICAvLyBSZWZyZXNoIHRoZSBjb29raWUgZXZlcnkgaG91ciBvciB3aGVuIGl0IGlzIGhhbGYtZXhwaXJlZC4KICAgICAvLyBUaGlzIHJlZHVjZXMgdGhlIG9kZHMgdGhhdCB0aGUgdXNlciBzZXNzaW9uIHdpbGwgYmUga2lja2VkCiAgICAgLy8gZWFybHkgYnV0IGFsc28gYXZvaWRzIHVzIG5lZWRpbmcgdG8gcmVmcmVzaCB0aGUgY29va2llIG9uCkBAIC0xMDgsMTggKzEyMCwxNCBAQAogICAgIGZpbmFsIGxvbmcgbm93ID0gbm93KCk7CiAgICAgZmluYWwgbG9uZyByZWZyZXNoQ29va2llQXQgPSBub3cgKyByZWZyZXNoOwogICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0ID0gbm93ICsgc2Vzc2lvbk1heEFnZU1pbGxpczsKLQotICAgIGlmICh4c3JmVG9rZW4gPT0gbnVsbCkgewotICAgICAgLy8gSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSB0b2tlbiBmb3IgdGhpcyBzZXNzaW9uLCBlc3RhYmxpc2ggb25lLgotICAgICAgLy8KLSAgICAgIGZpbmFsIGludCBub25jZUxlbiA9IDIwOwotICAgICAgZmluYWwgYnl0ZVtdIHJuZCA9IG5ldyBieXRlW25vbmNlTGVuXTsKLSAgICAgIHBybmcubmV4dEJ5dGVzKHJuZCk7Ci0gICAgICB4c3JmVG9rZW4gPSBDb29raWVCYXNlNjQuZW5jb2RlKHJuZCk7CisgICAgaWYgKHNpZCA9PSBudWxsKSB7CisgICAgICBzaWQgPSBuZXdVbmlxdWVUb2tlbih3aG8pOworICAgIH0KKyAgICBpZiAoYXV0aCA9PSBudWxsKSB7CisgICAgICBhdXRoID0gbmV3VW5pcXVlVG9rZW4od2hvKTsKICAgICB9CiAKLSAgICBWYWwgdmFsID0gbmV3IFZhbCh3aG8sIHJlZnJlc2hDb29raWVBdCwgcmVtZW1iZXIsCi0gICAgICAgIGxhc3RMb2dpbiwgeHNyZlRva2VuLCBleHBpcmVzQXQpOworICAgIFZhbCB2YWwgPSBuZXcgVmFsKHdobywgcmVmcmVzaENvb2tpZUF0LCByZW1lbWJlciwgbGFzdExvZ2luLCBleHBpcmVzQXQsIHNpZCwgYXV0aCk7CiAgICAgc2VsZi5wdXQoa2V5LnRva2VuLCB2YWwpOwogICAgIHJldHVybiB2YWw7CiAgIH0KQEAgLTE4MiwxOSArMTkwLDIwIEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyByZWZyZXNoQ29va2llQXQ7CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBwZXJzaXN0ZW50Q29va2llOwogICAgIHByaXZhdGUgdHJhbnNpZW50IEFjY291bnRFeHRlcm5hbElkLktleSBleHRlcm5hbElkOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyB4c3JmVG9rZW47CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBleHBpcmVzQXQ7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHNlc3Npb25JZDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgYXV0aDsKIAogICAgIFZhbChmaW5hbCBBY2NvdW50LklkIGFjY291bnRJZCwgZmluYWwgbG9uZyByZWZyZXNoQ29va2llQXQsCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVudENvb2tpZSwgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGV4dGVybmFsSWQsCi0gICAgICAgIGZpbmFsIFN0cmluZyB4c3JmVG9rZW4sCi0gICAgICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0KSB7CisgICAgICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgYXV0aCkgewogICAgICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50SWQ7CiAgICAgICB0aGlzLnJlZnJlc2hDb29raWVBdCA9IHJlZnJlc2hDb29raWVBdDsKICAgICAgIHRoaXMucGVyc2lzdGVudENvb2tpZSA9IHBlcnNpc3RlbnRDb29raWU7CiAgICAgICB0aGlzLmV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotICAgICAgdGhpcy54c3JmVG9rZW4gPSB4c3JmVG9rZW47CiAgICAgICB0aGlzLmV4cGlyZXNBdCA9IGV4cGlyZXNBdDsKKyAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgdGhpcy5hdXRoID0gYXV0aDsKICAgICB9CiAKICAgICBBY2NvdW50LklkIGdldEFjY291bnRJZCgpIHsKQEAgLTIwNSw2ICsyMTQsMTQgQEAKICAgICAgIHJldHVybiBleHRlcm5hbElkOwogICAgIH0KIAorICAgIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICByZXR1cm4gc2Vzc2lvbklkOworICAgIH0KKworICAgIFN0cmluZyBnZXRBdXRoKCkgeworICAgICAgcmV0dXJuIGF1dGg7CisgICAgfQorCiAgICAgYm9vbGVhbiBuZWVkc0Nvb2tpZVJlZnJlc2goKSB7CiAgICAgICByZXR1cm4gcmVmcmVzaENvb2tpZUF0IDw9IG5vdygpOwogICAgIH0KQEAgLTIxMywxMCArMjMwLDYgQEAKICAgICAgIHJldHVybiBwZXJzaXN0ZW50Q29va2llOwogICAgIH0KIAotICAgIFN0cmluZyBnZXRYc3JmVG9rZW4oKSB7Ci0gICAgICByZXR1cm4geHNyZlRva2VuOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChmaW5hbCBPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDEpOwogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIGFjY291bnRJZC5nZXQoKSk7CkBAIC0yMzIsMTIgKzI0NSwxOSBAQAogICAgICAgICB3cml0ZVN0cmluZyhvdXQsIGV4dGVybmFsSWQuZ2V0KCkpOwogICAgICAgfQogCi0gICAgICB3cml0ZVZhckludDMyKG91dCwgNSk7Ci0gICAgICB3cml0ZVN0cmluZyhvdXQsIHhzcmZUb2tlbik7CisgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDUpOworICAgICAgICB3cml0ZVN0cmluZyhvdXQsIHNlc3Npb25JZCk7CisgICAgICB9CiAKICAgICAgIHdyaXRlVmFySW50MzIob3V0LCA2KTsKICAgICAgIHdyaXRlRml4SW50NjQob3V0LCBleHBpcmVzQXQpOwogCisgICAgICBpZiAoYXV0aCAhPSBudWxsKSB7CisgICAgICAgIHdyaXRlVmFySW50MzIob3V0LCA3KTsKKyAgICAgICAgd3JpdGVTdHJpbmcob3V0LCBhdXRoKTsKKyAgICAgIH0KKwogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDApOwogICAgIH0KIApAQCAtMjYwLDExICsyODAsMTQgQEAKICAgICAgICAgICAgIGV4dGVybmFsSWQgPSBuZXcgQWNjb3VudEV4dGVybmFsSWQuS2V5KHJlYWRTdHJpbmcoaW4pKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHhzcmZUb2tlbiA9IHJlYWRTdHJpbmcoaW4pOworICAgICAgICAgICAgc2Vzc2lvbklkID0gcmVhZFN0cmluZyhpbik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICBleHBpcmVzQXQgPSByZWFkRml4SW50NjQoaW4pOwogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgYXV0aCA9IHJlYWRTdHJpbmcoaW4pOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5rbm93biB0YWcgZm91bmQgaW4gb2JqZWN0OiAiICsgdGFnKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU3NoR2x1ZU1vZHVsZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU3NoR2x1ZU1vZHVsZS5qYXZhCmluZGV4IDgyZTlkYTcuLmViMDY2MTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNzaEdsdWVNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJTc2hHbHVlTW9kdWxlLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hLZXlDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC0yOSwxOCArMjgsMTQgQEAKICAqLwogcHVibGljIGNsYXNzIFdlYlNzaEdsdWVNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3NoSW5mbz4gc3NoSW5mb1Byb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNzaEtleUNhY2hlPiBzc2hLZXlDYWNoZVByb3ZpZGVyOwogCiAgIEBJbmplY3QKLSAgV2ViU3NoR2x1ZU1vZHVsZShQcm92aWRlcjxTc2hJbmZvPiBzc2hJbmZvUHJvdmlkZXIsCi0gICAgICBQcm92aWRlcjxTc2hLZXlDYWNoZT4gc3NoS2V5Q2FjaGVQcm92aWRlcikgeworICBXZWJTc2hHbHVlTW9kdWxlKFByb3ZpZGVyPFNzaEluZm8+IHNzaEluZm9Qcm92aWRlcikgewogICAgIHRoaXMuc3NoSW5mb1Byb3ZpZGVyID0gc3NoSW5mb1Byb3ZpZGVyOwotICAgIHRoaXMuc3NoS2V5Q2FjaGVQcm92aWRlciA9IHNzaEtleUNhY2hlUHJvdmlkZXI7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgIGJpbmQoU3NoSW5mby5jbGFzcykudG9Qcm92aWRlcihzc2hJbmZvUHJvdmlkZXIpOwotICAgIGJpbmQoU3NoS2V5Q2FjaGUuY2xhc3MpLnRvUHJvdmlkZXIoc3NoS2V5Q2FjaGVQcm92aWRlcik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuamF2YQppbmRleCAwODIxNDk2Li4yOGUzNjFjIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2JlY29tZS9CZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldC5qYXZhCkBAIC0xNiwxNyArMTYsMjAgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQuU0NIRU1FX1VTRVJOQU1FOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQudGVtcGxhdGUuU2l0ZUhlYWRlckZvb3RlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CkBAIC01MiwyMCArNTUsMjQgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCiBAU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKK2NsYXNzIEJlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfREVWID0gQm9vbGVhbi5nZXRCb29sZWFuKCJHZXJyaXQuR3d0RGV2TW9kZSIpOwogCiAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgU2l0ZUhlYWRlckZvb3RlciBoZWFkZXJzOwogCiAgIEBJbmplY3QKICAgQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3cywKICAgICAgIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYW0sIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhbSwKKyAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LAorICAgICAgU2l0ZUhlYWRlckZvb3RlciBzaGYpIHsKICAgICB3ZWJTZXNzaW9uID0gd3M7CiAgICAgc2NoZW1hID0gc2Y7CiAgICAgYWNjb3VudE1hbmFnZXIgPSBhbTsKKyAgICBoZWFkZXJzID0gc2hmOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC03Nyw5ICs4NCw3IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAKICAgICBmaW5hbCBBdXRoUmVzdWx0IHJlczsKICAgICBpZiAoImNyZWF0ZV9hY2NvdW50Ii5lcXVhbHMocmVxLmdldFBhcmFtZXRlcigiYWN0aW9uIikpKSB7CkBAIC0xMTQsOSArMTE5LDExIEBACiAgICAgfQogCiAgICAgaWYgKHJlcyAhPSBudWxsKSB7Ci0gICAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKHJlcywgQXV0aE1ldGhvZC5CQUNLRE9PUiwgZmFsc2UpOworICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihyZXMsIGZhbHNlKTsKICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmRyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIHJkci5hcHBlbmQocmVxLmdldENvbnRleHRQYXRoKCkpOworICAgICAgcmRyLmFwcGVuZChPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKHJlcS5nZXRDb250ZXh0UGF0aCgpKSwKKyAgICAgICAgICAiLyIpKTsKICAgICAgIGlmIChJU19ERVYgJiYgcmVxLmdldFBhcmFtZXRlcigiZ3d0LmNvZGVzdnIiKSAhPSBudWxsKSB7CiAgICAgICAgIGlmIChyZHIuaW5kZXhPZigiPyIpIDwgMCkgewogICAgICAgICAgIHJkci5hcHBlbmQoIj8iKTsKQEAgLTE0NywxMiArMTU0LDEyIEBACiAKICAgcHJpdmF0ZSBieXRlW10gcHJlcGFyZUh0bWxPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CiAgICAgZmluYWwgU3RyaW5nIHBhZ2VOYW1lID0gIkJlY29tZUFueUFjY291bnQuaHRtbCI7Ci0gICAgZmluYWwgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKKyAgICBEb2N1bWVudCBkb2MgPSBoZWFkZXJzLnBhcnNlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKICAgICBpZiAoZG9jID09IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vICIgKyBwYWdlTmFtZSArICIgaW4gd2ViYXBwIik7CiAgICAgfQogICAgIGlmICghSVNfREVWKSB7Ci0gICAgICBmaW5hbCBFbGVtZW50IGRldm1vZGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImdlcnJpdF9nd3RkZXZtb2RlIik7CisgICAgICBmaW5hbCBFbGVtZW50IGRldm1vZGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImd3dGRldm1vZGUiKTsKICAgICAgIGlmIChkZXZtb2RlICE9IG51bGwpIHsKICAgICAgICAgZGV2bW9kZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZGV2bW9kZSk7CiAgICAgICB9CkBAIC0xNjYsNyArMTczLDcgQEAKICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lOwogICAgICAgICBpZiAoYS5nZXRVc2VyTmFtZSgpICE9IG51bGwpIHsKICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGEuZ2V0VXNlck5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhLmdldEZ1bGxOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0RnVsbE5hbWUoKSAhPSBudWxsICYmICFhLmdldEZ1bGxOYW1lKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgZGlzcGxheU5hbWUgPSBhLmdldEZ1bGxOYW1lKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoYS5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwpIHsKICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGEuZ2V0UHJlZmVycmVkRW1haWwoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJhNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKKworcHVibGljIGNsYXNzIEJlY29tZUFueUFjY291bnRNb2R1bGUgZXh0ZW5kcyBTZXJ2bGV0TW9kdWxlIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgeworICAgIHNlcnZlKCIvbG9naW4iLCAiL2xvZ2luLyoiKS53aXRoKEJlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aEZpbHRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cEF1dGhGaWx0ZXIuamF2YQppbmRleCBlYjhhNzZiLi5hZGNhOTVlIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aEZpbHRlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBBdXRoRmlsdGVyLmphdmEKQEAgLTE0LDE0ICsxNCwyNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0cy5maXJzdE5vbk51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5ncy5lbXB0eVRvTnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZC5TQ0hFTUVfR0VSUklUOworCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHRtbERvbVV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXcuSG9zdFBhZ2VTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuUlBDU2VydmxldFV0aWxzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OworCiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTI5LDcgKzM5LDYgQEAKIGltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKIGltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOwogaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CiBpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CkBAIC00OCwxNCArNTcsMTUgQEAKICAqLwogQFNpbmdsZXRvbgogY2xhc3MgSHR0cEF1dGhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gc2Vzc2lvblByb3ZpZGVyOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzaWduSW5SYXc7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHNpZ25Jbkd6aXA7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvZ2luSGVhZGVyOwogCiAgIEBJbmplY3QKICAgSHR0cEF1dGhGaWx0ZXIoZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbiwKLSAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMud2ViU2Vzc2lvbiA9IHdlYlNlc3Npb247CisgICAgICBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5zZXNzaW9uUHJvdmlkZXIgPSB3ZWJTZXNzaW9uOwogCiAgICAgZmluYWwgU3RyaW5nIHBhZ2VOYW1lID0gIkxvZ2luUmVkaXJlY3QuaHRtbCI7CiAgICAgZmluYWwgU3RyaW5nIGRvYyA9IEh0bWxEb21VdGlsLnJlYWRGaWxlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKQEAgLTY1LDEzICs3NSwxOCBAQAogCiAgICAgc2lnbkluUmF3ID0gZG9jLmdldEJ5dGVzKEh0bWxEb21VdGlsLkVOQyk7CiAgICAgc2lnbkluR3ppcCA9IEh0bWxEb21VdGlsLmNvbXByZXNzKHNpZ25JblJhdyk7CisgICAgbG9naW5IZWFkZXIgPSBmaXJzdE5vbk51bGwoCisgICAgICAgIGVtcHR5VG9OdWxsKGF1dGhDb25maWcuZ2V0TG9naW5IdHRwSGVhZGVyKCkpLAorICAgICAgICBBVVRIT1JJWkFUSU9OKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAogICAgICAgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBGaWx0ZXJDaGFpbiBjaGFpbikKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKCF3ZWJTZXNzaW9uLmdldCgpLmlzU2lnbmVkSW4oKSkgeworICAgIGlmIChpc1Nlc3Npb25WYWxpZCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0KSkgeworICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CiAgICAgICAvLyBOb3Qgc2lnbmVkIGluIHlldC4gU2luY2UgdGhlIGJyb3dzZXIgc3RhdGUgbWlnaHQgaGF2ZSBhbiBhbmNob3IKICAgICAgIC8vIHRva2VuIHdoaWNoIHdlIHdhbnQgdG8gY2FwdHVyZSBhbmQgY2FycnkgdGhyb3VnaCB0aGUgYXV0aCBwcm9jZXNzCiAgICAgICAvLyB3ZSBzZW5kIGJhY2sgSmF2YVNjcmlwdCBub3cgdG8gY2FwdHVyZSB0aGF0LCBhbmQgZG8gdGhlIHJlYWwgd29yawpAQCAtODcsOSArMTAyLDcgQEAKICAgICAgICAgdG9zZW5kID0gc2lnbkluUmF3OwogICAgICAgfQogCi0gICAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKICAgICAgIHJzcC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhIdG1sRG9tVXRpbC5FTkMpOwogICAgICAgcnNwLnNldENvbnRlbnRMZW5ndGgodG9zZW5kLmxlbmd0aCk7CkBAIC05OSwxMyArMTEyLDcyIEBACiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gQWxyZWFkeSBzaWduZWQgaW4sIGZvcndhcmQgdGhlIHJlcXVlc3QuCi0gICAgICAvLwotICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogICAgIH0KICAgfQogCisgIHByaXZhdGUgYm9vbGVhbiBpc1Nlc3Npb25WYWxpZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgV2ViU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvblByb3ZpZGVyLmdldCgpOworICAgIGlmIChzZXNzaW9uLmlzU2lnbmVkSW4oKSkgeworICAgICAgU3RyaW5nIHVzZXIgPSBnZXRSZW1vdGVVc2VyKHJlcSk7CisgICAgICByZXR1cm4gdXNlciA9PSBudWxsIHx8IGNvcnJlY3RVc2VyKHVzZXIsIHNlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvcnJlY3RVc2VyKFN0cmluZyB1c2VyLCBXZWJTZXNzaW9uIHNlc3Npb24pIHsKKyAgICBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgaWQgPSBzZXNzaW9uLmdldExhc3RMb2dpbkV4dGVybmFsSWQoKTsKKyAgICByZXR1cm4gaWQgIT0gbnVsbAorICAgICAgICAmJiBpZC5lcXVhbHMobmV3IEFjY291bnRFeHRlcm5hbElkLktleShTQ0hFTUVfR0VSUklULCB1c2VyKSk7CisgIH0KKworICBTdHJpbmcgZ2V0UmVtb3RlVXNlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgaWYgKEFVVEhPUklaQVRJT04uZXF1YWxzKGxvZ2luSGVhZGVyKSkgeworICAgICAgU3RyaW5nIHVzZXIgPSBlbXB0eVRvTnVsbChyZXEuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKKyAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBwZXJmb3JtZWQgdGhlIGF1dGhlbnRpY2F0aW9uLCBhbmQgaGFzIHRoZSB1c2VyCisgICAgICAgIC8vIGlkZW50aXR5IGFscmVhZHkgZGVjb2RlZCBmb3IgdXMuIEhvbm9yIHRoYXQgYXMgd2UgaGF2ZSBiZWVuCisgICAgICAgIC8vIGNvbmZpZ3VyZWQgdG8gaG9ub3IgSFRUUCBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBjb250YWluZXIgZGlkbid0IGRvIHRoZSBhdXRoZW50aWNhdGlvbiB3ZSBtaWdodAorICAgICAgLy8gaGF2ZSBkb25lIGl0IGluIHRoZSBmcm9udC1lbmQgd2ViIHNlcnZlci4gVHJ5IHRvIHNwbGl0CisgICAgICAvLyB0aGUgaWRlbnRpdHkgb3V0IG9mIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBhbmQgaG9ub3IgaXQuCisgICAgICAvLworICAgICAgU3RyaW5nIGF1dGggPSBlbXB0eVRvTnVsbChyZXEuZ2V0SGVhZGVyKEFVVEhPUklaQVRJT04pKTsKKyAgICAgIGlmIChhdXRoID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgIH0gZWxzZSBpZiAoYXV0aC5zdGFydHNXaXRoKCJCYXNpYyAiKSkgeworICAgICAgICBhdXRoID0gYXV0aC5zdWJzdHJpbmcoIkJhc2ljICIubGVuZ3RoKCkpOworICAgICAgICBhdXRoID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKGF1dGgpKTsKKyAgICAgICAgZmluYWwgaW50IGMgPSBhdXRoLmluZGV4T2YoJzonKTsKKyAgICAgICAgcmV0dXJuIGMgPiAwID8gYXV0aC5zdWJzdHJpbmcoMCwgYykgOiBudWxsOworCisgICAgICB9IGVsc2UgaWYgKGF1dGguc3RhcnRzV2l0aCgiRGlnZXN0ICIpKSB7CisgICAgICAgIGludCB1ID0gYXV0aC5pbmRleE9mKCJ1c2VybmFtZT1cIiIpOworICAgICAgICBpZiAodSA8PSAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYXV0aCA9IGF1dGguc3Vic3RyaW5nKHUgKyAxMCk7CisgICAgICAgIGludCBlID0gYXV0aC5pbmRleE9mKCciJyk7CisgICAgICAgIHJldHVybiBlID4gMCA/IGF1dGguc3Vic3RyaW5nKDAsIGF1dGguaW5kZXhPZignIicpKSA6IG51bGw7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBOb25zdGFuZGFyZCBIVFRQIGhlYWRlci4gV2UgaGF2ZSBiZWVuIHRvbGQgdG8gdHJ1c3QgdGhpcworICAgICAgLy8gaGVhZGVyIGJsaW5kbHkgYXMtaXMuCisgICAgICAvLworICAgICAgcmV0dXJuIGVtcHR5VG9OdWxsKHJlcS5nZXRIZWFkZXIobG9naW5IZWFkZXIpKTsKKyAgICB9CisgIH0KKworICBTdHJpbmcgZ2V0TG9naW5IZWFkZXIoKSB7CisgICAgcmV0dXJuIGxvZ2luSGVhZGVyOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgewogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aE1vZHVsZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cEF1dGhNb2R1bGUuamF2YQppbmRleCA1NTNiMWY0Li5kYWFhN2UyIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBBdXRoTW9kdWxlLmphdmEKQEAgLTIxLDYgKzIxLDYgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgewogICAgIGZpbHRlcigiLyIpLnRocm91Z2goSHR0cEF1dGhGaWx0ZXIuY2xhc3MpOwotICAgIHNlcnZlKCIvbG9naW4vKiIpLndpdGgoSHR0cExvZ2luU2VydmxldC5jbGFzcyk7CisgICAgc2VydmUoIi9sb2dpbiIsICIvbG9naW4vKiIpLndpdGgoSHR0cExvZ2luU2VydmxldC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBMb2dpblNlcnZsZXQuamF2YQppbmRleCA5YjdlYWY1Li42OTZhNTg1IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwTG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cExvZ2luU2VydmxldC5qYXZhCkBAIC0xOSwxNiArMTksMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTU4LDIzICs1NiwyMCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBMb2dpblNlcnZsZXQuY2xhc3MpOwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OID0gIkF1dGhvcml6YXRpb24iOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9naW5IZWFkZXI7CisgIHByaXZhdGUgZmluYWwgSHR0cEF1dGhGaWx0ZXIgYXV0aEZpbHRlcjsKIAogICBASW5qZWN0Ci0gIEh0dHBMb2dpblNlcnZsZXQoZmluYWwgQXV0aENvbmZpZyBhdXRoQ29uZmlnLAotICAgICAgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbiwKKyAgSHR0cExvZ2luU2VydmxldChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAogICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKLSAgICAgIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyKSB7CisgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciwKKyAgICAgIGZpbmFsIEh0dHBBdXRoRmlsdGVyIGF1dGhGaWx0ZXIpIHsKICAgICB0aGlzLndlYlNlc3Npb24gPSB3ZWJTZXNzaW9uOwogICAgIHRoaXMudXJsUHJvdmlkZXIgPSB1cmxQcm92aWRlcjsKICAgICB0aGlzLmFjY291bnRNYW5hZ2VyID0gYWNjb3VudE1hbmFnZXI7Ci0KLSAgICBmaW5hbCBTdHJpbmcgaGRyID0gYXV0aENvbmZpZy5nZXRMb2dpbkh0dHBIZWFkZXIoKTsKLSAgICB0aGlzLmxvZ2luSGVhZGVyID0gaGRyICE9IG51bGwgJiYgIWhkci5lcXVhbHMoIiIpID8gaGRyIDogQVVUSE9SSVpBVElPTjsKKyAgICB0aGlzLmF1dGhGaWx0ZXIgPSBhdXRoRmlsdGVyOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC04NiwxOSArODEsMTYgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgcnNwLnNldEhlYWRlcigiUHJhZ21hIiwgIm5vLWNhY2hlIik7Ci0gICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7Ci0KLSAgICBmaW5hbCBTdHJpbmcgdXNlciA9IGdldFJlbW90ZVVzZXIocmVxKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CisgICAgZmluYWwgU3RyaW5nIHVzZXIgPSBhdXRoRmlsdGVyLmdldFJlbW90ZVVzZXIocmVxKTsKICAgICBpZiAodXNlciA9PSBudWxsIHx8ICIiLmVxdWFscyh1c2VyKSkgewotICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gYXV0aGVudGljYXRlIHVzZXIgYnkgIiArIGxvZ2luSGVhZGVyCisgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNlciBieSAiICsgYXV0aEZpbHRlci5nZXRMb2dpbkhlYWRlcigpCiAgICAgICAgICAgKyAiIHJlcXVlc3QgaGVhZGVyLiAgQ2hlY2sgY29udGFpbmVyIG9yIHNlcnZlciBjb25maWd1cmF0aW9uLiIpOwogCiAgICAgICBmaW5hbCBEb2N1bWVudCBkb2MgPSBIdG1sRG9tVXRpbC5wYXJzZUZpbGUoIC8vCiAgICAgICAgICAgSHR0cExvZ2luU2VydmxldC5jbGFzcywgIkNvbmZpZ3VyYXRpb25FcnJvci5odG1sIik7CiAKLSAgICAgIHJlcGxhY2UoZG9jLCAibG9naW5IZWFkZXIiLCBsb2dpbkhlYWRlcik7CisgICAgICByZXBsYWNlKGRvYywgImxvZ2luSGVhZGVyIiwgYXV0aEZpbHRlci5nZXRMb2dpbkhlYWRlcigpKTsKICAgICAgIHJlcGxhY2UoZG9jLCAiU2VydmVyTmFtZSIsIHJlcS5nZXRTZXJ2ZXJOYW1lKCkpOwogICAgICAgcmVwbGFjZShkb2MsICJTZXJ2ZXJQb3J0IiwgIjoiICsgcmVxLmdldFNlcnZlclBvcnQoKSk7CiAgICAgICByZXBsYWNlKGRvYywgIkNvbnRleHRQYXRoIiwgcmVxLmdldENvbnRleHRQYXRoKCkpOwpAQCAtMTM2LDggKzEyOCw3IEBACiAgICAgfQogICAgIHJkci5hcHBlbmQodG9rZW4pOwogCi0gICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCBBdXRoTWV0aG9kLkNPT0tJRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcGVyc2lzdGVudCBjb29raWUgKi8pOworICAgIHdlYlNlc3Npb24uZ2V0KCkubG9naW4oYXJzcCwgdHJ1ZSAvKiBwZXJzaXN0ZW50IGNvb2tpZSAqLyk7CiAgICAgcnNwLnNlbmRSZWRpcmVjdChyZHIudG9TdHJpbmcoKSk7CiAgIH0KIApAQCAtMTczLDUwICsxNjQsNCBAQAogICAgIH0KICAgICByZXR1cm4gdG9rZW47CiAgIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRSZW1vdGVVc2VyKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICBpZiAoQVVUSE9SSVpBVElPTi5lcXVhbHMobG9naW5IZWFkZXIpKSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7Ci0gICAgICBpZiAodXNlciAhPSBudWxsICYmICEiIi5lcXVhbHModXNlcikpIHsKLSAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBwZXJmb3JtZWQgdGhlIGF1dGhlbnRpY2F0aW9uLCBhbmQgaGFzIHRoZSB1c2VyCi0gICAgICAgIC8vIGlkZW50aXR5IGFscmVhZHkgZGVjb2RlZCBmb3IgdXMuIEhvbm9yIHRoYXQgYXMgd2UgaGF2ZSBiZWVuCi0gICAgICAgIC8vIGNvbmZpZ3VyZWQgdG8gaG9ub3IgSFRUUCBhdXRoZW50aWNhdGlvbi4KLSAgICAgICAgLy8KLSAgICAgICAgcmV0dXJuIHVzZXI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZSBjb250YWluZXIgZGlkbid0IGRvIHRoZSBhdXRoZW50aWNhdGlvbiB3ZSBtaWdodAotICAgICAgLy8gaGF2ZSBkb25lIGl0IGluIHRoZSBmcm9udC1lbmQgd2ViIHNlcnZlci4gVHJ5IHRvIHNwbGl0Ci0gICAgICAvLyB0aGUgaWRlbnRpdHkgb3V0IG9mIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBhbmQgaG9ub3IgaXQuCi0gICAgICAvLwotICAgICAgU3RyaW5nIGF1dGggPSByZXEuZ2V0SGVhZGVyKEFVVEhPUklaQVRJT04pOwotICAgICAgaWYgKGF1dGggPT0gbnVsbCB8fCAiIi5lcXVhbHMoYXV0aCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgIH0gZWxzZSBpZiAoYXV0aC5zdGFydHNXaXRoKCJCYXNpYyAiKSkgewotICAgICAgICBhdXRoID0gYXV0aC5zdWJzdHJpbmcoIkJhc2ljICIubGVuZ3RoKCkpOwotICAgICAgICBhdXRoID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKGF1dGgpKTsKLSAgICAgICAgZmluYWwgaW50IGMgPSBhdXRoLmluZGV4T2YoJzonKTsKLSAgICAgICAgcmV0dXJuIGMgPiAwID8gYXV0aC5zdWJzdHJpbmcoMCwgYykgOiBudWxsOwotCi0gICAgICB9IGVsc2UgaWYgKGF1dGguc3RhcnRzV2l0aCgiRGlnZXN0ICIpKSB7Ci0gICAgICAgIGZpbmFsIGludCB1ID0gYXV0aC5pbmRleE9mKCJ1c2VybmFtZT1cIiIpOwotICAgICAgICBpZiAodSA8PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgYXV0aCA9IGF1dGguc3Vic3RyaW5nKHUgKyAxMCk7Ci0gICAgICAgIGZpbmFsIGludCBlID0gYXV0aC5pbmRleE9mKCciJyk7Ci0gICAgICAgIHJldHVybiBlID4gMCA/IGF1dGguc3Vic3RyaW5nKDAsIGF1dGguaW5kZXhPZignIicpKSA6IG51bGw7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOb25zdGFuZGFyZCBIVFRQIGhlYWRlci4gV2UgaGF2ZSBiZWVuIHRvbGQgdG8gdHJ1c3QgdGhpcwotICAgICAgLy8gaGVhZGVyIGJsaW5kbHkgYXMtaXMuCi0gICAgICAvLwotICAgICAgZmluYWwgU3RyaW5nIHVzZXIgPSByZXEuZ2V0SGVhZGVyKGxvZ2luSGVhZGVyKTsKLSAgICAgIHJldHVybiB1c2VyICE9IG51bGwgJiYgISIiLmVxdWFscyh1c2VyKSA/IHVzZXIgOiBudWxsOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cHNDbGllbnRTc2xDZXJ0QXV0aEZpbHRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cHNDbGllbnRTc2xDZXJ0QXV0aEZpbHRlci5qYXZhCmluZGV4IGZmMGViMjkuLmM4OTJjOWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydEF1dGhGaWx0ZXIuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRBdXRoRmlsdGVyLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTQyLDcgKzQxLDcgQEAKIEBTaW5nbGV0b24KIGNsYXNzIEh0dHBzQ2xpZW50U3NsQ2VydEF1dGhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVHRVhfVVNFUklEID0gUGF0dGVybi5jb21waWxlKCJDTj0oW14sXSopLC4qIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUkVHRVhfVVNFUklEID0gUGF0dGVybi5jb21waWxlKCJDTj0oW14sXSopIik7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQogICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBzQ2xpZW50U3NsQ2VydEF1dGhGaWx0ZXIuY2xhc3MpOwogCkBAIC03MSw3ICs3MCw3IEBACiAgICAgU3RyaW5nIG5hbWUgPSBjZXJ0c1swXS5nZXRTdWJqZWN0RE4oKS5nZXROYW1lKCk7CiAgICAgTWF0Y2hlciBtID0gUkVHRVhfVVNFUklELm1hdGNoZXIobmFtZSk7CiAgICAgU3RyaW5nIHVzZXJOYW1lOwotICAgIGlmIChtLm1hdGNoZXMoKSkgeworICAgIGlmIChtLmZpbmQoKSkgewogICAgICAgdXNlck5hbWUgPSBtLmdyb3VwKDEpOwogICAgIH0gZWxzZSB7CiAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiQ291bGRuJ3QgZXh0cmFjdCB1c2VybmFtZSBmcm9tIHlvdXIgY2VydGlmaWNhdGUiKTsKQEAgLTg1LDcgKzg0LDcgQEAKICAgICAgIGxvZy5lcnJvcihlcnIsIGUpOwogICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXJyLCBlKTsKICAgICB9Ci0gICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCBBdXRoTWV0aG9kLkNPT0tJRSwgdHJ1ZSk7CisgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCB0cnVlKTsKICAgICBjaGFpbi5kb0ZpbHRlcihyZXEsIHJzcCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cHNDbGllbnRTc2xDZXJ0TG9naW5TZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRMb2dpblNlcnZsZXQuamF2YQppbmRleCBjNWZhMWJhLi5kOTU4NWI5IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRMb2dpblNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRMb2dpblNlcnZsZXQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKQEAgLTU1LDkgKzU2LDcgQEAKICAgICByZHIuYXBwZW5kKCcjJyk7CiAgICAgcmRyLmFwcGVuZChnZXRUb2tlbihyZXEpKTsKIAotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgcnNwLnNlbmRSZWRpcmVjdChyZHIudG9TdHJpbmcoKSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cHNDbGllbnRTc2xDZXJ0TW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRNb2R1bGUuamF2YQppbmRleCA3ZDMyYWM4Li5lZGY1MDFiIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRNb2R1bGUuamF2YQpAQCAtMjEsNiArMjEsNiBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VydmxldHMoKSB7CiAgICAgZmlsdGVyKCIvIikudGhyb3VnaChIdHRwc0NsaWVudFNzbENlcnRBdXRoRmlsdGVyLmNsYXNzKTsKLSAgICBzZXJ2ZSgiL2xvZ2luLyoiKS53aXRoKEh0dHBzQ2xpZW50U3NsQ2VydExvZ2luU2VydmxldC5jbGFzcyk7CisgICAgc2VydmUoIi9sb2dpbiIsICIvbG9naW4vKiIpLndpdGgoSHR0cHNDbGllbnRTc2xDZXJ0TG9naW5TZXJ2bGV0LmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL0xkYXBBdXRoTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcEF1dGhNb2R1bGUuamF2YQppbmRleCBjNDZlZGMzLi5lNzY2M2JiIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcEF1dGhNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcEF1dGhNb2R1bGUuamF2YQpAQCAtMTQsMjAgKzE0LDEyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5sZGFwOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLlJwY1NlcnZsZXRNb2R1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLlVpUnBjTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKIAotLyoqIFJQQyBzdXBwb3J0IHJlbGF0ZWQgdG8gdXNlcm5hbWUvcGFzc3dvcmQgTERBUCBhdXRoZW50aWNhdGlvbi4gKi8KKy8qKiBDb25maWd1cmUgdXNlcm5hbWUvcGFzc3dvcmQgTERBUCBhdXRoZW50aWNhdGlvbi4gKi8KIHB1YmxpYyBjbGFzcyBMZGFwQXV0aE1vZHVsZSBleHRlbmRzIFNlcnZsZXRNb2R1bGUgewogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VydmxldHMoKSB7Ci0gICAgc2VydmUoIi9sb2dpbi8qIikud2l0aChMb2dpblJlZGlyZWN0U2VydmxldC5jbGFzcyk7Ci0gICAgaW5zdGFsbChuZXcgUnBjU2VydmxldE1vZHVsZShVaVJwY01vZHVsZS5QUkVGSVgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VydmxldHMoKSB7Ci0gICAgICAgIHJwYyhVc2VyUGFzc0F1dGhTZXJ2aWNlSW1wbC5jbGFzcyk7Ci0gICAgICB9Ci0gICAgfSk7CisgICAgc2VydmUoIi9sb2dpbiIsICIvbG9naW4vKiIpLndpdGgoTGRhcExvZ2luU2VydmxldC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwTG9naW5TZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcExvZ2luU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWU4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcExvZ2luU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5sZGFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQudGVtcGxhdGUuU2l0ZUhlYWRlckZvb3RlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRVc2VyTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogSGFuZGxlcyB1c2VybmFtZS9wYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbiBhZ2FpbnN0IHRoZSBkaXJlY3RvcnkuICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK0BTaW5nbGV0b24KK2NsYXNzIExkYXBMb2dpblNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAuZ2V0TG9nZ2VyKExkYXBMb2dpblNlcnZsZXQuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIFNpdGVIZWFkZXJGb290ZXIgaGVhZGVyczsKKworICBASW5qZWN0CisgIExkYXBMb2dpblNlcnZsZXQoQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIsCisgICAgICBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAorICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKKyAgICAgIFNpdGVIZWFkZXJGb290ZXIgaGVhZGVycykgeworICAgIHRoaXMuYWNjb3VudE1hbmFnZXIgPSBhY2NvdW50TWFuYWdlcjsKKyAgICB0aGlzLndlYlNlc3Npb24gPSB3ZWJTZXNzaW9uOworICAgIHRoaXMudXJsUHJvdmlkZXIgPSB1cmxQcm92aWRlcjsKKyAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworCisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eSh1cmxQcm92aWRlci5nZXQoKSkpIHsKKyAgICAgIGxvZy5lcnJvcigiZ2Vycml0LmNhbm9uaWNhbFdlYlVybCBtdXN0IGJlIHNldCBpbiBnZXJyaXQuY29uZmlnIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRGb3JtKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgQE51bGxhYmxlIFN0cmluZyBlcnJvck1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHNlbGYgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOworICAgIFN0cmluZyBjYW5jZWwgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbCh1cmxQcm92aWRlci5nZXQoKSwgIi8iKTsKKyAgICBTdHJpbmcgdG9rZW4gPSBnZXRUb2tlbihyZXEpOworICAgIGlmICghdG9rZW4uZXF1YWxzKCIvIikpIHsKKyAgICAgIGNhbmNlbCArPSAiIyIgKyB0b2tlbjsKKyAgICB9CisKKyAgICBEb2N1bWVudCBkb2MgPSBoZWFkZXJzLnBhcnNlKExkYXBMb2dpblNlcnZsZXQuY2xhc3MsICJMb2dpbkZvcm0uaHRtbCIpOworICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAiaG9zdE5hbWUiKS5zZXRUZXh0Q29udGVudChyZXEuZ2V0U2VydmVyTmFtZSgpKTsKKyAgICBIdG1sRG9tVXRpbC5maW5kKGRvYywgImxvZ2luX2Zvcm0iKS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsIHNlbGYpOworICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAiY2FuY2VsX2xpbmsiKS5zZXRBdHRyaWJ1dGUoImhyZWYiLCBjYW5jZWwpOworCisgICAgRWxlbWVudCBlbXNnID0gSHRtbERvbVV0aWwuZmluZChkb2MsICJlcnJvcl9tZXNzYWdlIik7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShlcnJvck1lc3NhZ2UpKSB7CisgICAgICBlbXNnLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgZW1zZy5zZXRUZXh0Q29udGVudChlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIGJ5dGVbXSBiaW4gPSBIdG1sRG9tVXRpbC50b1VURjgoZG9jKTsKKyAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKTsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICByZXMuc2V0Q29udGVudExlbmd0aChiaW4ubGVuZ3RoKTsKKyAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgb3V0LndyaXRlKGJpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc2VuZEZvcm0ocmVxLCByZXMsIG51bGwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHVzZXJuYW1lID0gU3RyaW5ncy5udWxsVG9FbXB0eShyZXEuZ2V0UGFyYW1ldGVyKCJ1c2VybmFtZSIpKS50cmltKCk7CisgICAgU3RyaW5nIHBhc3N3b3JkID0gU3RyaW5ncy5udWxsVG9FbXB0eShyZXEuZ2V0UGFyYW1ldGVyKCJwYXNzd29yZCIpKTsKKyAgICBTdHJpbmcgcmVtZW1iZXIgPSBTdHJpbmdzLm51bGxUb0VtcHR5KHJlcS5nZXRQYXJhbWV0ZXIoInJlbWVtYmVybWUiKSk7CisgICAgaWYgKHVzZXJuYW1lLmlzRW1wdHkoKSB8fCBwYXNzd29yZC5pc0VtcHR5KCkpIHsKKyAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCAiSW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBdXRoUmVxdWVzdCBhcmVxID0gQXV0aFJlcXVlc3QuZm9yVXNlcih1c2VybmFtZSk7CisgICAgYXJlcS5zZXRQYXNzd29yZChwYXNzd29yZCk7CisKKyAgICBBdXRoUmVzdWx0IGFyZXM7CisgICAgdHJ5IHsKKyAgICAgIGFyZXMgPSBhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUoYXJlcSk7CisgICAgfSBjYXRjaCAoQWNjb3VudFVzZXJOYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoQXV0aGVudGljYXRpb25VbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgIkF1dGhlbnRpY2F0aW9uIHVuYXZhaWxhYmxlIGF0IHRoaXMgdGltZS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGNhdGNoIChBY2NvdW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5pbmZvKFN0cmluZy5mb3JtYXQoIiclcycgZmFpbGVkIHRvIHNpZ24gaW46ICVzIiwgdXNlcm5hbWUsIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgIkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuIik7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkxEQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIiwgZSk7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgIkF1dGhlbnRpY2F0aW9uIHVuYXZhaWxhYmxlIGF0IHRoaXMgdGltZS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmcgdG9rZW4gPSBnZXRUb2tlbihyZXEpOworICAgIFN0cmluZ0J1aWxkZXIgZGVzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZGVzdC5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KCkpOworICAgIGRlc3QuYXBwZW5kKCcjJyk7CisgICAgZGVzdC5hcHBlbmQodG9rZW4pOworCisgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyZXMpOworICAgIHdlYlNlc3Npb24uZ2V0KCkubG9naW4oYXJlcywgIjEiLmVxdWFscyhyZW1lbWJlcikpOworICAgIHJlcy5zZW5kUmVkaXJlY3QoZGVzdC50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUb2tlbihmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgU3RyaW5nIHRva2VuID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4uaXNFbXB0eSgpKSB7CisgICAgICB0b2tlbiA9IFBhZ2VMaW5rcy5NSU5FOworICAgIH0gZWxzZSBpZiAoIXRva2VuLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgdG9rZW4gPSAiLyIgKyB0b2tlbjsKKyAgICB9CisgICAgcmV0dXJuIHRva2VuOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTG9naW5SZWRpcmVjdFNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Mb2dpblJlZGlyZWN0U2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZlMjI3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Mb2dpblJlZGlyZWN0U2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGgubGRhcDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluTW9kZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotLyoqCi0gKiBTZXJ2bGV0IGJvdW5kIHRvIHtAY29kZSAvbG9naW4vKn0gdG8gcmVkaXJlY3QgYWZ0ZXIgdXNlci9wYXNzIHNpZ24taW4uCi0gKiA8cD4KLSAqIFRoaXMgc2VydmxldCBpcyByZXF1aXJlZCBiZWNhdXNlIHVzZXIgYXV0aGVudGljYXRpb24gaXMgZG9uZSBvdmVyIFJQQywgYnV0IGlmCi0gKiB0aGUgUlBDIGlzIHN1Y2Nlc3NmdWwgd2UgbmVlZCB0byBmb3JjZSB0aGUgaG9zdCBwYWdlIHRvIGZ1bGx5IHJlbG9hZCB0byBwaWNrCi0gKiB1cCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiwgYXMgd2UgZG9uJ3Qgc3VwcG9ydCB1cGRhdGluZyB0aGUgVUkgb24gdGhlIGZseQotICogYWZ0ZXIgYSBzaWduLWluLgotICovCi1AU2luZ2xldG9uCi1jbGFzcyBMb2dpblJlZGlyZWN0U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7Ci0KLSAgQEluamVjdAotICBMb2dpblJlZGlyZWN0U2VydmxldChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAotICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcikgewotICAgIHRoaXMud2ViU2Vzc2lvbiA9IHdlYlNlc3Npb247Ci0gICAgdGhpcy51cmxQcm92aWRlciA9IHVybFByb3ZpZGVyOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTdHJpbmcgdG9rZW47Ci0gICAgaWYgKHdlYlNlc3Npb24uZ2V0KCkuaXNTaWduZWRJbigpKSB7Ci0gICAgICB0b2tlbiA9IGdldFRva2VuKHJlcSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiU2Vzc2lvbiBjb29raWUgbm90IGF2YWlsYWJsZS4iOwotICAgICAgdG9rZW4gPSAiL1NpZ25JbkZhaWx1cmUsIiArIFNpZ25Jbk1vZGUuU0lHTl9JTiArICIsIiArIG1zZzsKLSAgICB9Ci0KLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJkciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgcmRyLmFwcGVuZCh1cmxQcm92aWRlci5nZXQoKSk7Ci0gICAgcmRyLmFwcGVuZCgnIycpOwotICAgIHJkci5hcHBlbmQodG9rZW4pOwotCi0gICAgcnNwLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOwotICAgIHJzcC5zZW5kUmVkaXJlY3QocmRyLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0VG9rZW4oZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIFN0cmluZyB0b2tlbiA9IHJlcS5nZXRQYXRoSW5mbygpOwotICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmlzRW1wdHkoKSkgewotICAgICAgdG9rZW4gPSBQYWdlTGlua3MuTUlORTsKLSAgICB9IGVsc2UgaWYgKCF0b2tlbi5zdGFydHNXaXRoKCIvIikpIHsKLSAgICAgIHRva2VuID0gIi8iICsgdG9rZW47Ci0gICAgfQotICAgIHJldHVybiB0b2tlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL1VzZXJQYXNzQXV0aFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvVXNlclBhc3NBdXRoU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4ZWNiYi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvVXNlclBhc3NBdXRoU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXA7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC51c2VycGFzcy5Mb2dpblJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC51c2VycGFzcy5Vc2VyUGFzc0F1dGhTZXJ2aWNlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFVzZXJOYW1lRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhNZXRob2Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlcXVlc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoZW50aWNhdGlvblVuYXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotY2xhc3MgVXNlclBhc3NBdXRoU2VydmljZUltcGwgaW1wbGVtZW50cyBVc2VyUGFzc0F1dGhTZXJ2aWNlIHsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uOwotICBwcml2YXRlIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIEF1dGhUeXBlIGF1dGhUeXBlOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5Ci0gICAgICAuZ2V0TG9nZ2VyKFVzZXJQYXNzQXV0aFNlcnZpY2VJbXBsLmNsYXNzKTsKLQotICBASW5qZWN0Ci0gIFVzZXJQYXNzQXV0aFNlcnZpY2VJbXBsKGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb24sCi0gICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciwgZmluYWwgQXV0aENvbmZpZyBhdXRoQ29uZmlnKSB7Ci0gICAgdGhpcy53ZWJTZXNzaW9uID0gd2ViU2Vzc2lvbjsKLSAgICB0aGlzLmFjY291bnRNYW5hZ2VyID0gYWNjb3VudE1hbmFnZXI7Ci0gICAgdGhpcy5hdXRoVHlwZSA9IGF1dGhDb25maWcuZ2V0QXV0aFR5cGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPExvZ2luUmVzdWx0PiBjYWxsYmFjaykgewotICAgIExvZ2luUmVzdWx0IHJlc3VsdCA9IG5ldyBMb2dpblJlc3VsdChhdXRoVHlwZSk7Ci0gICAgaWYgKHVzZXJuYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHVzZXJuYW1lLnRyaW0oKSkgLy8KLSAgICAgICAgfHwgcGFzc3dvcmQgPT0gbnVsbCB8fCAiIi5lcXVhbHMocGFzc3dvcmQpKSB7Ci0gICAgICByZXN1bHQuc2V0RXJyb3IoTG9naW5SZXN1bHQuRXJyb3IuSU5WQUxJRF9MT0dJTik7Ci0gICAgICBjYWxsYmFjay5vblN1Y2Nlc3MocmVzdWx0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB1c2VybmFtZSA9IHVzZXJuYW1lLnRyaW0oKTsKLQotICAgIGZpbmFsIEF1dGhSZXF1ZXN0IHJlcSA9IEF1dGhSZXF1ZXN0LmZvclVzZXIodXNlcm5hbWUpOwotICAgIHJlcS5zZXRQYXNzd29yZChwYXNzd29yZCk7Ci0KLSAgICBmaW5hbCBBdXRoUmVzdWx0IHJlczsKLSAgICB0cnkgewotICAgICAgcmVzID0gYWNjb3VudE1hbmFnZXIuYXV0aGVudGljYXRlKHJlcSk7Ci0gICAgfSBjYXRjaCAoQWNjb3VudFVzZXJOYW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGVudGVyZWQgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB3ZXJlIGNvcnJlY3QsIGJ1dCB1c2VyIG5hbWUgY291bGQgbm90IGJlCi0gICAgICAvLyBzZXQgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGFjY291bnQgYW5kIHRoaXMgaXMgd2h5IHRoZSBsb2dpbiBmYWlscywKLSAgICAgIC8vIGVycm9yIHNjcmVlbiB3aXRoIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyCi0gICAgICBjYWxsYmFjay5vbkZhaWx1cmUoZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBjYXRjaCAoQXV0aGVudGljYXRpb25VbmF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXN1bHQuc2V0RXJyb3IoTG9naW5SZXN1bHQuRXJyb3IuQVVUSEVOVElDQVRJT05fVU5BVkFJTEFCTEUpOwotICAgICAgY2FsbGJhY2sub25TdWNjZXNzKHJlc3VsdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBjYXRjaCAoQWNjb3VudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuaW5mbyhTdHJpbmcuZm9ybWF0KCInJXMnIGZhaWxlZCB0byBzaWduIGluOiAlcyIsIHVzZXJuYW1lLCBlLmdldE1lc3NhZ2UoKSkpOwotICAgICAgcmVzdWx0LnNldEVycm9yKExvZ2luUmVzdWx0LkVycm9yLklOVkFMSURfTE9HSU4pOwotICAgICAgY2FsbGJhY2sub25TdWNjZXNzKHJlc3VsdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVzdWx0LnN1Y2Nlc3MgPSB0cnVlOwotICAgIHJlc3VsdC5pc05ldyA9IHJlcy5pc05ldygpOwotICAgIHdlYlNlc3Npb24uZ2V0KCkubG9naW4ocmVzLCBBdXRoTWV0aG9kLlBBU1NXT1JELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBwZXJzaXN0ZW50IGNvb2tpZSAqLyk7Ci0gICAgY2FsbGJhY2sub25TdWNjZXNzKHJlc3VsdCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRMb2dvU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdExvZ29TZXJ2bGV0LmphdmEKaW5kZXggNWJhMWYwOS4uNDFhYTU1MiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdExvZ29TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdExvZ29TZXJ2bGV0LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuZ2l0d2ViOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuR2l0V2ViQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCkBAIC0zMywxMSArMzQsNiBAQAogQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCiBAU2luZ2xldG9uCiBjbGFzcyBHaXRMb2dvU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQUdFID0KLSAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KDUsIFRpbWVVbml0Lk1JTlVURVMpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ1RSTCA9Ci0gICAgICAicHVibGljLCBtYXgtYWdlPSIgKyAoTUFYX0FHRSAvIDEwMDBMKTsKLQogICBwcml2YXRlIGZpbmFsIGxvbmcgbW9kaWZpZWQ7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHJhdzsKIApAQCAtNjAsMTYgKzU2LDE4IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gbW9kaWZpZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmIChyYXcgIT0gbnVsbCkgewotICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgIHJzcC5zZXRDb250ZW50VHlwZSgiaW1hZ2UvcG5nIik7CiAgICAgICByc3Auc2V0Q29udGVudExlbmd0aChyYXcubGVuZ3RoKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCBDQUNIRV9DVFJMKTsKLSAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJEYXRlIiwgbm93KTsKLSAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJFeHBpcmVzIiwgbm93ICsgTUFYX0FHRSk7CiAgICAgICByc3Auc2V0RGF0ZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIsIG1vZGlmaWVkKTsKKyAgICAgIENhY2hlSGVhZGVycy5zZXRDYWNoZWFibGUocmVxLCByc3AsIDUsIFRpbWVVbml0Lk1JTlVURVMpOwogCiAgICAgICBmaW5hbCBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zID0gcnNwLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgdHJ5IHsKQEAgLTc4LDYgKzc2LDcgQEAKICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgcnNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViQ3NzU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYkNzc1NlcnZsZXQuamF2YQppbmRleCBlMzk3OTYxLi5kY2NhMTA2IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViQ3NzU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJDc3NTZXJ2bGV0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HaXRXZWJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHRtbERvbVV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuUlBDU2VydmxldFV0aWxzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CkBAIC00OSwxMCArNTAsNiBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQyA9ICJVVEYtOCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0FHRSA9Ci0gICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NUUkwgPQotICAgICAgInB1YmxpYywgbWF4LWFnZT0iICsgKE1BWF9BR0UgLyAxMDAwTCk7CiAKICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1vZGlmaWVkOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSByYXdfY3NzOwpAQCAtODksNyArODYsNiBAQAogICBwcm90ZWN0ZWQgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKHJhd19jc3MgIT0gbnVsbCkgewotICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgIHJzcC5zZXRDb250ZW50VHlwZSgidGV4dC9jc3MiKTsKICAgICAgIHJzcC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhFTkMpOwogICAgICAgZmluYWwgYnl0ZVtdIHRvU2VuZDsKQEAgLTEwMCwxMCArOTYsOCBAQAogICAgICAgICB0b1NlbmQgPSByYXdfY3NzOwogICAgICAgfQogICAgICAgcnNwLnNldENvbnRlbnRMZW5ndGgodG9TZW5kLmxlbmd0aCk7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgQ0FDSEVfQ1RSTCk7Ci0gICAgICByc3Auc2V0RGF0ZUhlYWRlcigiRGF0ZSIsIG5vdyk7Ci0gICAgICByc3Auc2V0RGF0ZUhlYWRlcigiRXhwaXJlcyIsIG5vdyArIE1BWF9BR0UpOwogICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkxhc3QtTW9kaWZpZWQiLCBtb2RpZmllZCk7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Q2FjaGVhYmxlKHJlcSwgcnNwLCA1LCBUaW1lVW5pdC5NSU5VVEVTKTsKIAogICAgICAgZmluYWwgU2VydmxldE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKTsKICAgICAgIHRyeSB7CkBAIC0xMTIsNiArMTA2LDcgQEAKICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgcnNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViSmF2YVNjcmlwdFNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJKYXZhU2NyaXB0U2VydmxldC5qYXZhCmluZGV4IDYxZjMyYWMuLmQ3MTczMmEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJKYXZhU2NyaXB0U2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJKYXZhU2NyaXB0U2VydmxldC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmdpdHdlYjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkdpdFdlYkNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtMzMsMTEgKzM0LDYgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQogQFNpbmdsZXRvbgogY2xhc3MgR2l0V2ViSmF2YVNjcmlwdFNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0FHRSA9Ci0gICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NUUkwgPQotICAgICAgInB1YmxpYywgbWF4LWFnZT0iICsgKE1BWF9BR0UgLyAxMDAwTCk7Ci0KICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1vZGlmaWVkOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSByYXc7CiAKQEAgLTY4LDEzICs2NCwxMCBAQAogICBwcm90ZWN0ZWQgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKHJhdyAhPSBudWxsKSB7Ci0gICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgICAgIHJzcC5zZXRDb250ZW50TGVuZ3RoKHJhdy5sZW5ndGgpOwotICAgICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIENBQ0hFX0NUUkwpOwotICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkRhdGUiLCBub3cpOwotICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkV4cGlyZXMiLCBub3cgKyBNQVhfQUdFKTsKICAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgbW9kaWZpZWQpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldENhY2hlYWJsZShyZXEsIHJzcCwgNSwgVGltZVVuaXQuTUlOVVRFUyk7CiAKICAgICAgIGZpbmFsIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICB0cnkgewpAQCAtODMsNiArNzYsNyBAQAogICAgICAgICBvcy5jbG9zZSgpOwogICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgICByc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViU2VydmxldC5qYXZhCmluZGV4IDZjMzdlNDMuLmJhN2E1YjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYlNlcnZsZXQuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5naXR3ZWI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HZXJyaXRDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HaXRXZWJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGF1bmNoZXIuR2Vycml0TGF1bmNoZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CkBAIC0zOSw2ICs0MCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtNTgsMTAgKzYwLDggQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zODgsMTcgKzM4OCwxNCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICB0cnkgewotICAgICAgcnNwLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgICAgcnNwLnNldEhlYWRlcigiUHJhZ21hIiwgIm5vLWNhY2hlIik7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICAgIGV4ZWMocmVxLCByc3AsIHByb2plY3QsIHJlcG8pOwogICAgIH0gZmluYWxseSB7CiAgICAgICByZXBvLmNsb3NlKCk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCi0gICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYWlyIDogcmVxLmdldFF1ZXJ5U3RyaW5nKCkuc3BsaXQoIlsmO10iKSkgewogICAgICAgZmluYWwgaW50IGVxID0gcGFpci5pbmRleE9mKCc9Jyk7CkBAIC00MDYsOCArNDAzLDggQEAKICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYWlyLnN1YnN0cmluZygwLCBlcSk7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhaXIuc3Vic3RyaW5nKGVxICsgMSk7CiAKLSAgICAgICAgbmFtZSA9IFVSTERlY29kZXIuZGVjb2RlKG5hbWUsICJVVEYtOCIpOwotICAgICAgICB2YWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKHZhbHVlLCAiVVRGLTgiKTsKKyAgICAgICAgbmFtZSA9IFVybC5kZWNvZGUobmFtZSk7CisgICAgICAgIHZhbHVlID0gVXJsLmRlY29kZSh2YWx1ZSk7CiAgICAgICAgIHBhcmFtcy5wdXQobmFtZSwgdmFsdWUpOwogICAgICAgfQogICAgIH0KQEAgLTQxOSw3ICs0MTYsOCBAQAogICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIFByb2Nlc3MgcHJvYyA9CiAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHtnaXR3ZWJDZ2kuZ2V0QWJzb2x1dGVQYXRoKCl9LAotICAgICAgICAgICAgbWFrZUVudihyZXEsIHByb2plY3QpLCByZXBvLmdldERpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIG1ha2VFbnYocmVxLCBwcm9qZWN0KSwKKyAgICAgICAgICAgIGdpdHdlYkNnaS5nZXRBYnNvbHV0ZUZpbGUoKS5nZXRQYXJlbnRGaWxlKCkpOwogCiAgICAgY29weVN0ZGVyclRvTG9nKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSk7CiAgICAgaWYgKDAgPCByZXEuZ2V0Q29udGVudExlbmd0aCgpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhCmluZGV4IDJkOTU3ZjIuLmQxYzYxN2YgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhCkBAIC0xNCwxNCArMTQsMjAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5wbHVnaW5zOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkF1dG9SZWdpc3RlclV0aWwuY2FsY3VsYXRlQmluZEFubm90YXRpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5JbnZhbGlkUGx1Z2luRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLk1vZHVsZUdlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKIAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKQEAgLTI5LDYgKzM1LDcgQEAKIGNsYXNzIEh0dHBBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IgZXh0ZW5kcyBTZXJ2bGV0TW9kdWxlCiAgICAgaW1wbGVtZW50cyBNb2R1bGVHZW5lcmF0b3IgewogICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPEh0dHBTZXJ2bGV0Pj4gc2VydmUgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxUeXBlTGl0ZXJhbDw/PiwgQ2xhc3M8Pz4+IGxpc3RlbmVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VydmxldHMoKSB7CkBAIC0zNiw2ICs0MywxNiBAQAogICAgICAgYmluZChlLmdldFZhbHVlKCkpLmluKFNjb3Blcy5TSU5HTEVUT04pOwogICAgICAgc2VydmUoZS5nZXRLZXkoKSkud2l0aChlLmdldFZhbHVlKCkpOwogICAgIH0KKyAgICBmb3IgKE1hcC5FbnRyeTxUeXBlTGl0ZXJhbDw/PiwgQ2xhc3M8Pz4+IGUgOiBsaXN0ZW5lcnMuZW50cmllcygpKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIFR5cGVMaXRlcmFsPE9iamVjdD4gdHlwZSA9IChUeXBlTGl0ZXJhbDxPYmplY3Q+KSBlLmdldEtleSgpOworCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIENsYXNzPE9iamVjdD4gaW1wbCA9IChDbGFzczxPYmplY3Q+KSBlLmdldFZhbHVlKCk7CisKKyAgICAgIEFubm90YXRpb24gbiA9IGNhbGN1bGF0ZUJpbmRBbm5vdGF0aW9uKGltcGwpOworICAgICAgYmluZCh0eXBlKS5hbm5vdGF0ZWRXaXRoKG4pLnRvKGltcGwpOworICAgIH0KICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNjMsNiArODAsMTEgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBsaXN0ZW4oVHlwZUxpdGVyYWw8Pz4gdGwsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgbGlzdGVuZXJzLnB1dCh0bCwgY2xhenopOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBNb2R1bGUgY3JlYXRlKCkgdGhyb3dzIEludmFsaWRQbHVnaW5FeGNlcHRpb24gewogICAgIHJldHVybiB0aGlzOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5Nb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cFBsdWdpbk1vZHVsZS5qYXZhCmluZGV4IDJiY2FhMzAuLjVkYzdlMmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cFBsdWdpbk1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cFBsdWdpbk1vZHVsZS5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKICAgICBiaW5kKEh0dHBQbHVnaW5TZXJ2bGV0LmNsYXNzKTsKLSAgICBzZXJ2ZSgiL3BsdWdpbnMvKiIpLndpdGgoSHR0cFBsdWdpblNlcnZsZXQuY2xhc3MpOwogICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP3BsdWdpbnMvKC4qKT8kIikud2l0aChIdHRwUGx1Z2luU2VydmxldC5jbGFzcyk7CiAKICAgICBiaW5kKFN0YXJ0UGx1Z2luTGlzdGVuZXIuY2xhc3MpCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5TZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5TZXJ2bGV0LmphdmEKaW5kZXggZTczNzcwMC4uNTQ5YzIzOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9IdHRwUGx1Z2luU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cFBsdWdpblNlcnZsZXQuamF2YQpAQCAtMTQsMjAgKzE0LDI0IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucGx1Z2luczsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUmVnaXN0cmF0aW9uSGFuZGxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wbHVnaW4uTGlzdFBsdWdpbnNTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGkuUmVzdEFwaVNlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk1pbWVVdGlsRmlsZVR5cGVSZWdpc3RyeTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZG9jdW1lbnRhdGlvbi5NYXJrZG93bkZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luc0NvbGxlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUmVsb2FkUGx1Z2luTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuU3RhcnRQbHVnaW5MaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CkBAIC04MCw3ICs4NCw3IEBACiAgIHByaXZhdGUgZmluYWwgQ2FjaGU8UmVzb3VyY2VLZXksIFJlc291cmNlPiByZXNvdXJjZUNhY2hlOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBzc2hIb3N0OwogICBwcml2YXRlIGZpbmFsIGludCBzc2hQb3J0OwotICBwcml2YXRlIGZpbmFsIExpc3RQbHVnaW5zU2VydmxldCBsaXN0U2VydmxldDsKKyAgcHJpdmF0ZSBmaW5hbCBSZXN0QXBpU2VydmxldCBtYW5hZ2VyQXBpOwogCiAgIHByaXZhdGUgTGlzdDxQbHVnaW4+IHBlbmRpbmcgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgcHJpdmF0ZSBTdHJpbmcgYmFzZTsKQEAgLTkyLDExICs5NiwxMyBAQAogICAgICAgQENhbm9uaWNhbFdlYlVybCBQcm92aWRlcjxTdHJpbmc+IHdlYlVybCwKICAgICAgIEBOYW1lZChIdHRwUGx1Z2luTW9kdWxlLlBMVUdJTl9SRVNPVVJDRVMpIENhY2hlPFJlc291cmNlS2V5LCBSZXNvdXJjZT4gY2FjaGUsCiAgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsCi0gICAgICBTc2hJbmZvIHNzaEluZm8sIExpc3RQbHVnaW5zU2VydmxldCBsaXN0U2VydmxldCkgeworICAgICAgU3NoSW5mbyBzc2hJbmZvLAorICAgICAgUmVzdEFwaVNlcnZsZXQuR2xvYmFscyBnbG9iYWxzLAorICAgICAgUGx1Z2luc0NvbGxlY3Rpb24gcGx1Z2lucykgewogICAgIHRoaXMubWltZVV0aWwgPSBtaW1lVXRpbDsKICAgICB0aGlzLndlYlVybCA9IHdlYlVybDsKICAgICB0aGlzLnJlc291cmNlQ2FjaGUgPSBjYWNoZTsKLSAgICB0aGlzLmxpc3RTZXJ2bGV0ID0gbGlzdFNlcnZsZXQ7CisgICAgdGhpcy5tYW5hZ2VyQXBpID0gbmV3IFJlc3RBcGlTZXJ2bGV0KGdsb2JhbHMsIHBsdWdpbnMpOwogCiAgICAgU3RyaW5nIHNzaEhvc3QgPSAicmV2aWV3LmV4YW1wbGUuY29tIjsKICAgICBpbnQgc3NoUG9ydCA9IDI5NDE4OwpAQCAtMTg3LDE0ICsxOTMsMTkgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgIFN0cmluZyBuYW1lID0gZXh0cmFjdE5hbWUocmVxKTsKLSAgICBpZiAobmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICBsaXN0U2VydmxldC5zZXJ2aWNlKHJlcSwgcmVzKTsKKyAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICBTcGxpdHRlci5vbignLycpLmxpbWl0KDMpLm9taXRFbXB0eVN0cmluZ3MoKQorICAgICAgICAuc3BsaXQoU3RyaW5ncy5udWxsVG9FbXB0eShyZXEuZ2V0UGF0aEluZm8oKSkpKTsKKworICAgIGlmIChpc0FwaUNhbGwocmVxLCBwYXJ0cykpIHsKKyAgICAgIG1hbmFnZXJBcGkuc2VydmljZShyZXEsIHJlcyk7CiAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgU3RyaW5nIG5hbWUgPSBwYXJ0cy5nZXQoMCk7CiAgICAgZmluYWwgUGx1Z2luSG9sZGVyIGhvbGRlciA9IHBsdWdpbnMuZ2V0KG5hbWUpOwogICAgIGlmIChob2xkZXIgPT0gbnVsbCkgewotICAgICAgbm9DYWNoZShyZXMpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyZXMpOwogICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjE0LDExICsyMjUsMTkgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBpQ2FsbChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBMaXN0PFN0cmluZz4gcGFydHMpIHsKKyAgICBTdHJpbmcgbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOworICAgIGludCBjbnQgPSBwYXJ0cy5zaXplKCk7CisgICAgcmV0dXJuIGNudCA9PSAwCisgICAgICAgIHx8IChjbnQgPT0gMSAmJiAoIlBVVCIuZXF1YWxzKG1ldGhvZCkgfHwgIkRFTEVURSIuZXF1YWxzKG1ldGhvZCkpKQorICAgICAgICB8fCAoY250ID09IDIgJiYgcGFydHMuZ2V0KDEpLnN0YXJ0c1dpdGgoImdlcnJpdH4iKSk7CisgIH0KKwogICBwcml2YXRlIHZvaWQgb25EZWZhdWx0KFBsdWdpbkhvbGRlciBob2xkZXIsCiAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKCEiR0VUIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSAmJiAhIkhFQUQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSB7Ci0gICAgICBub0NhY2hlKHJlcyk7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CiAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTUVUSE9EX05PVF9BTExPV0VEKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMzksOCArMjU4LDExIEBACiAgICAgfQogCiAgICAgaWYgKCIiLmVxdWFscyhmaWxlKSkgewotICAgICAgcmVzLnNlbmRSZWRpcmVjdCh1cmkgKyAiRG9jdW1lbnRhdGlvbi9pbmRleC5odG1sIik7Ci0gICAgfSBlbHNlIGlmIChmaWxlLnN0YXJ0c1dpdGgoInN0YXRpYy8iKSkgeworICAgICAgcmVzLnNlbmRSZWRpcmVjdCh1cmkgKyBob2xkZXIuZG9jUHJlZml4ICsgImluZGV4Lmh0bWwiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZmlsZS5zdGFydHNXaXRoKGhvbGRlci5zdGF0aWNQcmVmaXgpKSB7CiAgICAgICBKYXJGaWxlIGphciA9IGhvbGRlci5wbHVnaW4uZ2V0SmFyRmlsZSgpOwogICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoZmlsZSk7CiAgICAgICBpZiAoZXhpc3RzKGVudHJ5KSkgewpAQCAtMjQ5LDExICsyNzEsMTIgQEAKICAgICAgICAgcmVzb3VyY2VDYWNoZS5wdXQoa2V5LCBSZXNvdXJjZS5OT1RfRk9VTkQpOwogICAgICAgICBSZXNvdXJjZS5OT1RfRk9VTkQuc2VuZChyZXEsIHJlcyk7CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChmaWxlLmVxdWFscygiRG9jdW1lbnRhdGlvbiIpKSB7CisgICAgfSBlbHNlIGlmIChmaWxlLmVxdWFscygKKyAgICAgICAgaG9sZGVyLmRvY1ByZWZpeC5zdWJzdHJpbmcoMCwgaG9sZGVyLmRvY1ByZWZpeC5sZW5ndGgoKSAtIDEpKSkgewogICAgICAgcmVzLnNlbmRSZWRpcmVjdCh1cmkgKyAiL2luZGV4Lmh0bWwiKTsKLSAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aCgiRG9jdW1lbnRhdGlvbi8iKSAmJiBmaWxlLmVuZHNXaXRoKCIvIikpIHsKKyAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aChob2xkZXIuZG9jUHJlZml4KSAmJiBmaWxlLmVuZHNXaXRoKCIvIikpIHsKICAgICAgIHJlcy5zZW5kUmVkaXJlY3QodXJpICsgImluZGV4Lmh0bWwiKTsKLSAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aCgiRG9jdW1lbnRhdGlvbi8iKSkgeworICAgIH0gZWxzZSBpZiAoZmlsZS5zdGFydHNXaXRoKGhvbGRlci5kb2NQcmVmaXgpKSB7CiAgICAgICBKYXJGaWxlIGphciA9IGhvbGRlci5wbHVnaW4uZ2V0SmFyRmlsZSgpOwogICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoZmlsZSk7CiAgICAgICBpZiAoIWV4aXN0cyhlbnRyeSkpIHsKQEAgLTUwMSw2ICs1MjQsMTAgQEAKICAgICB9CiAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKICAgICAgIGNvbnRlbnRUeXBlID0gbWltZVV0aWwuZ2V0TWltZVR5cGUoZW50cnkuZ2V0TmFtZSgpLCBkYXRhKS50b1N0cmluZygpOworICAgICAgaWYgKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLmVxdWFscyhjb250ZW50VHlwZSkKKyAgICAgICAgICAmJiBlbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qcyIpKSB7CisgICAgICAgIGNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiOworICAgICAgfQogICAgIH0KIAogICAgIGxvbmcgdGltZSA9IGVudHJ5LmdldFRpbWUoKTsKQEAgLTU0OSwyOSArNTc2LDM1IEBACiAgICAgcmV0dXJuIGRhdGE7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdE5hbWUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIFN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7Ci0gICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShwYXRoKSB8fCAiLyIuZXF1YWxzKHBhdGgpKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICAgIGludCBzID0gcGF0aC5pbmRleE9mKCcvJywgMSk7Ci0gICAgcmV0dXJuIDAgPD0gcyA/IHBhdGguc3Vic3RyaW5nKDEsIHMpIDogcGF0aC5zdWJzdHJpbmcoMSk7Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBub0NhY2hlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB7Ci0gICAgcmVzLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgIHJlcy5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJlcy5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOwotICAgIHJlcy5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiYXR0YWNobWVudCIpOwotICB9Ci0KICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGx1Z2luSG9sZGVyIHsKICAgICBmaW5hbCBQbHVnaW4gcGx1Z2luOwogICAgIGZpbmFsIEd1aWNlRmlsdGVyIGZpbHRlcjsKKyAgICBmaW5hbCBTdHJpbmcgc3RhdGljUHJlZml4OworICAgIGZpbmFsIFN0cmluZyBkb2NQcmVmaXg7CiAKICAgICBQbHVnaW5Ib2xkZXIoUGx1Z2luIHBsdWdpbiwgR3VpY2VGaWx0ZXIgZmlsdGVyKSB7CiAgICAgICB0aGlzLnBsdWdpbiA9IHBsdWdpbjsKICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgdGhpcy5zdGF0aWNQcmVmaXggPQorICAgICAgICBnZXRQcmVmaXgocGx1Z2luLCAiR2Vycml0LUh0dHBTdGF0aWNQcmVmaXgiLCAic3RhdGljLyIpOworICAgICAgdGhpcy5kb2NQcmVmaXggPQorICAgICAgICBnZXRQcmVmaXgocGx1Z2luLCAiR2Vycml0LUh0dHBEb2N1bWVudGF0aW9uUHJlZml4IiwgIkRvY3VtZW50YXRpb24vIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByZWZpeChQbHVnaW4gcGx1Z2luLCBTdHJpbmcgYXR0ciwgU3RyaW5nIGRlZikgeworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IHBsdWdpbi5nZXRKYXJGaWxlKCkuZ2V0TWFuaWZlc3QoKS5nZXRNYWluQXR0cmlidXRlcygpCisgICAgICAgICAgICAuZ2V0VmFsdWUoYXR0cik7CisgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiBDaGFyTWF0Y2hlci5pcygnLycpLnRyaW1Gcm9tKHByZWZpeCkgKyAiLyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KCJFcnJvciBnZXR0aW5nICVzIGZvciBwbHVnaW4gJXMsIHVzaW5nIGRlZmF1bHQiLAorICAgICAgICAgICAgYXR0ciwgcGx1Z2luLmdldE5hbWUoKSksIGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtNTkwLDcgKzYyMyw4IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRQYXRoKCkgewotICAgICAgcmV0dXJuICgoSHR0cFNlcnZsZXRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgIHJldHVybiAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRSZXF1ZXN0VVJJKCkuc3Vic3RyaW5nKAorICAgICAgICAgIGNvbnRleHRQYXRoLmxlbmd0aCgpKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvUmVzb3VyY2UuamF2YQppbmRleCAwNTk3MGFmLi5mMzU0ZmQ1IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL1Jlc291cmNlLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9SZXNvdXJjZS5qYXZhCkBAIC0xNCw2ICsxNCw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucGx1Z2luczsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtMjksNyArMzEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHZvaWQgc2VuZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIEh0dHBQbHVnaW5TZXJ2bGV0Lm5vQ2FjaGUocmVzKTsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocmVzKTsKICAgICAgIHJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwogICAgIH0KICAgfTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9DYXRTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvQ2F0U2VydmxldC5qYXZhCmluZGV4IGFkZjRhZDUuLjFlY2Q5MjkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9DYXRTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0NhdFNlcnZsZXQuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJhdzsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwpAQCAtMjMsNiArMjQsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtNDQsNyArNDYsNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CkBAIC05NSw3ICs5Niw3IEBACiAgICAgLy8gcmF0aGVyIHRoYW4gZXNjYXBlZCBhcyAiJTI1MkYiLCB3aGljaCBtYWtlcyBtZSBmZWVsIHJlYWxseSByZWFsbHkKICAgICAvLyB1bmNvbWZvcnRhYmxlIHdpdGggYSBibGluZCBkZWNvZGUgcmlnaHQgaGVyZS4KICAgICAvLwotICAgIGtleVN0ciA9IFVSTERlY29kZXIuZGVjb2RlKGtleVN0ciwgIlVURi04Iik7CisgICAga2V5U3RyID0gVXJsLmRlY29kZShrZXlTdHIpOwogCiAgICAgaWYgKCFrZXlTdHIuc3RhcnRzV2l0aCgiLyIpKSB7CiAgICAgICByc3Auc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKQEAgLTIyNiw5ICsyMjcsNyBAQAogICAgIGZpbmFsIGxvbmcgd2hlbiA9IGZyb21Db21taXQuZ2V0Q29tbWl0VGltZSgpICogMTAwMEw7CiAKICAgICByc3Auc2V0RGF0ZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIsIHdoZW4pOwotICAgIHJzcC5zZXREYXRlSGVhZGVyKCJFeHBpcmVzIiwgMEwpOwotICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKIAogICAgIE91dHB1dFN0cmVhbSBvdXQ7CiAgICAgWmlwT3V0cHV0U3RyZWFtIHpvOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlU2VydmxldC5qYXZhCmluZGV4IDZhNDNkOTUuLjZjZGQ5YmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Ib3N0UGFnZVNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvSG9zdFBhZ2VTZXJ2bGV0LmphdmEKQEAgLTE0LDI1ICsxNCwzMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJhdzsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmhhc2guSGFzaGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuQnl0ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2Vycml0Q29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkhvc3RQYWdlRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMud2VidWkuV2ViVWlQbHVnaW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHRtbERvbVV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuUlBDU2VydmxldFV0aWxzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkubGlua2VyLnNlcnZlci5QZXJtdXRhdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmxpbmtlci5zZXJ2ZXIuUGVybXV0YXRpb25TZWxlY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5Kc29uU2VydmxldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwpAQCAtNDQsOCArNDksOCBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwpAQCAtNjYsNiArNzEsNyBAQAogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdXJyZW50VXNlcjsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiBzZXNzaW9uOwogICBwcml2YXRlIGZpbmFsIEdlcnJpdENvbmZpZyBjb25maWc7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY1NldDxXZWJVaVBsdWdpbj4gcGx1Z2luczsKICAgcHJpdmF0ZSBmaW5hbCBIb3N0UGFnZURhdGEuVGhlbWUgc2lnbmVkT3V0VGhlbWU7CiAgIHByaXZhdGUgZmluYWwgSG9zdFBhZ2VEYXRhLlRoZW1lIHNpZ25lZEluVGhlbWU7CiAgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CkBAIC03OSwxNSArODUsMTggQEAKICAgSG9zdFBhZ2VTZXJ2bGV0KGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdSwgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gdywKICAgICAgIGZpbmFsIFNpdGVQYXRocyBzcCwgZmluYWwgVGhlbWVGYWN0b3J5IHRoZW1lRmFjdG9yeSwKICAgICAgIGZpbmFsIEdlcnJpdENvbmZpZyBnYywgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsCisgICAgICBmaW5hbCBEeW5hbWljU2V0PFdlYlVpUGx1Z2luPiB3ZWJVaVBsdWdpbnMsCiAgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcpCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogICAgIGN1cnJlbnRVc2VyID0gY3U7CiAgICAgc2Vzc2lvbiA9IHc7CiAgICAgY29uZmlnID0gZ2M7CisgICAgcGx1Z2lucyA9IHdlYlVpUGx1Z2luczsKICAgICBzaWduZWRPdXRUaGVtZSA9IHRoZW1lRmFjdG9yeS5nZXRTaWduZWRPdXRUaGVtZSgpOwogICAgIHNpZ25lZEluVGhlbWUgPSB0aGVtZUZhY3RvcnkuZ2V0U2lnbmVkSW5UaGVtZSgpOwogICAgIHNpdGUgPSBzcDsKICAgICByZWZyZXNoSGVhZGVyRm9vdGVyID0gY2ZnLmdldEJvb2xlYW4oInNpdGUiLCAicmVmcmVzaEhlYWRlckZvb3RlciIsIHRydWUpOworICAgIGJvb2xlYW4gY2hlY2tVc2VyQWdlbnQgPSBjZmcuZ2V0Qm9vbGVhbigic2l0ZSIsICJjaGVja1VzZXJBZ2VudCIsIHRydWUpOwogCiAgICAgZmluYWwgU3RyaW5nIHBhZ2VOYW1lID0gIkhvc3RQYWdlLmh0bWwiOwogICAgIHRlbXBsYXRlID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKQEAgLTEwMiw0MCArMTExLDQwIEBACiAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigiTm8gIiArIEhQRF9JRCArICIgaW4gIiArIHBhZ2VOYW1lKTsKICAgICB9CiAKLSAgICBmaW5hbCBTdHJpbmcgc3JjID0gImdlcnJpdC9nZXJyaXQubm9jYWNoZS5qcyI7Ci0gICAgc2VsZWN0b3IgPSBuZXcgUGVybXV0YXRpb25TZWxlY3RvcigiZ2Vycml0Iik7Ci0gICAgaWYgKElTX0RFViB8fCAhY2ZnLmdldEJvb2xlYW4oInNpdGUiLCAiY2hlY2tVc2VyQWdlbnQiLCB0cnVlKSkgewotICAgICAgbm9DYWNoZU5hbWUgPSBzcmM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIEVsZW1lbnQgZGV2bW9kZSA9IEh0bWxEb21VdGlsLmZpbmQodGVtcGxhdGUsICJnZXJyaXRfZ3d0ZGV2bW9kZSIpOworICAgIFN0cmluZyBzcmMgPSAiZ2Vycml0X3VpL2dlcnJpdF91aS5ub2NhY2hlLmpzIjsKKyAgICBpZiAoIUlTX0RFVikgeworICAgICAgRWxlbWVudCBkZXZtb2RlID0gSHRtbERvbVV0aWwuZmluZCh0ZW1wbGF0ZSwgImd3dGRldm1vZGUiKTsKICAgICAgIGlmIChkZXZtb2RlICE9IG51bGwpIHsKICAgICAgICAgZGV2bW9kZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZGV2bW9kZSk7CiAgICAgICB9CiAKICAgICAgIElucHV0U3RyZWFtIGluID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiLyIgKyBzcmMpOwotICAgICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJObyAiICsgc3JjICsgIiBpbiB3ZWJhcHAgcm9vdCIpOwotICAgICAgfQotCi0gICAgICBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKLSAgICAgIHRyeSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICBIYXNoZXIgbWQgPSBIYXNoaW5nLm1kNSgpLm5ld0hhc2hlcigpOwogICAgICAgICB0cnkgewotICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICB3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgewotICAgICAgICAgICAgbWQudXBkYXRlKGJ1ZiwgMCwgbik7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+IDApIHsKKyAgICAgICAgICAgICAgbWQucHV0Qnl0ZXMoYnVmLCAwLCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaW4uY2xvc2UoKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHJlYWRpbmcgIiArIHNyYywgZSk7CiAgICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgcmVhZGluZyAiICsgc3JjLCBlKTsKKyAgICAgICAgc3JjICs9ICI/Y29udGVudD0iICsgbWQuaGFzaCgpLnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2cuZGVidWcoIk5vICIgKyBzcmMgKyAiIGluIHdlYmFwcCByb290OyBrZWVwaW5nIG5vbmNhY2hlLmpzIFVSTCIpOwogICAgICAgfQotICAgICAgZmluYWwgU3RyaW5nIGlkID0gT2JqZWN0SWQuZnJvbVJhdyhtZC5kaWdlc3QoKSkubmFtZSgpOwotICAgICAgbm9DYWNoZU5hbWUgPSBzcmMgKyAiP2NvbnRlbnQ9IiArIGlkOwotICAgICAgc2VsZWN0b3IuaW5pdChzZXJ2bGV0Q29udGV4dCk7CiAgICAgfQogCisgICAgbm9DYWNoZU5hbWUgPSBzcmM7CisgICAgc2VsZWN0b3IgPSBuZXcgUGVybXV0YXRpb25TZWxlY3RvcigiZ2Vycml0X3VpIik7CisgICAgaWYgKGNoZWNrVXNlckFnZW50ICYmICFJU19ERVYpIHsKKyAgICAgIHNlbGVjdG9yLmluaXQoc2VydmxldENvbnRleHQpOworICAgIH0KICAgICBwYWdlID0gbmV3IFBhZ2UoKTsKICAgfQogCkBAIC0xNjIsMTggKzE3MSwxNiBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIFBhZ2UuQ29udGVudCBwYWdlID0gZ2V0KCkuZ2V0KHNlbGVjdChyZXEpKTsKLSAgICBmaW5hbCBieXRlW10gcmF3OwotCisgICAgZmluYWwgUGFnZS5Db250ZW50IHBhZ2UgPSBzZWxlY3QocmVxKTsKKyAgICBmaW5hbCBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICBmaW5hbCBDdXJyZW50VXNlciB1c2VyID0gY3VycmVudFVzZXIuZ2V0KCk7CiAgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikgewotICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAgICAgICB3LndyaXRlKEhQRF9JRCArICIuYWNjb3VudD0iKTsKICAgICAgIGpzb24oKChJZGVudGlmaWVkVXNlcikgdXNlcikuZ2V0QWNjb3VudCgpLCB3KTsKICAgICAgIHcud3JpdGUoIjsiKTsKIAotICAgICAgdy53cml0ZShIUERfSUQgKyAiLnhzcmZUb2tlbj0iKTsKLSAgICAgIGpzb24oc2Vzc2lvbi5nZXQoKS5nZXRUb2tlbigpLCB3KTsKKyAgICAgIHcud3JpdGUoSFBEX0lEICsgIi54R2Vycml0QXV0aD0iKTsKKyAgICAgIGpzb24oc2Vzc2lvbi5nZXQoKS5nZXRYR2Vycml0QXV0aCgpLCB3KTsKICAgICAgIHcud3JpdGUoIjsiKTsKIAogICAgICAgdy53cml0ZShIUERfSUQgKyAiLmFjY291bnREaWZmUHJlZj0iKTsKQEAgLTE4MywyNCArMTkwLDI0IEBACiAgICAgICB3LndyaXRlKEhQRF9JRCArICIudGhlbWU9Iik7CiAgICAgICBqc29uKHNpZ25lZEluVGhlbWUsIHcpOwogICAgICAgdy53cml0ZSgiOyIpOwotCi0gICAgICBmaW5hbCBieXRlW10gdXNlckRhdGEgPSB3LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICByYXcgPSBjb25jYXQocGFnZS5wYXJ0MSwgdXNlckRhdGEsIHBhZ2UucGFydDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByYXcgPSBwYWdlLmZ1bGw7CisgICAgICB3LndyaXRlKEhQRF9JRCArICIudGhlbWU9Iik7CisgICAgICBqc29uKHNpZ25lZE91dFRoZW1lLCB3KTsKKyAgICAgIHcud3JpdGUoIjsiKTsKICAgICB9CisgICAgcGx1Z2lucyh3KTsKIAorICAgIGZpbmFsIGJ5dGVbXSBocGQgPSB3LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgZmluYWwgYnl0ZVtdIHJhdyA9IEJ5dGVzLmNvbmNhdChwYWdlLnBhcnQxLCBocGQsIHBhZ2UucGFydDIpOwogICAgIGZpbmFsIGJ5dGVbXSB0b3NlbmQ7CiAgICAgaWYgKFJQQ1NlcnZsZXRVdGlscy5hY2NlcHRzR3ppcEVuY29kaW5nKHJlcSkpIHsKICAgICAgIHJzcC5zZXRIZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpOwotICAgICAgdG9zZW5kID0gcmF3ID09IHBhZ2UuZnVsbCA/IHBhZ2UuZnVsbF9neiA6IEh0bWxEb21VdGlsLmNvbXByZXNzKHJhdyk7CisgICAgICB0b3NlbmQgPSBIdG1sRG9tVXRpbC5jb21wcmVzcyhyYXcpOwogICAgIH0gZWxzZSB7CiAgICAgICB0b3NlbmQgPSByYXc7CiAgICAgfQogCi0gICAgcnNwLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICByc3Auc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOwogICAgIHJzcC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhIdG1sRG9tVXRpbC5FTkMpOwogICAgIHJzcC5zZXRDb250ZW50TGVuZ3RoKHRvc2VuZC5sZW5ndGgpOwpAQCAtMjEyLDI5ICsyMTksMzEgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIFBlcm11dGF0aW9uIHNlbGVjdChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgaWYgKCIwIi5lcXVhbHMocmVxLmdldFBhcmFtZXRlcigicyIpKSkgeworICBwcml2YXRlIHZvaWQgcGx1Z2lucyhTdHJpbmdXcml0ZXIgdykgeworICAgIExpc3Q8U3RyaW5nPiB1cmxzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChXZWJVaVBsdWdpbiB1IDogcGx1Z2lucykgeworICAgICAgdXJscy5hZGQoU3RyaW5nLmZvcm1hdCgicGx1Z2lucy8lcy8lcyIsCisgICAgICAgICAgdS5nZXRQbHVnaW5OYW1lKCksCisgICAgICAgICAgdS5nZXRKYXZhU2NyaXB0UmVzb3VyY2VQYXRoKCkpKTsKKyAgICB9CisgICAgaWYgKCF1cmxzLmlzRW1wdHkoKSkgeworICAgICAgdy53cml0ZShIUERfSUQgKyAiLnBsdWdpbnM9Iik7CisgICAgICBqc29uKHVybHMsIHcpOworICAgICAgdy53cml0ZSgiOyIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUGFnZS5Db250ZW50IHNlbGVjdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgUGFnZSBwZyA9IGdldCgpOworICAgIGlmICgiMSIuZXF1YWxzKHJlcS5nZXRQYXJhbWV0ZXIoImRiZyIpKSkgeworICAgICAgcmV0dXJuIHBnLmRlYnVnOworICAgIH0gZWxzZSBpZiAoIjAiLmVxdWFscyhyZXEuZ2V0UGFyYW1ldGVyKCJzIikpKSB7CiAgICAgICAvLyBJZiBzPTAgaXMgdXNlZCBpbiB0aGUgVVJMLCB0aGUgdXNlciBoYXMgZXhwbGljaXRseSBhc2tlZCB1cwogICAgICAgLy8gdG8gbm90IHBlcmZvcm0gc2VsZWN0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgcGVyaGFwcyBkdWUgdG8KICAgICAgIC8vIGl0IGluY29ycmVjdGx5IGd1ZXNzaW5nIHRoZWlyIHVzZXIgYWdlbnQuCi0gICAgICAvLwotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gcGcuZ2V0KG51bGwpOwogICAgIH0KLSAgICByZXR1cm4gc2VsZWN0b3Iuc2VsZWN0KHJlcSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBieXRlW10gY29uY2F0KGJ5dGVbXSBwMSwgYnl0ZVtdIHAyLCBieXRlW10gcDMpIHsKLSAgICBmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW3AxLmxlbmd0aCArIHAyLmxlbmd0aCArIHAzLmxlbmd0aF07Ci0gICAgaW50IHAgPSAwOwotICAgIHAgPSBhcHBlbmQocDEsIHIsIHApOwotICAgIHAgPSBhcHBlbmQocDIsIHIsIHApOwotICAgIHAgPSBhcHBlbmQocDMsIHIsIHApOwotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGFwcGVuZChieXRlW10gc3JjLCBmaW5hbCBieXRlW10gZHN0LCBpbnQgcCkgewotICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLCAwLCBkc3QsIHAsIHNyYy5sZW5ndGgpOwotICAgIHJldHVybiBwICsgc3JjLmxlbmd0aDsKKyAgICByZXR1cm4gcGcuZ2V0KHNlbGVjdG9yLnNlbGVjdChyZXEpKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVJbmZvIHsKQEAgLTI1Niw2ICsyNjUsNyBAQAogICAgIHByaXZhdGUgZmluYWwgRmlsZUluZm8gaGVhZGVyOwogICAgIHByaXZhdGUgZmluYWwgRmlsZUluZm8gZm9vdGVyOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFBlcm11dGF0aW9uLCBDb250ZW50PiBwZXJtdXRhdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50IGRlYnVnOwogCiAgICAgUGFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICBEb2N1bWVudCBob3N0RG9jID0gSHRtbERvbVV0aWwuY2xvbmUodGVtcGxhdGUpOwpAQCAtMjg4LDggKzI5OCwxMiBAQAogCiAgICAgICBFbGVtZW50IG5vY2FjaGUgPSBIdG1sRG9tVXRpbC5maW5kKGhvc3REb2MsICJnZXJyaXRfbW9kdWxlIik7CiAgICAgICBhc1NjcmlwdChub2NhY2hlKTsKKyAgICAgIG5vY2FjaGUucmVtb3ZlQXR0cmlidXRlKCJpZCIpOwogICAgICAgbm9jYWNoZS5zZXRBdHRyaWJ1dGUoInNyYyIsIG5vQ2FjaGVOYW1lKTsKICAgICAgIHBlcm11dGF0aW9ucy5wdXQobnVsbCwgbmV3IENvbnRlbnQoaG9zdERvYykpOworCisgICAgICBub2NhY2hlLnNldEF0dHJpYnV0ZSgic3JjIiwgImdlcnJpdF91aS9nZXJyaXRfZGJnLm5vY2FjaGUuanMiKTsKKyAgICAgIGRlYnVnID0gbmV3IENvbnRlbnQoaG9zdERvYyk7CiAgICAgfQogCiAgICAgQ29udGVudCBnZXQoUGVybXV0YXRpb24gcCkgewpAQCAtMzA1LDcgKzMxOSw2IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzU2NyaXB0KGZpbmFsIEVsZW1lbnQgc2NyaXB0Tm9kZSkgewotICAgICAgc2NyaXB0Tm9kZS5yZW1vdmVBdHRyaWJ1dGUoImlkIik7CiAgICAgICBzY3JpcHROb2RlLnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgICAgIHNjcmlwdE5vZGUuc2V0QXR0cmlidXRlKCJsYW5ndWFnZSIsICJqYXZhc2NyaXB0Iik7CiAgICAgfQpAQCAtMzEzLDggKzMyNiw2IEBACiAgICAgY2xhc3MgQ29udGVudCB7CiAgICAgICBmaW5hbCBieXRlW10gcGFydDE7CiAgICAgICBmaW5hbCBieXRlW10gcGFydDI7Ci0gICAgICBmaW5hbCBieXRlW10gZnVsbDsKLSAgICAgIGZpbmFsIGJ5dGVbXSBmdWxsX2d6OwogCiAgICAgICBDb250ZW50KERvY3VtZW50IGhvc3REb2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyByYXcgPSBIdG1sRG9tVXRpbC50b1N0cmluZyhob3N0RG9jKTsKQEAgLTMyNCwxNSArMzM1LDYgQEAKICAgICAgICAgfQogICAgICAgICBwYXJ0MSA9IHJhdy5zdWJzdHJpbmcoMCwgcCkuZ2V0Qnl0ZXMoIlVURi04Iik7CiAgICAgICAgIHBhcnQyID0gcmF3LnN1YnN0cmluZyhyYXcuaW5kZXhPZignPicsIHApICsgMSkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHcud3JpdGUoSFBEX0lEICsgIi50aGVtZT0iKTsKLSAgICAgICAganNvbihzaWduZWRPdXRUaGVtZSwgdyk7Ci0gICAgICAgIHcud3JpdGUoIjsiKTsKLQotICAgICAgICBmaW5hbCBieXRlW10gdGhlbWVEYXRhID0gdy50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgICBmdWxsID0gY29uY2F0KHBhcnQxLCB0aGVtZURhdGEsIHBhcnQyKTsKLSAgICAgICAgZnVsbF9neiA9IEh0bWxEb21VdGlsLmNvbXByZXNzKGZ1bGwpOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0xlZ2FjeUdlcnJpdFNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXRTZXJ2bGV0LmphdmEKaW5kZXggZDM4N2Y2ZS4uNzljMmFlYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0xlZ2FjeUdlcnJpdFNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0U2VydmxldC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJhdzsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtNjYsOSArNjcsNyBAQAogICAgICAgdG9zZW5kID0gcmF3OwogICAgIH0KIAotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKICAgICByc3Auc2V0Q2hhcmFjdGVyRW5jb2RpbmcoSHRtbERvbVV0aWwuRU5DKTsKICAgICByc3Auc2V0Q29udGVudExlbmd0aCh0b3NlbmQubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Tc2hJbmZvU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1NzaEluZm9TZXJ2bGV0LmphdmEKaW5kZXggNjA3OGM0ZS4uNTc1Njg4MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1NzaEluZm9TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1NzaEluZm9TZXJ2bGV0LmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmF3OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCkBAIC02MCwxMCArNjEsNiBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKLQogICAgIGZpbmFsIExpc3Q8SG9zdEtleT4gaG9zdEtleXMgPSBzc2hkLmdldEhvc3RLZXlzKCk7CiAgICAgZmluYWwgU3RyaW5nIG91dDsKICAgICBpZiAoIWhvc3RLZXlzLmlzRW1wdHkoKSkgewpAQCAtODgsNiArODUsNyBAQAogICAgICAgb3V0ID0gIk5PVF9BVkFJTEFCTEUiOwogICAgIH0KIAorICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICByc3Auc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CiAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7CiAgICAgZmluYWwgUHJpbnRXcml0ZXIgdyA9IHJzcC5nZXRXcml0ZXIoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9TdGF0aWNTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvU3RhdGljU2VydmxldC5qYXZhCmluZGV4IDk4OGRhZGIuLmJjMGExNzQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9TdGF0aWNTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1N0YXRpY1NlcnZsZXQuamF2YQpAQCAtMTQsNyArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJhdzsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5SUENTZXJ2bGV0VXRpbHM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKQEAgLTI2LDcgKzI4LDggQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwpAQCAtMzcsMTIgKzQwLDcgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQogQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIFN0YXRpY1NlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0FHRSA9IDEyICogNjAgKiA2MCAqIDEwMDBMLyogbWlsbGlzZWNvbmRzICovOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfQ1RSTCA9Ci0gICAgICAicHVibGljLCBtYXgtYWdlPSIgKyAoTUFYX0FHRSAvIDEwMDBMKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBNSU1FX1RZUEVTID0KLSAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IE1JTUVfVFlQRVMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKICAgc3RhdGljIHsKICAgICBNSU1FX1RZUEVTLnB1dCgiaHRtbCIsICJ0ZXh0L2h0bWwiKTsKICAgICBNSU1FX1RZUEVTLnB1dCgiaHRtIiwgInRleHQvaHRtbCIpOwpAQCAtMTQ3LDYgKzE0NSw3IEBACiAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBGaWxlIHAgPSBsb2NhbChyZXEpOwogICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICAgIHJzcC5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE2MSw4ICsxNjAsNyBAQAogICAgICAgdG9zZW5kID0gcmVhZEZpbGUocCk7CiAgICAgfQogCi0gICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIENBQ0hFX0NUUkwpOwotICAgIHJzcC5zZXREYXRlSGVhZGVyKCJFeHBpcmVzIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBNQVhfQUdFKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Q2FjaGVhYmxlKHJlcSwgcnNwLCAxMiwgVGltZVVuaXQuSE9VUlMpOwogICAgIHJzcC5zZXREYXRlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgcC5sYXN0TW9kaWZpZWQoKSk7CiAgICAgcnNwLnNldENvbnRlbnRUeXBlKHR5cGUpOwogICAgIHJzcC5zZXRDb250ZW50TGVuZ3RoKHRvc2VuZC5sZW5ndGgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1RoZW1lRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1RoZW1lRmFjdG9yeS5qYXZhCmluZGV4IDk3MjM2NzQuLjllODllZWUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9UaGVtZUZhY3RvcnkuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvVGhlbWVGYWN0b3J5LmphdmEKQEAgLTM4LDExICszOCwxMSBAQAogCiAgIHByaXZhdGUgSG9zdFBhZ2VEYXRhLlRoZW1lIGdldFRoZW1lKFN0cmluZyBuYW1lKSB7CiAgICAgSG9zdFBhZ2VEYXRhLlRoZW1lIHRoZW1lID0gbmV3IEhvc3RQYWdlRGF0YS5UaGVtZSgpOwotICAgIHRoZW1lLmJhY2tncm91bmRDb2xvciA9IGNvbG9yKG5hbWUsICJiYWNrZ3JvdW5kQ29sb3IiLCAiI0ZDRkVFRiIpOwotICAgIHRoZW1lLnRleHRDb2xvciA9IGNvbG9yKG5hbWUsICJ0ZXh0Q29sb3IiLCAiIzAwMDAwMCIpOwotICAgIHRoZW1lLnRyaW1Db2xvciA9IGNvbG9yKG5hbWUsICJ0cmltQ29sb3IiLCAiI0Q0RTlBOSIpOwotICAgIHRoZW1lLnNlbGVjdGlvbkNvbG9yID0gY29sb3IobmFtZSwgInNlbGVjdGlvbkNvbG9yIiwgIiNGRkZGQ0MiKTsKLSAgICB0aGVtZS50b3BNZW51Q29sb3IgPSBjb2xvcihuYW1lLCAidG9wTWVudUNvbG9yIiwgdGhlbWUudHJpbUNvbG9yKTsKKyAgICB0aGVtZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcihuYW1lLCAiYmFja2dyb3VuZENvbG9yIiwgIiNGRkZGRkYiKTsKKyAgICB0aGVtZS50ZXh0Q29sb3IgPSBjb2xvcihuYW1lLCAidGV4dENvbG9yIiwgIiMzNTM1MzUiKTsKKyAgICB0aGVtZS50cmltQ29sb3IgPSBjb2xvcihuYW1lLCAidHJpbUNvbG9yIiwgIiNFRUVFRUUiKTsKKyAgICB0aGVtZS5zZWxlY3Rpb25Db2xvciA9IGNvbG9yKG5hbWUsICJzZWxlY3Rpb25Db2xvciIsICIjRDhFREY5Iik7CisgICAgdGhlbWUudG9wTWVudUNvbG9yID0gY29sb3IobmFtZSwgInRvcE1lbnVDb2xvciIsICIjRkZGRkZGIik7CiAgICAgdGhlbWUuY2hhbmdlVGFibGVPdXRkYXRlZENvbG9yID0gY29sb3IobmFtZSwgImNoYW5nZVRhYmxlT3V0ZGF0ZWRDb2xvciIsICIjRjA4MDgwIik7CiAgICAgdGhlbWUudGFibGVPZGRSb3dDb2xvciA9IGNvbG9yKG5hbWUsICJ0YWJsZU9kZFJvd0NvbG9yIiwgInRyYW5zcGFyZW50Iik7CiAgICAgdGhlbWUudGFibGVFdmVuUm93Q29sb3IgPSBjb2xvcihuYW1lLCAidGFibGVFdmVuUm93Q29sb3IiLCAidHJhbnNwYXJlbnQiKTsKQEAgLTU0LDExICs1NCw3IEBACiAgICAgaWYgKHYgPT0gbnVsbCB8fCB2LmlzRW1wdHkoKSkgewogICAgICAgdiA9IGNmZy5nZXRTdHJpbmcoInRoZW1lIiwgbnVsbCwgbmFtZSk7CiAgICAgICBpZiAodiA9PSBudWxsIHx8IHYuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmICgic2lnbmVkLWluIi5lcXVhbHMoc2VjdGlvbikgJiYgImJhY2tncm91bmRDb2xvciIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgdiA9ICIjRkZGRkZGIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2ID0gZGVmYXVsdFZhbHVlOwotICAgICAgICB9CisgICAgICAgIHYgPSBkZWZhdWx0VmFsdWU7CiAgICAgICB9CiAgICAgfQogICAgIGlmICghdi5zdGFydHNXaXRoKCIjIikgJiYgdi5tYXRjaGVzKCJeWzAtOWEtZkEtRl17Miw2fSQiKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmVzdGFwaS9QYXJhbWV0ZXJQYXJzZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiZmZjMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGkuUmVzdEFwaVNlcnZsZXQucmVwbHlCaW5hcnlSZXN1bHQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGkuUmVzdEFwaVNlcnZsZXQucmVwbHlFcnJvcjsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmluYXJ5UmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQudXRpbC5jbGkuQ21kTGluZVBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblByaW1pdGl2ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2NsYXNzIFBhcmFtZXRlclBhcnNlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZVNldDxTdHJpbmc+IFJFU0VSVkVEX0tFWVMgPSBJbW11dGFibGVTZXQub2YoCisgICAgICAicHAiLCAicHJldHR5UHJpbnQiLCAic3RyaWN0IiwgImNhbGxiYWNrIiwgImFsdCIsICJmaWVsZHMiKTsKKworICBwcml2YXRlIGZpbmFsIENtZExpbmVQYXJzZXIuRmFjdG9yeSBwYXJzZXJGYWN0b3J5OworCisgIEBJbmplY3QKKyAgUGFyYW1ldGVyUGFyc2VyKENtZExpbmVQYXJzZXIuRmFjdG9yeSBwZikgeworICAgIHRoaXMucGFyc2VyRmFjdG9yeSA9IHBmOworICB9CisKKyAgPFQ+IGJvb2xlYW4gcGFyc2UoVCBwYXJhbSwKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBpbiwKKyAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQ21kTGluZVBhcnNlciBjbHAgPSBwYXJzZXJGYWN0b3J5LmNyZWF0ZShwYXJhbSk7CisgICAgdHJ5IHsKKyAgICAgIGNscC5wYXJzZU9wdGlvbk1hcChpbik7CisgICAgfSBjYXRjaCAoQ21kTGluZUV4Y2VwdGlvbiBlKSB7CisgICAgICBpZiAoIWNscC53YXNIZWxwUmVxdWVzdGVkQnlPcHRpb24oKSkgeworICAgICAgICByZXBseUVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjbHAud2FzSGVscFJlcXVlc3RlZEJ5T3B0aW9uKCkpIHsKKyAgICAgIFN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICBjbHAucHJpbnRRdWVyeVN0cmluZ1VzYWdlKHJlcS5nZXRSZXF1ZXN0VVJJKCksIG1zZyk7CisgICAgICBtc2cud3JpdGUoJ1xuJyk7CisgICAgICBtc2cud3JpdGUoJ1xuJyk7CisgICAgICBjbHAucHJpbnRVc2FnZShtc2csIG51bGwpOworICAgICAgbXNnLndyaXRlKCdcbicpOworICAgICAgcmVwbHlCaW5hcnlSZXN1bHQocmVxLCByZXMsCisgICAgICAgICAgQmluYXJ5UmVzdWx0LmNyZWF0ZShtc2cudG9TdHJpbmcoKSkuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKSk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgdm9pZCBzcGxpdFF1ZXJ5U3RyaW5nKFN0cmluZyBxdWVyeVN0cmluZywKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcsCisgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKSB7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkocXVlcnlTdHJpbmcpKSB7CisgICAgICBmb3IgKFN0cmluZyBrdlBhaXIgOiBTcGxpdHRlci5vbignJicpLnNwbGl0KHF1ZXJ5U3RyaW5nKSkgeworICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGkgPSBTcGxpdHRlci5vbignPScpLmxpbWl0KDIpLnNwbGl0KGt2UGFpcikuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIGtleSA9IFVybC5kZWNvZGUoaS5uZXh0KCkpOworICAgICAgICBTdHJpbmcgdmFsID0gaS5oYXNOZXh0KCkgPyBVcmwuZGVjb2RlKGkubmV4dCgpKSA6ICIiOworICAgICAgICBpZiAoUkVTRVJWRURfS0VZUy5jb250YWlucyhrZXkpKSB7CisgICAgICAgICAgY29uZmlnLnB1dChrZXksIHZhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyYW1zLnB1dChrZXksIHZhbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBxdWVyeShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgU2V0PFN0cmluZz4gcGFyYW1zID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkocmVxLmdldFF1ZXJ5U3RyaW5nKCkpKSB7CisgICAgICBmb3IgKFN0cmluZyBrdlBhaXIgOiBTcGxpdHRlci5vbignJicpLnNwbGl0KHJlcS5nZXRRdWVyeVN0cmluZygpKSkgeworICAgICAgICBwYXJhbXMuYWRkKEl0ZXJhYmxlcy5nZXRGaXJzdCgKKyAgICAgICAgICAgIFNwbGl0dGVyLm9uKCc9JykubGltaXQoMikuc3BsaXQoa3ZQYWlyKSwKKyAgICAgICAgICAgIG51bGwpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhcmFtczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZXJ0IGEgc3RhbmRhcmQgVVJMIGVuY29kZWQgZm9ybSBpbnB1dCBpbnRvIGEgcGFyc2VkIEpTT04gdHJlZS4KKyAgICogPHA+CisgICAqIEdpdmVuIGFuIGlucHV0IHN1Y2ggYXM6CisgICAqCisgICAqIDxwcmU+CisgICAqIG1lc3NhZ2U9RG9lcytub3QrY29tcGlsZS4mbGFiZWxzLlZlcmlmaWVkPS0xCisgICAqIDwvcHJlPgorICAgKgorICAgKiB3aGljaCBpcyBlYXNpbHkgY3JlYXRlZCB1c2luZyB0aGUgY3VybCBjb21tYW5kIGxpbmUgdG9vbDoKKyAgICoKKyAgICogPHByZT4KKyAgICogY3VybCAtLWRhdGEgJ21lc3NhZ2U9RG9lcyBub3QgY29tcGlsZS4nIC0tZGF0YSBsYWJlbHMuVmVyaWZpZWQ9LTEKKyAgICogPC9wcmU+CisgICAqCisgICAqIGNvbnZlcnRzIHRvIGEgSlNPTiBvYmplY3Qgc3RydWN0dXJlIHRoYXQgaXMgbm9ybWFsbHkgZXhwZWN0ZWQ6CisgICAqCisgICAqIDxwcmU+CisgICAqIHsKKyAgICogICAibWVzc2FnZSI6ICJEb2VzIG5vdCBjb21waWxlLiIsCisgICAqICAgImxhYmVscyI6IHsKKyAgICogICAgICJWZXJpZmllZCI6ICItMSIKKyAgICogICB9CisgICAqIH0KKyAgICogPC9wcmU+CisgICAqCisgICAqIFRoaXMgaW5wdXQgY2FuIHRoZW4gYmUgZnVydGhlciBwcm9jZXNzZWQgaW50byB0aGUgSmF2YSBpbnB1dCB0eXBlIGV4cGVjdGVkCisgICAqIGJ5IGEgdmlldyB1c2luZyBHc29uLiBIZXJlIHdlIHJlbHkgb24gR3NvbiB0byBwZXJmb3JtIGltcGxpY2l0IGNvbnZlcnNpb24KKyAgICogb2YgYSBzdHJpbmcge0Bjb2RlICItMSJ9IHRvIGEgbnVtYmVyIHR5cGUgd2hlbiB0aGUgSmF2YSBpbnB1dCB0eXBlIGV4cGVjdHMKKyAgICogYSBudW1iZXIuCisgICAqIDxwPgorICAgKiBDb252ZXJzaW9uIGFzc3VtZXMgYW55IGZpZWxkIG5hbWUgdGhhdCBkb2VzIG5vdCBjb250YWluIHtAY29kZSAiLiJ9IHdpbGwgYmUKKyAgICogYSBwcm9wZXJ0eSBvZiB0aGUgdG9wIGxldmVsIGlucHV0IG9iamVjdC4gQW55IGZpZWxkIHdpdGggYSBkb3Qgd2lsbCB1c2UgdGhlCisgICAqIGZpcnN0IHNlZ21lbnQgYXMgdGhlIHRvcCBsZXZlbCBwcm9wZXJ0eSBuYW1lIG5hbWluZyBhbiBvYmplY3QsIGFuZCB0aGUgcmVzdAorICAgKiBvZiB0aGUgZmllbGQgbmFtZSBhcyBhIHByb3BlcnR5IGluIHRoZSBuZXN0ZWQgb2JqZWN0LgorICAgKgorICAgKiBAcGFyYW0gcmVxIHJlcXVlc3QgdG8gcGFyc2UgZm9ybSBpbnB1dCBmcm9tIGFuZCBjcmVhdGUgSlNPTiB0cmVlLgorICAgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgSlNPTiBvYmplY3QgdHJlZS4KKyAgICogQHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBjYXN0LCBhcyB0aGVyZSBhcmUKKyAgICogICAgICAgICBjb25mbGljdGluZyBkZWZpbml0aW9ucyBmb3IgYSBuZXN0ZWQgb2JqZWN0LgorICAgKi8KKyAgc3RhdGljIEpzb25PYmplY3QgZm9ybVRvSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxKQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24geworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBtYXAgPSByZXEuZ2V0UGFyYW1ldGVyTWFwKCk7CisgICAgcmV0dXJuIGZvcm1Ub0pzb24obWFwLCBxdWVyeShyZXEpKTsKKyAgfQorCisgIEBWaXNpYmxlRm9yVGVzdGluZworICBzdGF0aWMgSnNvbk9iamVjdCBmb3JtVG9Kc29uKE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBtYXAsIFNldDxTdHJpbmc+IHF1ZXJ5KQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24geworICAgIEpzb25PYmplY3QgaW5wdXRPYmplY3QgPSBuZXcgSnNvbk9iamVjdCgpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudCA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICBTdHJpbmcga2V5ID0gZW50LmdldEtleSgpOworICAgICAgU3RyaW5nW10gdmFsdWVzID0gZW50LmdldFZhbHVlKCk7CisKKyAgICAgIGlmIChxdWVyeS5jb250YWlucyhrZXkpIHx8IHZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAvLyBEaXNhbGxvdyBwcm9jZXNzaW5nIHF1ZXJ5IHBhcmFtZXRlcnMgYXMgaW5wdXQgYm9keSBmaWVsZHMuCisgICAgICAgIC8vIEltcGxlbWVudGF0aW9ucyBvZiB2aWV3cyBzaG91bGQgYXZvaWQgZHVwbGljYXRlIG5hbWluZy4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEpzb25PYmplY3Qgb2JqID0gaW5wdXRPYmplY3Q7CisgICAgICBpbnQgZG90ID0ga2V5LmluZGV4T2YoJy4nKTsKKyAgICAgIGlmICgwIDw9IGRvdCkgeworICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBrZXkuc3Vic3RyaW5nKDAsIGRvdCk7CisgICAgICAgIEpzb25FbGVtZW50IGUgPSBpbnB1dE9iamVjdC5nZXQocHJvcGVydHkpOworICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgb2JqID0gbmV3IEpzb25PYmplY3QoKTsKKyAgICAgICAgICBpbnB1dE9iamVjdC5hZGQocHJvcGVydHksIG9iaik7CisgICAgICAgIH0gZWxzZSBpZiAoZS5pc0pzb25PYmplY3QoKSkgeworICAgICAgICAgIG9iaiA9IGUuZ2V0QXNKc29uT2JqZWN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgImtleSAlcyBjb25mbGljdHMgd2l0aCAlcyIsCisgICAgICAgICAgICAgIGtleSwgcHJvcGVydHkpKTsKKyAgICAgICAgfQorICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKGRvdCArIDEpOworICAgICAgfQorCisgICAgICBpZiAob2JqLmdldChrZXkpICE9IG51bGwpIHsKKyAgICAgICAgLy8gVGhpcyBlcnJvciBzaG91bGQgbmV2ZXIgaGFwcGVuLiBJZiBhbGwgZm9ybSB2YWx1ZXMgYXJlIGhhbmRsZWQKKyAgICAgICAgLy8gdG9nZXRoZXIgaW4gYSBzaW5nbGUgcGFzcyBwcm9wZXJ0aWVzIGFyZSBzZXQgb25seSBvbmNlLiBTZXR0aW5nCisgICAgICAgIC8vIGFnYWluIGluZGljYXRlcyBzb21ldGhpbmcgaGFzIGdvbmUgdmVyeSB3cm9uZy4KKyAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oImludmFsaWQgZm9ybSBpbnB1dCwgdXNlIEpTT04gaW5zdGVhZCIpOworICAgICAgfSBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgb2JqLmFkZFByb3BlcnR5KGtleSwgdmFsdWVzWzBdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEpzb25BcnJheSBsaXN0ID0gbmV3IEpzb25BcnJheSgpOworICAgICAgICBmb3IgKFN0cmluZyB2IDogdmFsdWVzKSB7CisgICAgICAgICAgbGlzdC5hZGQobmV3IEpzb25QcmltaXRpdmUodikpOworICAgICAgICB9CisgICAgICAgIG9iai5hZGQoa2V5LCBsaXN0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlucHV0T2JqZWN0OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1Jlc3RBcGlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhYTE5MQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUmVzdEFwaVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDg2NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGk7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQkFEX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0NPTkZMSUNUOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DUkVBVEVEOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTUVUSE9EX05PVF9BTExPV0VEOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQ7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX09LOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19QUkVDT05ESVRJT05fRkFJTEVEOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZEhhc2hNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSHR0cEhlYWRlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQuQXVkaXRTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0Lkh0dHBBdWRpdEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkFjY2VwdHNDcmVhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkFjY2VwdHNQb3N0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CaW5hcnlSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUHV0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0Q29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuU3RyZWFtaW5nUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uRXhjbHVzaW9uU3RyYXRlZ3k7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkZpZWxkQXR0cmlidXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uRmllbGROYW1pbmdQb2xpY3k7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb25CdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUHJpbWl0aXZlOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5zdHJlYW0uSnNvblJlYWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25Ub2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLk1hbGZvcm1lZEpzb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC51dGlsLlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5UZW1wb3JhcnlCdWZmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlci5IZWFwOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitwdWJsaWMgY2xhc3MgUmVzdEFwaVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihSZXN0QXBpU2VydmxldC5jbGFzcyk7CisKKyAgLyoqIE1JTUUgdHlwZSB1c2VkIGZvciBhIEpTT04gcmVzcG9uc2UgYm9keS4gKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fVFlQRSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOworCisgIC8qKgorICAgKiBHYXJiYWdlIHByZWZpeCBpbnNlcnRlZCBiZWZvcmUgSlNPTiBvdXRwdXQgdG8gcHJldmVudCBYU1NJLgorICAgKiA8cD4KKyAgICogVGhpcyBwcmVmaXggaXMgIildfSdcbiIgYW5kIGlzIGRlc2lnbmVkIHRvIHByZXZlbnQgYSB3ZWIgYnJvd3NlciBmcm9tCisgICAqIGV4ZWN1dGluZyB0aGUgcmVzcG9uc2UgYm9keSBpZiB0aGUgcmVzb3VyY2UgVVJJIHdlcmUgdG8gYmUgcmVmZXJlbmNlZCB1c2luZworICAgKiBhICZsdDtzY3JpcHQgc3JjPSIuLi4mZ3Q7IEhUTUwgdGFnIGZyb20gYW5vdGhlciB3ZWIgc2l0ZS4gQ2xpZW50cyB1c2luZyB0aGUKKyAgICogSFRUUCBpbnRlcmZhY2Ugd2lsbCBuZWVkIHRvIGFsd2F5cyBzdHJpcCB0aGUgZmlyc3QgbGluZSBvZiByZXNwb25zZSBkYXRhIHRvCisgICAqIHJlbW92ZSB0aGlzIG1hZ2ljIGhlYWRlci4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEpTT05fTUFHSUM7CisKKyAgc3RhdGljIHsKKyAgICBKU09OX01BR0lDID0gIildfSdcbiIuZ2V0Qnl0ZXMoVVRGXzgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBHbG9iYWxzIHsKKyAgICBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXI7CisgICAgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKKyAgICBmaW5hbCBQcm92aWRlcjxQYXJhbWV0ZXJQYXJzZXI+IHBhcmFtUGFyc2VyOworICAgIGZpbmFsIEF1ZGl0U2VydmljZSBhdWRpdFNlcnZpY2U7CisKKyAgICBASW5qZWN0CisgICAgR2xvYmFscyhQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCisgICAgICAgIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb24sCisgICAgICAgIFByb3ZpZGVyPFBhcmFtZXRlclBhcnNlcj4gcGFyYW1QYXJzZXIsCisgICAgICAgIEF1ZGl0U2VydmljZSBhdWRpdFNlcnZpY2UpIHsKKyAgICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKKyAgICAgIHRoaXMud2ViU2Vzc2lvbiA9IHdlYlNlc3Npb247CisgICAgICB0aGlzLnBhcmFtUGFyc2VyID0gcGFyYW1QYXJzZXI7CisgICAgICB0aGlzLmF1ZGl0U2VydmljZSA9IGF1ZGl0U2VydmljZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIEdsb2JhbHMgZ2xvYmFsczsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXN0Q29sbGVjdGlvbjxSZXN0UmVzb3VyY2UsIFJlc3RSZXNvdXJjZT4+IG1lbWJlcnM7CisKKyAgcHVibGljIFJlc3RBcGlTZXJ2bGV0KEdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFJlc3RDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXN0UmVzb3VyY2UsID8gZXh0ZW5kcyBSZXN0UmVzb3VyY2U+IG1lbWJlcnMpIHsKKyAgICB0aGlzKGdsb2JhbHMsIFByb3ZpZGVycy5vZihtZW1iZXJzKSk7CisgIH0KKworICBwdWJsaWMgUmVzdEFwaVNlcnZsZXQoR2xvYmFscyBnbG9iYWxzLAorICAgICAgUHJvdmlkZXI8PyBleHRlbmRzIFJlc3RDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXN0UmVzb3VyY2UsID8gZXh0ZW5kcyBSZXN0UmVzb3VyY2U+PiBtZW1iZXJzKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgUHJvdmlkZXI8UmVzdENvbGxlY3Rpb248UmVzdFJlc291cmNlLCBSZXN0UmVzb3VyY2U+PiBuID0KKyAgICAgICAgKFByb3ZpZGVyPFJlc3RDb2xsZWN0aW9uPFJlc3RSZXNvdXJjZSwgUmVzdFJlc291cmNlPj4pIGNoZWNrTm90TnVsbCgoT2JqZWN0KSBtZW1iZXJzKTsKKyAgICB0aGlzLmdsb2JhbHMgPSBnbG9iYWxzOworICAgIHRoaXMubWVtYmVycyA9IG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgbG9uZyBhdWRpdFN0YXJ0VHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CisgICAgcmVzLnNldEhlYWRlcigiQ29udGVudC1EaXNwb3NpdGlvbiIsICJhdHRhY2htZW50Iik7CisgICAgcmVzLnNldEhlYWRlcigiWC1Db250ZW50LVR5cGUtT3B0aW9ucyIsICJub3NuaWZmIik7CisgICAgaW50IHN0YXR1cyA9IFNDX09LOworICAgIE9iamVjdCByZXN1bHQgPSBudWxsOworICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBMaW5rZWRIYXNoTXVsdGltYXAuY3JlYXRlKCk7CisgICAgT2JqZWN0IGlucHV0UmVxdWVzdEJvZHkgPSBudWxsOworCisgICAgdHJ5IHsKKyAgICAgIGNoZWNrVXNlclNlc3Npb24ocmVxKTsKKworICAgICAgTGlzdDxJZFN0cmluZz4gcGF0aCA9IHNwbGl0UGF0aChyZXEpOworICAgICAgUmVzdENvbGxlY3Rpb248UmVzdFJlc291cmNlLCBSZXN0UmVzb3VyY2U+IHJjID0gbWVtYmVycy5nZXQoKTsKKyAgICAgIGNoZWNrQWNjZXNzQW5ub3RhdGlvbnMocmMuZ2V0Q2xhc3MoKSk7CisKKyAgICAgIFJlc3RSZXNvdXJjZSByc3JjID0gVG9wTGV2ZWxSZXNvdXJjZS5JTlNUQU5DRTsKKyAgICAgIFJlc3RWaWV3PFJlc3RSZXNvdXJjZT4gdmlldyA9IG51bGw7CisgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCJHRVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgdmlldyA9IHJjLmxpc3QoKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYyBpbnN0YW5jZW9mIEFjY2VwdHNQb3N0ICYmICJQT1NUIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSkgeworICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgIEFjY2VwdHNQb3N0PFJlc3RSZXNvdXJjZT4gYWMgPSAoQWNjZXB0c1Bvc3Q8UmVzdFJlc291cmNlPikgcmM7CisgICAgICAgICAgdmlldyA9IGFjLnBvc3QocnNyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgSWRTdHJpbmcgaWQgPSBwYXRoLnJlbW92ZSgwKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByc3JjID0gcmMucGFyc2UocnNyYywgaWQpOworICAgICAgICAgIGNoZWNrUHJlY29uZGl0aW9ucyhyZXEsIHJzcmMpOworICAgICAgICB9IGNhdGNoIChSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBpZiAocmMgaW5zdGFuY2VvZiBBY2NlcHRzQ3JlYXRlCisgICAgICAgICAgICAgICYmIHBhdGguaXNFbXB0eSgpCisgICAgICAgICAgICAgICYmICgiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkKKyAgICAgICAgICAgICAgICAgIHx8ICJQVVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBBY2NlcHRzQ3JlYXRlPFJlc3RSZXNvdXJjZT4gYWMgPSAoQWNjZXB0c0NyZWF0ZTxSZXN0UmVzb3VyY2U+KSByYzsKKyAgICAgICAgICAgIHZpZXcgPSBhYy5jcmVhdGUocnNyYywgaWQpOworICAgICAgICAgICAgc3RhdHVzID0gU0NfQ1JFQVRFRDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgeworICAgICAgICAgIHZpZXcgPSB2aWV3KHJjLCByZXEuZ2V0TWV0aG9kKCksIHBhdGgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjaGVja0FjY2Vzc0Fubm90YXRpb25zKHZpZXcuZ2V0Q2xhc3MoKSk7CisKKyAgICAgIHdoaWxlICh2aWV3IGluc3RhbmNlb2YgUmVzdENvbGxlY3Rpb248Pyw/PikgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgUmVzdENvbGxlY3Rpb248UmVzdFJlc291cmNlLCBSZXN0UmVzb3VyY2U+IGMgPQorICAgICAgICAgICAgKFJlc3RDb2xsZWN0aW9uPFJlc3RSZXNvdXJjZSwgUmVzdFJlc291cmNlPikgdmlldzsKKworICAgICAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBpZiAoIkdFVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgIHZpZXcgPSBjLmxpc3QoKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBBY2NlcHRzUG9zdCAmJiAiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgQWNjZXB0c1Bvc3Q8UmVzdFJlc291cmNlPiBhYyA9IChBY2NlcHRzUG9zdDxSZXN0UmVzb3VyY2U+KSBjOworICAgICAgICAgICAgdmlldyA9IGFjLnBvc3QocnNyYyk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIElkU3RyaW5nIGlkID0gcGF0aC5yZW1vdmUoMCk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJzcmMgPSBjLnBhcnNlKHJzcmMsIGlkKTsKKyAgICAgICAgICAgIGNoZWNrUHJlY29uZGl0aW9ucyhyZXEsIHJzcmMpOworICAgICAgICAgICAgdmlldyA9IG51bGw7CisgICAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIEFjY2VwdHNDcmVhdGUKKyAgICAgICAgICAgICAgICAmJiBwYXRoLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICYmICgiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgIlBVVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpKSB7CisgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICBBY2NlcHRzQ3JlYXRlPFJlc3RSZXNvdXJjZT4gYWMgPSAoQWNjZXB0c0NyZWF0ZTxSZXN0UmVzb3VyY2U+KSBjOworICAgICAgICAgICAgICB2aWV3ID0gYWMuY3JlYXRlKHJzcmMsIGlkKTsKKyAgICAgICAgICAgICAgc3RhdHVzID0gU0NfQ1JFQVRFRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHZpZXcgPSB2aWV3KGMsIHJlcS5nZXRNZXRob2QoKSwgcGF0aCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoZWNrQWNjZXNzQW5ub3RhdGlvbnModmlldy5nZXRDbGFzcygpKTsKKyAgICAgIH0KKworICAgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNvbmZpZyA9IExpbmtlZEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICAgIFBhcmFtZXRlclBhcnNlci5zcGxpdFF1ZXJ5U3RyaW5nKHJlcS5nZXRRdWVyeVN0cmluZygpLCBjb25maWcsIHBhcmFtcyk7CisgICAgICBpZiAoIWdsb2JhbHMucGFyYW1QYXJzZXIuZ2V0KCkucGFyc2UodmlldywgcGFyYW1zLCByZXEsIHJlcykpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAodmlldyBpbnN0YW5jZW9mIFJlc3RNb2RpZnlWaWV3PD8sID8+KSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBSZXN0TW9kaWZ5VmlldzxSZXN0UmVzb3VyY2UsIE9iamVjdD4gbSA9CisgICAgICAgICAgICAoUmVzdE1vZGlmeVZpZXc8UmVzdFJlc291cmNlLCBPYmplY3Q+KSB2aWV3OworCisgICAgICAgIGlucHV0UmVxdWVzdEJvZHkgPSBwYXJzZVJlcXVlc3QocmVxLCBpbnB1dFR5cGUobSkpOworICAgICAgICByZXN1bHQgPSBtLmFwcGx5KHJzcmMsIGlucHV0UmVxdWVzdEJvZHkpOworICAgICAgfSBlbHNlIGlmICh2aWV3IGluc3RhbmNlb2YgUmVzdFJlYWRWaWV3PD8+KSB7CisgICAgICAgIHJlc3VsdCA9ICgoUmVzdFJlYWRWaWV3PFJlc3RSZXNvdXJjZT4pIHZpZXcpLmFwcGx5KHJzcmMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgICAgIFJlc3BvbnNlIHIgPSAoUmVzcG9uc2UpIHJlc3VsdDsKKyAgICAgICAgc3RhdHVzID0gci5zdGF0dXNDb2RlKCk7CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFJlc3BvbnNlLlJlZGlyZWN0KSB7CisgICAgICAgIHJlcy5zZW5kUmVkaXJlY3QoKChSZXNwb25zZS5SZWRpcmVjdCkgcmVzdWx0KS5sb2NhdGlvbigpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmVzLnNldFN0YXR1cyhzdGF0dXMpOworCisgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgU3RyZWFtaW5nUmVzcG9uc2UpIHsKKyAgICAgICAgU3RyZWFtaW5nUmVzcG9uc2UgciA9IChTdHJlYW1pbmdSZXNwb25zZSkgcmVzdWx0OworICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoci5nZXRDb250ZW50VHlwZSgpKTsKKyAgICAgICAgci5zdHJlYW0ocmVzLmdldE91dHB1dFN0cmVhbSgpKTsKKyAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IFJlc3BvbnNlLm5vbmUoKSkgeworICAgICAgICByZXN1bHQgPSBSZXNwb25zZS51bndyYXAocmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEJpbmFyeVJlc3VsdCkgeworICAgICAgICAgIHJlcGx5QmluYXJ5UmVzdWx0KHJlcSwgcmVzLCAoQmluYXJ5UmVzdWx0KSByZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlcGx5SnNvbihyZXEsIHJlcywgY29uZmlnLCByZXN1bHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoQXV0aEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfRk9SQklEREVOLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoQmFkUmVxdWVzdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfQkFEX1JFUVVFU1QsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcGx5RXJyb3IocmVzLCBzdGF0dXMgPSBTQ19NRVRIT0RfTk9UX0FMTE9XRUQsICJNZXRob2Qgbm90IGFsbG93ZWQiKTsKKyAgICB9IGNhdGNoIChSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcGx5RXJyb3IocmVzLCBzdGF0dXMgPSBTQ19DT05GTElDVCwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfUFJFQ09ORElUSU9OX0ZBSUxFRCwKKyAgICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbChlLmdldE1lc3NhZ2UoKSwgIlByZWNvbmRpdGlvbiBmYWlsZWQiKSk7CisgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfTk9UX0ZPVU5ELCAiTm90IGZvdW5kIik7CisgICAgfSBjYXRjaCAoVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gNDIyLAorICAgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKGUuZ2V0TWVzc2FnZSgpLCAiVW5wcm9jZXNzYWJsZSBFbnRpdHkiKSk7CisgICAgfSBjYXRjaCAoQW1iaWd1b3VzVmlld0V4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfTk9UX0ZPVU5ELCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoTWFsZm9ybWVkSnNvbkV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfQkFEX1JFUVVFU1QsICJJbnZhbGlkICIgKyBKU09OX1RZUEUgKyAiIGluIHJlcXVlc3QiKTsKKyAgICB9IGNhdGNoIChKc29uUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX0JBRF9SRVFVRVNULCAiSW52YWxpZCAiICsgSlNPTl9UWVBFICsgIiBpbiByZXF1ZXN0Iik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHN0YXR1cyA9IFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgIGhhbmRsZUV4Y2VwdGlvbihlLCByZXEsIHJlcyk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdsb2JhbHMuYXVkaXRTZXJ2aWNlLmRpc3BhdGNoKG5ldyBIdHRwQXVkaXRFdmVudChnbG9iYWxzLndlYlNlc3Npb24uZ2V0KCkKKyAgICAgICAgICAuZ2V0U2Vzc2lvbklkKCksIGdsb2JhbHMuY3VycmVudFVzZXIuZ2V0KCksIHJlcS5nZXRSZXF1ZXN0VVJJKCksCisgICAgICAgICAgYXVkaXRTdGFydFRzLCBwYXJhbXMsIHJlcS5nZXRNZXRob2QoKSwgaW5wdXRSZXF1ZXN0Qm9keSwgc3RhdHVzLAorICAgICAgICAgIHJlc3VsdCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja1ByZWNvbmRpdGlvbnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVzdFJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICBpZiAoIioiLmVxdWFscyhyZXEuZ2V0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIikpKSB7CisgICAgICB0aHJvdyBuZXcgUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uKCJSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFR5cGUgaW5wdXRUeXBlKFJlc3RNb2RpZnlWaWV3PFJlc3RSZXNvdXJjZSwgT2JqZWN0PiBtKSB7CisgICAgVHlwZSBpbnB1dFR5cGUgPSBleHRyYWN0SW5wdXRUeXBlKG0uZ2V0Q2xhc3MoKSk7CisgICAgaWYgKGlucHV0VHlwZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIlZpZXcgJXMgZG9lcyBub3QgY29ycmVjdGx5IGltcGxlbWVudCAlcyIsCisgICAgICAgICAgbS5nZXRDbGFzcygpLCBSZXN0TW9kaWZ5Vmlldy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0VHlwZTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgIHByaXZhdGUgc3RhdGljIFR5cGUgZXh0cmFjdElucHV0VHlwZShDbGFzcyBjbGF6eikgeworICAgIGZvciAoVHlwZSB0IDogY2xhenouZ2V0R2VuZXJpY0ludGVyZmFjZXMoKSkgeworICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZQorICAgICAgICAgICYmICgoUGFyYW1ldGVyaXplZFR5cGUpIHQpLmdldFJhd1R5cGUoKSA9PSBSZXN0TW9kaWZ5Vmlldy5jbGFzcykgeworICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJpemVkVHlwZSkgdCkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzFdOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGF6ei5nZXRTdXBlcmNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgVHlwZSBpID0gZXh0cmFjdElucHV0VHlwZShjbGF6ei5nZXRTdXBlcmNsYXNzKCkpOworICAgICAgaWYgKGkgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKENsYXNzIHQgOiBjbGF6ei5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgIFR5cGUgaSA9IGV4dHJhY3RJbnB1dFR5cGUodCk7CisgICAgICBpZiAoaSAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgcGFyc2VSZXF1ZXN0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFR5cGUgdHlwZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24sCisgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24geworICAgIGlmIChpc1R5cGUoSlNPTl9UWVBFLCByZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gcmVxLmdldFJlYWRlcigpOworICAgICAgdHJ5IHsKKyAgICAgICAgSnNvblJlYWRlciBqc29uID0gbmV3IEpzb25SZWFkZXIoYnIpOworICAgICAgICBqc29uLnNldExlbmllbnQodHJ1ZSk7CisKKyAgICAgICAgSnNvblRva2VuIGZpcnN0OworICAgICAgICB0cnkgeworICAgICAgICAgIGZpcnN0ID0ganNvbi5wZWVrKCk7CisgICAgICAgIH0gY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIkV4cGVjdGVkIEpTT04gb2JqZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpcnN0ID09IEpzb25Ub2tlbi5TVFJJTkcpIHsKKyAgICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoanNvbi5uZXh0U3RyaW5nKCksIHR5cGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPdXRwdXRGb3JtYXQuSlNPTi5uZXdHc29uKCkuZnJvbUpzb24oanNvbiwgdHlwZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBici5jbG9zZSgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIlBVVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkgJiYgYWNjZXB0c1B1dElucHV0KHR5cGUpKSB7CisgICAgICByZXR1cm4gcGFyc2VQdXRJbnB1dChyZXEsIHR5cGUpOworICAgIH0gZWxzZSBpZiAoIkRFTEVURSIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkgJiYgaGFzTm9Cb2R5KHJlcSkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZWxzZSBpZiAoaGFzTm9Cb2R5KHJlcSkpIHsKKyAgICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZSh0eXBlKTsKKyAgICB9IGVsc2UgaWYgKGlzVHlwZSgidGV4dC9wbGFpbiIsIHJlcS5nZXRDb250ZW50VHlwZSgpKSkgeworICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSByZXEuZ2V0UmVhZGVyKCk7CisgICAgICB0cnkgeworICAgICAgICBjaGFyW10gdG1wID0gbmV3IGNoYXJbMjU2XTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBuOworICAgICAgICB3aGlsZSAoMCA8IChuID0gYnIucmVhZCh0bXApKSkgeworICAgICAgICAgIHNiLmFwcGVuZCh0bXAsIDAsIG4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJzZVN0cmluZyhzYi50b1N0cmluZygpLCB0eXBlKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkKKyAgICAgICAgJiYgaXNUeXBlKEZPUk1fVFlQRSwgcmVxLmdldENvbnRlbnRUeXBlKCkpKSB7CisgICAgICByZXR1cm4gT3V0cHV0Rm9ybWF0LkpTT04ubmV3R3NvbigpLmZyb21Kc29uKAorICAgICAgICAgIFBhcmFtZXRlclBhcnNlci5mb3JtVG9Kc29uKHJlcSksCisgICAgICAgICAgdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJFeHBlY3RlZCBDb250ZW50LVR5cGU6ICIgKyBKU09OX1RZUEUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTm9Cb2R5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBpbnQgbGVuID0gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICBTdHJpbmcgdHlwZSA9IHJlcS5nZXRDb250ZW50VHlwZSgpOworICAgIHJldHVybiAobGVuIDw9IDAgJiYgdHlwZSA9PSBudWxsKQorICAgICAgICB8fCAobGVuID09IDAgJiYgaXNUeXBlKEZPUk1fVFlQRSwgdHlwZSkpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzUHV0SW5wdXQoVHlwZSB0eXBlKSB7CisgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgZm9yIChGaWVsZCBmIDogKChDbGFzcykgdHlwZSkuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICBpZiAoZi5nZXRUeXBlKCkgPT0gUHV0SW5wdXQuY2xhc3MpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIE9iamVjdCBwYXJzZVB1dElucHV0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFR5cGUgdHlwZSkKKyAgICAgIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLAorICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB7CisgICAgT2JqZWN0IG9iaiA9IGNyZWF0ZUluc3RhbmNlKHR5cGUpOworICAgIGZvciAoRmllbGQgZiA6IG9iai5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgIGlmIChmLmdldFR5cGUoKSA9PSBQdXRJbnB1dC5jbGFzcykgeworICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGYuc2V0KG9iaiwgbmV3IFB1dElucHV0KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxLmdldENvbnRlbnRUeXBlKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXEuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVxLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgfQorCisgIHByaXZhdGUgT2JqZWN0IHBhcnNlU3RyaW5nKFN0cmluZyB2YWx1ZSwgVHlwZSB0eXBlKQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sCisgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sCisgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBPYmplY3Qgb2JqID0gY3JlYXRlSW5zdGFuY2UodHlwZSk7CisgICAgRmllbGRbXSBmaWVsZHMgPSBvYmouZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgIGlmIChmaWVsZHMubGVuZ3RoID09IDAgJiYgU3RyaW5ncy5pc051bGxPckVtcHR5KHZhbHVlKSkgeworICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisgICAgZm9yIChGaWVsZCBmIDogZmllbGRzKSB7CisgICAgICBpZiAoZi5nZXRBbm5vdGF0aW9uKERlZmF1bHRJbnB1dC5jbGFzcykgIT0gbnVsbAorICAgICAgICAgICYmIGYuZ2V0VHlwZSgpID09IFN0cmluZy5jbGFzcykgeworICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGYuc2V0KG9iaiwgdmFsdWUpOworICAgICAgICByZXR1cm4gb2JqOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiRXhwZWN0ZWQgSlNPTiBvYmplY3QiKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjcmVhdGVJbnN0YW5jZShUeXBlIHR5cGUpCisgICAgICB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBDbGFzczxPYmplY3Q+IGNsYXp6ID0gKENsYXNzPE9iamVjdD4pIHR5cGU7CisgICAgICBDb25zdHJ1Y3RvcjxPYmplY3Q+IGMgPSBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9yKCk7CisgICAgICBjLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICByZXR1cm4gYy5uZXdJbnN0YW5jZSgpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbigiQ2Fubm90IG1ha2UgIiArIHR5cGUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBseUpzb24oQE51bGxhYmxlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcsCisgICAgICBPYmplY3QgcmVzdWx0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBoZWFwKEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7CisgICAgV3JpdGVyIHcgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsIFVURl84KSk7CisgICAgR3NvbiBnc29uID0gbmV3R3Nvbihjb25maWcsIHJlcSk7CisgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEpzb25FbGVtZW50KSB7CisgICAgICBnc29uLnRvSnNvbigoSnNvbkVsZW1lbnQpIHJlc3VsdCwgdyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdzb24udG9Kc29uKHJlc3VsdCwgdyk7CisgICAgfQorICAgIHcud3JpdGUoJ1xuJyk7CisgICAgdy5mbHVzaCgpOworCisgICAgcmVwbHlCaW5hcnlSZXN1bHQocmVxLCByZXMsIG5ldyBCaW5hcnlSZXN1bHQoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBidWYubGVuZ3RoKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1Zi53cml0ZVRvKG9zLCBudWxsKTsKKyAgICAgIH0KKyAgICB9LnNldENvbnRlbnRUeXBlKEpTT05fVFlQRSkuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoVVRGXzgubmFtZSgpKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBHc29uIG5ld0dzb24oTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNvbmZpZywKKyAgICAgIEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgR3NvbkJ1aWxkZXIgZ2IgPSBPdXRwdXRGb3JtYXQuSlNPTl9DT01QQUNULm5ld0dzb25CdWlsZGVyKCk7CisKKyAgICBlbmFibGVQcmV0dHlQcmludChnYiwgY29uZmlnLCByZXEpOworICAgIGVuYWJsZVBhcnRpYWxHZXRGaWVsZHMoZ2IsIGNvbmZpZyk7CisKKyAgICByZXR1cm4gZ2IuY3JlYXRlKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuYWJsZVByZXR0eVByaW50KEdzb25CdWlsZGVyIGdiLAorICAgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IGNvbmZpZywKKyAgICAgIEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgU3RyaW5nIHBwID0gSXRlcmFibGVzLmdldEZpcnN0KGNvbmZpZy5nZXQoInBwIiksIG51bGwpOworICAgIGlmIChwcCA9PSBudWxsKSB7CisgICAgICBwcCA9IEl0ZXJhYmxlcy5nZXRGaXJzdChjb25maWcuZ2V0KCJwcmV0dHlQcmludCIpLCBudWxsKTsKKyAgICAgIGlmIChwcCA9PSBudWxsICYmIHJlcSAhPSBudWxsKSB7CisgICAgICAgIHBwID0gYWNjZXB0c0pzb24ocmVxKSA/ICIwIiA6ICIxIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCIxIi5lcXVhbHMocHApIHx8ICJ0cnVlIi5lcXVhbHMocHApKSB7CisgICAgICBnYi5zZXRQcmV0dHlQcmludGluZygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5hYmxlUGFydGlhbEdldEZpZWxkcyhHc29uQnVpbGRlciBnYiwKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcpIHsKKyAgICBmaW5hbCBTZXQ8U3RyaW5nPiB3YW50ID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChTdHJpbmcgcCA6IGNvbmZpZy5nZXQoImZpZWxkcyIpKSB7CisgICAgICBJdGVyYWJsZXMuYWRkQWxsKHdhbnQsIFNwbGl0dGVyLm9uKCcsJykKKyAgICAgICAgICAub21pdEVtcHR5U3RyaW5ncygpLnRyaW1SZXN1bHRzKCkKKyAgICAgICAgICAuc3BsaXQocCkpOworICAgIH0KKyAgICBpZiAoIXdhbnQuaXNFbXB0eSgpKSB7CisgICAgICBnYi5hZGRTZXJpYWxpemF0aW9uRXhjbHVzaW9uU3RyYXRlZ3kobmV3IEV4Y2x1c2lvblN0cmF0ZWd5KCkgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2tpcEZpZWxkKEZpZWxkQXR0cmlidXRlcyBmaWVsZCkgeworICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXMuZ2V0KGZpZWxkLmdldE5hbWUoKSk7CisgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gTmFtZXMgYXJlIHN1cHBsaWVkIGJ5IEdzb24gaW4gdGVybXMgb2YgSmF2YSBzb3VyY2UuCisgICAgICAgICAgICAvLyBUcmFuc2xhdGUgYW5kIGNhY2hlIHRoZSBKU09OIGxvd2VyX2Nhc2Vfc3R5bGUgdXNlZC4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIG5hbWUgPQorICAgICAgICAgICAgICAgICAgRmllbGROYW1pbmdQb2xpY3kuTE9XRVJfQ0FTRV9XSVRIX1VOREVSU0NPUkVTLnRyYW5zbGF0ZU5hbWUoLy8KKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldERlY2xhcmVkRmllbGQoZmllbGQuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgIG5hbWVzLnB1dChmaWVsZC5nZXROYW1lKCksIG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAhd2FudC5jb250YWlucyhuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTa2lwQ2xhc3MoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHJlcGx5QmluYXJ5UmVzdWx0KAorICAgICAgQE51bGxhYmxlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIEJpbmFyeVJlc3VsdCBiaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlcy5zZXRDb250ZW50VHlwZShiaW4uZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICBPdXRwdXRTdHJlYW0gZHN0ID0gcmVzLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgdHJ5IHsKKyAgICAgICAgbG9uZyBsZW4gPSBiaW4uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICBib29sZWFuIGd6aXAgPSBiaW4uY2FuR3ppcCgpICYmIGFjY2VwdHNHemlwKHJlcSk7CisgICAgICAgIGlmIChnemlwICYmIDI1NiA8PSBsZW4gJiYgbGVuIDw9ICgxMCA8PCAyMCkpIHsKKyAgICAgICAgICBUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBjb21wcmVzcyhiaW4pOworICAgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPCBsZW4pIHsKKyAgICAgICAgICAgIHJlcy5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGJ1Zi5sZW5ndGgoKSk7CisgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyAgICAgICAgICAgIGJ1Zi53cml0ZVRvKGRzdCwgbnVsbCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcGx5VW5jb21wcmVzc2VkKHJlcywgZHN0LCBiaW4sIGxlbik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGd6aXApIHsKKyAgICAgICAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKKyAgICAgICAgICBkc3QgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShkc3QpOworICAgICAgICAgIGJpbi53cml0ZVRvKGRzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVwbHlVbmNvbXByZXNzZWQocmVzLCBkc3QsIGJpbiwgbGVuKTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZHN0LmNsb3NlKCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGJpbi5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwbHlVbmNvbXByZXNzZWQoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBPdXRwdXRTdHJlYW0gZHN0LCBCaW5hcnlSZXN1bHQgYmluLCBsb25nIGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoMCA8PSBsZW4gJiYgbGVuIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgIHJlcy5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGxlbik7CisgICAgfSBlbHNlIGlmICgwIDw9IGxlbikgeworICAgICAgcmVzLnNldEhlYWRlcigiQ29udGVudC1MZW5ndGgiLCBMb25nLnRvU3RyaW5nKGxlbikpOworICAgIH0KKyAgICBiaW4ud3JpdGVUbyhkc3QpOworICB9CisKKyAgcHJpdmF0ZSBSZXN0VmlldzxSZXN0UmVzb3VyY2U+IHZpZXcoCisgICAgICBSZXN0Q29sbGVjdGlvbjxSZXN0UmVzb3VyY2UsIFJlc3RSZXNvdXJjZT4gcmMsCisgICAgICBTdHJpbmcgbWV0aG9kLCBMaXN0PElkU3RyaW5nPiBwYXRoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEFtYmlndW91c1ZpZXdFeGNlcHRpb24geworICAgIER5bmFtaWNNYXA8UmVzdFZpZXc8UmVzdFJlc291cmNlPj4gdmlld3MgPSByYy52aWV3cygpOworICAgIGZpbmFsIElkU3RyaW5nIHByb2plY3Rpb24gPSBwYXRoLmlzRW1wdHkoKQorICAgICAgICA/IElkU3RyaW5nLmZyb21VcmwoIi8iKQorICAgICAgICA6IHBhdGgucmVtb3ZlKDApOworICAgIGlmICghcGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBwYXRoIGNvbXBvbmVudHMgc3RpbGwgcmVtYWluaW5nIGFmdGVyIHRoaXMgcHJvamVjdGlvbgorICAgICAgLy8gaXMgY2hvc2VuLCBsb29rIGZvciB0aGUgcHJvamVjdGlvbiBiYXNlZCB1cG9uIEdFVCBhcyB0aGUgbWV0aG9kIGFzCisgICAgICAvLyB0aGUgY2xpZW50IHRoaW5rcyBpdCBpcyBhIG5lc3RlZCBjb2xsZWN0aW9uLgorICAgICAgbWV0aG9kID0gIkdFVCI7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IHAgPSBzcGxpdFByb2plY3Rpb24ocHJvamVjdGlvbik7CisgICAgaWYgKHAuc2l6ZSgpID09IDIpIHsKKyAgICAgIFJlc3RWaWV3PFJlc3RSZXNvdXJjZT4gdmlldyA9CisgICAgICAgICAgdmlld3MuZ2V0KHAuZ2V0KDApLCBtZXRob2QgKyAiLiIgKyBwLmdldCgxKSk7CisgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiB2aWV3OworICAgICAgfQorICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24ocHJvamVjdGlvbik7CisgICAgfQorCisgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QgKyAiLiIgKyBwLmdldCgwKTsKKyAgICBSZXN0VmlldzxSZXN0UmVzb3VyY2U+IGNvcmUgPSB2aWV3cy5nZXQoImdlcnJpdCIsIG5hbWUpOworICAgIGlmIChjb3JlICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBjb3JlOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIFJlc3RWaWV3PFJlc3RSZXNvdXJjZT4+IHIgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgICBmb3IgKFN0cmluZyBwbHVnaW4gOiB2aWV3cy5wbHVnaW5zKCkpIHsKKyAgICAgIFJlc3RWaWV3PFJlc3RSZXNvdXJjZT4gYWN0aW9uID0gdmlld3MuZ2V0KHBsdWdpbiwgbmFtZSk7CisgICAgICBpZiAoYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgci5wdXQocGx1Z2luLCBhY3Rpb24pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChyLnNpemUoKSA9PSAxKSB7CisgICAgICByZXR1cm4gSXRlcmFibGVzLmdldEZpcnN0KHIudmFsdWVzKCksIG51bGwpOworICAgIH0gZWxzZSBpZiAoci5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKHByb2plY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgQW1iaWd1b3VzVmlld0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAiUHJvamVjdGlvbiAlcyBpcyBhbWJpZ3VvdXM6ICIsCisgICAgICAgIG5hbWUsCisgICAgICAgIEpvaW5lci5vbigiLCAiKS5qb2luKAorICAgICAgICAgIEl0ZXJhYmxlcy50cmFuc2Zvcm0oci5rZXlTZXQoKSwgbmV3IEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgaW4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGluICsgIn4iICsgcHJvamVjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSkpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBMaXN0PElkU3RyaW5nPiBzcGxpdFBhdGgoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFN0cmluZyBwYXRoID0gcmVxLmdldFBhdGhJbmZvKCk7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShwYXRoKSkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKyAgICBMaXN0PElkU3RyaW5nPiBvdXQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKFN0cmluZyBwIDogU3BsaXR0ZXIub24oJy8nKS5zcGxpdChwYXRoKSkgeworICAgICAgb3V0LmFkZChJZFN0cmluZy5mcm9tVXJsKHApKTsKKyAgICB9CisgICAgaWYgKG91dC5zaXplKCkgPiAwICYmIG91dC5nZXQob3V0LnNpemUoKSAtIDEpLmlzRW1wdHkoKSkgeworICAgICAgb3V0LnJlbW92ZShvdXQuc2l6ZSgpIC0gMSk7CisgICAgfQorICAgIHJldHVybiBvdXQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gc3BsaXRQcm9qZWN0aW9uKElkU3RyaW5nIHByb2plY3Rpb24pIHsKKyAgICBMaXN0PFN0cmluZz4gcCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSgyKTsKKyAgICBJdGVyYWJsZXMuYWRkQWxsKHAsIFNwbGl0dGVyLm9uKCd+JykubGltaXQoMikuc3BsaXQocHJvamVjdGlvbi5nZXQoKSkpOworICAgIHJldHVybiBwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrVXNlclNlc3Npb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICBDdXJyZW50VXNlciB1c2VyID0gZ2xvYmFscy5jdXJyZW50VXNlci5nZXQoKTsKKyAgICBpZiAoaXNTdGF0ZUNoYW5nZShyZXEpKSB7CisgICAgICBpZiAodXNlciBpbnN0YW5jZW9mIEFub255bW91c1VzZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIik7CisgICAgICB9IGVsc2UgaWYgKCFnbG9iYWxzLndlYlNlc3Npb24uZ2V0KCkuaXNBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aC5SRVNUX0FQSSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkludmFsaWQgYXV0aGVudGljYXRpb24gbWV0aG9kLiBJbiBvcmRlciB0byBhdXRoZW50aWNhdGUsIHByZWZpeCB0aGUgUkVTVCBlbmRwb2ludCBVUkwgd2l0aCAvYS8gKGUuZy4gaHR0cDovL2V4YW1wbGUuY29tL2EvcHJvamVjdHMvKS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgdXNlci5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguUkVTVF9BUEkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N0YXRlQ2hhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBTdHJpbmcgbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOworICAgIHJldHVybiAhKCJHRVQiLmVxdWFscyhtZXRob2QpIHx8ICJIRUFEIi5lcXVhbHMobWV0aG9kKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tBY2Nlc3NBbm5vdGF0aW9ucyhDbGFzczw/IGV4dGVuZHMgT2JqZWN0PiBjbGF6eikKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICBSZXF1aXJlc0NhcGFiaWxpdHkgcmMgPSBjbGF6ei5nZXRBbm5vdGF0aW9uKFJlcXVpcmVzQ2FwYWJpbGl0eS5jbGFzcyk7CisgICAgaWYgKHJjICE9IG51bGwpIHsKKyAgICAgIEN1cnJlbnRVc2VyIHVzZXIgPSBnbG9iYWxzLmN1cnJlbnRVc2VyLmdldCgpOworICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wgY3RsID0gdXNlci5nZXRDYXBhYmlsaXRpZXMoKTsKKyAgICAgIGlmICghY3RsLmNhblBlcmZvcm0ocmMudmFsdWUoKSkgJiYgIWN0bC5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgeworICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkNhcGFiaWxpdHkgJXMgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIHRoaXMgcmVzb3VyY2UiLAorICAgICAgICAgICAgcmMudmFsdWUoKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBlcnIsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgdXJpID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShyZXEuZ2V0UXVlcnlTdHJpbmcoKSkpIHsKKyAgICAgIHVyaSArPSAiPyIgKyByZXEuZ2V0UXVlcnlTdHJpbmcoKTsKKyAgICB9CisgICAgbG9nLmVycm9yKFN0cmluZy5mb3JtYXQoIkVycm9yIGluICVzICVzIiwgcmVxLmdldE1ldGhvZCgpLCB1cmkpLCBlcnIpOworCisgICAgaWYgKCFyZXMuaXNDb21taXR0ZWQoKSkgeworICAgICAgcmVzLnJlc2V0KCk7CisgICAgICByZXBseUVycm9yKHJlcywgU0NfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCAiSW50ZXJuYWwgc2VydmVyIGVycm9yIik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgcmVwbHlFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgaW50IHN0YXR1c0NvZGUsIFN0cmluZyBtc2cpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJlcy5zZXRTdGF0dXMoc3RhdHVzQ29kZSk7CisgICAgcmVwbHlUZXh0KG51bGwsIHJlcywgbXNnKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHJlcGx5VGV4dChATnVsbGFibGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBTdHJpbmcgdGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoKHJlcSA9PSBudWxsIHx8ICJHRVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSAmJiBpc01heWJlSFRNTCh0ZXh0KSkgeworICAgICAgcmVwbHlKc29uKHJlcSwgcmVzLCBJbW11dGFibGVNdWx0aW1hcC5vZigicHAiLCAiMCIpLCBuZXcgSnNvblByaW1pdGl2ZSh0ZXh0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghdGV4dC5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICB0ZXh0ICs9ICJcbiI7CisgICAgICB9CisgICAgICByZXBseUJpbmFyeVJlc3VsdChyZXEsIHJlcywKKyAgICAgICAgICBCaW5hcnlSZXN1bHQuY3JlYXRlKHRleHQpLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gSVNfSFRNTCA9IFBhdHRlcm4uY29tcGlsZSgiWzwmXSIpOworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF5YmVIVE1MKFN0cmluZyB0ZXh0KSB7CisgICAgcmV0dXJuIElTX0hUTUwubWF0Y2hlcih0ZXh0KS5maW5kKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjY2VwdHNKc29uKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICByZXR1cm4gcmVxICE9IG51bGwgJiYgaXNUeXBlKEpTT05fVFlQRSwgcmVxLmdldEhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNjZXB0c0d6aXAoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIGlmIChyZXEgIT0gbnVsbCkgeworICAgICAgU3RyaW5nIGFjY2VwdHMgPSByZXEuZ2V0SGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORyk7CisgICAgICByZXR1cm4gYWNjZXB0cyAhPSBudWxsICYmIGFjY2VwdHMuaW5kZXhPZigiZ3ppcCIpICE9IC0xOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHlwZShTdHJpbmcgZXhwZWN0LCBTdHJpbmcgZ2l2ZW4pIHsKKyAgICBpZiAoZ2l2ZW4gPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoZXhwZWN0LmVxdWFscyhnaXZlbikpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoZ2l2ZW4uc3RhcnRzV2l0aChleHBlY3QgKyAiLCIpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZm9yIChTdHJpbmcgcCA6IGdpdmVuLnNwbGl0KCJbICw7XVsgLDtdKiIpKSB7CisgICAgICBpZiAoZXhwZWN0LmVxdWFscyhwKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgY29tcHJlc3MoQmluYXJ5UmVzdWx0IGJpbikKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0gaGVhcCgyMCA8PCAyMCk7CisgICAgR1pJUE91dHB1dFN0cmVhbSBneiA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGJ1Zik7CisgICAgYmluLndyaXRlVG8oZ3opOworICAgIGd6LmZpbmlzaCgpOworICAgIGd6LmZsdXNoKCk7CisgICAgcmV0dXJuIGJ1ZjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEhlYXAgaGVhcChpbnQgbWF4KSB7CisgICAgcmV0dXJuIG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChtYXgpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFtYmlndW91c1ZpZXdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICAgIEFtYmlndW91c1ZpZXdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0F1ZGl0ZWRIdHRwU2VydmxldFJlc3BvbnNlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvQXVkaXRlZEh0dHBTZXJ2bGV0UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTliNTRjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0F1ZGl0ZWRIdHRwU2VydmxldFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKK2NsYXNzIEF1ZGl0ZWRIdHRwU2VydmxldFJlc3BvbnNlCisgICAgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcgorICAgIGltcGxlbWVudHMgSHR0cFNlcnZsZXRSZXNwb25zZSB7CisgIHByaXZhdGUgaW50IHN0YXR1czsKKworICBBdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgc3VwZXIocmVzcG9uc2UpOworICB9CisKKyAgaW50IGdldFN0YXR1cygpIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MpIHsKKyAgICBzdXBlci5zZXRTdGF0dXMoc2MpOworICAgIHRoaXMuc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2V0U3RhdHVzKGludCBzYywgU3RyaW5nIHNtKSB7CisgICAgc3VwZXIuc2V0U3RhdHVzKHNjLCBzbSk7CisgICAgdGhpcy5zdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN1cGVyLnNlbmRFcnJvcihzYyk7CisgICAgdGhpcy5zdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IHNjLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN1cGVyLnNlbmRFcnJvcihzYywgbXNnKTsKKyAgICB0aGlzLnN0YXR1cyA9IHNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3VwZXIuc2VuZFJlZGlyZWN0KGxvY2F0aW9uKTsKKyAgICB0aGlzLnN0YXR1cyA9IFNDX01PVkVEX1RFTVBPUkFSSUxZOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbi5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0Jhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24uamF2YQppbmRleCA2MjUwNmYwLi4zMjc3OTkyIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9CYXNlU2VydmljZUltcGxlbWVudGF0aW9uLmphdmEKQEAgLTQ4LDYgKzQ4LDEwIEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAorICBwcm90ZWN0ZWQgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CisgICAgcmV0dXJuIGN1cnJlbnRVc2VyLmdldCgpOworICB9CisKICAgLyoqCiAgICAqIEV4ZWN1dGVzIDxjb2RlPmFjdGlvbi5ydW48L2NvZGU+IHdpdGggYW4gYWN0aXZlIFJldmlld0RiIGNvbm5lY3Rpb24uCiAgICAqIDxwPgpAQCAtNjgsNyArNzIsMTEgQEAKICAgICB9IGNhdGNoIChJbnZhbGlkUXVlcnlFeGNlcHRpb24gZSkgewogICAgICAgY2FsbGJhY2sub25GYWlsdXJlKGUpOwogICAgIH0gY2F0Y2ggKE5vU3VjaFByb2plY3RFeGNlcHRpb24gZSkgewotICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7CisgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgeworICAgICAgICBjYWxsYmFjay5vbkZhaWx1cmUobmV3IE5vU3VjaEVudGl0eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7CisgICAgICB9CiAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgewogICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7CiAgICAgfSBjYXRjaCAoT3JtUnVudGltZUV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvR2Vycml0SnNvblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9HZXJyaXRKc29uU2VydmxldC5qYXZhCmluZGV4IDFiMjQ3OTIuLjU1ZWNiMDEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9HZXJyaXRKc29uU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9HZXJyaXRKc29uU2VydmxldC5qYXZhCkBAIC0xNCwxMyArMTQsMTUgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGM7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0RXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0U2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdC5ScGNBdWRpdEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdWRpdC5BdWRpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5SZXF1aXJlZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vdFNpZ25lZEluRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJlbW90ZUpzb25TZXJ2aWNlOwpAQCAtMzYsMTEgKzM4LDExIEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKwogLyoqCiAgKiBCYXNlIEpTT04gc2VydmxldCB0byBlbnN1cmUgdGhlIGN1cnJlbnQgdXNlciBpcyBub3QgZm9yZ2VkLgogICovCkBAIC02Nyw3ICs2OSw3IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgR2Vycml0Q2FsbCBjcmVhdGVBY3RpdmVDYWxsKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgewotICAgIGZpbmFsIEdlcnJpdENhbGwgY2FsbCA9IG5ldyBHZXJyaXRDYWxsKHNlc3Npb24uZ2V0KCksIHJlcSwgcnNwKTsKKyAgICBmaW5hbCBHZXJyaXRDYWxsIGNhbGwgPSBuZXcgR2Vycml0Q2FsbChzZXNzaW9uLmdldCgpLCByZXEsIG5ldyBBdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZShyc3ApKTsKICAgICBjdXJyZW50Q2FsbC5zZXQoY2FsbCk7CiAgICAgcmV0dXJuIGNhbGw7CiAgIH0KQEAgLTEzMSw2NCArMTMzLDg4IEBACiAgICAgICB9CiAgICAgICBBdWRpdCBub3RlID0gKEF1ZGl0KSBtZXRob2QuZ2V0QW5ub3RhdGlvbihBdWRpdC5jbGFzcyk7CiAgICAgICBpZiAobm90ZSAhPSBudWxsKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzaWQgPSBjYWxsLmdldFdlYlNlc3Npb24oKS5nZXRUb2tlbigpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2lkID0gY2FsbC5nZXRXZWJTZXNzaW9uKCkuZ2V0U2Vzc2lvbklkKCk7CiAgICAgICAgIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXJuYW1lID0gY2FsbC5nZXRXZWJTZXNzaW9uKCkuZ2V0Q3VycmVudFVzZXIoKTsKLSAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGFyZ3MgPQorICAgICAgICBmaW5hbCBNdWx0aW1hcDxTdHJpbmcsID8+IGFyZ3MgPQogICAgICAgICAgICAgZXh0cmFjdFBhcmFtcyhub3RlLCBjYWxsKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHdoYXQgPSBleHRyYWN0V2hhdChub3RlLCBtZXRob2QuZ2V0TmFtZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHdoYXQgPSBleHRyYWN0V2hhdChub3RlLCBjYWxsKTsKICAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IGNhbGwuZ2V0UmVzdWx0KCk7CiAKLSAgICAgICAgYXVkaXQuZGlzcGF0Y2gobmV3IEF1ZGl0RXZlbnQoc2lkLCB1c2VybmFtZSwgd2hhdCwgY2FsbC5nZXRXaGVuKCksIGFyZ3MsCi0gICAgICAgICAgICByZXN1bHQpKTsKKyAgICAgICAgYXVkaXQuZGlzcGF0Y2gobmV3IFJwY0F1ZGl0RXZlbnQoc2lkLCB1c2VybmFtZSwgd2hhdCwgY2FsbC5nZXRXaGVuKCksCisgICAgICAgICAgICBhcmdzLCBjYWxsLmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldE1ldGhvZCgpLCBjYWxsLmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldE1ldGhvZCgpLAorICAgICAgICAgICAgKChBdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZSkgKGNhbGwuZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpKSkKKyAgICAgICAgICAgICAgICAuZ2V0U3RhdHVzKCksIHJlc3VsdCkpOwogICAgICAgfQogICAgIH0gY2F0Y2ggKFRocm93YWJsZSBhbGwpIHsKICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGxvZyB0aGUgY2FsbCIsIGFsbCk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gZXh0cmFjdFBhcmFtcyhmaW5hbCBBdWRpdCBub3RlLCBmaW5hbCBHZXJyaXRDYWxsIGNhbGwpIHsKLSAgICBMaXN0PE9iamVjdD4gYXJncyA9IExpc3RzLm5ld0FycmF5TGlzdChBcnJheXMuYXNMaXN0KGNhbGwuZ2V0UGFyYW1zKCkpKTsKKyAgcHJpdmF0ZSBNdWx0aW1hcDxTdHJpbmcsID8+IGV4dHJhY3RQYXJhbXMoZmluYWwgQXVkaXQgbm90ZSwgZmluYWwgR2Vycml0Q2FsbCBjYWxsKSB7CisgICAgTXVsdGltYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKworICAgIE9iamVjdFtdIHBhcmFtcyA9IGNhbGwuZ2V0UGFyYW1zKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGFyZ3MucHV0KCIkIiArIGksIHBhcmFtc1tpXSk7CisgICAgfQorCiAgICAgZm9yIChpbnQgaWR4IDogbm90ZS5vYmZ1c2NhdGUoKSkgewotICAgICAgYXJncy5zZXQoaWR4LCAiKioqKioiKTsKKyAgICAgIGFyZ3MucmVtb3ZlQWxsKCIkIiArIGlkeCk7CisgICAgICBhcmdzLnB1dCgiJCIgKyBpZHgsICIqKioqKiIpOwogICAgIH0KICAgICByZXR1cm4gYXJnczsKICAgfQogCi0gIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RXaGF0KGZpbmFsIEF1ZGl0IG5vdGUsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RXaGF0KGZpbmFsIEF1ZGl0IG5vdGUsIGZpbmFsIEdlcnJpdENhbGwgY2FsbCkgeworICAgIFN0cmluZyBtZXRob2RDbGFzcyA9IGNhbGwuZ2V0TWV0aG9kQ2xhc3MoKS5nZXROYW1lKCk7CisgICAgbWV0aG9kQ2xhc3MgPSBtZXRob2RDbGFzcy5zdWJzdHJpbmcobWV0aG9kQ2xhc3MubGFzdEluZGV4T2YoIi4iKSsxKTsKICAgICBTdHJpbmcgd2hhdCA9IG5vdGUuYWN0aW9uKCk7CiAgICAgaWYgKHdoYXQubGVuZ3RoKCkgPT0gMCkgewotICAgICAgYm9vbGVhbiBjY2FzZSA9IENoYXJhY3Rlci5pc0xvd2VyQ2FzZShtZXRob2ROYW1lLmNoYXJBdCgwKSk7Ci0KLSAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2ROYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgY2hhciBjID0gbWV0aG9kTmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgIGlmIChjY2FzZSAmJiAhQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgIH0KLSAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0gICAgICB9Ci0gICAgICB3aGF0ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgIHdoYXQgPSBjYWxsLmdldE1ldGhvZCgpLmdldE5hbWUoKTsKICAgICB9CiAKLSAgICByZXR1cm4gd2hhdDsKKyAgICByZXR1cm4gbWV0aG9kQ2xhc3MgKyAiLiIgKyB3aGF0OwogICB9CiAKICAgc3RhdGljIGNsYXNzIEdlcnJpdENhbGwgZXh0ZW5kcyBBY3RpdmVDYWxsIHsKICAgICBwcml2YXRlIGZpbmFsIFdlYlNlc3Npb24gc2Vzc2lvbjsKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgd2hlbjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCByZXN1bHRGaWVsZDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCBtZXRob2RGaWVsZDsKIAogICAgIC8vIE5lZWRlZCB0byBhbGxvdyBhY2Nlc3MgdG8gbm9uLXB1YmxpYyByZXN1bHQgZmllbGQgaW4gR1dUL0pTT04tUlBDCiAgICAgc3RhdGljIHsKKyAgICAgIHJlc3VsdEZpZWxkID0gZ2V0UHJpdmF0ZUZpZWxkKEFjdGl2ZUNhbGwuY2xhc3MsICJyZXN1bHQiKTsKKyAgICAgIG1ldGhvZEZpZWxkID0gZ2V0UHJpdmF0ZUZpZWxkKE1ldGhvZEhhbmRsZS5jbGFzcywgIm1ldGhvZCIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpZWxkIGdldFByaXZhdGVGaWVsZChDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGZpZWxkTmFtZSkgewogICAgICAgRmllbGQgZGVjbGFyZWRGaWVsZCA9IG51bGw7CiAgICAgICB0cnkgewotICAgICAgICBkZWNsYXJlZEZpZWxkID0gQWN0aXZlQ2FsbC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJyZXN1bHQiKTsKKyAgICAgICAgZGVjbGFyZWRGaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKICAgICAgICAgZGVjbGFyZWRGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gZXhwb3NlIFJQUy9KU09OIHJlc3VsdCBmaWVsZCIpOwogICAgICAgfQorICAgICAgcmV0dXJuIGRlY2xhcmVkRmllbGQ7CisgICAgfQogCi0gICAgICByZXN1bHRGaWVsZCA9IGRlY2xhcmVkRmllbGQ7CisgICAgLy8gU3Vycm9nYXRlIG9mIHRoZSBtaXNzaW5nIGdldE1ldGhvZENsYXNzKCkgaW4gR1dUL0pTT04tUlBDCisgICAgcHVibGljIENsYXNzPD8+IGdldE1ldGhvZENsYXNzKCkgeworICAgICAgaWYgKG1ldGhvZEZpZWxkID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisKKyAgICAgIHRyeSB7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBtZXRob2RGaWVsZC5nZXQodGhpcy5nZXRNZXRob2QoKSk7CisgICAgICAgIHJldHVybiBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGFjY2VzcyByZXN1bHQgZmllbGQiKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICBsb2cuZXJyb3IoIk5vIHBlcm1pc3Npb25zIHRvIGFjY2VzcyByZXN1bHQgZmllbGQiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLy8gU3Vycm9nYXRlIG9mIHRoZSBtaXNzaW5nIGdldFJlc3VsdCgpIGluIEdXVC9KU09OLVJQQwpAQCAtMjQ2LDExICsyNzIsMTMgQEAKICAgICAgICAgLy8KICAgICAgICAgcmV0dXJuICFzZXNzaW9uLmlzU2lnbmVkSW4oKTsKIAotICAgICAgfSBlbHNlIHsKKyAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi5pc1NpZ25lZEluKCkgJiYgc2Vzc2lvbi5pc1ZhbGlkWEdlcnJpdEF1dGgoa2V5SW4pKSB7CiAgICAgICAgIC8vIFRoZSBzZXNzaW9uIG11c3QgZXhpc3QsIGFuZCBtdXN0IGJlIHVzaW5nIHRoaXMgdG9rZW4uCiAgICAgICAgIC8vCi0gICAgICAgIHJldHVybiBzZXNzaW9uLmlzU2lnbmVkSW4oKSAmJiBzZXNzaW9uLmlzVG9rZW5WYWxpZChrZXlJbik7CisgICAgICAgIHNlc3Npb24uZ2V0Q3VycmVudFVzZXIoKS5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguSlNPTl9SUEMpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBwdWJsaWMgV2ViU2Vzc2lvbiBnZXRXZWJTZXNzaW9uKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL1JwY1NlcnZsZXRNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ScGNTZXJ2bGV0TW9kdWxlLmphdmEKaW5kZXggODc2ZmVlMy4uOTUzYmM3MSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL1JwY1NlcnZsZXRNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvUnBjU2VydmxldE1vZHVsZS5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qKiBCaW5kcyB7QGxpbmsgUmVtb3RlSnNvblNlcnZpY2V9IGltcGxlbWVudGF0aW9ucyB0byBhIEpTT04gc2VydmxldC4gKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBScGNTZXJ2bGV0TW9kdWxlIGV4dGVuZHMgU2VydmxldE1vZHVsZSB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICIvZ2Vycml0L3JwYy8iOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiL2dlcnJpdF91aS9ycGMvIjsKIAogICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmVmaXg7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9TdWdnZXN0U2VydmljZUltcGwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9TdWdnZXN0U2VydmljZUltcGwuamF2YQppbmRleCAxYmFhNDliLi41NTljMjcwIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvU3VnZ2VzdFNlcnZpY2VJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL1N1Z2dlc3RTZXJ2aWNlSW1wbC5qYXZhCkBAIC0zMyw4ICszMyw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFZpc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwTWVtYmVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBvc3RSZXZpZXdlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkFkZFJldmlld2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CkBAIC0yMjQsMTYgKzIyNCwyNyBAQAogICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfQotICAgICAgICBWaXNpYmlsaXR5Q29udHJvbCB2aXNpYmlsaXR5Q29udHJvbCA9IG5ldyBWaXNpYmlsaXR5Q29udHJvbCgpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoQWNjb3VudCBhY2NvdW50KSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIElkZW50aWZpZWRVc2VyIHdobyA9Ci0gICAgICAgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShyZXZpZXdEYlByb3ZpZGVyLCBhY2NvdW50LmdldElkKCkpOwotICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGNoYW5nZUNvbnRyb2wgZGlyZWN0bHkgYXMgaXQgd29uJ3Qgc3VnZ2VzdCByZXZpZXdlcnMKLSAgICAgICAgICAgIC8vIHRvIGRyYWZ0cwotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZUNvbnRyb2wuZm9yVXNlcih3aG8pLmlzUmVmVmlzaWJsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfTsKKworICAgICAgICBWaXNpYmlsaXR5Q29udHJvbCB2aXNpYmlsaXR5Q29udHJvbDsKKyAgICAgICAgaWYgKGNoYW5nZUNvbnRyb2wuZ2V0UmVmQ29udHJvbCgpLmlzVmlzaWJsZUJ5UmVnaXN0ZXJlZFVzZXJzKCkpIHsKKyAgICAgICAgICB2aXNpYmlsaXR5Q29udHJvbCA9IG5ldyBWaXNpYmlsaXR5Q29udHJvbCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKEFjY291bnQgYWNjb3VudCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdmlzaWJpbGl0eUNvbnRyb2wgPSBuZXcgVmlzaWJpbGl0eUNvbnRyb2woKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZShBY2NvdW50IGFjY291bnQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgICAgICAgICBJZGVudGlmaWVkVXNlciB3aG8gPQorICAgICAgICAgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShyZXZpZXdEYlByb3ZpZGVyLCBhY2NvdW50LmdldElkKCkpOworICAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1c2UgY2hhbmdlQ29udHJvbCBkaXJlY3RseSBhcyBpdCB3b24ndCBzdWdnZXN0IHJldmlld2VycworICAgICAgICAgICAgICAvLyB0byBkcmFmdHMKKyAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZUNvbnRyb2wuZm9yVXNlcih3aG8pLmlzUmVmVmlzaWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH07CisgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBMaXN0PEFjY291bnRJbmZvPiBzdWdnZXN0ZWRBY2NvdW50cyA9CiAgICAgICAgICAgICBzdWdnZXN0QWNjb3VudChkYiwgcXVlcnksIEJvb2xlYW4uVFJVRSwgbGltaXQsIHZpc2liaWxpdHlDb250cm9sKTsKQEAgLTI2MiwxMyArMjczLDEzIEBACiAKICAgcHJpdmF0ZSBib29sZWFuIHN1Z2dlc3RHcm91cEFzUmV2aWV3ZXIoZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3QsCiAgICAgICBmaW5hbCBHcm91cFJlZmVyZW5jZSBncm91cCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgaWYgKCFBZGRSZXZpZXdlci5pc0xlZ2FsUmV2aWV3ZXJHcm91cChncm91cC5nZXRVVUlEKCkpKSB7CisgICAgaWYgKCFQb3N0UmV2aWV3ZXJzLmlzTGVnYWxSZXZpZXdlckdyb3VwKGdyb3VwLmdldFVVSUQoKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgZmluYWwgU2V0PEFjY291bnQ+IG1lbWJlcnMgPQotICAgICAgICAgIGdyb3VwTWVtYmVyc0ZhY3RvcnkuY3JlYXRlKCkubGlzdEFjY291bnRzKGdyb3VwLmdldFVVSUQoKSwgcHJvamVjdCk7CisgICAgICBmaW5hbCBTZXQ8QWNjb3VudD4gbWVtYmVycyA9IGdyb3VwTWVtYmVyc0ZhY3RvcnkuY3JlYXRlKGdldEN1cnJlbnRVc2VyKCkpCisgICAgICAgICAgLmxpc3RBY2NvdW50cyhncm91cC5nZXRVVUlEKCksIHByb2plY3QpOwogCiAgICAgICBpZiAobWVtYmVycy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjc2LDcgKzI4Nyw3IEBACiAKICAgICAgIGZpbmFsIGludCBtYXhBbGxvd2VkID0KICAgICAgICAgICBjZmcuZ2V0SW50KCJhZGRyZXZpZXdlciIsICJtYXhBbGxvd2VkIiwKLSAgICAgICAgICAgICAgQWRkUmV2aWV3ZXIuREVGQVVMVF9NQVhfUkVWSUVXRVJTKTsKKyAgICAgICAgICAgICAgUG9zdFJldmlld2Vycy5ERUZBVUxUX01BWF9SRVZJRVdFUlMpOwogICAgICAgaWYgKG1heEFsbG93ZWQgPiAwICYmIG1lbWJlcnMuc2l6ZSgpID4gbWF4QWxsb3dlZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzYzIwOS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuYWNjb3VudDsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9BQ0NPVU5UOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5GTFVTSF9DQUNIRVM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuS0lMTF9UQVNLOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlBSSU9SSVRZOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlNUQVJUX1JFUExJQ0FUSU9OOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlZJRVdfQ0FDSEVTOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlZJRVdfQ09OTkVDVElPTlM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuVklFV19RVUVVRTsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuUmVzdEFwaVNlcnZsZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5RdWV1ZVByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwotCi1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLUBTaW5nbGV0b24KLXB1YmxpYyBjbGFzcyBBY2NvdW50Q2FwYWJpbGl0aWVzU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyUGFyc2VyIHBhcmFtUGFyc2VyOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEltcGw+IGZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBBY2NvdW50Q2FwYWJpbGl0aWVzU2VydmxldChmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBQYXJhbWV0ZXJQYXJzZXIgcGFyYW1QYXJzZXIsIFByb3ZpZGVyPEltcGw+IGZhY3RvcnkpIHsKLSAgICBzdXBlcihjdXJyZW50VXNlcik7Ci0gICAgdGhpcy5wYXJhbVBhcnNlciA9IHBhcmFtUGFyc2VyOwotICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEltcGwgaW1wbCA9IGZhY3RvcnkuZ2V0KCk7Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIGltcGwuZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LkpTT05fQ09NUEFDVDsKLSAgICB9Ci0gICAgaWYgKHBhcmFtUGFyc2VyLnBhcnNlKGltcGwsIHJlcSwgcmVzKSkgewotICAgICAgaW1wbC5jb21wdXRlKCk7Ci0KLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihidWYsICJVVEYtOCIpOwotICAgICAgaWYgKGltcGwuZm9ybWF0LmlzSnNvbigpKSB7Ci0gICAgICAgIHJlcy5zZXRDb250ZW50VHlwZShKU09OX1RZUEUpOwotICAgICAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7Ci0gICAgICAgIGltcGwuZm9ybWF0Lm5ld0dzb24oKS50b0pzb24oCi0gICAgICAgICAgICBpbXBsLmhhdmUsCi0gICAgICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIE9iamVjdD4+KCkge30uZ2V0VHlwZSgpLAotICAgICAgICAgICAgb3V0KTsKLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIGJ1Zi53cml0ZSgnXG4nKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZSA6IGltcGwuaGF2ZS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgb3V0LndyaXRlKGUuZ2V0S2V5KCkpOwotICAgICAgICAgIGlmICghKGUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoIjogIik7Ci0gICAgICAgICAgICBvdXQud3JpdGUoZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQud3JpdGUoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICB9Ci0gICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7Ci0gICAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIEltcGwgewotICAgIHByaXZhdGUgZmluYWwgQ2FwYWJpbGl0eUNvbnRyb2wgY2M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGhhdmU7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiLS1mb3JtYXQiLCBtZXRhVmFyID0gIkZNVCIsIHVzYWdlID0gIk91dHB1dCBkaXNwbGF5IGZvcm1hdCIpCi0gICAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7Ci0KLSAgICBAT3B0aW9uKG5hbWUgPSAiLXEiLCBtZXRhVmFyID0gIkNBUCIsIG11bHRpVmFsdWVkID0gdHJ1ZSwgdXNhZ2UgPSAiQ2FwYWJpbGl0eSB0byBpbnNwZWN0IikKLSAgICB2b2lkIGFkZFF1ZXJ5KFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAocXVlcnkgPT0gbnVsbCkgewotICAgICAgICBxdWVyeSA9IFNldHMubmV3SGFzaFNldCgpOwotICAgICAgfQotICAgICAgcXVlcnkuYWRkKG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gcXVlcnk7Ci0KLSAgICBASW5qZWN0Ci0gICAgSW1wbChDdXJyZW50VXNlciB1c2VyKSB7Ci0gICAgICBjYyA9IHVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7Ci0gICAgICBoYXZlID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7Ci0gICAgfQotCi0gICAgdm9pZCBjb21wdXRlKCkgewotICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IEdsb2JhbENhcGFiaWxpdHkuZ2V0QWxsTmFtZXMoKSkgewotICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKFBSSU9SSVRZKSAmJiB3YW50KG5hbWUpICYmIGNjLmNhblBlcmZvcm0obmFtZSkpIHsKLSAgICAgICAgICBpZiAoR2xvYmFsQ2FwYWJpbGl0eS5oYXNSYW5nZShuYW1lKSkgewotICAgICAgICAgICAgaGF2ZS5wdXQobmFtZSwgbmV3IFJhbmdlKGNjLmdldFJhbmdlKG5hbWUpKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhdmUucHV0KG5hbWUsIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBoYXZlLnB1dChDUkVBVEVfQUNDT1VOVCwgY2MuY2FuQ3JlYXRlQWNjb3VudCgpKTsKLSAgICAgIGhhdmUucHV0KENSRUFURV9HUk9VUCwgY2MuY2FuQ3JlYXRlR3JvdXAoKSk7Ci0gICAgICBoYXZlLnB1dChDUkVBVEVfUFJPSkVDVCwgY2MuY2FuQ3JlYXRlUHJvamVjdCgpKTsKLSAgICAgIGhhdmUucHV0KEtJTExfVEFTSywgY2MuY2FuS2lsbFRhc2soKSk7Ci0gICAgICBoYXZlLnB1dChWSUVXX0NBQ0hFUywgY2MuY2FuVmlld0NhY2hlcygpKTsKLSAgICAgIGhhdmUucHV0KEZMVVNIX0NBQ0hFUywgY2MuY2FuRmx1c2hDYWNoZXMoKSk7Ci0gICAgICBoYXZlLnB1dChWSUVXX0NPTk5FQ1RJT05TLCBjYy5jYW5WaWV3Q29ubmVjdGlvbnMoKSk7Ci0gICAgICBoYXZlLnB1dChWSUVXX1FVRVVFLCBjYy5jYW5WaWV3UXVldWUoKSk7Ci0gICAgICBoYXZlLnB1dChTVEFSVF9SRVBMSUNBVElPTiwgY2MuY2FuU3RhcnRSZXBsaWNhdGlvbigpKTsKLQotICAgICAgUXVldWVQcm92aWRlci5RdWV1ZVR5cGUgcXVldWUgPSBjYy5nZXRRdWV1ZVR5cGUoKTsKLSAgICAgIGlmIChxdWV1ZSAhPSBRdWV1ZVByb3ZpZGVyLlF1ZXVlVHlwZS5JTlRFUkFDVElWRQotICAgICAgICAgIHx8IChxdWVyeSAhPSBudWxsICYmIHF1ZXJ5LmNvbnRhaW5zKFBSSU9SSVRZKSkpIHsKLSAgICAgICAgaGF2ZS5wdXQoUFJJT1JJVFksIHF1ZXVlKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gaXRyID0gaGF2ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRyLmhhc05leHQoKSkgewotICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGUgPSBpdHIubmV4dCgpOwotICAgICAgICBpZiAoIXdhbnQoZS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICBpdHIucmVtb3ZlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQm9vbGVhbiAmJiAhKChCb29sZWFuKSBlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgaXRyLnJlbW92ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdhbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAgIHJldHVybiBxdWVyeSA9PSBudWxsIHx8IHF1ZXJ5LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmFuZ2UgewotICAgIHByaXZhdGUgdHJhbnNpZW50IFBlcm1pc3Npb25SYW5nZSByYW5nZTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIGludCBtaW47Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBpbnQgbWF4OwotCi0gICAgUmFuZ2UoUGVybWlzc2lvblJhbmdlIHIpIHsKLSAgICAgIHJhbmdlID0gcjsKLSAgICAgIG1pbiA9IHIuZ2V0TWluKCk7Ci0gICAgICBtYXggPSByLmdldE1heCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcmFuZ2UudG9TdHJpbmcoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRNb2R1bGUuamF2YQppbmRleCA5NTdmMzM5Li5iZWY2MzE2IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50TW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudE1vZHVsZS5qYXZhCkBAIC0zMCwxOCArMzAsMTIgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICBmYWN0b3J5KEFncmVlbWVudEluZm9GYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwotICAgICAgICBmYWN0b3J5KENyZWF0ZUdyb3VwLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KERlbGV0ZUV4dGVybmFsSWRzLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KEV4dGVybmFsSWREZXRhaWxGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwotICAgICAgICBmYWN0b3J5KEdyb3VwRGV0YWlsSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShNeUdyb3Vwc0ZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoUmVnaXN0ZXJOZXdFbWFpbFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZW5hbWVHcm91cC5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShWaXNpYmxlR3JvdXBzSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKICAgICAgIH0KICAgICB9KTsKICAgICBycGMoQWNjb3VudFNlY3VyaXR5SW1wbC5jbGFzcyk7CiAgICAgcnBjKEFjY291bnRTZXJ2aWNlSW1wbC5jbGFzcyk7Ci0gICAgcnBjKEdyb3VwQWRtaW5TZXJ2aWNlSW1wbC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRTZWN1cml0eUltcGwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRTZWN1cml0eUltcGwuamF2YQppbmRleCBiNjJhMTBiLi4xMTg0NmQzIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50U2VjdXJpdHlJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudFNlY3VyaXR5SW1wbC5qYXZhCkBAIC0xOCwxMCArMTgsMTAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50U2VjdXJpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ29udHJpYnV0b3JBZ3JlZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Db250YWN0SW5mb3JtYXRpb25TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZFNzaEtleUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKQEAgLTQ3LDcgKzQ3LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5SZWFsbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbnRhY3QuQ29udGFjdFN0b3JlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsVG9rZW5WZXJpZmllcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWdpc3Rlck5ld0VtYWlsU2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKQEAgLTg2LDcgKzg1LDYgQEAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VVc2VyTmFtZS5DdXJyZW50VXNlciBjaGFuZ2VVc2VyTmFtZUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgRGVsZXRlRXh0ZXJuYWxJZHMuRmFjdG9yeSBkZWxldGVFeHRlcm5hbElkc0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgRXh0ZXJuYWxJZERldGFpbEZhY3RvcnkuRmFjdG9yeSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBNeUdyb3Vwc0ZhY3RvcnkuRmFjdG9yeSBteUdyb3Vwc0ZhY3Rvcnk7CiAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKICAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CkBAIC0xMDQsNyArMTAyLDYgQEAKICAgICAgIGZpbmFsIENoYW5nZVVzZXJOYW1lLkN1cnJlbnRVc2VyIGNoYW5nZVVzZXJOYW1lRmFjdG9yeSwKICAgICAgIGZpbmFsIERlbGV0ZUV4dGVybmFsSWRzLkZhY3RvcnkgZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5LAogICAgICAgZmluYWwgRXh0ZXJuYWxJZERldGFpbEZhY3RvcnkuRmFjdG9yeSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeSwKLSAgICAgIGZpbmFsIE15R3JvdXBzRmFjdG9yeS5GYWN0b3J5IG15R3JvdXBzRmFjdG9yeSwKICAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUpIHsKICAgICBzdXBlcihzY2hlbWEsIGN1cnJlbnRVc2VyKTsKICAgICBjb250YWN0U3RvcmUgPSBjczsKQEAgLTEyNiw3ICsxMjMsNiBAQAogICAgIHRoaXMuY2hhbmdlVXNlck5hbWVGYWN0b3J5ID0gY2hhbmdlVXNlck5hbWVGYWN0b3J5OwogICAgIHRoaXMuZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5ID0gZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5OwogICAgIHRoaXMuZXh0ZXJuYWxJZERldGFpbEZhY3RvcnkgPSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLm15R3JvdXBzRmFjdG9yeSA9IG15R3JvdXBzRmFjdG9yeTsKICAgICB0aGlzLmhvb2tzID0gaG9va3M7CiAgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKICAgfQpAQCAtMTkxLDcgKzE4Nyw4IEBACiAgICAgaWYgKHJlYWxtLmFsbG93c0VkaXQoQWNjb3VudC5GaWVsZE5hbWUuVVNFUl9OQU1FKSkgewogICAgICAgSGFuZGxlci53cmFwKGNoYW5nZVVzZXJOYW1lRmFjdG9yeS5jcmVhdGUobmV3TmFtZSkpLnRvKGNhbGxiYWNrKTsKICAgICB9IGVsc2UgewotICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7CisgICAgICBjYWxsYmFjay5vbkZhaWx1cmUobmV3IFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oIk5vdCBhbGxvd2VkIHRvIGNoYW5nZSIKKyAgICAgICAgICArICIgdXNlcm5hbWUiKSk7CiAgICAgfQogICB9CiAKQEAgLTIxMSwxNiArMjA4LDYgQEAKICAgICBleHRlcm5hbElkRGV0YWlsRmFjdG9yeS5jcmVhdGUoKS50byhjYWxsYmFjayk7CiAgIH0KIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgbXlHcm91cHMoZmluYWwgQXN5bmNDYWxsYmFjazxMaXN0PEFjY291bnRHcm91cD4+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPExpc3Q8QWNjb3VudEdyb3VwPj4oKSB7Ci0gICAgICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXA+IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIHJldHVybiBteUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCkuY2FsbCgpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KICAgcHVibGljIHZvaWQgZGVsZXRlRXh0ZXJuYWxJZHMoZmluYWwgU2V0PEFjY291bnRFeHRlcm5hbElkLktleT4ga2V5cywKICAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8U2V0PEFjY291bnRFeHRlcm5hbElkLktleT4+IGNhbGxiYWNrKSB7CiAgICAgZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5LmNyZWF0ZShrZXlzKS50byhjYWxsYmFjayk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZDU2MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRzUmVzdEFwaVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQWNjb3VudHNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBBY2NvdW50c1Jlc3RBcGlTZXJ2bGV0KFJlc3RBcGlTZXJ2bGV0Lkdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBhY2NvdW50cyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0NyZWF0ZUdyb3VwLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9DcmVhdGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmViZDA0Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0NyZWF0ZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybUNyZWF0ZUdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1jbGFzcyBDcmVhdGVHcm91cCBleHRlbmRzIEhhbmRsZXI8QWNjb3VudEdyb3VwLklkPiB7Ci0gIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBDcmVhdGVHcm91cCBjcmVhdGUoU3RyaW5nIGdyb3VwTmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFBlcmZvcm1DcmVhdGVHcm91cC5GYWN0b3J5IHBlcmZvcm1DcmVhdGVHcm91cEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lOwotCi0gIEBJbmplY3QKLSAgQ3JlYXRlR3JvdXAoZmluYWwgUGVyZm9ybUNyZWF0ZUdyb3VwLkZhY3RvcnkgcGVyZm9ybUNyZWF0ZUdyb3VwRmFjdG9yeSwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIEBBc3Npc3RlZCBmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0gICAgdGhpcy5wZXJmb3JtQ3JlYXRlR3JvdXBGYWN0b3J5ID0gcGVyZm9ybUNyZWF0ZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLnVzZXIgPSB1c2VyOwotICAgIHRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbiwKLSAgICAgIFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gewotICAgIGZpbmFsIFBlcmZvcm1DcmVhdGVHcm91cCBwZXJmb3JtQ3JlYXRlR3JvdXAgPSBwZXJmb3JtQ3JlYXRlR3JvdXBGYWN0b3J5LmNyZWF0ZSgpOwotICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSB1c2VyLmdldEFjY291bnRJZCgpOwotICAgIHJldHVybiBwZXJmb3JtQ3JlYXRlR3JvdXAuY3JlYXRlR3JvdXAoZ3JvdXBOYW1lLCBudWxsLCBmYWxzZSwgbnVsbCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lKSwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0dyb3VwQWRtaW5TZXJ2aWNlSW1wbC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBBZG1pblNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTJlMDUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBBZG1pblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBBZG1pblNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwT3B0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkluYWN0aXZlQWNjb3VudEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEFjY291bnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hFbnRpdHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXF1ZXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmRzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwSW5jbHVkZUNhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWNsYXNzIEdyb3VwQWRtaW5TZXJ2aWNlSW1wbCBleHRlbmRzIEJhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24gaW1wbGVtZW50cwotICAgIEdyb3VwQWRtaW5TZXJ2aWNlIHsKLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOwotICBwcml2YXRlIGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXI7Ci0gIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0aFR5cGUgYXV0aFR5cGU7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOwotICBwcml2YXRlIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIENyZWF0ZUdyb3VwLkZhY3RvcnkgY3JlYXRlR3JvdXBGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJlbmFtZUdyb3VwLkZhY3RvcnkgcmVuYW1lR3JvdXBGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEdyb3VwRGV0YWlsSGFuZGxlci5GYWN0b3J5IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBWaXNpYmxlR3JvdXBzSGFuZGxlci5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgR3JvdXBBZG1pblNlcnZpY2VJbXBsKGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBzY2hlbWEsCi0gICAgICBmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAotICAgICAgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGUsCi0gICAgICBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIsCi0gICAgICBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcsCi0gICAgICBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCi0gICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAotICAgICAgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIENyZWF0ZUdyb3VwLkZhY3RvcnkgY3JlYXRlR3JvdXBGYWN0b3J5LAotICAgICAgZmluYWwgUmVuYW1lR3JvdXAuRmFjdG9yeSByZW5hbWVHcm91cEZhY3RvcnksCi0gICAgICBmaW5hbCBHcm91cERldGFpbEhhbmRsZXIuRmFjdG9yeSBncm91cERldGFpbEZhY3RvcnksCi0gICAgICBmaW5hbCBWaXNpYmxlR3JvdXBzSGFuZGxlci5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5KSB7Ci0gICAgc3VwZXIoc2NoZW1hLCBjdXJyZW50VXNlcik7Ci0gICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7Ci0gICAgdGhpcy5ncm91cEluY2x1ZGVDYWNoZSA9IGdyb3VwSW5jbHVkZUNhY2hlOwotICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOwotICAgIHRoaXMuYWNjb3VudE1hbmFnZXIgPSBhY2NvdW50TWFuYWdlcjsKLSAgICB0aGlzLmF1dGhUeXBlID0gYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpOwotICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7Ci0gICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7Ci0gICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmNyZWF0ZUdyb3VwRmFjdG9yeSA9IGNyZWF0ZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLnJlbmFtZUdyb3VwRmFjdG9yeSA9IHJlbmFtZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLnZpc2libGVHcm91cHNGYWN0b3J5ID0gdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpYmxlR3JvdXBzKGZpbmFsIEFzeW5jQ2FsbGJhY2s8R3JvdXBMaXN0PiBjYWxsYmFjaykgewotICAgIHZpc2libGVHcm91cHNGYWN0b3J5LmNyZWF0ZSgpLnRvKGNhbGxiYWNrKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUdyb3VwKGZpbmFsIFN0cmluZyBuZXdOYW1lLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxBY2NvdW50R3JvdXAuSWQ+IGNhbGxiYWNrKSB7Ci0gICAgY3JlYXRlR3JvdXBGYWN0b3J5LmNyZWF0ZShuZXdOYW1lKS50byhjYWxsYmFjayk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBncm91cERldGFpbChBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlELAotICAgICAgQXN5bmNDYWxsYmFjazxHcm91cERldGFpbD4gY2FsbGJhY2spIHsKLSAgICBpZiAoZ3JvdXBJZCA9PSBudWxsICYmIGdyb3VwVVVJRCAhPSBudWxsKSB7Ci0gICAgICBBY2NvdW50R3JvdXAgZyA9IGdyb3VwQ2FjaGUuZ2V0KGdyb3VwVVVJRCk7Ci0gICAgICBpZiAoZyAhPSBudWxsKSB7Ci0gICAgICAgIGdyb3VwSWQgPSBnLmdldElkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBEZXNjcmlwdGlvbihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBJZCk7Ci0gICAgICAgIGFzc2VydEFtR3JvdXBPd25lcihkYiwgZ3JvdXApOwotICAgICAgICBncm91cC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIGRiLmFjY291bnRHcm91cHMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdyb3VwKSk7Ci0gICAgICAgIGdyb3VwQ2FjaGUuZXZpY3QoZ3JvdXApOwotICAgICAgICByZXR1cm4gVm9pZFJlc3VsdC5JTlNUQU5DRTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNoYW5nZUdyb3VwT3B0aW9ucyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIEdyb3VwT3B0aW9ucyBncm91cE9wdGlvbnMsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248Vm9pZFJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgVm9pZFJlc3VsdCBydW4oZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KGdyb3VwSWQpOwotICAgICAgICBhc3NlcnRBbUdyb3VwT3duZXIoZGIsIGdyb3VwKTsKLSAgICAgICAgZ3JvdXAuc2V0VmlzaWJsZVRvQWxsKGdyb3VwT3B0aW9ucy5pc1Zpc2libGVUb0FsbCgpKTsKLSAgICAgICAgZGIuYWNjb3VudEdyb3VwcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ3JvdXApKTsKLSAgICAgICAgZ3JvdXBDYWNoZS5ldmljdChncm91cCk7Ci0gICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBPd25lcihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBuZXdPd25lck5hbWUsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248Vm9pZFJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgVm9pZFJlc3VsdCBydW4oZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KGdyb3VwSWQpOwotICAgICAgICBhc3NlcnRBbUdyb3VwT3duZXIoZGIsIGdyb3VwKTsKLQotICAgICAgICBHcm91cFJlZmVyZW5jZSBvd25lciA9Ci0gICAgICAgICAgICBHcm91cEJhY2tlbmRzLmZpbmRFeGFjdFN1Z2dlc3Rpb24oZ3JvdXBCYWNrZW5kLCBuZXdPd25lck5hbWUpOwotICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBncm91cC5zZXRPd25lckdyb3VwVVVJRChvd25lci5nZXRVVUlEKCkpOwotICAgICAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOwotICAgICAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW5hbWVHcm91cChmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIG5ld05hbWUsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjaykgewotICAgIHJlbmFtZUdyb3VwRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCwgbmV3TmFtZSkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBUeXBlKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgQWNjb3VudEdyb3VwLlR5cGUgbmV3VHlwZSwgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBJZCk7Ci0gICAgICAgIGFzc2VydEFtR3JvdXBPd25lcihkYiwgZ3JvdXApOwotICAgICAgICBncm91cC5zZXRUeXBlKG5ld1R5cGUpOwotICAgICAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOwotICAgICAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRHcm91cE1lbWJlcihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBuYW1lT3JFbWFpbCwgZmluYWwgQXN5bmNDYWxsYmFjazxHcm91cERldGFpbD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248R3JvdXBEZXRhaWw+KCkgewotICAgICAgcHVibGljIEdyb3VwRGV0YWlsIHJ1bihSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gZ3JvdXBDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwQ2FjaGUuZ2V0KGdyb3VwSWQpLmdldFR5cGUoKSAhPSBBY2NvdW50R3JvdXAuVHlwZS5JTlRFUk5BTCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBY2NvdW50IGEgPSBmaW5kQWNjb3VudChuYW1lT3JFbWFpbCk7Ci0gICAgICAgIGlmICghYS5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IEluYWN0aXZlQWNjb3VudEV4Y2VwdGlvbihhLmdldEZ1bGxOYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWNvbnRyb2wuY2FuQWRkTWVtYmVyKGEuZ2V0SWQoKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrZXkgPQotICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlci5LZXkoYS5nZXRJZCgpLCBncm91cElkKTsKLSAgICAgICAgQWNjb3VudEdyb3VwTWVtYmVyIG0gPSBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICBtID0gbmV3IEFjY291bnRHcm91cE1lbWJlcihrZXkpOwotICAgICAgICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpLmluc2VydCgKLSAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLAotICAgICAgICAgICAgICAgICAgZ2V0QWNjb3VudElkKCkpKSk7Ci0gICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obSkpOwotICAgICAgICAgIGFjY291bnRDYWNoZS5ldmljdChtLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBncm91cERldGFpbEZhY3RvcnkuY3JlYXRlKGdyb3VwSWQpLmNhbGwoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEdyb3VwSW5jbHVkZShmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBncm91cE5hbWUsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8R3JvdXBEZXRhaWw+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgIHB1YmxpYyBHcm91cERldGFpbCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUsCi0gICAgICAgICAgTm9TdWNoR3JvdXBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBHcm91cENvbnRyb2wgY29udHJvbCA9IGdyb3VwQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoZ3JvdXBJZCk7Ci0gICAgICAgIGlmIChncm91cENhY2hlLmdldChncm91cElkKS5nZXRUeXBlKCkgIT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwIGEgPSBmaW5kR3JvdXAoZ3JvdXBOYW1lKTsKLSAgICAgICAgaWYgKCFjb250cm9sLmNhbkFkZEdyb3VwKGEuZ2V0SWQoKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZS5LZXkga2V5ID0KLSAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlLktleShncm91cElkLCBhLmdldElkKCkpOwotICAgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlIG0gPSBkYi5hY2NvdW50R3JvdXBJbmNsdWRlcygpLmdldChrZXkpOwotICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgbSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlKGtleSk7Ci0gICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLmluc2VydCgKLSAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQobSwKLSAgICAgICAgICAgICAgICAgIGdldEFjY291bnRJZCgpKSkpOwotICAgICAgICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtKSk7Ci0gICAgICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RJbmNsdWRlKGEuZ2V0R3JvdXBVVUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkuY2FsbCgpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVsZXRlR3JvdXBNZW1iZXJzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgU2V0PEFjY291bnRHcm91cE1lbWJlci5LZXk+IGtleXMsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPFZvaWRSZXN1bHQ+KCkgewotICAgICAgcHVibGljIFZvaWRSZXN1bHQgcnVuKGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgICAgIE5vU3VjaEdyb3VwRXhjZXB0aW9uLCBGYWlsdXJlIHsKLSAgICAgICAgZmluYWwgR3JvdXBDb250cm9sIGNvbnRyb2wgPSBncm91cENvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGdyb3VwSWQpOwotICAgICAgICBpZiAoZ3JvdXBDYWNoZS5nZXQoZ3JvdXBJZCkuZ2V0VHlwZSgpICE9IEFjY291bnRHcm91cC5UeXBlLklOVEVSTkFMKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrIDoga2V5cykgewotICAgICAgICAgIGlmICghZ3JvdXBJZC5lcXVhbHMoay5nZXRBY2NvdW50R3JvdXBJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEVudGl0eUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gZ2V0QWNjb3VudElkKCk7Ci0gICAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrIDoga2V5cykgewotICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBtID0gZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmdldChrKTsKLSAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWNvbnRyb2wuY2FuUmVtb3ZlTWVtYmVyKG0uZ2V0QWNjb3VudElkKCkpKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjY291bnRHcm91cE1lbWJlckF1ZGl0IGF1ZGl0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQgYSA6IGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpCi0gICAgICAgICAgICAgICAgLmJ5R3JvdXBBY2NvdW50KG0uZ2V0QWNjb3VudEdyb3VwSWQoKSwgbS5nZXRBY2NvdW50SWQoKSkpIHsKLSAgICAgICAgICAgICAgaWYgKGEuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgIGF1ZGl0ID0gYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBhdWRpdC5yZW1vdmVkKG1lKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVyc0F1ZGl0KCkKLSAgICAgICAgICAgICAgICAgIC51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGF1ZGl0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBhdWRpdCA9IG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLCBtZSk7Ci0gICAgICAgICAgICAgIGF1ZGl0LnJlbW92ZWRMZWdhY3koKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVyc0F1ZGl0KCkKLSAgICAgICAgICAgICAgICAgIC5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGF1ZGl0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG0pKTsKLSAgICAgICAgICAgIGFjY291bnRDYWNoZS5ldmljdChtLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkZWxldGVHcm91cEluY2x1ZGVzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgU2V0PEFjY291bnRHcm91cEluY2x1ZGUuS2V5PiBrZXlzLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gZ3JvdXBDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwQ2FjaGUuZ2V0KGdyb3VwSWQpLmdldFR5cGUoKSAhPSBBY2NvdW50R3JvdXAuVHlwZS5JTlRFUk5BTCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGsgOiBrZXlzKSB7Ci0gICAgICAgICAgaWYgKCFncm91cElkLmVxdWFscyhrLmdldEdyb3VwSWQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGdldEFjY291bnRJZCgpOwotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLklkPiBncm91cHNUb0V2aWN0ID0gbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwLklkPigpOwotICAgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGsgOiBrZXlzKSB7Ci0gICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBtID0KLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKS5nZXQoayk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFjb250cm9sLmNhblJlbW92ZUdyb3VwKG0uZ2V0SW5jbHVkZUlkKCkpKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBhdWRpdCA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBhIDogZGIKLSAgICAgICAgICAgICAgICAuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLmJ5R3JvdXBJbmNsdWRlKAotICAgICAgICAgICAgICAgICAgICBtLmdldEdyb3VwSWQoKSwgbS5nZXRJbmNsdWRlSWQoKSkpIHsKLSAgICAgICAgICAgICAgaWYgKGEuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgIGF1ZGl0ID0gYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBhdWRpdC5yZW1vdmVkKG1lKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLnVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhdWRpdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG0pKTsKLSAgICAgICAgICAgIGdyb3Vwc1RvRXZpY3QuYWRkKGsuZ2V0SW5jbHVkZUlkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEFjY291bnRHcm91cCBncm91cCA6IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBzVG9FdmljdCkpIHsKLSAgICAgICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdEluY2x1ZGUoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEFtR3JvdXBPd25lcihmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwKQotICAgICAgdGhyb3dzIEZhaWx1cmUgewotICAgIHRyeSB7Ci0gICAgICBpZiAoIWdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cC5nZXRJZCgpKS5pc093bmVyKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEdyb3VwRXhjZXB0aW9uKGdyb3VwLmdldElkKCkpKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXAuZ2V0SWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgQWNjb3VudCBmaW5kQWNjb3VudChmaW5hbCBTdHJpbmcgbmFtZU9yRW1haWwpIHRocm93cyBPcm1FeGNlcHRpb24sCi0gICAgICBGYWlsdXJlIHsKLSAgICBBY2NvdW50IHIgPSBhY2NvdW50UmVzb2x2ZXIuZmluZChuYW1lT3JFbWFpbCk7Ci0gICAgaWYgKHIgPT0gbnVsbCkgewotICAgICAgc3dpdGNoIChhdXRoVHlwZSkgewotICAgICAgICBjYXNlIEhUVFBfTERBUDoKLSAgICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKLSAgICAgICAgY2FzZSBMREFQOgotICAgICAgICAgIHIgPSBjcmVhdGVBY2NvdW50QnlMZGFwKG5hbWVPckVtYWlsKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgIH0KLSAgICAgIGlmIChyID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEFjY291bnRFeGNlcHRpb24obmFtZU9yRW1haWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICBwcml2YXRlIEFjY291bnQgY3JlYXRlQWNjb3VudEJ5TGRhcChTdHJpbmcgdXNlcikgewotICAgIGlmICghdXNlci5tYXRjaGVzKEFjY291bnQuVVNFUl9OQU1FX1BBVFRFUk4pKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgZmluYWwgQXV0aFJlcXVlc3QgcmVxID0gQXV0aFJlcXVlc3QuZm9yVXNlcih1c2VyKTsKLSAgICAgIHJlcS5zZXRTa2lwQXV0aGVudGljYXRpb24odHJ1ZSk7Ci0gICAgICByZXR1cm4gYWNjb3VudENhY2hlLmdldChhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUocmVxKS5nZXRBY2NvdW50SWQoKSkKLSAgICAgICAgICAuZ2V0QWNjb3VudCgpOwotICAgIH0gY2F0Y2ggKEFjY291bnRFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBBY2NvdW50R3JvdXAgZmluZEdyb3VwKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgRmFpbHVyZSB7Ci0gICAgZmluYWwgQWNjb3VudEdyb3VwIGcgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkobmFtZSkpOwotICAgIGlmIChnID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbihuYW1lKSk7Ci0gICAgfQotICAgIHJldHVybiBnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0dyb3VwRGV0YWlsSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBEZXRhaWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzQyMTguLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBEZXRhaWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBEZXRhaWxGYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1wdWJsaWMgY2xhc3MgR3JvdXBEZXRhaWxIYW5kbGVyIGV4dGVuZHMgSGFuZGxlcjxHcm91cERldGFpbD4gewotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEdyb3VwRGV0YWlsSGFuZGxlciBjcmVhdGUoQWNjb3VudEdyb3VwLklkIGdyb3VwSWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZDsKLQotICBASW5qZWN0Ci0gIEdyb3VwRGV0YWlsSGFuZGxlcihmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQpIHsKLSAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBHcm91cERldGFpbCBjYWxsKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgTm9TdWNoR3JvdXBFeGNlcHRpb24gewotICAgIHJldHVybiBncm91cERldGFpbEZhY3RvcnkuY3JlYXRlKGdyb3VwSWQpLmNhbGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvTXlHcm91cHNGYWN0b3J5LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9NeUdyb3Vwc0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjZTM3MS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9NeUdyb3Vwc0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuYWNjb3VudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuVmlzaWJsZUdyb3VwczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1jbGFzcyBNeUdyb3Vwc0ZhY3RvcnkgZXh0ZW5kcyBIYW5kbGVyPExpc3Q8QWNjb3VudEdyb3VwPj4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgTXlHcm91cHNGYWN0b3J5IGNyZWF0ZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKLQotICBASW5qZWN0Ci0gIE15R3JvdXBzRmFjdG9yeShmaW5hbCBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3RvcnksIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIpIHsKLSAgICB0aGlzLnZpc2libGVHcm91cHNGYWN0b3J5ID0gdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gICAgdGhpcy51c2VyID0gdXNlcjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXA+IGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgVmlzaWJsZUdyb3VwcyB2aXNpYmxlR3JvdXBzID0gdmlzaWJsZUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCk7Ci0gICAgcmV0dXJuIHZpc2libGVHcm91cHMuZ2V0KHVzZXIpLmdldEdyb3VwcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9SZW5hbWVHcm91cC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvUmVuYW1lR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYWY5ZS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9SZW5hbWVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybVJlbmFtZUdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1jbGFzcyBSZW5hbWVHcm91cCBleHRlbmRzIEhhbmRsZXI8R3JvdXBEZXRhaWw+IHsKLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFJlbmFtZUdyb3VwIGNyZWF0ZShBY2NvdW50R3JvdXAuSWQgaWQsIFN0cmluZyBuZXdOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUGVyZm9ybVJlbmFtZUdyb3VwLkZhY3RvcnkgcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBuZXdOYW1lOwotCi0gIEBJbmplY3QKLSAgUmVuYW1lR3JvdXAoZmluYWwgUGVyZm9ybVJlbmFtZUdyb3VwLkZhY3RvcnkgcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQEFzc2lzdGVkIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgdGhpcy5wZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5ID0gcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEdyb3VwRGV0YWlsIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24sCi0gICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgSW52YWxpZE5hbWVFeGNlcHRpb24gewotICAgIHJldHVybiBwZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5LmNyZWF0ZSgpLnJlbmFtZUdyb3VwKGdyb3VwSWQsIG5ld05hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9WaXNpYmxlR3JvdXBzSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvVmlzaWJsZUdyb3Vwc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmOTFmNy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9WaXNpYmxlR3JvdXBzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlZpc2libGVHcm91cHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotCi1wdWJsaWMgY2xhc3MgVmlzaWJsZUdyb3Vwc0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPEdyb3VwTGlzdD4gewotCi0gIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBWaXNpYmxlR3JvdXBzSGFuZGxlciBjcmVhdGUoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgVmlzaWJsZUdyb3Vwcy5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgVmlzaWJsZUdyb3Vwc0hhbmRsZXIoZmluYWwgVmlzaWJsZUdyb3Vwcy5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5KSB7Ci0gICAgdGhpcy52aXNpYmxlR3JvdXBzRmFjdG9yeSA9IHZpc2libGVHcm91cHNGYWN0b3J5OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBHcm91cExpc3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHJldHVybiB2aXNpYmxlR3JvdXBzRmFjdG9yeS5jcmVhdGUoKS5nZXQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9DaGFuZ2VzUmVzdEFwaVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2UvQ2hhbmdlc1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MTBiOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2UvQ2hhbmdlc1Jlc3RBcGlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlc0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENoYW5nZXNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBDaGFuZ2VzUmVzdEFwaVNlcnZsZXQoUmVzdEFwaVNlcnZsZXQuR2xvYmFscyBnbG9iYWxzLAorICAgICAgUHJvdmlkZXI8Q2hhbmdlc0NvbGxlY3Rpb24+IGNoYW5nZXMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBjaGFuZ2VzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9EZXByZWNhdGVkQ2hhbmdlUXVlcnlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQppbmRleCBjZjQ0M2U3Li5kYTIxYzUxIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQpAQCAtNzMsNiArNzMsNyBAQAogICAgIHAuc2V0SW5jbHVkZUN1cnJlbnRQYXRjaFNldChnZXQocmVxLCAiY3VycmVudC1wYXRjaC1zZXQiLCBmYWxzZSkpOwogICAgIHAuc2V0SW5jbHVkZVBhdGNoU2V0cyhnZXQocmVxLCAicGF0Y2gtc2V0cyIsIGZhbHNlKSk7CiAgICAgcC5zZXRJbmNsdWRlQXBwcm92YWxzKGdldChyZXEsICJhbGwtYXBwcm92YWxzIiwgZmFsc2UpKTsKKyAgICBwLnNldEluY2x1ZGVGaWxlcyhnZXQocmVxLCAiZmlsZXMiLCBmYWxzZSkpOwogICAgIHAuc2V0T3V0cHV0KHJzcC5nZXRPdXRwdXRTdHJlYW0oKSwgZm9ybWF0KTsKICAgICBwLnF1ZXJ5KGdldChyZXEsICJxIiwgInN0YXR1czpvcGVuIikpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0xpc3RDaGFuZ2VzU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9MaXN0Q2hhbmdlc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMWQ0My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0xpc3RDaGFuZ2VzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2U7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5SZXN0QXBpU2VydmxldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkxpc3RDaGFuZ2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1AU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgTGlzdENoYW5nZXNTZXJ2bGV0IGV4dGVuZHMgUmVzdEFwaVNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RDaGFuZ2VzU2VydmxldC5jbGFzcyk7Ci0gIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyUGFyc2VyIHBhcmFtUGFyc2VyOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RDaGFuZ2VzPiBmYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgTGlzdENoYW5nZXNTZXJ2bGV0KGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdXJyZW50VXNlciwKLSAgICAgIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlciwgUHJvdmlkZXI8TGlzdENoYW5nZXM+IGxzKSB7Ci0gICAgc3VwZXIoY3VycmVudFVzZXIpOwotICAgIHRoaXMucGFyYW1QYXJzZXIgPSBwYXJhbVBhcnNlcjsKLSAgICB0aGlzLmZhY3RvcnkgPSBsczsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgTGlzdENoYW5nZXMgaW1wbCA9IGZhY3RvcnkuZ2V0KCk7Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIGltcGwuc2V0Rm9ybWF0KE91dHB1dEZvcm1hdC5KU09OX0NPTVBBQ1QpOwotICAgIH0KLSAgICBpZiAocGFyYW1QYXJzZXIucGFyc2UoaW1wbCwgcmVxLCByZXMpKSB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgaWYgKGltcGwuZ2V0Rm9ybWF0KCkuaXNKc29uKCkpIHsKLSAgICAgICAgYnVmLndyaXRlKEpTT05fTUFHSUMpOwotICAgICAgfQotCi0gICAgICBXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCAiVVRGLTgiKSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbXBsLnF1ZXJ5KG91dCk7Ci0gICAgICB9IGNhdGNoIChRdWVyeVBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgc2VuZFRleHQocmVxLCByZXMsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLmVycm9yKCJFcnJvciBxdWVyeWluZyAvY2hhbmdlcy8iLCBlKTsKLSAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICByZXMuc2V0Q29udGVudFR5cGUoaW1wbC5nZXRGb3JtYXQoKS5pc0pzb24oKSA/IEpTT05fVFlQRSA6ICJ0ZXh0L3BsYWluIik7Ci0gICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7Ci0gICAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2VIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTA4ODUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9BYmFuZG9uQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLkFiYW5kb25DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1jbGFzcyBBYmFuZG9uQ2hhbmdlSGFuZGxlciBleHRlbmRzIEhhbmRsZXI8Q2hhbmdlRGV0YWlsPiB7Ci0KLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEFiYW5kb25DaGFuZ2VIYW5kbGVyIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFiYW5kb25DaGFuZ2U+IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7Ci0gIEBOdWxsYWJsZQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOwotCi0gIEBJbmplY3QKLSAgQWJhbmRvbkNoYW5nZUhhbmRsZXIoZmluYWwgUHJvdmlkZXI8QWJhbmRvbkNoYW5nZT4gYWJhbmRvbkNoYW5nZVByb3ZpZGVyLAotICAgICAgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKLSAgICAgIEBBc3Npc3RlZCBATnVsbGFibGUgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICB0aGlzLmFiYW5kb25DaGFuZ2VQcm92aWRlciA9IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sCi0gICAgICBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBBYmFuZG9uQ2hhbmdlIGFiYW5kb25DaGFuZ2UgPSBhYmFuZG9uQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgYWJhbmRvbkNoYW5nZS5zZXRDaGFuZ2VJZChwYXRjaFNldElkLmdldFBhcmVudEtleSgpKTsKLSAgICBhYmFuZG9uQ2hhbmdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IGFiYW5kb25DaGFuZ2UuY2FsbCgpOwotICAgIGlmIChyZXN1bHQuZ2V0RXJyb3JzKCkuc2l6ZSgpID4gMCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihyZXN1bHQuZ2V0Q2hhbmdlSWQoKSk7Ci0gICAgfQotICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXN1bHQuZ2V0Q2hhbmdlSWQoKSkuY2FsbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZURldGFpbEZhY3RvcnkuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCmluZGV4IDY2NjBhM2QuLjEyMGI5YWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCkBAIC0xNCw5ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZWRldGFpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKQEAgLTI3LDcgKzI0LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKQEAgLTM2LDE1ICszMiwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUHJvamVjdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm9DYWNoZUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5SZWJhc2VDaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlT3A7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuQ2F0ZWdvcnlGdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuRnVuY3Rpb25TdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNjksOSArNjUsNyBAQAogICAgIENoYW5nZURldGFpbEZhY3RvcnkgY3JlYXRlKENoYW5nZS5JZCBpZCk7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgRnVuY3Rpb25TdGF0ZS5GYWN0b3J5IGZ1bmN0aW9uU3RhdGU7CiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXREZXRhaWxGYWN0b3J5LkZhY3RvcnkgcGF0Y2hTZXREZXRhaWw7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljOwogICBwcml2YXRlIGZpbmFsIEFub255bW91c1VzZXIgYW5vbnltb3VzVXNlcjsKQEAgLTg3LDkgKzgxLDEyIEBACiAgIHByaXZhdGUgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeTsKICAgcHJpdmF0ZSBib29sZWFuIHRlc3RNZXJnZTsKIAorICBwcml2YXRlIExpc3Q8UGF0Y2hTZXRBbmNlc3Rvcj4gY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzOworICBwcml2YXRlIExpc3Q8UGF0Y2hTZXQ+IGN1cnJlbnREZXBQYXRjaFNldHM7CisgIHByaXZhdGUgTGlzdDxDaGFuZ2U+IGN1cnJlbnREZXBDaGFuZ2VzOworCiAgIEBJbmplY3QKLSAgQ2hhbmdlRGV0YWlsRmFjdG9yeShmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZSwKKyAgQ2hhbmdlRGV0YWlsRmFjdG9yeSgKICAgICAgIGZpbmFsIFBhdGNoU2V0RGV0YWlsRmFjdG9yeS5GYWN0b3J5IHBhdGNoU2V0RGV0YWlsLCBmaW5hbCBSZXZpZXdEYiBkYiwKICAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAogICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LApAQCAtOTgsOCArOTUsNiBAQAogICAgICAgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeSwKICAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZywKICAgICAgIEBBc3Npc3RlZCBmaW5hbCBDaGFuZ2UuSWQgaWQpIHsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwotICAgIHRoaXMuZnVuY3Rpb25TdGF0ZSA9IGZ1bmN0aW9uU3RhdGU7CiAgICAgdGhpcy5wYXRjaFNldERldGFpbCA9IHBhdGNoU2V0RGV0YWlsOwogICAgIHRoaXMuZGIgPSBkYjsKICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CkBAIC0xMTYsNyArMTExLDcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwKICAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKICAgICBjb250cm9sID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwogICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBjb250cm9sLmdldENoYW5nZSgpOwogICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoID0gZGIucGF0Y2hTZXRzKCkuZ2V0KGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKQEAgLTE0MSw5ICsxMzYsOSBAQAogCiAgICAgZGV0YWlsLnNldENhblJldmVydChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5NRVJHRUQgJiYgY29udHJvbC5jYW5BZGRQYXRjaFNldCgpKTsKIAotICAgIGRldGFpbC5zZXRDYW5SZWJhc2UoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpICYmIGNvbnRyb2wuY2FuUmViYXNlKCkpOwotCiAgICAgZGV0YWlsLnNldENhbkVkaXQoY29udHJvbC5nZXRSZWZDb250cm9sKCkuY2FuV3JpdGUoKSk7CisgICAgZGV0YWlsLnNldENhbkVkaXRDb21taXRNZXNzYWdlKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSAmJiBjb250cm9sLmNhbkFkZFBhdGNoU2V0KCkpOworICAgIGRldGFpbC5zZXRDYW5FZGl0VG9waWNOYW1lKGNvbnRyb2wuY2FuRWRpdFRvcGljTmFtZSgpKTsKIAogICAgIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzID0gY29udHJvbC5nZXRTdWJtaXRSZWNvcmRzKGRiLCBwYXRjaCk7CiAgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjIDogc3VibWl0UmVjb3JkcykgewpAQCAtMTYxLDYgKzE1Niw4IEBACiAgICAgfQogICAgIGRldGFpbC5zZXRTdWJtaXRSZWNvcmRzKHN1Ym1pdFJlY29yZHMpOwogCisgICAgZGV0YWlsLnNldFN1Ym1pdFR5cGVSZWNvcmQoY29udHJvbC5nZXRTdWJtaXRUeXBlUmVjb3JkKGRiLCBwYXRjaCkpOworCiAgICAgcGF0Y2hzZXRzQnlJZCA9IG5ldyBIYXNoTWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldD4oKTsKICAgICBsb2FkUGF0Y2hTZXRzKCk7CiAgICAgbG9hZE1lc3NhZ2VzKCk7CkBAIC0xNjgsNiArMTY1LDExIEBACiAgICAgICBsb2FkQ3VycmVudFBhdGNoU2V0KCk7CiAgICAgfQogICAgIGxvYWQoKTsKKworICAgIGRldGFpbC5zZXRDYW5SZWJhc2UoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpICYmCisgICAgICAgIGNvbnRyb2wuY2FuUmViYXNlKCkgJiYKKyAgICAgICAgUmViYXNlQ2hhbmdlLmNhbkRvUmViYXNlKGRiLCBjaGFuZ2UsIHJlcG9NYW5hZ2VyLAorICAgICAgICAgICAgY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzLCBjdXJyZW50RGVwUGF0Y2hTZXRzLCBjdXJyZW50RGVwQ2hhbmdlcykpOwogICAgIGRldGFpbC5zZXRBY2NvdW50cyhhaWMuY3JlYXRlKCkpOwogICAgIHJldHVybiBkZXRhaWw7CiAgIH0KQEAgLTIwNSw1MyArMjA3LDEzIEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGxvYWQoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24geworICBwcml2YXRlIHZvaWQgbG9hZCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKKyAgICAgIE5vU3VjaFByb2plY3RFeGNlcHRpb24gewogICAgIGZpbmFsIENoYW5nZS5TdGF0dXMgc3RhdHVzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpOwogICAgIGlmICgoc3RhdHVzLmVxdWFscyhDaGFuZ2UuU3RhdHVzLk5FVykgfHwgc3RhdHVzLmVxdWFscyhDaGFuZ2UuU3RhdHVzLkRSQUZUKSkgJiYKICAgICAgICAgdGVzdE1lcmdlKSB7CiAgICAgICBDaGFuZ2VVdGlsLnRlc3RNZXJnZShvcEZhY3RvcnksIGRldGFpbC5nZXRDaGFuZ2UoKSk7CiAgICAgfQotCi0gICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCA9IGRldGFpbC5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzID0KLSAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkudG9MaXN0KCk7Ci0KLSAgICBpZiAoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0gZnVuY3Rpb25TdGF0ZS5jcmVhdGUoY29udHJvbCwgcHNJZCwgYWxsQXBwcm92YWxzKTsKLQotICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgYXQgOiBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgICBDYXRlZ29yeUZ1bmN0aW9uLmZvckNhdGVnb3J5KGF0LmdldENhdGVnb3J5KCkpLnJ1bihhdCwgZnMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXJzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpIC8vCi0gICAgICAgICYmIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyOwotICAgIGZpbmFsIEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+IGFkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+KCk7Ci0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGNhIDogYWxsQXBwcm92YWxzKSB7Ci0gICAgICBBcHByb3ZhbERldGFpbCBkID0gYWQuZ2V0KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGlmIChkID09IG51bGwpIHsKLSAgICAgICAgZCA9IG5ldyBBcHByb3ZhbERldGFpbChjYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIGQuc2V0Q2FuUmVtb3ZlKGNhblJlbW92ZVJldmlld2Vycyk7Ci0gICAgICAgIGFkLnB1dChkLmdldEFjY291bnQoKSwgZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5jYW5SZW1vdmUoKSkgewotICAgICAgICBkLnNldENhblJlbW92ZShjb250cm9sLmNhblJlbW92ZVJldmlld2VyKGNhKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2EuZ2V0UGF0Y2hTZXRJZCgpLmVxdWFscyhwc0lkKSkgewotICAgICAgICBkLmFkZChjYSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgQWNjb3VudC5JZCBvd25lciA9IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRPd25lcigpOwotICAgIGlmIChhZC5jb250YWluc0tleShvd25lcikpIHsKLSAgICAgIC8vIEVuc3VyZSB0aGUgb3duZXIgYWx3YXlzIHNvcnRzIHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlCi0gICAgICAvLwotICAgICAgYWQuZ2V0KG93bmVyKS5zb3J0Rmlyc3QoKTsKLSAgICB9Ci0KLSAgICBhaWMud2FudChhZC5rZXlTZXQoKSk7Ci0gICAgZGV0YWlsLnNldEFwcHJvdmFscyhhZC52YWx1ZXMoKSk7CiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gaXNSZXZpZXdlcihDaGFuZ2UgY2hhbmdlKSB7CkBAIC0yNjYsNiArMjI4LDggQEAKICAgcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50UGF0Y2hTZXQoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAogICAgICAgTm9TdWNoRW50aXR5RXhjZXB0aW9uLCBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sCiAgICAgICBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24geworICAgIGN1cnJlbnREZXBQYXRjaFNldHMgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0PigpOworICAgIGN1cnJlbnREZXBDaGFuZ2VzID0gbmV3IEFycmF5TGlzdDxDaGFuZ2U+KCk7CiAgICAgZmluYWwgUGF0Y2hTZXQgY3VycmVudFBhdGNoID0gZmluZEN1cnJlbnRPckxhdGVzdFBhdGNoU2V0KCk7CiAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCA9IGN1cnJlbnRQYXRjaC5nZXRJZCgpOwogICAgIGZpbmFsIFBhdGNoU2V0RGV0YWlsRmFjdG9yeSBsb2FkZXIgPSBwYXRjaFNldERldGFpbC5jcmVhdGUobnVsbCwgcHNJZCwgbnVsbCk7CkBAIC0yNzgsOCArMjQyLDEwIEBACiAgICAgZmluYWwgSGFzaE1hcDxDaGFuZ2UuSWQsUGF0Y2hTZXQuSWQ+IGFuY2VzdG9yUGF0Y2hJZHMgPQogICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsUGF0Y2hTZXQuSWQ+KCk7CiAgICAgZmluYWwgTGlzdDxDaGFuZ2UuSWQ+IGFuY2VzdG9yT3JkZXIgPSBuZXcgQXJyYXlMaXN0PENoYW5nZS5JZD4oKTsKLSAgICBmb3IgKFBhdGNoU2V0QW5jZXN0b3IgYSA6IGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuYW5jZXN0b3JzT2YocHNJZCkpIHsKKyAgICBjdXJyZW50UGF0Y2hTZXRBbmNlc3RvcnMgPSBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmFuY2VzdG9yc09mKHBzSWQpLnRvTGlzdCgpOworICAgIGZvciAoUGF0Y2hTZXRBbmNlc3RvciBhIDogY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzKSB7CiAgICAgICBmb3IgKFBhdGNoU2V0IHAgOiBkYi5wYXRjaFNldHMoKS5ieVJldmlzaW9uKGEuZ2V0QW5jZXN0b3JSZXZpc2lvbigpKSkgeworICAgICAgICBjdXJyZW50RGVwUGF0Y2hTZXRzLmFkZChwKTsKICAgICAgICAgZmluYWwgQ2hhbmdlLklkIGNrID0gcC5nZXRJZCgpLmdldFBhcmVudEtleSgpOwogICAgICAgICBpZiAoY2hhbmdlc1RvR2V0LmFkZChjaykpIHsKICAgICAgICAgICBhbmNlc3RvclBhdGNoSWRzLnB1dChjaywgcC5nZXRJZCgpKTsKQEAgLTMxMyw2ICsyNzksNyBAQAogICAgIGZvciAoZmluYWwgQ2hhbmdlLklkIGEgOiBhbmNlc3Rvck9yZGVyKSB7CiAgICAgICBmaW5hbCBDaGFuZ2UgYWMgPSBtLmdldChhKTsKICAgICAgIGlmIChhYyAhPSBudWxsICYmIGFjLmdldFByb2plY3QoKS5lcXVhbHMoZGV0YWlsLmdldENoYW5nZSgpLmdldFByb2plY3QoKSkpIHsKKyAgICAgICAgY3VycmVudERlcENoYW5nZXMuYWRkKGFjKTsKICAgICAgICAgaWYgKGFjLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBDaGFuZ2UuU1RBVFVTX0RSQUZUCiAgICAgICAgICAgICB8fCBhYy5nZXRPd25lcigpLmVxdWFscyhjdXJyZW50VXNlcklkKQogICAgICAgICAgICAgfHwgaXNSZXZpZXdlcihhYykpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTWFuYWdlU2VydmljZUltcGwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTWFuYWdlU2VydmljZUltcGwuamF2YQppbmRleCBmOTk5MjFiLi41M2UwZDlkIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1hbmFnZVNlcnZpY2VJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9DaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbC5qYXZhCkBAIC0xNyw0NCArMTcsMjcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlTWFuYWdlU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0LklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBjbGFzcyBDaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIENoYW5nZU1hbmFnZVNlcnZpY2UgewotICBwcml2YXRlIGZpbmFsIFN1Ym1pdEFjdGlvbi5GYWN0b3J5IHN1Ym1pdEFjdGlvbjsKLSAgcHJpdmF0ZSBmaW5hbCBBYmFuZG9uQ2hhbmdlSGFuZGxlci5GYWN0b3J5IGFiYW5kb25DaGFuZ2VIYW5kbGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZWJhc2VDaGFuZ2UuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJlc3RvcmVDaGFuZ2VIYW5kbGVyLkZhY3RvcnkgcmVzdG9yZUNoYW5nZUhhbmRsZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmVydENoYW5nZS5GYWN0b3J5IHJldmVydENoYW5nZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUmViYXNlQ2hhbmdlSGFuZGxlci5GYWN0b3J5IHJlYmFzZUNoYW5nZUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUHVibGlzaEFjdGlvbi5GYWN0b3J5IHB1Ymxpc2hBY3Rpb247CiAgIHByaXZhdGUgZmluYWwgRGVsZXRlRHJhZnRDaGFuZ2UuRmFjdG9yeSBkZWxldGVEcmFmdENoYW5nZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLkZhY3RvcnkgZWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyRmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIENoYW5nZU1hbmFnZVNlcnZpY2VJbXBsKGZpbmFsIFN1Ym1pdEFjdGlvbi5GYWN0b3J5IHBhdGNoU2V0QWN0aW9uLAotICAgICAgZmluYWwgQWJhbmRvbkNoYW5nZUhhbmRsZXIuRmFjdG9yeSBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBSZWJhc2VDaGFuZ2UuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5LAotICAgICAgZmluYWwgUmVzdG9yZUNoYW5nZUhhbmRsZXIuRmFjdG9yeSByZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBSZXZlcnRDaGFuZ2UuRmFjdG9yeSByZXZlcnRDaGFuZ2VGYWN0b3J5LAorICBDaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbCgKKyAgICAgIGZpbmFsIFJlYmFzZUNoYW5nZUhhbmRsZXIuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5LAogICAgICAgZmluYWwgUHVibGlzaEFjdGlvbi5GYWN0b3J5IHB1Ymxpc2hBY3Rpb24sCi0gICAgICBmaW5hbCBEZWxldGVEcmFmdENoYW5nZS5GYWN0b3J5IGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeSkgewotICAgIHRoaXMuc3VibWl0QWN0aW9uID0gcGF0Y2hTZXRBY3Rpb247Ci0gICAgdGhpcy5hYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnkgPSBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3Rvcnk7CisgICAgICBmaW5hbCBEZWxldGVEcmFmdENoYW5nZS5GYWN0b3J5IGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeSwKKyAgICAgIGZpbmFsIEVkaXRDb21taXRNZXNzYWdlSGFuZGxlci5GYWN0b3J5IGVkaXRDb21taXRNZXNzYWdlSGFuZGxlcikgewogICAgIHRoaXMucmViYXNlQ2hhbmdlRmFjdG9yeSA9IHJlYmFzZUNoYW5nZUZhY3Rvcnk7Ci0gICAgdGhpcy5yZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3RvcnkgPSByZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3Rvcnk7Ci0gICAgdGhpcy5yZXZlcnRDaGFuZ2VGYWN0b3J5ID0gcmV2ZXJ0Q2hhbmdlRmFjdG9yeTsKICAgICB0aGlzLnB1Ymxpc2hBY3Rpb24gPSBwdWJsaXNoQWN0aW9uOwogICAgIHRoaXMuZGVsZXRlRHJhZnRDaGFuZ2VGYWN0b3J5ID0gZGVsZXRlRHJhZnRDaGFuZ2VGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3VibWl0KGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2IpIHsKLSAgICBzdWJtaXRBY3Rpb24uY3JlYXRlKHBhdGNoU2V0SWQpLnRvKGNiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFiYW5kb25DaGFuZ2UoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKLSAgICBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQsIG1lc3NhZ2UpLnRvKGNhbGxiYWNrKTsKKyAgICB0aGlzLmVkaXRDb21taXRNZXNzYWdlSGFuZGxlckZhY3RvcnkgPSBlZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXI7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZWJhc2VDaGFuZ2UoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKQEAgLTYyLDE2ICs0NSw2IEBACiAgICAgcmViYXNlQ2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmV2ZXJ0Q2hhbmdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKSB7Ci0gICAgcmV2ZXJ0Q2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgbWVzc2FnZSkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZUNoYW5nZShmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjaykgewotICAgIHJlc3RvcmVDaGFuZ2VIYW5kbGVyRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgbWVzc2FnZSkudG8oY2FsbGJhY2spOwotICB9Ci0KICAgcHVibGljIHZvaWQgcHVibGlzaChmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAogICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKSB7CiAgICAgcHVibGlzaEFjdGlvbi5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwpAQCAtODEsNCArNTQsOSBAQAogICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewogICAgIGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwogICB9CisKKyAgcHVibGljIHZvaWQgY3JlYXRlTmV3UGF0Y2hTZXQoSWQgcGF0Y2hTZXRJZCwgU3RyaW5nIG1lc3NhZ2UsCisgICAgICBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKKyAgICBlZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXJGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkLCBtZXNzYWdlKS50byhjYWxsYmFjayk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1vZHVsZS5qYXZhCmluZGV4IGI2NzJhNDM5Li40OGMxM2MyIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTW9kdWxlLmphdmEKQEAgLTI4LDE1ICsyOCwxMiBAQAogICAgIGluc3RhbGwobmV3IEZhY3RvcnlNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgZmFjdG9yeShBYmFuZG9uQ2hhbmdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZXN0b3JlQ2hhbmdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZXZlcnRDaGFuZ2UuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoUmViYXNlQ2hhbmdlLkZhY3RvcnkuY2xhc3MpOworICAgICAgICBmYWN0b3J5KEVkaXRDb21taXRNZXNzYWdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKKyAgICAgICAgZmFjdG9yeShSZWJhc2VDaGFuZ2VIYW5kbGVyLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoSW5jbHVkZWRJbkRldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoUGF0Y2hTZXREZXRhaWxGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFBhdGNoU2V0UHVibGlzaERldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoU3VibWl0QWN0aW9uLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFB1Ymxpc2hBY3Rpb24uRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoRGVsZXRlRHJhZnRDaGFuZ2UuRmFjdG9yeS5jbGFzcyk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0Q2hhbmdlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0Q2hhbmdlLmphdmEKaW5kZXggZWNkOGI1NC4uNjNjMjJjZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9EZWxldGVEcmFmdENoYW5nZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRGVsZXRlRHJhZnRDaGFuZ2UuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogCiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKIApAQCAtNDYsMTIgKzQ2LDEyIEBACiAgIERlbGV0ZURyYWZ0Q2hhbmdlKGZpbmFsIFJldmlld0RiIGRiLAogICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAogICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkgewogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKIAogICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CiAgIH0KQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwogICAgIH0KIAotICAgIENoYW5nZVV0aWwuZGVsZXRlRHJhZnRDaGFuZ2UocGF0Y2hTZXRJZCwgZ2l0TWFuYWdlciwgcmVwbGljYXRpb24sIGRiKTsKKyAgICBDaGFuZ2VVdGlsLmRlbGV0ZURyYWZ0Q2hhbmdlKHBhdGNoU2V0SWQsIGdpdE1hbmFnZXIsIGdpdFJlZlVwZGF0ZWQsIGRiKTsKICAgICByZXR1cm4gVm9pZFJlc3VsdC5JTlNUQU5DRTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9FZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNjRjOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuVHJhY2tpbmdGb290ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLk5vU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitjbGFzcyBFZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4geworICBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyLkZhY3RvcnkgY29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlckZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOworICBwcml2YXRlIGZpbmFsIENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKKworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworCisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7CisgIHByaXZhdGUgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVyczsKKworICBASW5qZWN0CisgIEVkaXRDb21taXRNZXNzYWdlSGFuZGxlcihmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCisgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKKyAgICAgIGZpbmFsIENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuRmFjdG9yeSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAorICAgICAgQEFzc2lzdGVkIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MsCisgICAgICBmaW5hbCBDb21taXRWYWxpZGF0b3JzLkZhY3RvcnkgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnksCisgICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLAorICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsCisgICAgICBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWwsIFRyYWNraW5nRm9vdGVycyB0cmFja2luZ0Zvb3RlcnMpIHsKKyAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKKyAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OworICAgIHRoaXMuY29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlckZhY3RvcnkgPSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeTsKKworICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5jb21taXRWYWxpZGF0b3JzRmFjdG9yeSA9IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5OworICAgIHRoaXMuZ2l0TWFuYWdlciA9IGdpdE1hbmFnZXI7CisKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKKyAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOworICAgIHRoaXMudHJhY2tpbmdGb290ZXJzID0gdHJhY2tpbmdGb290ZXJzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOworICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuQWRkUGF0Y2hTZXQoKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIk5vdCBhbGxvd2VkIHRvIGFkZCBuZXcgUGF0Y2ggU2V0cyB0bzogIiArIGNoYW5nZUlkLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0OworICAgIHRyeSB7CisgICAgICBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpLmdldFByb2plY3QoKSk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQsIGUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgQ29tbWl0VmFsaWRhdG9ycyBjb21taXRWYWxpZGF0b3JzID0KKyAgICAgICAgICBjb21taXRWYWxpZGF0b3JzRmFjdG9yeS5jcmVhdGUoY29udHJvbC5nZXRSZWZDb250cm9sKCksIG5ldyBOb1NzaEluZm8oKSwgZ2l0KTsKKworICAgICAgQ2hhbmdlVXRpbC5lZGl0Q29tbWl0TWVzc2FnZShwYXRjaFNldElkLCBjb250cm9sLmdldFJlZkNvbnRyb2woKSwgY29tbWl0VmFsaWRhdG9ycywgY3VycmVudFVzZXIsIG1lc3NhZ2UsIGRiLAorICAgICAgICAgIGNvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXJGYWN0b3J5LCBob29rcywgZ2l0LCBwYXRjaFNldEluZm9GYWN0b3J5LCBnaXRSZWZVcGRhdGVkLCBteUlkZW50LAorICAgICAgICAgIGFwcHJvdmFsc1V0aWwsIHRyYWNraW5nRm9vdGVycyk7CisKKyAgICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShjaGFuZ2VJZCkuY2FsbCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUGF0Y2hTZXRQdWJsaXNoRGV0YWlsRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKaW5kZXggNTBiYWY5Ny4uZDAxMDFhNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKQEAgLTE0LDE4ICsxNCwxNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXRQdWJsaXNoRGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwpAQCAtMzQsMTQgKzMwLDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuQ2F0ZWdvcnlGdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuRnVuY3Rpb25TdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC01Myw5ICs0NSw3IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IGluZm9GYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uU3RhdGUuRmFjdG9yeSBmdW5jdGlvblN0YXRlOwogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXM7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljOwogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CiAKQEAgLTY5LDE1ICs1OSwxMSBAQAogICBQYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5KGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgaW5mb0ZhY3RvcnksCiAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwKICAgICAgIGZpbmFsIEFjY291bnRJbmZvQ2FjaGVGYWN0b3J5LkZhY3RvcnkgYWNjb3VudEluZm9DYWNoZUZhY3RvcnksCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZSwKICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkKSB7CiAgICAgdGhpcy5pbmZvRmFjdG9yeSA9IGluZm9GYWN0b3J5OwogICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmZ1bmN0aW9uU3RhdGUgPSBmdW5jdGlvblN0YXRlOwogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwogICAgIHRoaXMuYWljID0gYWNjb3VudEluZm9DYWNoZUZhY3RvcnkuY3JlYXRlKCk7CiAgICAgdGhpcy51c2VyID0gdXNlcjsKIApAQCAtMTAxLDkgKzg3LDYgQEAKICAgICBkZXRhaWwuc2V0Q2hhbmdlKGNoYW5nZSk7CiAgICAgZGV0YWlsLnNldERyYWZ0cyhkcmFmdHMpOwogCi0gICAgTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IGFsbG93ZWQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGdpdmVuID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpCiAgICAgICAgICYmIHBhdGNoU2V0SWQuZXF1YWxzKGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKSkgewogICAgICAgLy8gVE9ETyBQdXNoIHRoaXMgc2VsZWN0aW9uIG9mIGxhYmVscyBkb3duIGludG8gdGhlIFByb2xvZyBpbnRlcnByZXRlci4KQEAgLTEyMCwxMSArMTAzLDYgQEAKICAgICAgICAgICByYW5nZUJ5TmFtZS5wdXQoci5nZXRMYWJlbCgpLCByKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgYWxsb3dlZCA9IG5ldyBBcnJheUxpc3Q8UGVybWlzc2lvblJhbmdlPigpOwotCi0gICAgICBnaXZlbiA9IGRiLnBhdGNoU2V0QXBwcm92YWxzKCkgLy8KLSAgICAgICAgICAuYnlQYXRjaFNldFVzZXIocGF0Y2hTZXRJZCwgdXNlci5nZXRBY2NvdW50SWQoKSkgLy8KLSAgICAgICAgICAudG9MaXN0KCk7CiAKICAgICAgIGJvb2xlYW4gY291bGRTdWJtaXQgPSBmYWxzZTsKICAgICAgIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzID0gY29udHJvbC5jYW5TdWJtaXQoZGIsIHBhdGNoU2V0KTsKQEAgLTE0MiwxMiArMTIwLDggQEAKICAgICAgICAgICAgIGJvb2xlYW4gY2FuTWFrZU9rID0gZmFsc2U7CiAgICAgICAgICAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSByYW5nZUJ5TmFtZS5nZXQobGJsLmxhYmVsKTsKICAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGlmICghYWxsb3dlZC5jb250YWlucyhyYW5nZSkpIHsKLSAgICAgICAgICAgICAgICBhbGxvd2VkLmFkZChyYW5nZSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBBcHByb3ZhbFR5cGUgYXQgPSBhcHByb3ZhbFR5cGVzLmJ5TGFiZWwobGJsLmxhYmVsKTsKLSAgICAgICAgICAgICAgaWYgKGF0ID09IG51bGwgfHwgYXQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSA9PSByYW5nZS5nZXRNYXgoKSkgeworICAgICAgICAgICAgICBMYWJlbFR5cGUgbHQgPSBjb250cm9sLmdldExhYmVsVHlwZXMoKS5ieUxhYmVsKGxibC5sYWJlbCk7CisgICAgICAgICAgICAgIGlmIChsdCAhPSBudWxsICYmIGx0LmdldE1heCgpLmdldFZhbHVlKCkgPT0gcmFuZ2UuZ2V0TWF4KCkpIHsKICAgICAgICAgICAgICAgICBjYW5NYWtlT2sgPSB0cnVlOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNjMsNiArMTM3LDEwIEBACiAgICAgICAgICAgICAgICAgICBvaysrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIElNUE9TU0lCTEU6CisgICAgICAgICAgICAgIGNhc2UgUkVKRUNUOgorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIApAQCAtMTc2LDYwICsxNTQsMTEgQEAKICAgICAgIGlmIChjb3VsZFN1Ym1pdCAmJiBjb250cm9sLmdldFJlZkNvbnRyb2woKS5jYW5TdWJtaXQoKSkgewogICAgICAgICBkZXRhaWwuc2V0Q2FuU3VibWl0KHRydWUpOwogICAgICAgfQotCi0gICAgICBkZXRhaWwuc2V0U3VibWl0UmVjb3JkcyhzdWJtaXRSZWNvcmRzKTsKICAgICB9CiAKLSAgICBkZXRhaWwuc2V0TGFiZWxzKGFsbG93ZWQpOwotICAgIGRldGFpbC5zZXRHaXZlbihnaXZlbik7Ci0gICAgbG9hZEFwcHJvdmFscyhkZXRhaWwsIGNvbnRyb2wpOwotCisgICAgZGV0YWlsLnNldFN1Ym1pdFR5cGVSZWNvcmQoY29udHJvbC5nZXRTdWJtaXRUeXBlUmVjb3JkKGRiLCBwYXRjaFNldCkpOwogICAgIGRldGFpbC5zZXRBY2NvdW50cyhhaWMuY3JlYXRlKCkpOwogCiAgICAgcmV0dXJuIGRldGFpbDsKICAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkQXBwcm92YWxzKGZpbmFsIFBhdGNoU2V0UHVibGlzaERldGFpbCBkZXRhaWwsCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIFBhdGNoU2V0LklkIHBzSWQgPSBkZXRhaWwuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzID0KLSAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkudG9MaXN0KCk7Ci0KLSAgICBpZiAoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0gZnVuY3Rpb25TdGF0ZS5jcmVhdGUoY29udHJvbCwgcHNJZCwgYWxsQXBwcm92YWxzKTsKLQotICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgYXQgOiBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgICBDYXRlZ29yeUZ1bmN0aW9uLmZvckNhdGVnb3J5KGF0LmdldENhdGVnb3J5KCkpLnJ1bihhdCwgZnMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXJzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpIC8vCi0gICAgICAgICYmIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyOwotICAgIGZpbmFsIEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+IGFkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+KCk7Ci0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGNhIDogYWxsQXBwcm92YWxzKSB7Ci0gICAgICBBcHByb3ZhbERldGFpbCBkID0gYWQuZ2V0KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGlmIChkID09IG51bGwpIHsKLSAgICAgICAgZCA9IG5ldyBBcHByb3ZhbERldGFpbChjYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIGQuc2V0Q2FuUmVtb3ZlKGNhblJlbW92ZVJldmlld2Vycyk7Ci0gICAgICAgIGFkLnB1dChkLmdldEFjY291bnQoKSwgZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5jYW5SZW1vdmUoKSkgewotICAgICAgICBkLnNldENhblJlbW92ZShjb250cm9sLmNhblJlbW92ZVJldmlld2VyKGNhKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2EuZ2V0UGF0Y2hTZXRJZCgpLmVxdWFscyhwc0lkKSkgewotICAgICAgICBkLmFkZChjYSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgQWNjb3VudC5JZCBvd25lciA9IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRPd25lcigpOwotICAgIGlmIChhZC5jb250YWluc0tleShvd25lcikpIHsKLSAgICAgIC8vIEVuc3VyZSB0aGUgb3duZXIgYWx3YXlzIHNvcnRzIHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlCi0gICAgICBhZC5nZXQob3duZXIpLnNvcnRGaXJzdCgpOwotICAgIH0KLQotICAgIGFpYy53YW50KGFkLmtleVNldCgpKTsKLSAgICBkZXRhaWwuc2V0QXBwcm92YWxzKGFkLnZhbHVlcygpKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QdWJsaXNoQWN0aW9uLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQppbmRleCBmNTdiMjljLi4zOGY4ZmM2IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUHVibGlzaERyYWZ0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CkBAIC01Myw3ICs1NCw4IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgQ2hhbmdlRGV0YWlsIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sCiAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKLSAgICAgIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKICAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gcHVibGlzaEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKICAgICBpZiAocmVzdWx0LmdldEVycm9ycygpLnNpemUoKSA+IDApIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwdWJsaXNoIHBhdGNoc2V0Iik7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZTMwMi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFwcHJvdmFsc1V0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlYmFzZWRQYXRjaFNldFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1jbGFzcyBSZWJhc2VDaGFuZ2UgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmViYXNlQ2hhbmdlIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLQotICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tSdW5uZXIgaG9va3M7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7Ci0KLSAgQEluamVjdAotICBSZWJhc2VDaGFuZ2UoZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAotICAgICAgZmluYWwgUmV2aWV3RGIgZGIsIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLAotICAgICAgZmluYWwgUmViYXNlZFBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIENoYW5nZUhvb2tSdW5uZXIgaG9va3MsCi0gICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAotICAgICAgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsKSB7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0gICAgdGhpcy5yZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5ID0gcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLmhvb2tzID0gaG9va3M7Ci0gICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKLQotICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gICAgdGhpcy5yZXBsaWNhdGlvbiA9IHJlcGxpY2F0aW9uOwotICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7Ci0KLSAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKLSAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICBDaGFuZ2VVdGlsLnJlYmFzZUNoYW5nZShwYXRjaFNldElkLCBjdXJyZW50VXNlciwgZGIsCi0gICAgICAgIHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnksIGhvb2tzLCBnaXRNYW5hZ2VyLCBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgICByZXBsaWNhdGlvbiwgbXlJZGVudCwgY2hhbmdlQ29udHJvbEZhY3RvcnksIGFwcHJvdmFsc1V0aWwpOwotCi0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpLmNhbGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUmViYXNlQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIFJlYmFzZUNoYW5nZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4geworICBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgUmViYXNlQ2hhbmdlSGFuZGxlciBjcmVhdGUoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOworCisgIEBJbmplY3QKKyAgUmViYXNlQ2hhbmdlSGFuZGxlcihmaW5hbCBSZWJhc2VDaGFuZ2UgcmViYXNlQ2hhbmdlLAorICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkKSB7CisgICAgdGhpcy5yZWJhc2VDaGFuZ2UgPSByZWJhc2VDaGFuZ2U7CisgICAgdGhpcy5jdXJyZW50VXNlciA9IGN1cnJlbnRVc2VyOworICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7CisKKyAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgcmViYXNlQ2hhbmdlLnJlYmFzZShwYXRjaFNldElkLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CisgICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpLmNhbGwoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU3MWZkLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmVzdG9yZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5SZXN0b3JlQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotY2xhc3MgUmVzdG9yZUNoYW5nZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmVzdG9yZUNoYW5nZUhhbmRsZXIgY3JlYXRlKFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIFN0cmluZyBtZXNzYWdlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVzdG9yZUNoYW5nZT4gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLSAgQE51bGxhYmxlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgQEluamVjdAotICBSZXN0b3JlQ2hhbmdlSGFuZGxlcihmaW5hbCBQcm92aWRlcjxSZXN0b3JlQ2hhbmdlPiByZXN0b3JlQ2hhbmdlUHJvdmlkZXIsCi0gICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAotICAgICAgQEFzc2lzdGVkIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgIHRoaXMucmVzdG9yZUNoYW5nZVByb3ZpZGVyID0gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOwotICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIENoYW5nZURldGFpbCBjYWxsKCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAotICAgICAgRW1haWxFeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIFJlc3RvcmVDaGFuZ2UgcmVzdG9yZUNoYW5nZSA9IHJlc3RvcmVDaGFuZ2VQcm92aWRlci5nZXQoKTsKLSAgICByZXN0b3JlQ2hhbmdlLnNldENoYW5nZUlkKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpOwotICAgIHJlc3RvcmVDaGFuZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gcmVzdG9yZUNoYW5nZS5jYWxsKCk7Ci0gICAgaWYgKHJlc3VsdC5nZXRFcnJvcnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmV2ZXJ0Q2hhbmdlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JldmVydENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGEwM2JkLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmV2ZXJ0Q2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmV2ZXJ0ZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1jbGFzcyBSZXZlcnRDaGFuZ2UgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmV2ZXJ0Q2hhbmdlIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLSAgQE51bGxhYmxlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKLQotICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OwotCi0gIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKLQotICBASW5qZWN0Ci0gIFJldmVydENoYW5nZShmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCi0gICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBAQXNzaXN0ZWQgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDaGFuZ2VIb29rcyBob29rcywKLSAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCi0gICAgICBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCi0gICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uLAotICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQpIHsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLnJldmVydGVkU2VuZGVyRmFjdG9yeSA9IHJldmVydGVkU2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIHRoaXMuaG9va3MgPSBob29rczsKLSAgICB0aGlzLmdpdE1hbmFnZXIgPSBnaXRNYW5hZ2VyOwotCi0gICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247Ci0gICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQ2hhbmdlRGV0YWlsIGNhbGwoKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCi0gICAgICBFbWFpbEV4Y2VwdGlvbiwgTm9TdWNoRW50aXR5RXhjZXB0aW9uLCBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sCi0gICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLSAgICBpZiAoIWNvbnRyb2wuY2FuQWRkUGF0Y2hTZXQoKSkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7Ci0gICAgfQotCi0gICAgQ2hhbmdlLklkIHJldmVydGVkQ2hhbmdlSWQgPSBDaGFuZ2VVdGlsLnJldmVydChwYXRjaFNldElkLCBjdXJyZW50VXNlciwgbWVzc2FnZSwgZGIsCi0gICAgICAgIHJldmVydGVkU2VuZGVyRmFjdG9yeSwgaG9va3MsIGdpdE1hbmFnZXIsIHBhdGNoU2V0SW5mb0ZhY3RvcnksCi0gICAgICAgIHJlcGxpY2F0aW9uLCBteUlkZW50KTsKLQotICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXZlcnRlZENoYW5nZUlkKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvU3VibWl0QWN0aW9uLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1N1Ym1pdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyMWQ1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvU3VibWl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZWRldGFpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hFbnRpdHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuU3VibWl0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1jbGFzcyBTdWJtaXRBY3Rpb24gZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgU3VibWl0QWN0aW9uIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7Ci0KLSAgQEluamVjdAotICBTdWJtaXRBY3Rpb24oZmluYWwgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpIHsKLSAgICB0aGlzLnN1Ym1pdEZhY3RvcnkgPSBzdWJtaXRGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwKLSAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9Ci0gICAgICAgIHN1Ym1pdEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKLSAgICBpZiAocmVzdWx0LmdldEVycm9ycygpLnNpemUoKSA+IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgIkNhbm5vdCBzdWJtaXQgIiArIHJlc3VsdC5nZXRFcnJvcnMoKS5nZXQoMCkuZ2V0TWVzc2FnZU9yVHlwZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ncm91cC9Hcm91cHNSZXN0QXBpU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2dyb3VwL0dyb3Vwc1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYzc0NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ncm91cC9Hcm91cHNSZXN0QXBpU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBHcm91cHNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBHcm91cHNSZXN0QXBpU2VydmxldChSZXN0QXBpU2VydmxldC5HbG9iYWxzIGdsb2JhbHMsCisgICAgICBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBncm91cHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvQWRkUmV2aWV3ZXJIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvQWRkUmV2aWV3ZXJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDZlNjAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL0FkZFJldmlld2VySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wYXRjaDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWwuQ2hhbmdlRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5BZGRSZXZpZXdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotY2xhc3MgQWRkUmV2aWV3ZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlcjxSZXZpZXdlclJlc3VsdD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgQWRkUmV2aWV3ZXJIYW5kbGVyIGNyZWF0ZShDaGFuZ2UuSWQgY2hhbmdlSWQsIENvbGxlY3Rpb248U3RyaW5nPiByZXZpZXdlcnMsCi0gICAgICAgIGJvb2xlYW4gY29uZmlybWVkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQWRkUmV2aWV3ZXIuRmFjdG9yeSBhZGRSZXZpZXdlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQ7Ci0gIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHJldmlld2VyczsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbmZpcm1lZDsKLQotICBASW5qZWN0Ci0gIEFkZFJldmlld2VySGFuZGxlcihmaW5hbCBBZGRSZXZpZXdlci5GYWN0b3J5IGFkZFJldmlld2VyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcmV2aWV3ZXJzLAotICAgICAgQEFzc2lzdGVkIGZpbmFsIGJvb2xlYW4gY29uZmlybWVkKSB7Ci0KLSAgICB0aGlzLmFkZFJldmlld2VyRmFjdG9yeSA9IGFkZFJldmlld2VyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICAgIHRoaXMucmV2aWV3ZXJzID0gcmV2aWV3ZXJzOwotICAgIHRoaXMuY29uZmlybWVkID0gY29uZmlybWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdlclJlc3VsdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0ID0gYWRkUmV2aWV3ZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2VJZCwgcmV2aWV3ZXJzLCBjb25maXJtZWQpLmNhbGwoKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlKGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKGNoYW5nZUlkKS5jYWxsKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaERldGFpbFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hEZXRhaWxTZXJ2aWNlSW1wbC5qYXZhCmluZGV4IDQwYzliODQuLjMxNzQ3NTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaERldGFpbFNlcnZpY2VJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoRGV0YWlsU2VydmljZUltcGwuamF2YQpAQCAtMTQsMzggKzE0LDI0IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnBhdGNoOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxTdW1tYXJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsU3VtbWFyeVNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaERldGFpbFNlcnZpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5CYXNlU2VydmljZUltcGxlbWVudGF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWwuQ2hhbmdlRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudERpZmZQcmVmZXJlbmNlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UGF0Y2hSZXZpZXc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoLktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvQ2FjaGVGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuRGVsZXRlRHJhZnRQYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QdWJsaXNoQ29tbWVudHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkZ1bmN0aW9uU3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC01NiwyMiArNDIsMTAgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAogY2xhc3MgUGF0Y2hEZXRhaWxTZXJ2aWNlSW1wbCBleHRlbmRzIEJhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24gaW1wbGVtZW50cwogICAgIFBhdGNoRGV0YWlsU2VydmljZSB7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotCi0gIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkuRmFjdG9yeSBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBZGRSZXZpZXdlckhhbmRsZXIuRmFjdG9yeSBhZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZUZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNjcmlwdEZhY3RvcnkuRmFjdG9yeSBwYXRjaFNjcmlwdEZhY3RvcnlGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFNhdmVEcmFmdC5GYWN0b3J5IHNhdmVEcmFmdEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7CkBAIC03OSwyOCArNTMsMTQgQEAKICAgQEluamVjdAogICBQYXRjaERldGFpbFNlcnZpY2VJbXBsKGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBzY2hlbWEsCiAgICAgICBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5GYWN0b3J5IGFjY291bnRJbmZvQ2FjaGVGYWN0b3J5LAotICAgICAgZmluYWwgQWRkUmV2aWV3ZXJIYW5kbGVyLkZhY3RvcnkgYWRkUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIFJlbW92ZVJldmlld2VySGFuZGxlci5GYWN0b3J5IHJlbW92ZVJldmlld2VySGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCiAgICAgICBmaW5hbCBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3RvcnksCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZUZhY3RvcnksCiAgICAgICBmaW5hbCBQYXRjaFNjcmlwdEZhY3RvcnkuRmFjdG9yeSBwYXRjaFNjcmlwdEZhY3RvcnlGYWN0b3J5LAotICAgICAgZmluYWwgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeSwKICAgICAgIGZpbmFsIFNhdmVEcmFmdC5GYWN0b3J5IHNhdmVEcmFmdEZhY3RvcnksCiAgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSkgewogICAgIHN1cGVyKHNjaGVtYSwgY3VycmVudFVzZXIpOwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAKLSAgICB0aGlzLmFjY291bnRJbmZvQ2FjaGVGYWN0b3J5ID0gYWNjb3VudEluZm9DYWNoZUZhY3Rvcnk7Ci0gICAgdGhpcy5hZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5ID0gYWRkUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeTsKLSAgICB0aGlzLnJlbW92ZVJldmlld2VySGFuZGxlckZhY3RvcnkgPSByZW1vdmVSZXZpZXdlckhhbmRsZXJGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRlbGV0ZURyYWZ0UGF0Y2hTZXRGYWN0b3J5ID0gZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7Ci0gICAgdGhpcy5mdW5jdGlvblN0YXRlRmFjdG9yeSA9IGZ1bmN0aW9uU3RhdGVGYWN0b3J5OwogICAgIHRoaXMucGF0Y2hTY3JpcHRGYWN0b3J5RmFjdG9yeSA9IHBhdGNoU2NyaXB0RmFjdG9yeUZhY3Rvcnk7Ci0gICAgdGhpcy5wdWJsaXNoQ29tbWVudHNGYWN0b3J5ID0gcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKICAgICB0aGlzLnNhdmVEcmFmdEZhY3RvcnkgPSBzYXZlRHJhZnRGYWN0b3J5OwogICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7CiAgIH0KQEAgLTE2NSw2ICsxMjUsOCBAQAogICAgICAgICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXN1bHQuZ2V0Q2hhbmdlSWQoKSkuY2FsbCgpOwogICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24ocmVzdWx0LmdldENoYW5nZUlkKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoZSk7CiAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVudGl0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoZSk7CiAgICAgICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CkBAIC0xNzcsMTU0ICsxMzksNCBAQAogICAgICAgfQogICAgIH0pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgcHVibGlzaENvbW1lbnRzKGZpbmFsIFBhdGNoU2V0LklkIHBzaWQsIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICBmaW5hbCBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiB0YWdzLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYikgewotICAgIEhhbmRsZXIud3JhcChwdWJsaXNoQ29tbWVudHNGYWN0b3J5LmNyZWF0ZShwc2lkLCBtc2csIHRhZ3MsIGZhbHNlKSkudG8oY2IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgcmV2aWV3ZWQgc3RhdHVzIGZvciB0aGUgZmlsZSBieSB1c2VyIEBjb2Rle2FjY291bnR9Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoZmluYWwgS2V5IHBhdGNoS2V5LAotICAgICAgZmluYWwgYm9vbGVhbiByZXZpZXdlZCwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFjY291bnQuSWQgYWNjb3VudCA9IGdldEFjY291bnRJZCgpOwotICAgICAgICBBY2NvdW50UGF0Y2hSZXZpZXcuS2V5IGtleSA9Ci0gICAgICAgICAgICBuZXcgQWNjb3VudFBhdGNoUmV2aWV3LktleShwYXRjaEtleSwgYWNjb3VudCk7Ci0gICAgICAgIGRiLmFjY291bnRzKCkuYmVnaW5UcmFuc2FjdGlvbihhY2NvdW50KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBBY2NvdW50UGF0Y2hSZXZpZXcgYXByID0gZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmdldChrZXkpOwotICAgICAgICAgIGlmIChhcHIgPT0gbnVsbCAmJiByZXZpZXdlZCkgewotICAgICAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmluc2VydCgKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IEFjY291bnRQYXRjaFJldmlldyhwYXRjaEtleSwgYWNjb3VudCkpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFwciAhPSBudWxsICYmICFyZXZpZXdlZCkgewotICAgICAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oYXByKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRiLmNvbW1pdCgpOwotICAgICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGRiLnJvbGxiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFJldmlld2VycyhmaW5hbCBDaGFuZ2UuSWQgaWQsIGZpbmFsIExpc3Q8U3RyaW5nPiByZXZpZXdlcnMsCi0gICAgICBmaW5hbCBib29sZWFuIGNvbmZpcm1lZCwgZmluYWwgQXN5bmNDYWxsYmFjazxSZXZpZXdlclJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBhZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5LmNyZWF0ZShpZCwgcmV2aWV3ZXJzLCBjb25maXJtZWQpLnRvKGNhbGxiYWNrKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVJldmlld2VyKGZpbmFsIENoYW5nZS5JZCBpZCwgZmluYWwgQWNjb3VudC5JZCByZXZpZXdlcklkLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxSZXZpZXdlclJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICByZW1vdmVSZXZpZXdlckhhbmRsZXJGYWN0b3J5LmNyZWF0ZShpZCwgcmV2aWV3ZXJJZCkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXNlckFwcHJvdmFscyhmaW5hbCBTZXQ8Q2hhbmdlLklkPiBjaWRzLCBmaW5hbCBBY2NvdW50LklkIGFpZCwKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8QXBwcm92YWxTdW1tYXJ5U2V0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgcHVibGljIEFwcHJvdmFsU3VtbWFyeVNldCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IGFwcHJvdmFscyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4oKTsKLSAgICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljRmFjdG9yeSA9Ci0gICAgICAgICAgICBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5jcmVhdGUoKTsKLQotICAgICAgICBhaWNGYWN0b3J5LndhbnQoYWlkKTsKLSAgICAgICAgZm9yIChmaW5hbCBDaGFuZ2UuSWQgaWQgOiBjaWRzKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY2MgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihpZCk7Ci0gICAgICAgICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gY2MuZ2V0Q2hhbmdlKCk7Ci0gICAgICAgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc19pZCA9IGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgICAgICAgICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IHBzYXMgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgICAgICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0KLSAgICAgICAgICAgICAgICBmdW5jdGlvblN0YXRlRmFjdG9yeS5jcmVhdGUoY2MsIHBzX2lkLCBwc2FzLnZhbHVlcygpKTsKLQotICAgICAgICAgICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhIDogZGIucGF0Y2hTZXRBcHByb3ZhbHMoKQotICAgICAgICAgICAgICAgIC5ieVBhdGNoU2V0VXNlcihwc19pZCwgYWlkKSkgewotICAgICAgICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIGNhdGVnb3J5ID0gY2EuZ2V0Q2F0ZWdvcnlJZCgpOwotICAgICAgICAgICAgICBpZiAoQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICBmcy5ub3JtYWxpemUoYXBwcm92YWxUeXBlcy5ieUlkKGNhdGVnb3J5KSwgY2EpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChjYS5nZXRWYWx1ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBwc2FzLnB1dChjYXRlZ29yeSwgY2EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcHByb3ZhbHMucHV0KGlkLCBuZXcgQXBwcm92YWxTdW1tYXJ5KHBzYXMudmFsdWVzKCkpKTsKLSAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gbnNjZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSB1c2VyIGhhcyBubyBhY2Nlc3MgdG8gc2VlIHRoaXMgY2hhbmdlLCBzbyB3ZSBzaW1wbHkgZG8gbm90Ci0gICAgICAgICAgICAgKiBwcm92aWRlIGFueSBkZXRhaWxzIGFib3V0IGl0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQXBwcm92YWxTdW1tYXJ5U2V0KGFpY0ZhY3RvcnkuY3JlYXRlKCksIGFwcHJvdmFscyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdHJvbmdlc3RBcHByb3ZhbHMoZmluYWwgU2V0PENoYW5nZS5JZD4gY2lkcywKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8QXBwcm92YWxTdW1tYXJ5U2V0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgcHVibGljIEFwcHJvdmFsU3VtbWFyeVNldCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IGFwcHJvdmFscyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4oKTsKLSAgICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljRmFjdG9yeSA9Ci0gICAgICAgICAgICBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5jcmVhdGUoKTsKLQotICAgICAgICBmb3IgKGZpbmFsIENoYW5nZS5JZCBpZCA6IGNpZHMpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbCBjYyA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGlkKTsKLSAgICAgICAgICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBjYy5nZXRDaGFuZ2UoKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdGNoU2V0LklkIHBzX2lkID0gY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7Ci0gICAgICAgICAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gcHNhcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uU3RhdGUgZnMgPQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uU3RhdGVGYWN0b3J5LmNyZWF0ZShjYywgcHNfaWQsIHBzYXMudmFsdWVzKCkpOwotCi0gICAgICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgY2EgOiBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQocHNfaWQpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0ZWdvcnkgPSBjYS5nZXRDYXRlZ29yeUlkKCk7Ci0gICAgICAgICAgICAgIGlmIChBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgIGZzLm5vcm1hbGl6ZShhcHByb3ZhbFR5cGVzLmJ5SWQoY2F0ZWdvcnkpLCBjYSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJvb2xlYW4ga2VlcCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChwc2FzLmNvbnRhaW5zS2V5KGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIGZpbmFsIHNob3J0IG9sZFZhbHVlID0gcHNhcy5nZXQoY2F0ZWdvcnkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgc2hvcnQgbmV3VmFsdWUgPSBjYS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGtlZXAgPQotICAgICAgICAgICAgICAgICAgICAoTWF0aC5hYnMob2xkVmFsdWUpIDwgTWF0aC5hYnMobmV3VmFsdWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChNYXRoLmFicyhvbGRWYWx1ZSkgPT0gTWF0aC5hYnMobmV3VmFsdWUpICYmIChuZXdWYWx1ZSA8IG9sZFZhbHVlKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChrZWVwKSB7Ci0gICAgICAgICAgICAgICAgYWljRmFjdG9yeS53YW50KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgICAgICBwc2FzLnB1dChjYXRlZ29yeSwgY2EpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwcHJvdmFscy5wdXQoaWQsIG5ldyBBcHByb3ZhbFN1bW1hcnkocHNhcy52YWx1ZXMoKSkpOwotICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBuc2NlKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIHVzZXIgaGFzIG5vIGFjY2VzcyB0byBzZWUgdGhpcyBjaGFuZ2UsIHNvIHdlIHNpbXBseSBkbyBub3QKLSAgICAgICAgICAgICAqIHByb3ZpZGUgYW55IGRldGFpbHMgYWJvdXQgaXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEFwcHJvdmFsU3VtbWFyeVNldChhaWNGYWN0b3J5LmNyZWF0ZSgpLCBhcHByb3ZhbHMpOwotICAgICAgfQotICAgIH0pOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCmluZGV4IDNlOTRiNGMuLmQxZjViMjQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCkBAIC0yOCw4ICsyOCw2IEBACiAgICAgaW5zdGFsbChuZXcgRmFjdG9yeU1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICBmYWN0b3J5KEFkZFJldmlld2VySGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZW1vdmVSZXZpZXdlckhhbmRsZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoUGF0Y2hTY3JpcHRGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFNhdmVEcmFmdC5GYWN0b3J5LmNsYXNzKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEJ1aWxkZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEJ1aWxkZXIuamF2YQppbmRleCA4MTZiYmVmLi41MDE5NDAzIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hTY3JpcHRCdWlsZGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoU2NyaXB0QnVpbGRlci5qYXZhCkBAIC0xMzMsNiArMTMzLDcgQEAKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgYm9vbGVhbiBpbnRyYWxpbmVEaWZmZXJlbmNlSXNQb3NzaWJsZSA9IHRydWU7CiAgICAgYm9vbGVhbiBpbnRyYWxpbmVGYWlsdXJlID0gZmFsc2U7CisgICAgYm9vbGVhbiBpbnRyYWxpbmVUaW1lb3V0ID0gZmFsc2U7CiAKICAgICBhLnBhdGggPSBvbGROYW1lKGNvbnRlbnQpOwogICAgIGIucGF0aCA9IG5ld05hbWUoY29udGVudCk7CkBAIC0xNjAsMTAgKzE2MSwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICBjYXNlIEVSUk9SOgotICAgICAgICAgIGNhc2UgVElNRU9VVDoKICAgICAgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlID0gZmFsc2U7CiAgICAgICAgICAgICBpbnRyYWxpbmVGYWlsdXJlID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUSU1FT1VUOgorICAgICAgICAgICAgaW50cmFsaW5lRGlmZmVyZW5jZUlzUG9zc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGludHJhbGluZVRpbWVvdXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlID0gZmFsc2U7CkBAIC0xOTgsMTAgKzIwMywxMCBAQAogICAgICAgICBjb250ZXh0ID0gZGlmZlByZWZzLmdldENvbnRleHQoKTsKICAgICAgICAgaHVnZUZpbGUgPSB0cnVlOwogCi0gICAgICB9IGVsc2UgaWYgKGRpZmZQcmVmcy5pc1N5bnRheEhpZ2hsaWdodGluZygpKSB7Ci0gICAgICAgIC8vIEluIG9yZGVyIHRvIHN5bnRheCBoaWdobGlnaHQgdGhlIGZpbGUgcHJvcGVybHkgd2UgbmVlZCB0bwotICAgICAgICAvLyBnaXZlIHRoZSBjbGllbnQgdGhlIGNvbXBsZXRlIGZpbGUgY29udGVudHMuIFNvIGZvcmNlIG91cgotICAgICAgICAvLyBjb250ZXh0IHRlbXBvcmFyaWx5IHRvIHRoZSBjb21wbGV0ZSBmaWxlIHNpemUuCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJbiBvcmRlciB0byBleHBhbmQgdGhlIHNraXBwZWQgY29tbW9uIGxpbmVzIG9yIHN5bnRheCBoaWdobGlnaHQgdGhlCisgICAgICAgIC8vIGZpbGUgcHJvcGVybHkgd2UgbmVlZCB0byBnaXZlIHRoZSBjbGllbnQgdGhlIGNvbXBsZXRlIGZpbGUgY29udGVudHMuCisgICAgICAgIC8vIFNvIGZvcmNlIG91ciBjb250ZXh0IHRlbXBvcmFyaWx5IHRvIHRoZSBjb21wbGV0ZSBmaWxlIHNpemUuCiAgICAgICAgIC8vCiAgICAgICAgIGNvbnRleHQgPSBNQVhfQ09OVEVYVDsKICAgICAgIH0KQEAgLTIxMiw3ICsyMTcsNyBAQAogICAgICAgICBjb250ZW50LmdldE9sZE5hbWUoKSwgY29udGVudC5nZXROZXdOYW1lKCksIGEuZmlsZU1vZGUsIGIuZmlsZU1vZGUsCiAgICAgICAgIGNvbnRlbnQuZ2V0SGVhZGVyTGluZXMoKSwgZGlmZlByZWZzLCBhLmRzdCwgYi5kc3QsIGVkaXRzLAogICAgICAgICBhLmRpc3BsYXlNZXRob2QsIGIuZGlzcGxheU1ldGhvZCwgY29tbWVudHMsIGhpc3RvcnksIGh1Z2VGaWxlLAotICAgICAgICBpbnRyYWxpbmVEaWZmZXJlbmNlSXNQb3NzaWJsZSwgaW50cmFsaW5lRmFpbHVyZSk7CisgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlLCBpbnRyYWxpbmVGYWlsdXJlLCBpbnRyYWxpbmVUaW1lb3V0KTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNb2RpZnkoUGF0Y2hMaXN0RW50cnkgY29udGVudCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoU2NyaXB0RmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoU2NyaXB0RmFjdG9yeS5qYXZhCmluZGV4IDk3ZDg1MGEuLmUwZWM0NjUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEZhY3RvcnkuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hTY3JpcHRGYWN0b3J5LmphdmEKQEAgLTI0MSw2ICsyNDEsMTIgQEAKICAgICAgICAgICAgICAgbmFtZSA9IG9sZE5hbWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgTU9ESUZJRUQ6CisgICAgICAgICAgY2FzZSBERUxFVEVEOgorICAgICAgICAgIGNhc2UgQURERUQ6CisgICAgICAgICAgY2FzZSBSRVdSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtMjY2LDYgKzI3Miw5IEBACiAgICAgICAgIH0KICAgICAgICAgbG9hZFB1Ymxpc2hlZChieUtleSwgYWljLCBuZXdOYW1lKTsKICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgUkVXUklURToKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgZmluYWwgQ3VycmVudFVzZXIgdXNlciA9IGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKTsKQEAgLTI4OCw2ICsyOTcsOSBAQAogICAgICAgICAgIH0KICAgICAgICAgICBsb2FkRHJhZnRzKGJ5S2V5LCBhaWMsIG1lLCBuZXdOYW1lKTsKICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFV1JJVEU6CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzFjMWMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1JlbW92ZVJldmlld2VySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wYXRjaDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWwuQ2hhbmdlRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5SZW1vdmVSZXZpZXdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogSW1wbGVtZW50IHRoZSByZW1vdGUgbG9naWMgdGhhdCByZW1vdmVzIGEgcmV2aWV3ZXIgZnJvbSBhIGNoYW5nZS4KLSAqLwotY2xhc3MgUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlcjxSZXZpZXdlclJlc3VsdD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyIGNyZWF0ZShDaGFuZ2UuSWQgY2hhbmdlSWQsIEFjY291bnQuSWQgcmV2aWV3ZXJJZCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFJlbW92ZVJldmlld2VyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEFjY291bnQuSWQgcmV2aWV3ZXJJZDsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQ7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBSZW1vdmVSZXZpZXdlckhhbmRsZXIoZmluYWwgUmVtb3ZlUmV2aWV3ZXIuRmFjdG9yeSByZW1vdmVSZXZpZXdlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBDaGFuZ2UuSWQgY2hhbmdlSWQsIEBBc3Npc3RlZCBBY2NvdW50LklkIHJldmlld2VySWQpIHsKLSAgICB0aGlzLnJlbW92ZVJldmlld2VyRmFjdG9yeSA9IHJlbW92ZVJldmlld2VyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZUlkID0gY2hhbmdlSWQ7Ci0gICAgdGhpcy5yZXZpZXdlcklkID0gcmV2aWV3ZXJJZDsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdlclJlc3VsdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0ID0gcmVtb3ZlUmV2aWV3ZXJGYWN0b3J5LmNyZWF0ZSgKLSAgICAgICAgY2hhbmdlSWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXZpZXdlcklkKSkuY2FsbCgpOwotICAgIHJlc3VsdC5zZXRDaGFuZ2UoY2hhbmdlRGV0YWlsRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQpLmNhbGwoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvU2F2ZURyYWZ0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvU2F2ZURyYWZ0LmphdmEKaW5kZXggMDZjMjFkZi4uMThhYjVmZjUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9TYXZlRHJhZnQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvU2F2ZURyYWZ0LmphdmEKQEAgLTcxLDggKzcxLDggQEAKIAogICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpOwogICAgICAgaWYgKGNvbW1lbnQuZ2V0S2V5KCkuZ2V0KCkgPT0gbnVsbCkgewotICAgICAgICBpZiAoY29tbWVudC5nZXRMaW5lKCkgPCAxKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29tbWVudCBsaW5lIG11c3QgYmUgPj0gMSwgbm90ICIKKyAgICAgICAgaWYgKGNvbW1lbnQuZ2V0TGluZSgpIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbW1lbnQgbGluZSBtdXN0IGJlID49IDAsIG5vdCAiCiAgICAgICAgICAgICAgICsgY29tbWVudC5nZXRMaW5lKCkpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wbHVnaW4vTGlzdFBsdWdpbnNTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGx1Z2luL0xpc3RQbHVnaW5zU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTgxNDVjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wbHVnaW4vTGlzdFBsdWdpbnNTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnBsdWdpbjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuUmVzdEFwaVNlcnZsZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuTGlzdFBsdWdpbnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1AU2luZ2xldG9uCi1AUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKLXB1YmxpYyBjbGFzcyBMaXN0UGx1Z2luc1NlcnZsZXQgZXh0ZW5kcyBSZXN0QXBpU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0UGx1Z2lucz4gZmFjdG9yeTsKLQotICBASW5qZWN0Ci0gIExpc3RQbHVnaW5zU2VydmxldChmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBQYXJhbWV0ZXJQYXJzZXIgcGFyYW1QYXJzZXIsIFByb3ZpZGVyPExpc3RQbHVnaW5zPiBscykgewotICAgIHN1cGVyKGN1cnJlbnRVc2VyKTsKLSAgICB0aGlzLnBhcmFtUGFyc2VyID0gcGFyYW1QYXJzZXI7Ci0gICAgdGhpcy5mYWN0b3J5ID0gbHM7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIExpc3RQbHVnaW5zIGltcGwgPSBmYWN0b3J5LmdldCgpOwotICAgIGlmIChhY2NlcHRzSnNvbihyZXEpKSB7Ci0gICAgICBpbXBsLnNldEZvcm1hdChPdXRwdXRGb3JtYXQuSlNPTl9DT01QQUNUKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtUGFyc2VyLnBhcnNlKGltcGwsIHJlcSwgcmVzKSkgewotICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIGlmIChpbXBsLmdldEZvcm1hdCgpLmlzSnNvbigpKSB7Ci0gICAgICAgIHJlcy5zZXRDb250ZW50VHlwZShKU09OX1RZUEUpOwotICAgICAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgIH0KLSAgICAgIGltcGwuZGlzcGxheShidWYpOwotICAgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOwotICAgICAgc2VuZChyZXEsIHJlcywgYnVmLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQWRkQnJhbmNoLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9BZGRCcmFuY2guamF2YQppbmRleCA5N2U5YmI0Li5kMjY1MDFlIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9BZGRCcmFuY2guamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9BZGRCcmFuY2guamF2YQpAQCAtMTUsOCArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MaXN0QnJhbmNoZXNSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BZGRCcmFuY2hSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkUmV2aXNpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKQEAgLTQ2LDcgKzQ1LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWNsYXNzIEFkZEJyYW5jaCBleHRlbmRzIEhhbmRsZXI8TGlzdEJyYW5jaGVzUmVzdWx0PiB7CitjbGFzcyBBZGRCcmFuY2ggZXh0ZW5kcyBIYW5kbGVyPEFkZEJyYW5jaFJlc3VsdD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWRkQnJhbmNoLmNsYXNzKTsKIAogICBpbnRlcmZhY2UgRmFjdG9yeSB7CkBAIC05MCw5ICs4OSw3IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3RCcmFuY2hlc1Jlc3VsdCBjYWxsKCkgdGhyb3dzIE5vU3VjaFByb2plY3RFeGNlcHRpb24sCi0gICAgICBJbnZhbGlkTmFtZUV4Y2VwdGlvbiwgSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgIEJyYW5jaENyZWF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbiB7CisgIHB1YmxpYyBBZGRCcmFuY2hSZXN1bHQgY2FsbCgpIHRocm93cyBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wgPQogICAgICAgICBwcm9qZWN0Q29udHJvbEZhY3RvcnkuY29udHJvbEZvcihwcm9qZWN0TmFtZSk7CiAKQEAgLTEwNCwxMCArMTAxLDE0IEBACiAgICAgICByZWZuYW1lID0gQ29uc3RhbnRzLlJfSEVBRFMgKyByZWZuYW1lOwogICAgIH0KICAgICBpZiAoIVJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUocmVmbmFtZSkpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkTmFtZUV4Y2VwdGlvbigpOworICAgICAgcmV0dXJuIG5ldyBBZGRCcmFuY2hSZXN1bHQobmV3IEFkZEJyYW5jaFJlc3VsdC5FcnJvcigKKyAgICAgICAgICBBZGRCcmFuY2hSZXN1bHQuRXJyb3IuVHlwZS5JTlZBTElEX05BTUUsIHJlZm5hbWUpKTsKICAgICB9CiAgICAgaWYgKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2gocmVmbmFtZSkpIHsKLSAgICAgIHRocm93IG5ldyBCcmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24ocmVmbmFtZSk7CisgICAgICByZXR1cm4gbmV3IEFkZEJyYW5jaFJlc3VsdCgKKyAgICAgICAgICBuZXcgQWRkQnJhbmNoUmVzdWx0LkVycm9yKAorICAgICAgICAgICAgICBBZGRCcmFuY2hSZXN1bHQuRXJyb3IuVHlwZS5CUkFOQ0hfQ1JFQVRJT05fTk9UX0FMTE9XRURfVU5ERVJfUkVGTkFNRV9QUkVGSVgsCisgICAgICAgICAgICAgIE1hZ2ljQnJhbmNoLmdldE1hZ2ljUmVmTmFtZVByZWZpeChyZWZuYW1lKSkpOwogICAgIH0KIAogICAgIGZpbmFsIEJyYW5jaC5OYW1lS2V5IG5hbWUgPSBuZXcgQnJhbmNoLk5hbWVLZXkocHJvamVjdE5hbWUsIHJlZm5hbWUpOwpAQCAtMTQ0LDkgKzE0NSwyMiBAQAogICAgICAgICAgIGNhc2UgRkFTVF9GT1JXQVJEOgogICAgICAgICAgIGNhc2UgTkVXOgogICAgICAgICAgIGNhc2UgTk9fQ0hBTkdFOgotICAgICAgICAgICAgcmVmZXJlbmNlVXBkYXRlZC5maXJlKG5hbWUuZ2V0UGFyZW50S2V5KCksIHJlZm5hbWUpOworICAgICAgICAgICAgcmVmZXJlbmNlVXBkYXRlZC5maXJlKG5hbWUuZ2V0UGFyZW50S2V5KCksIHUpOwogICAgICAgICAgICAgaG9va3MuZG9SZWZVcGRhdGVkSG9vayhuYW1lLCB1LCBpZGVudGlmaWVkVXNlci5nZXRBY2NvdW50KCkpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBMT0NLX0ZBSUxVUkU6CisgICAgICAgICAgICBpZiAocmVwby5nZXRSZWYocmVmbmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gbmV3IEFkZEJyYW5jaFJlc3VsdChuZXcgQWRkQnJhbmNoUmVzdWx0LkVycm9yKAorICAgICAgICAgICAgICAgICAgQWRkQnJhbmNoUmVzdWx0LkVycm9yLlR5cGUuQlJBTkNIX0FMUkVBRFlfRVhJU1RTLCByZWZuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgcmVmUHJlZml4ID0gZ2V0UmVmUHJlZml4KHJlZm5hbWUpOworICAgICAgICAgICAgd2hpbGUgKCFDb25zdGFudHMuUl9IRUFEUy5lcXVhbHMocmVmUHJlZml4KSkgeworICAgICAgICAgICAgICBpZiAocmVwby5nZXRSZWYocmVmUHJlZml4KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRCcmFuY2hSZXN1bHQobmV3IEFkZEJyYW5jaFJlc3VsdC5FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgQWRkQnJhbmNoUmVzdWx0LkVycm9yLlR5cGUuQlJBTkNIX0NSRUFUSU9OX0NPTkZMSUNULCByZWZQcmVmaXgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZWZQcmVmaXggPSBnZXRSZWZQcmVmaXgocmVmUHJlZml4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24ocmVzdWx0Lm5hbWUoKSk7CiAgICAgICAgICAgfQpAQCAtMTU1LDExICsxNjksMjIgQEAKICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIGJyYW5jaCAiICsgbmFtZSwgZXJyKTsKICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgfQorICAgIH0gY2F0Y2ggKEludmFsaWRSZXZpc2lvbkV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbmV3IEFkZEJyYW5jaFJlc3VsdChuZXcgQWRkQnJhbmNoUmVzdWx0LkVycm9yKAorICAgICAgICAgIEFkZEJyYW5jaFJlc3VsdC5FcnJvci5UeXBlLklOVkFMSURfUkVWSVNJT04pKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgcmVwby5jbG9zZSgpOwogICAgIH0KIAotICAgIHJldHVybiBsaXN0QnJhbmNoZXNGYWN0b3J5LmNyZWF0ZShwcm9qZWN0TmFtZSkuY2FsbCgpOworICAgIHJldHVybiBuZXcgQWRkQnJhbmNoUmVzdWx0KGxpc3RCcmFuY2hlc0ZhY3RvcnkuY3JlYXRlKHByb2plY3ROYW1lKS5jYWxsKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlZlByZWZpeChmaW5hbCBTdHJpbmcgcmVmTmFtZSkgeworICAgIGZpbmFsIGludCBpID0gcmVmTmFtZS5sYXN0SW5kZXhPZignLycpOworICAgIGlmIChpID4gQ29uc3RhbnRzLlJfSEVBRFMubGVuZ3RoKCkgLSAxKSB7CisgICAgICByZXR1cm4gcmVmTmFtZS5zdWJzdHJpbmcoMCwgaSk7CisgICAgfQorICAgIHJldHVybiBDb25zdGFudHMuUl9IRUFEUzsKICAgfQogCiAgIHByaXZhdGUgT2JqZWN0SWQgcGFyc2VTdGFydGluZ1JldmlzaW9uKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0JyYW5jaENyZWF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Y2RjMzIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBCcmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiQnJhbmNoIGNyZWF0aW9uIGlzIG5vdCBhbGxvd2VkIHVuZGVyOiAiOwotCi0gIHB1YmxpYyBCcmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIHJlZm5hbWVQcmVmaXgpIHsKLSAgICBzdXBlcihNRVNTQUdFICsgcmVmbmFtZVByZWZpeCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0NyZWF0ZVByb2plY3RIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9DcmVhdGVQcm9qZWN0SGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFmMzMyLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0NyZWF0ZVByb2plY3RIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DcmVhdGVQcm9qZWN0QXJnczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9qZWN0SGFuZGxlciBleHRlbmRzIEhhbmRsZXI8Vm9pZFJlc3VsdD4gewotCi0gIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBDcmVhdGVQcm9qZWN0SGFuZGxlciBjcmVhdGUoQEFzc2lzdGVkKCJwcm9qZWN0TmFtZSIpIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgQEFzc2lzdGVkKCJwYXJlbnROYW1lIikgU3RyaW5nIHBhcmVudE5hbWUsCi0gICAgICAgIEBBc3Npc3RlZCgiZW1wdHlDb21taXQiKSBib29sZWFuIGVtcHR5Q29tbWl0LAotICAgICAgICBAQXNzaXN0ZWQoInBlcm1pc3Npb25zT25seSIpIGJvb2xlYW4gcGVybWlzc2lvbnNPbmx5KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQ3JlYXRlUHJvamVjdC5GYWN0b3J5IGNyZWF0ZVByb2plY3RGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFByb2plY3RDb250cm9sLkZhY3RvcnkgcHJvamVjdENvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyZW50TmFtZTsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVtcHR5Q29tbWl0OwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbnNPbmx5OwotCi0gIEBJbmplY3QKLSAgcHVibGljIENyZWF0ZVByb2plY3RIYW5kbGVyKGZpbmFsIENyZWF0ZVByb2plY3QuRmFjdG9yeSBjcmVhdGVQcm9qZWN0RmFjdG9yeSwKLSAgICAgIGZpbmFsIFByb2plY3RDb250cm9sLkZhY3RvcnkgcHJvamVjdENvbnRyb2xGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkKCJwcm9qZWN0TmFtZSIpIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgIEBBc3Npc3RlZCgicGFyZW50TmFtZSIpIGZpbmFsIFN0cmluZyBwYXJlbnROYW1lLAotICAgICAgQEFzc2lzdGVkKCJlbXB0eUNvbW1pdCIpIGZpbmFsIGJvb2xlYW4gZW1wdHlDb21taXQsCi0gICAgICBAQXNzaXN0ZWQoInBlcm1pc3Npb25zT25seSIpIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbnNPbmx5KSB7Ci0gICAgdGhpcy5jcmVhdGVQcm9qZWN0RmFjdG9yeSA9IGNyZWF0ZVByb2plY3RGYWN0b3J5OwotICAgIHRoaXMucHJvamVjdENvbnRyb2xGYWN0b3J5ID0gcHJvamVjdENvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLSAgICB0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotICAgIHRoaXMuZW1wdHlDb21taXQgPSBlbXB0eUNvbW1pdDsKLSAgICB0aGlzLnBlcm1pc3Npb25zT25seSA9IHBlcm1pc3Npb25zT25seTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgVm9pZFJlc3VsdCBjYWxsKCkgdGhyb3dzIFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQ3JlYXRlUHJvamVjdEFyZ3MgYXJncyA9IG5ldyBDcmVhdGVQcm9qZWN0QXJncygpOwotICAgIGFyZ3Muc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgIGlmICghcGFyZW50TmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgbmFtZUtleSA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkocGFyZW50TmFtZSk7Ci0gICAgICB0cnkgewotICAgICAgICBhcmdzLm5ld1BhcmVudCA9IHByb2plY3RDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihuYW1lS2V5KTsKLSAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb2plY3RFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKCJQYXJlbnQgcHJvamVjdCBcIiIKLSAgICAgICAgICAgICsgcGFyZW50TmFtZSArICJcIiBkb2VzIG5vdCBleGlzdC4iLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYXJncy5wcm9qZWN0RGVzY3JpcHRpb24gPSAiIjsKLSAgICBhcmdzLnN1Ym1pdFR5cGUgPSBTdWJtaXRUeXBlLk1FUkdFX0lGX05FQ0VTU0FSWTsKLSAgICBhcmdzLmJyYW5jaCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIGFyZ3MuY3JlYXRlRW1wdHlDb21taXQgPSBlbXB0eUNvbW1pdDsKLSAgICBhcmdzLnBlcm1pc3Npb25zT25seSA9IHBlcm1pc3Npb25zT25seTsKLQotICAgIGZpbmFsIENyZWF0ZVByb2plY3QgY3JlYXRlUHJvamVjdCA9IGNyZWF0ZVByb2plY3RGYWN0b3J5LmNyZWF0ZShhcmdzKTsKLSAgICBjcmVhdGVQcm9qZWN0LmNyZWF0ZVByb2plY3QoKTsKLSAgICByZXR1cm4gVm9pZFJlc3VsdC5JTlNUQU5DRTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvRGVsZXRlQnJhbmNoZXMuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0RlbGV0ZUJyYW5jaGVzLmphdmEKaW5kZXggZjJiM2NhMy4uOGY1NDMwZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvRGVsZXRlQnJhbmNoZXMuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9EZWxldGVCcmFuY2hlcy5qYXZhCkBAIC01MCw3ICs1MCw3IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlcjsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKQEAgLTYxLDcgKzYxLDcgQEAKICAgQEluamVjdAogICBEZWxldGVCcmFuY2hlcyhmaW5hbCBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeSwKICAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwKICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGlkZW50aWZpZWRVc2VyLAogICAgICAgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MsCiAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgIEBBc3Npc3RlZCBQcm9qZWN0Lk5hbWVLZXkgbmFtZSwgQEFzc2lzdGVkIFNldDxCcmFuY2guTmFtZUtleT4gdG9SZW1vdmUpIHsKICAgICB0aGlzLnByb2plY3RDb250cm9sRmFjdG9yeSA9IHByb2plY3RDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7Ci0gICAgdGhpcy5yZXBsaWNhdGlvbiA9IHJlcGxpY2F0aW9uOworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CiAgICAgdGhpcy5pZGVudGlmaWVkVXNlciA9IGlkZW50aWZpZWRVc2VyOwogICAgIHRoaXMuaG9va3MgPSBob29rczsKICAgICB0aGlzLmRiID0gZGI7CkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICBjYXNlIEZBU1RfRk9SV0FSRDoKICAgICAgICAgICBjYXNlIEZPUkNFRDoKICAgICAgICAgICAgIGRlbGV0ZWQuYWRkKGJyYW5jaEtleSk7Ci0gICAgICAgICAgICByZXBsaWNhdGlvbi5maXJlKHByb2plY3ROYW1lLCByZWZuYW1lKTsKKyAgICAgICAgICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShwcm9qZWN0TmFtZSwgdSk7CiAgICAgICAgICAgICBob29rcy5kb1JlZlVwZGF0ZWRIb29rKGJyYW5jaEtleSwgdSwgaWRlbnRpZmllZFVzZXIuZ2V0QWNjb3VudCgpKTsKICAgICAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9MaXN0UHJvamVjdHNTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9MaXN0UHJvamVjdHNTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjdkMzUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvTGlzdFByb2plY3RzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLlJlc3RBcGlTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lkxpc3RQcm9qZWN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotQFNpbmdsZXRvbgotcHVibGljIGNsYXNzIExpc3RQcm9qZWN0c1NlcnZsZXQgZXh0ZW5kcyBSZXN0QXBpU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0UHJvamVjdHM+IGZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBMaXN0UHJvamVjdHNTZXJ2bGV0KGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdXJyZW50VXNlciwKLSAgICAgIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlciwgUHJvdmlkZXI8TGlzdFByb2plY3RzPiBscykgewotICAgIHN1cGVyKGN1cnJlbnRVc2VyKTsKLSAgICB0aGlzLnBhcmFtUGFyc2VyID0gcGFyYW1QYXJzZXI7Ci0gICAgdGhpcy5mYWN0b3J5ID0gbHM7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIExpc3RQcm9qZWN0cyBpbXBsID0gZmFjdG9yeS5nZXQoKTsKLSAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShyZXEuZ2V0UGF0aEluZm8oKSkpIHsKLSAgICAgIGltcGwuc2V0TWF0Y2hQcmVmaXgoVVJMRGVjb2Rlci5kZWNvZGUocmVxLmdldFBhdGhJbmZvKCksICJVVEYtOCIpKTsKLSAgICB9Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIGltcGwuc2V0Rm9ybWF0KE91dHB1dEZvcm1hdC5KU09OX0NPTVBBQ1QpOwotICAgIH0KLSAgICBpZiAocGFyYW1QYXJzZXIucGFyc2UoaW1wbCwgcmVxLCByZXMpKSB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgaWYgKGltcGwuZ2V0Rm9ybWF0KCkuaXNKc29uKCkpIHsKLSAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKEpTT05fVFlQRSk7Ci0gICAgICAgIGJ1Zi53cml0ZShKU09OX01BR0lDKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgICAgfQotICAgICAgaW1wbC5kaXNwbGF5KGJ1Zik7Ci0gICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7Ci0gICAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFjY2Vzc0ZhY3RvcnkuamF2YQppbmRleCA3YjNiOGU3Li4yYzU2ODFiIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBY2Nlc3NGYWN0b3J5LmphdmEKQEAgLTEyMSw2ICsxMjEsOSBAQAogICAgICAgICBpZiAocGMuaXNPd25lcigpKSB7CiAgICAgICAgICAgbG9jYWwuYWRkKHNlY3Rpb24pOwogICAgICAgICAgIG93bmVyT2YuYWRkKG5hbWUpOworCisgICAgICAgIH0gZWxzZSBpZiAobWV0YUNvbmZpZ0NvbnRyb2wuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICBsb2NhbC5hZGQoc2VjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgfSBlbHNlIGlmIChSZWZDb25maWdTZWN0aW9uLmlzVmFsaWQobmFtZSkpIHsKQEAgLTIwMSw2ICsyMDQsNyBAQAogICAgIGRldGFpbC5zZXRDYW5VcGxvYWQocGMuaXNPd25lcigpCiAgICAgICAgIHx8IChtZXRhQ29uZmlnQ29udHJvbC5pc1Zpc2libGUoKSAmJiBtZXRhQ29uZmlnQ29udHJvbC5jYW5VcGxvYWQoKSkpOwogICAgIGRldGFpbC5zZXRDb25maWdWaXNpYmxlKHBjLmlzT3duZXIoKSB8fCBtZXRhQ29uZmlnQ29udHJvbC5pc1Zpc2libGUoKSk7CisgICAgZGV0YWlsLnNldExhYmVsVHlwZXMocGMuZ2V0TGFiZWxUeXBlcygpKTsKICAgICByZXR1cm4gZGV0YWlsOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBY2Nlc3NIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzSGFuZGxlci5qYXZhCmluZGV4IDAyYjg0YjAuLjBhNTBhMzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBY2Nlc3NIYW5kbGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFjY2Vzc0hhbmRsZXIuamF2YQpAQCAtMTQsNiArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0OwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5Qcm9qZWN0QWNjZXNzVXRpbC5tZXJnZVNlY3Rpb25zOworCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwpAQCAtMzYsMTEgKzM4LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0QWNjZXNzSGFuZGxlcjxUPiBleHRlbmRzIEhhbmRsZXI8VD4gewpAQCAtMTUxLDIzICsxNTAsNiBAQAogICAgIHRvRGVsZXRlLnJlbW92ZShzZWN0aW9uLmdldE5hbWUoKSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBMaXN0PEFjY2Vzc1NlY3Rpb24+IG1lcmdlU2VjdGlvbnMoTGlzdDxBY2Nlc3NTZWN0aW9uPiBzcmMpIHsKLSAgICBNYXA8U3RyaW5nLCBBY2Nlc3NTZWN0aW9uPiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIEFjY2Vzc1NlY3Rpb24+KCk7Ci0gICAgZm9yIChBY2Nlc3NTZWN0aW9uIHNlY3Rpb24gOiBzcmMpIHsKLSAgICAgIGlmIChzZWN0aW9uLmdldFBlcm1pc3Npb25zKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBBY2Nlc3NTZWN0aW9uIHByaW9yID0gbWFwLmdldChzZWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJpb3IgIT0gbnVsbCkgewotICAgICAgICBwcmlvci5tZXJnZUZyb20oc2VjdGlvbik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtYXAucHV0KHNlY3Rpb24uZ2V0TmFtZSgpLCBzZWN0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8QWNjZXNzU2VjdGlvbj4obWFwLnZhbHVlcygpKTsKLSAgfQotCiAgIHByaXZhdGUgc3RhdGljIFNldDxTdHJpbmc+IHNjYW5TZWN0aW9uTmFtZXMoUHJvamVjdENvbmZpZyBjb25maWcpIHsKICAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKICAgICBmb3IgKEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiA6IGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9ucygpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWRtaW5TZXJ2aWNlSW1wbC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFkbWluU2VydmljZUltcGwuamF2YQppbmRleCA5ODNmMWZjLi4wZTQ2YmMzIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWRtaW5TZXJ2aWNlSW1wbC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBZG1pblNlcnZpY2VJbXBsLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFkZEJyYW5jaFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MaXN0QnJhbmNoZXNSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFjY2VzczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Qcm9qZWN0QWRtaW5TZXJ2aWNlOwpAQCAtMjMsNyArMjQsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTQwLDcgKzQwLDYgQEAKICAgcHJpdmF0ZSBmaW5hbCBMaXN0QnJhbmNoZXMuRmFjdG9yeSBsaXN0QnJhbmNoZXNGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFZpc2libGVQcm9qZWN0RGV0YWlscy5GYWN0b3J5IHZpc2libGVQcm9qZWN0RGV0YWlsc0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdEFjY2Vzc0ZhY3RvcnkuRmFjdG9yeSBwcm9qZWN0QWNjZXNzRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDcmVhdGVQcm9qZWN0SGFuZGxlci5GYWN0b3J5IGNyZWF0ZVByb2plY3RIYW5kbGVyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0RGV0YWlsRmFjdG9yeS5GYWN0b3J5IHByb2plY3REZXRhaWxGYWN0b3J5OwogCiAgIEBJbmplY3QKQEAgLTUyLDggKzUxLDcgQEAKICAgICAgIGZpbmFsIExpc3RCcmFuY2hlcy5GYWN0b3J5IGxpc3RCcmFuY2hlc0ZhY3RvcnksCiAgICAgICBmaW5hbCBWaXNpYmxlUHJvamVjdERldGFpbHMuRmFjdG9yeSB2aXNpYmxlUHJvamVjdERldGFpbHNGYWN0b3J5LAogICAgICAgZmluYWwgUHJvamVjdEFjY2Vzc0ZhY3RvcnkuRmFjdG9yeSBwcm9qZWN0QWNjZXNzRmFjdG9yeSwKLSAgICAgIGZpbmFsIFByb2plY3REZXRhaWxGYWN0b3J5LkZhY3RvcnkgcHJvamVjdERldGFpbEZhY3RvcnksCi0gICAgICBmaW5hbCBDcmVhdGVQcm9qZWN0SGFuZGxlci5GYWN0b3J5IGNyZWF0ZU5ld1Byb2plY3RGYWN0b3J5KSB7CisgICAgICBmaW5hbCBQcm9qZWN0RGV0YWlsRmFjdG9yeS5GYWN0b3J5IHByb2plY3REZXRhaWxGYWN0b3J5KSB7CiAgICAgdGhpcy5hZGRCcmFuY2hGYWN0b3J5ID0gYWRkQnJhbmNoRmFjdG9yeTsKICAgICB0aGlzLmNoYW5nZVByb2plY3RBY2Nlc3NGYWN0b3J5ID0gY2hhbmdlUHJvamVjdEFjY2Vzc0ZhY3Rvcnk7CiAgICAgdGhpcy5yZXZpZXdQcm9qZWN0QWNjZXNzRmFjdG9yeSA9IHJldmlld1Byb2plY3RBY2Nlc3NGYWN0b3J5OwpAQCAtNjMsNyArNjEsNiBAQAogICAgIHRoaXMudmlzaWJsZVByb2plY3REZXRhaWxzRmFjdG9yeSA9IHZpc2libGVQcm9qZWN0RGV0YWlsc0ZhY3Rvcnk7CiAgICAgdGhpcy5wcm9qZWN0QWNjZXNzRmFjdG9yeSA9IHByb2plY3RBY2Nlc3NGYWN0b3J5OwogICAgIHRoaXMucHJvamVjdERldGFpbEZhY3RvcnkgPSBwcm9qZWN0RGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLmNyZWF0ZVByb2plY3RIYW5kbGVyRmFjdG9yeSA9IGNyZWF0ZU5ld1Byb2plY3RGYWN0b3J5OwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xMjYsMTYgKzEyMyw4IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBhZGRCcmFuY2goZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAogICAgICAgZmluYWwgU3RyaW5nIGJyYW5jaE5hbWUsIGZpbmFsIFN0cmluZyBzdGFydGluZ1JldmlzaW9uLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxMaXN0QnJhbmNoZXNSZXN1bHQ+IGNhbGxiYWNrKSB7CisgICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPEFkZEJyYW5jaFJlc3VsdD4gY2FsbGJhY2spIHsKICAgICBhZGRCcmFuY2hGYWN0b3J5LmNyZWF0ZShwcm9qZWN0TmFtZSwgYnJhbmNoTmFtZSwgc3RhcnRpbmdSZXZpc2lvbikudG8oCiAgICAgICAgIGNhbGxiYWNrKTsKICAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjcmVhdGVOZXdQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsCi0gICAgICBib29sZWFuIGVtcHR5Q29tbWl0LCBib29sZWFuIHBlcm1pc3Npb25zT25seSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBjcmVhdGVQcm9qZWN0SGFuZGxlckZhY3RvcnkuY3JlYXRlKHByb2plY3ROYW1lLCBwYXJlbnROYW1lLCBlbXB0eUNvbW1pdCwKLSAgICAgICAgcGVybWlzc2lvbnNPbmx5KS50byhjYWxsYmFjayk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3REZXRhaWxGYWN0b3J5LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0RGV0YWlsRmFjdG9yeS5qYXZhCmluZGV4IDI3NDE2NDAuLjI1MzNmZWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3REZXRhaWxGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdERldGFpbEZhY3RvcnkuamF2YQpAQCAtMTQsOCArMTQsMTAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlByb2plY3REZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkluaGVyaXRlZEJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwpAQCAtNjgsNiArNzAsMjggQEAKICAgICBkZXRhaWwuc2V0Q2FuTW9kaWZ5TWVyZ2VUeXBlKHVzZXJJc093bmVyKTsKICAgICBkZXRhaWwuc2V0Q2FuTW9kaWZ5U3RhdGUodXNlcklzT3duZXIpOwogCisgICAgZmluYWwgSW5oZXJpdGVkQm9vbGVhbiB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBuZXcgSW5oZXJpdGVkQm9vbGVhbigpOworICAgIGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gdXNlU2lnbmVkT2ZmQnkgPSBuZXcgSW5oZXJpdGVkQm9vbGVhbigpOworICAgIGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gdXNlQ29udGVudE1lcmdlID0gbmV3IEluaGVyaXRlZEJvb2xlYW4oKTsKKyAgICBmaW5hbCBJbmhlcml0ZWRCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRCA9IG5ldyBJbmhlcml0ZWRCb29sZWFuKCk7CisgICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldFZhbHVlKHByb2plY3RTdGF0ZS5nZXRQcm9qZWN0KCkKKyAgICAgICAgLmdldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKKyAgICB1c2VTaWduZWRPZmZCeS5zZXRWYWx1ZShwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLmdldFVzZVNpZ25lZE9mZkJ5KCkpOworICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRWYWx1ZShwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLmdldFVzZUNvbnRlbnRNZXJnZSgpKTsKKyAgICByZXF1aXJlQ2hhbmdlSUQuc2V0VmFsdWUocHJvamVjdFN0YXRlLmdldFByb2plY3QoKS5nZXRSZXF1aXJlQ2hhbmdlSUQoKSk7CisgICAgUHJvamVjdFN0YXRlIHBhcmVudFN0YXRlID0gSXRlcmFibGVzLmdldEZpcnN0KHByb2plY3RTdGF0ZS5wYXJlbnRzKCksIG51bGwpOworICAgIGlmIChwYXJlbnRTdGF0ZSAhPSBudWxsKSB7CisgICAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMuc2V0SW5oZXJpdGVkVmFsdWUocGFyZW50U3RhdGUKKyAgICAgICAgICAuaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSk7CisgICAgICB1c2VTaWduZWRPZmZCeS5zZXRJbmhlcml0ZWRWYWx1ZShwYXJlbnRTdGF0ZS5pc1VzZVNpZ25lZE9mZkJ5KCkpOworICAgICAgdXNlQ29udGVudE1lcmdlLnNldEluaGVyaXRlZFZhbHVlKHBhcmVudFN0YXRlLmlzVXNlQ29udGVudE1lcmdlKCkpOworICAgICAgcmVxdWlyZUNoYW5nZUlELnNldEluaGVyaXRlZFZhbHVlKHBhcmVudFN0YXRlLmlzUmVxdWlyZUNoYW5nZUlEKCkpOworICAgIH0KKyAgICBkZXRhaWwuc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyk7CisgICAgZGV0YWlsLnNldFVzZVNpZ25lZE9mZkJ5KHVzZVNpZ25lZE9mZkJ5KTsKKyAgICBkZXRhaWwuc2V0VXNlQ29udGVudE1lcmdlKHVzZUNvbnRlbnRNZXJnZSk7CisgICAgZGV0YWlsLnNldFJlcXVpcmVDaGFuZ2VJRChyZXF1aXJlQ2hhbmdlSUQpOworCiAgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lID0gcHJvamVjdFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CiAgICAgUmVwb3NpdG9yeSBnaXQ7CiAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RNb2R1bGUuamF2YQppbmRleCBlOTQzZTNmYy4uMmQ0ZjIxMCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RNb2R1bGUuamF2YQpAQCAtMzEsNyArMzEsNiBAQAogICAgICAgICBmYWN0b3J5KEFkZEJyYW5jaC5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShDaGFuZ2VQcm9qZWN0QWNjZXNzLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFJldmlld1Byb2plY3RBY2Nlc3MuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoQ3JlYXRlUHJvamVjdEhhbmRsZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoQ2hhbmdlUHJvamVjdFNldHRpbmdzLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KERlbGV0ZUJyYW5jaGVzLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KExpc3RCcmFuY2hlcy5GYWN0b3J5LmNsYXNzKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RzUmVzdEFwaVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RzUmVzdEFwaVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNiOGIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdHNSZXN0QXBpU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJlc3RhcGkuUmVzdEFwaVNlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBQcm9qZWN0c1Jlc3RBcGlTZXJ2bGV0IGV4dGVuZHMgUmVzdEFwaVNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBASW5qZWN0CisgIFByb2plY3RzUmVzdEFwaVNlcnZsZXQoUmVzdEFwaVNlcnZsZXQuR2xvYmFscyBnbG9iYWxzLAorICAgICAgUHJvdmlkZXI8UHJvamVjdHNDb2xsZWN0aW9uPiBwcm9qZWN0cykgeworICAgIHN1cGVyKGdsb2JhbHMsIHByb2plY3RzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUmV2aWV3UHJvamVjdEFjY2Vzcy5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUmV2aWV3UHJvamVjdEFjY2Vzcy5qYXZhCmluZGV4IDY5YTI4M2EuLjI1MTI0OWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Jldmlld1Byb2plY3RBY2Nlc3MuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9SZXZpZXdQcm9qZWN0QWNjZXNzLmphdmEKQEAgLTI3LDE0ICsyNywxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5DaGFuZ2VSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBvc3RSZXZpZXdlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1ldGFEYXRhVXBkYXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guQWRkUmV2aWV3ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwpAQCAtNTgsMTQgKzYxLDE2IEBACiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CiAgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQWRkUmV2aWV3ZXIuRmFjdG9yeSBhZGRSZXZpZXdlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UG9zdFJldmlld2Vycz4gcmV2aWV3ZXJzUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VGYWN0b3J5OwogCiAgIEBJbmplY3QKICAgUmV2aWV3UHJvamVjdEFjY2VzcyhmaW5hbCBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeSwKICAgICAgIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCiAgICAgICBmaW5hbCBNZXRhRGF0YVVwZGF0ZS5Vc2VyIG1ldGFEYXRhVXBkYXRlRmFjdG9yeSwgZmluYWwgUmV2aWV3RGIgZGIsCiAgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCi0gICAgICBmaW5hbCBBZGRSZXZpZXdlci5GYWN0b3J5IGFkZFJldmlld2VyRmFjdG9yeSwKKyAgICAgIGZpbmFsIFByb3ZpZGVyPFBvc3RSZXZpZXdlcnM+IHJldmlld2Vyc1Byb3ZpZGVyLAorICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VGYWN0b3J5LAogCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAogICAgICAgQE51bGxhYmxlIEBBc3Npc3RlZCBmaW5hbCBPYmplY3RJZCBiYXNlLApAQCAtNzYsMTQgKzgxLDE2IEBACiAgICAgdGhpcy5kYiA9IGRiOwogICAgIHRoaXMudXNlciA9IHVzZXI7CiAgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgICB0aGlzLmFkZFJldmlld2VyRmFjdG9yeSA9IGFkZFJldmlld2VyRmFjdG9yeTsKKyAgICB0aGlzLnJldmlld2Vyc1Byb3ZpZGVyID0gcmV2aWV3ZXJzUHJvdmlkZXI7CisgICAgdGhpcy5jaGFuZ2VGYWN0b3J5ID0gY2hhbmdlRmFjdG9yeTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgQ2hhbmdlLklkIHVwZGF0ZVByb2plY3RDb25maWcoUHJvamVjdENvbmZpZyBjb25maWcsIE1ldGFEYXRhVXBkYXRlIG1kKQogICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24gewogICAgIENoYW5nZS5JZCBjaGFuZ2VJZCA9IG5ldyBDaGFuZ2UuSWQoZGIubmV4dENoYW5nZUlkKCkpOwotICAgIFBhdGNoU2V0IHBzID0gbmV3IFBhdGNoU2V0KG5ldyBQYXRjaFNldC5JZChjaGFuZ2VJZCwgMSkpOworICAgIFBhdGNoU2V0IHBzID0KKyAgICAgICAgbmV3IFBhdGNoU2V0KG5ldyBQYXRjaFNldC5JZChjaGFuZ2VJZCwgQ2hhbmdlLklOSVRJQUxfUEFUQ0hfU0VUX0lEKSk7CiAgICAgUmV2Q29tbWl0IGNvbW1pdCA9IGNvbmZpZy5jb21taXRUb05ld1JlZihtZCwgcHMuZ2V0UmVmTmFtZSgpKTsKICAgICBpZiAoY29tbWl0LmdldElkKCkuZXF1YWxzKGJhc2UpKSB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTk2LDcgKzEwMyw2IEBACiAgICAgICAgIG5ldyBCcmFuY2guTmFtZUtleSgKICAgICAgICAgICAgIGNvbmZpZy5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpLAogICAgICAgICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRykpOwotICAgIGNoYW5nZS5uZXh0UGF0Y2hTZXRJZCgpOwogCiAgICAgcHMuc2V0Q3JlYXRlZE9uKGNoYW5nZS5nZXRDcmVhdGVkT24oKSk7CiAgICAgcHMuc2V0VXBsb2FkZXIoY2hhbmdlLmdldE93bmVyKCkpOwpAQCAtMTExLDcgKzExNyw3IEBACiAgICAgICBpbnNlcnRBbmNlc3RvcnMocHMuZ2V0SWQoKSwgY29tbWl0KTsKICAgICAgIGRiLnBhdGNoU2V0cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHMpKTsKICAgICAgIGRiLmNoYW5nZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNoYW5nZSkpOwotICAgICAgYWRkUHJvamVjdE93bmVyc0FzUmV2aWV3ZXJzKGNoYW5nZUlkKTsKKyAgICAgIGFkZFByb2plY3RPd25lcnNBc1Jldmlld2VycyhjaGFuZ2UpOwogICAgICAgZGIuY29tbWl0KCk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGRiLnJvbGxiYWNrKCk7CkBAIC0xMzMsMTIgKzEzOSwxNSBAQAogICAgIGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuaW5zZXJ0KHRvSW5zZXJ0KTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBhZGRQcm9qZWN0T3duZXJzQXNSZXZpZXdlcnMoZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkKSB7CisgIHByaXZhdGUgdm9pZCBhZGRQcm9qZWN0T3duZXJzQXNSZXZpZXdlcnMoZmluYWwgQ2hhbmdlIGNoYW5nZSkgewogICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0T3duZXJzID0KICAgICAgICAgZ3JvdXBCYWNrZW5kLmdldChBY2NvdW50R3JvdXAuUFJPSkVDVF9PV05FUlMpLmdldE5hbWUoKTsKICAgICB0cnkgewotICAgICAgYWRkUmV2aWV3ZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2VJZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHByb2plY3RPd25lcnMpLAotICAgICAgICAgIGZhbHNlKS5jYWxsKCk7CisgICAgICBDaGFuZ2VSZXNvdXJjZSByc3JjID0KKyAgICAgICAgICBuZXcgQ2hhbmdlUmVzb3VyY2UoY2hhbmdlRmFjdG9yeS5jb250cm9sRm9yKGNoYW5nZSwgdXNlcikpOworICAgICAgUG9zdFJldmlld2Vycy5JbnB1dCBpbnB1dCA9IG5ldyBQb3N0UmV2aWV3ZXJzLklucHV0KCk7CisgICAgICBpbnB1dC5yZXZpZXdlciA9IHByb2plY3RPd25lcnM7CisgICAgICByZXZpZXdlcnNQcm92aWRlci5nZXQoKS5hcHBseShyc3JjLCBpbnB1dCk7CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIC8vIG9uZSBvZiB0aGUgb3duZXIgZ3JvdXBzIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCB0aGlzIGl0IHdoeSBpdAogICAgICAgLy8gY2FuJ3QgYmUgYWRkZWQgYXMgcmV2aWV3ZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3RlbXBsYXRlL1NpdGVIZWFkZXJGb290ZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3RlbXBsYXRlL1NpdGVIZWFkZXJGb290ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFmMDMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvdGVtcGxhdGUvU2l0ZUhlYWRlckZvb3Rlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQudGVtcGxhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHRtbERvbVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFNpdGVIZWFkZXJGb290ZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2l0ZUhlYWRlckZvb3Rlci5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlZnJlc2hIZWFkZXJGb290ZXI7CisgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGVQYXRoczsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBUZW1wbGF0ZSB0ZW1wbGF0ZTsKKworICBASW5qZWN0CisgIFNpdGVIZWFkZXJGb290ZXIoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnLCBTaXRlUGF0aHMgc2l0ZVBhdGhzKSB7CisgICAgdGhpcy5yZWZyZXNoSGVhZGVyRm9vdGVyID0gY2ZnLmdldEJvb2xlYW4oInNpdGUiLCAicmVmcmVzaEhlYWRlckZvb3RlciIsIHRydWUpOworICAgIHRoaXMuc2l0ZVBhdGhzID0gc2l0ZVBhdGhzOworCisgICAgVGVtcGxhdGUgdCA9IG5ldyBUZW1wbGF0ZShzaXRlUGF0aHMpOworICAgIHRyeSB7CisgICAgICB0LmxvYWQoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cud2FybigiQ2Fubm90IGxvYWQgc2l0ZSBoZWFkZXIgb3IgZm9vdGVyIiwgZSk7CisgICAgfQorICAgIHRlbXBsYXRlID0gdDsKKyAgfQorCisgIHB1YmxpYyBEb2N1bWVudCBwYXJzZShDbGFzczw/PiBjbGF6eiwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgVGVtcGxhdGUgdCA9IHRlbXBsYXRlOworICAgIGlmIChyZWZyZXNoSGVhZGVyRm9vdGVyICYmIHQuaXNTdGFsZSgpKSB7CisgICAgICB0ID0gbmV3IFRlbXBsYXRlKHNpdGVQYXRocyk7CisgICAgICB0cnkgeworICAgICAgICB0LmxvYWQoKTsKKyAgICAgICAgdGVtcGxhdGUgPSB0OworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBsb2cud2FybigiQ2Fubm90IHJlZnJlc2ggc2l0ZSBoZWFkZXIgb3IgZm9vdGVyIiwgZSk7CisgICAgICAgIHQgPSB0ZW1wbGF0ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBEb2N1bWVudCBkb2MgPSBIdG1sRG9tVXRpbC5wYXJzZUZpbGUoY2xhenosIG5hbWUpOworICAgIGluamVjdENzcyhkb2MsICJnZXJyaXRfc2l0ZWNzcyIsIHQuY3NzKTsKKyAgICBpbmplY3RYbWwoZG9jLCAiZ2Vycml0X2hlYWRlciIsIHQuaGVhZGVyKTsKKyAgICBpbmplY3RYbWwoZG9jLCAiZ2Vycml0X2Zvb3RlciIsIHQuZm9vdGVyKTsKKyAgICByZXR1cm4gZG9jOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluamVjdENzcyhEb2N1bWVudCBkb2MsIFN0cmluZyBpZCwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICBFbGVtZW50IGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgaWQpOworICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGNvbnRlbnQpKSB7CisgICAgICAgIHdoaWxlIChlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSB7CisgICAgICAgICAgZS5yZW1vdmVDaGlsZChlLmdldEZpcnN0Q2hpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZS5yZW1vdmVBdHRyaWJ1dGUoImlkIik7CisgICAgICAgIGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbigiXG4iICsgY29udGVudCArICJcbiIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbmplY3RYbWwoRG9jdW1lbnQgZG9jLCBTdHJpbmcgaWQsIEVsZW1lbnQgZCkgeworICAgIEVsZW1lbnQgZSA9IEh0bWxEb21VdGlsLmZpbmQoZG9jLCBpZCk7CisgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICB3aGlsZSAoZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkgeworICAgICAgICAgIGUucmVtb3ZlQ2hpbGQoZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICB9CisgICAgICAgIGUuYXBwZW5kQ2hpbGQoZG9jLmltcG9ydE5vZGUoZCwgdHJ1ZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVtcGxhdGUgeworICAgIHByaXZhdGUgZmluYWwgRmlsZUluZm8gY3NzRmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVJbmZvIGhlYWRlckZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSW5mbyBmb290ZXJGaWxlOworCisgICAgU3RyaW5nIGNzczsKKyAgICBFbGVtZW50IGhlYWRlcjsKKyAgICBFbGVtZW50IGZvb3RlcjsKKworICAgIFRlbXBsYXRlKFNpdGVQYXRocyBzaXRlKSB7CisgICAgICBjc3NGaWxlID0gbmV3IEZpbGVJbmZvKHNpdGUuc2l0ZV9jc3MpOworICAgICAgaGVhZGVyRmlsZSA9IG5ldyBGaWxlSW5mbyhzaXRlLnNpdGVfaGVhZGVyKTsKKyAgICAgIGZvb3RlckZpbGUgPSBuZXcgRmlsZUluZm8oc2l0ZS5zaXRlX2Zvb3Rlcik7CisgICAgfQorCisgICAgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIGNzcyA9IEh0bWxEb21VdGlsLnJlYWRGaWxlKAorICAgICAgICAgIGNzc0ZpbGUucGF0aC5nZXRQYXJlbnRGaWxlKCksCisgICAgICAgICAgY3NzRmlsZS5wYXRoLmdldE5hbWUoKSk7CisgICAgICBoZWFkZXIgPSByZWFkWG1sKGhlYWRlckZpbGUpOworICAgICAgZm9vdGVyID0gcmVhZFhtbChmb290ZXJGaWxlKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzU3RhbGUoKSB7CisgICAgICByZXR1cm4gY3NzRmlsZS5pc1N0YWxlKCkgfHwgaGVhZGVyRmlsZS5pc1N0YWxlKCkgfHwgZm9vdGVyRmlsZS5pc1N0YWxlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudCByZWFkWG1sKEZpbGVJbmZvIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIERvY3VtZW50IGQgPSBIdG1sRG9tVXRpbC5wYXJzZUZpbGUoc3JjLnBhdGgpOworICAgICAgcmV0dXJuIGQgIT0gbnVsbCA/IGQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgOiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVJbmZvIHsKKyAgICBmaW5hbCBGaWxlIHBhdGg7CisgICAgZmluYWwgbG9uZyB0aW1lOworCisgICAgRmlsZUluZm8oRmlsZSBwKSB7CisgICAgICBwYXRoID0gcDsKKyAgICAgIHRpbWUgPSBwYXRoLmxhc3RNb2RpZmllZCgpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNTdGFsZSgpIHsKKyAgICAgIHJldHVybiB0aW1lICE9IHBhdGgubGFzdE1vZGlmaWVkKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnQuaHRtbCBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudC5odG1sCmluZGV4IGMzYzc1MDMuLmM2NjAzMTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudC5odG1sCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudC5odG1sCkBAIC0xLDEwICsxLDEwIEBACiA8aHRtbD4KICAgPGhlYWQ+CiAgICAgPHRpdGxlPkdlcnJpdCBDb2RlIFJldmlldzwvdGl0bGU+Ci0gICAgPHNjcmlwdCBpZD0iZ2Vycml0X2d3dGRldm1vZGUiPgorICAgIDxzY3JpcHQgaWQ9Imd3dGRldm1vZGUiPgogICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgdmFyIHBuID0gJ2d3dC5jb2Rlc3ZyJzsKLSAgICAgICAgdmFyIGNuID0gJ2dlcnJpdC4nICsgcG47CisgICAgICAgIHZhciBjbiA9ICdnZXJyaXRfdWkuJyArIHBuOwogCiAgICAgICAgIHZhciBwX3N0YXJ0ID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5pbmRleE9mKHBuICsgJz0nKTsKICAgICAgICAgaWYgKHBfc3RhcnQgIT0gLTEpIHsKQEAgLTI5LDUxICsyOSw1OSBAQAogICAgICAgICB9CiAgICAgICB9KSgpOwogICAgIDwvc2NyaXB0PgorICAgIDxzdHlsZSBpZD0iZ2Vycml0X3NpdGVjc3MiIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPgogICA8L2hlYWQ+CiAgIDxib2R5PgotICAgIDxoMj5TaWduIEluPC9oMj4KLSAgICA8dGFibGUgYm9yZGVyPSIwIj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoPlVzZXJuYW1lOjwvdGg+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMzAiIG5hbWU9InVzZXJfbmFtZSIgLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWNvbWUgQWNjb3VudCIgLz4KLSAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgorICAgIDxkaXYgaWQ9ImdlcnJpdF90b3BtZW51IiBzdHlsZT0iaGVpZ2h0OjQ1cHg7IiBjbGFzcz0iZ2Vycml0VG9wTWVudSI+PC9kaXY+CisgICAgPGRpdiBpZD0iZ2Vycml0X2hlYWRlciI+PC9kaXY+CisgICAgPGRpdiBpZD0iZ2Vycml0X2JvZHkiIGNsYXNzPSJnZXJyaXRCb2R5Ij4KKyAgICAgIDxoMj5TaWduIEluPC9oMj4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjAiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPlVzZXJuYW1lOjwvdGg+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMzAiIG5hbWU9InVzZXJfbmFtZSIgLz4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJlY29tZSBBY2NvdW50IiAvPgorICAgICAgICAgICAgPC9mb3JtPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CiAKLSAgICAgIDx0cj4KLSAgICAgICAgPHRoPkVtYWlsIEFkZHJlc3M6PC90aD4KLSAgICAgICAgPHRkPgotICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIzMCIgbmFtZT0icHJlZmVycmVkX2VtYWlsIiAvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJlY29tZSBBY2NvdW50IiAvPgotICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGg+RW1haWwgQWRkcmVzczo8L3RoPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJwcmVmZXJyZWRfZW1haWwiIC8+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWNvbWUgQWNjb3VudCIgLz4KKyAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgogCi0gICAgICA8dHI+Ci0gICAgICAgIDx0aD5BY2NvdW50IElEOjwvdGg+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTIiIG5hbWU9ImFjY291bnRfaWQiIC8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVjb21lIEFjY291bnQiIC8+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aD5BY2NvdW50IElEOjwvdGg+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMTIiIG5hbWU9ImFjY291bnRfaWQiIC8+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWNvbWUgQWNjb3VudCIgLz4KKyAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgogCi0gICAgICA8dHI+Ci0gICAgICAgIDx0aD5DaG9vc2U6PC90aD4KLSAgICAgICAgPHRkIGlkPSJ1c2VybGlzdCIvPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+Q2hvb3NlOjwvdGg+CisgICAgICAgICAgPHRkIGlkPSJ1c2VybGlzdCIvPgorICAgICAgICA8L3RyPgorICAgICAgPC90YWJsZT4KIAotICAgIDxociAvPgotICAgIDxoMj5SZWdpc3RlcjwvaDI+Ci0gICAgPGZvcm0gbWV0aG9kPSJQT1NUIj4KLSAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImNyZWF0ZV9hY2NvdW50IiAvPgotICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik5ldyBBY2NvdW50IiAvPgotICAgIDwvZm9ybT4KKyAgICAgIDxociAvPgorICAgICAgPGgyPlJlZ2lzdGVyPC9oMj4KKyAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9ImNyZWF0ZV9hY2NvdW50IiAvPgorICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iTmV3IEFjY291bnQiIC8+CisgICAgICA8L2Zvcm0+CisgICAgPC9kaXY+CisgICAgPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7IG1hcmdpbi10b3A6IDE1cHg7IHBhZGRpbmctdG9wOiAycHg7IG1hcmdpbi1ib3R0b206IDE1cHg7Ij4KKyAgICAgIDxkaXYgaWQ9ImdlcnJpdF9mb290ZXIiPjwvZGl2PgorICAgIDwvZGl2PgogICA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0NvbmZpZ3VyYXRpb25FcnJvci5odG1sIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Db25maWd1cmF0aW9uRXJyb3IuaHRtbAppbmRleCA3Mjk0MDEyLi4wYmMzMzY5IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0NvbmZpZ3VyYXRpb25FcnJvci5odG1sCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvQ29uZmlndXJhdGlvbkVycm9yLmh0bWwKQEAgLTQ5LDIyICs0OSwxNiBAQAogJmx0O1ZpcnR1YWxIb3N0IDxzcGFuIGNsYXNzPSdTZXJ2ZXJOYW1lJz5yZXZpZXcuZXhhbXBsZS5jb208L3NwYW4+PHNwYW4gY2xhc3M9J1NlcnZlclBvcnQnPjo4MDwvc3Bhbj4mZ3Q7CiAgICAgU2VydmVyTmFtZSA8c3BhbiBjbGFzcz0nU2VydmVyTmFtZSc+cmV2aWV3LmV4YW1wbGUuY29tPC9zcGFuPgogCi0gICAgUHJveHlSZXF1ZXN0cyBPZmYKLSAgICBQcm94eVZpYSBPZmYKLSAgICBQcm94eVByZXNlcnZlSG9zdCBPbgotCi0gICAgJmx0O1Byb3h5IComZ3Q7Ci0gICAgICAgICAgT3JkZXIgZGVueSxhbGxvdwotICAgICAgICAgIEFsbG93IGZyb20gYWxsCi0gICAgJmx0Oy9Qcm94eSZndDsKLQogPGRpdiBjbGFzcz0nYXBhY2hlX2F1dGgnPiAgICAmbHQ7TG9jYXRpb24gPHNwYW4gY2xhc3M9J0NvbnRleHRQYXRoJz4vcjwvc3Bhbj4vbG9naW4vJmd0OwogICAgICAgQXV0aFR5cGUgQmFzaWMKICAgICAgIEF1dGhOYW1lICJHZXJyaXQgQ29kZSBSZXZpZXciCiAgICAgICBSZXF1aXJlIHZhbGlkLXVzZXIKICAgICAgIC4uLgogICAgICZsdDsvTG9jYXRpb24mZ3Q7PC9kaXY+Ci0gICAgUHJveHlQYXNzIDxzcGFuIGNsYXNzPSdDb250ZXh0UGF0aCc+L3I8L3NwYW4+LyBodHRwOi8vLi4uPHNwYW4gY2xhc3M9J0NvbnRleHRQYXRoJz4vcjwvc3Bhbj4vCisKKyAgICBBbGxvd0VuY29kZWRTbGFzaGVzIE5vRGVjb2RlCisgICAgUmV3cml0ZUVuZ2luZSBPbgorICAgIFJld3JpdGVSdWxlIF48c3BhbiBjbGFzcz0nQ29udGV4dFBhdGgnPi9yPC9zcGFuPi8oLiopIGh0dHA6Ly8uLi48c3BhbiBjbGFzcz0nQ29udGV4dFBhdGgnPi9yPC9zcGFuPi8kMSBbTkUsUF0KICZsdDsvVmlydHVhbEhvc3QmZ3Q7CiAgICAgPC9wcmU+CiAgIDwvYm9keT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvTG9naW5SZWRpcmVjdC5odG1sIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Mb2dpblJlZGlyZWN0Lmh0bWwKaW5kZXggNzJiNTg5Zi4uNDMzYmUyMCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Mb2dpblJlZGlyZWN0Lmh0bWwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Mb2dpblJlZGlyZWN0Lmh0bWwKQEAgLTEsNCArMSw0IEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CiA8aHRtbD4KICAgPGhlYWQ+CiAgICAgPHRpdGxlPkdlcnJpdCBDb2RlIFJldmlldzwvdGl0bGU+CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Mb2dpbkZvcm0uaHRtbCBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL0xvZ2luRm9ybS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YmM3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Mb2dpbkZvcm0uaHRtbApAQCAtMCwwICsxLDgzIEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkdlcnJpdCBDb2RlIFJldmlldyAtIFNpZ24gSW48L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAjZXJyb3JfbWVzc2FnZSB7CisgICAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgICAgbWFyZ2luOiAyZW07CisgICAgICAgIHdpZHRoOiAyMGVtOworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDExNik7CisgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgICAgfQorICAgICAgI2NhbmNlbF9saW5rIHsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7CisgICAgICB9CisgICAgPC9zdHlsZT4KKyAgICA8c3R5bGUgaWQ9ImdlcnJpdF9zaXRlY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfdG9wbWVudSIgc3R5bGU9ImhlaWdodDo0NXB4OyIgY2xhc3M9ImdlcnJpdFRvcE1lbnUiPjwvZGl2PgorICAgIDxkaXYgaWQ9ImdlcnJpdF9oZWFkZXIiPjwvZGl2PgorICAgIDxkaXYgaWQ9ImdlcnJpdF9ib2R5IiBjbGFzcz0iZ2Vycml0Qm9keSI+CisgICAgICA8aDE+U2lnbiBJbiB0byBHZXJyaXQgQ29kZSBSZXZpZXcgYXQgPHNwYW4gaWQ9Imhvc3ROYW1lIj5leGFtcGxlLmNvbTwvc3Bhbj48L2gxPgorICAgICAgPGRpdiBpZD0iZXJyb3JfbWVzc2FnZSI+SW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZC48L2Rpdj4KKyAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIjIiBpZD0ibG9naW5fZm9ybSI+CisgICAgICAgIDx0YWJsZSBzdHlsZT0iYm9yZGVyOiAwOyI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGg+VXNlcm5hbWU8L3RoPgorICAgICAgICAgIDx0ZD48aW5wdXQgbmFtZT0idXNlcm5hbWUiIGlkPSJmX3VzZXIiCisgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgc2l6ZT0iMjUiCisgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD0iMSIgLz48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPlBhc3N3b3JkPC90aD4KKyAgICAgICAgICA8dGQ+PGlucHV0IG5hbWU9InBhc3N3b3JkIiBpZD0iZl9wYXNzIgorICAgICAgICAgICAgICAgICAgICAgdHlwZT0icGFzc3dvcmQiCisgICAgICAgICAgICAgICAgICAgICBzaXplPSIyNSIKKyAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PSIyIiAvPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8aW5wdXQgbmFtZT0icmVtZW1iZXJtZSIgaWQ9ImZfcmVtZW1iZXIiCisgICAgICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCisgICAgICAgICAgICAgICAgICAgdmFsdWU9IjEiCisgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9IjMiIC8+CisgICAgICAgICAgICA8bGFiZWwgZm9yPSJmX3JlbWVtYmVyIj5SZW1lbWJlciBtZTwvbGFiZWw+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48L3RkPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTaWduIEluIiB0YWJpbmRleD0iNCIvPgorICAgICAgICAgICAgPGEgaHJlZj0iLi4vIiBpZD0iY2FuY2VsX2xpbmsiPkNhbmNlbDwvYT4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgPC9mb3JtPgorICAgICAgPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7IG1hcmdpbi10b3A6IDE1cHg7IHBhZGRpbmctdG9wOiAycHg7IG1hcmdpbi1ib3R0b206IDE1cHg7Ij4KKyAgICAgICAgPGRpdiBpZD0iZ2Vycml0X2Zvb3RlciI+PC9kaXY+CisgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKworICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgIHZhciBsb2dpbl9mb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luX2Zvcm0nKTsKKyAgICAgIHZhciBmX3VzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl91c2VyJyk7CisgICAgICB2YXIgZl9wYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZfcGFzcycpOworICAgICAgZl91c2VyLm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykgeworICAgICAgICAgIGZfcGFzcy5mb2N1cygpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZl9wYXNzLm9ua2V5ZG93biA9IGZ1bmN0aW9uKGUpIHsKKyAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykgeworICAgICAgICAgIGxvZ2luX2Zvcm0uc3VibWl0KCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICBmX3VzZXIuZm9jdXMoKTsKKyAgICA8L3NjcmlwdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvSG9zdFBhZ2UuaHRtbCBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlLmh0bWwKaW5kZXggZmYwOWY1MC4uOTA3NDE0ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvSG9zdFBhZ2UuaHRtbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Ib3N0UGFnZS5odG1sCkBAIC0yLDEwICsyLDEwIEBACiAgIDxoZWFkPgogICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXc8L3RpdGxlPgogICAgIDxtZXRhIG5hbWU9Imd3dDpwcm9wZXJ0eSIgY29udGVudD0ibG9jYWxlPWVuX1VTIiAvPgotICAgIDxzY3JpcHQgaWQ9ImdlcnJpdF9nd3RkZXZtb2RlIj4KKyAgICA8c2NyaXB0IGlkPSJnd3RkZXZtb2RlIj4KICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIHZhciBwbiA9ICdnd3QuY29kZXN2cic7Ci0gICAgICAgIHZhciBjbiA9ICdnZXJyaXQuJyArIHBuOworICAgICAgICB2YXIgY24gPSAnZ2Vycml0X3VpLicgKyBwbjsKIAogICAgICAgICB2YXIgcF9zdGFydCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5kZXhPZihwbiArICc9Jyk7CiAgICAgICAgIGlmIChwX3N0YXJ0ICE9IC0xKSB7CkBAIC0zMiw3ICszMiw3IEBACiAgICAgPC9zY3JpcHQ+CiAgICAgPHNjcmlwdCBpZD0iZ2Vycml0X2hvc3RwYWdlZGF0YSI+PC9zY3JpcHQ+CiAgICAgPHN0eWxlICBpZD0iZ2Vycml0X3NpdGVjc3MiIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPgotICAgIDxsaW5rIHJlbD0iaWNvbiIgdHlwZT0iaW1hZ2UvZ2lmIiBocmVmPSJmYXZpY29uLmljbyIgLz4KKyAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZmF2aWNvbi5pY28iIC8+CiAgIDwvaGVhZD4KICAgPGJvZHk+CiAgICAgPGRpdiBpZD0iZ2Vycml0X3RvcG1lbnUiPjwvZGl2PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0Lmh0bWwgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXQuaHRtbAppbmRleCA1MDUwYmYyLi42NjM5YTViIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXQuaHRtbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXQuaHRtbApAQCAtMSw0ICsxLDQgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvc3RyaWN0LmR0ZCI+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9zdHJpY3QuZHRkIj4KIDxodG1sPgogICA8aGVhZD4KICAgICA8dGl0bGU+R2Vycml0IENvZGUgUmV2aWV3PC90aXRsZT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyVGVzdC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmVzdGFwaS9QYXJhbWV0ZXJQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiYzdmMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblByaW1pdGl2ZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFBhcmFtZXRlclBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Rm9ybVRvSnNvbigpIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICBKc29uT2JqZWN0IG9iaiA9IFBhcmFtZXRlclBhcnNlci5mb3JtVG9Kc29uKAorICAgICAgICBJbW11dGFibGVNYXAub2YoCisgICAgICAgICAgICAibWVzc2FnZSIsIG5ldyBTdHJpbmdbXXsidGhpcy5pcy50ZXh0In0sCisgICAgICAgICAgICAibGFiZWxzLlZlcmlmaWVkIiwgbmV3IFN0cmluZ1tdeyItMSJ9LAorICAgICAgICAgICAgImxhYmVscy5Db2RlLVJldmlldyIsIG5ldyBTdHJpbmdbXXsiMiJ9LAorICAgICAgICAgICAgImFfbGlzdCIsIG5ldyBTdHJpbmdbXXsiYSIsICJiIn0pLAorICAgICAgICBJbW11dGFibGVTZXQub2YoInEiKSk7CisKKyAgICBKc29uT2JqZWN0IGxhYmVscyA9IG5ldyBKc29uT2JqZWN0KCk7CisgICAgbGFiZWxzLmFkZFByb3BlcnR5KCJWZXJpZmllZCIsICItMSIpOworICAgIGxhYmVscy5hZGRQcm9wZXJ0eSgiQ29kZS1SZXZpZXciLCAiMiIpOworICAgIEpzb25BcnJheSBsaXN0ID0gbmV3IEpzb25BcnJheSgpOworICAgIGxpc3QuYWRkKG5ldyBKc29uUHJpbWl0aXZlKCJhIikpOworICAgIGxpc3QuYWRkKG5ldyBKc29uUHJpbWl0aXZlKCJiIikpOworICAgIEpzb25PYmplY3QgZXhwID0gbmV3IEpzb25PYmplY3QoKTsKKyAgICBleHAuYWRkUHJvcGVydHkoIm1lc3NhZ2UiLCAidGhpcy5pcy50ZXh0Iik7CisgICAgZXhwLmFkZCgibGFiZWxzIiwgbGFiZWxzKTsKKyAgICBleHAuYWRkKCJhX2xpc3QiLCBsaXN0KTsKKworICAgIGFzc2VydEVxdWFscyhleHAsIG9iaik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1sYXVuY2hlci9wb20ueG1sIGIvZ2Vycml0LWxhdW5jaGVyL3BvbS54bWwKaW5kZXggZTcwMDM1MS4uNGYzM2NlOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWxhdW5jaGVyL3BvbS54bWwKKysrIGIvZ2Vycml0LWxhdW5jaGVyL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1sYXVuY2hlcjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1sYXVuY2hlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2xhdW5jaGVyL0dlcnJpdExhdW5jaGVyLmphdmEgYi9nZXJyaXQtbGF1bmNoZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9sYXVuY2hlci9HZXJyaXRMYXVuY2hlci5qYXZhCmluZGV4IDljY2E1NTkuLmQ0OWM2YzcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1sYXVuY2hlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2xhdW5jaGVyL0dlcnJpdExhdW5jaGVyLmphdmEKKysrIGIvZ2Vycml0LWxhdW5jaGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvbGF1bmNoZXIvR2Vycml0TGF1bmNoZXIuamF2YQpAQCAtMjA2LDI3ICsyMDYsMTAgQEAKICAgICAgICAgICBmaW5hbCBaaXBFbnRyeSB6ZSA9IGUubmV4dEVsZW1lbnQoKTsKICAgICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHplLmdldE5hbWUoKS5zdGFydHNXaXRoKCJXRUItSU5GL2xpYi8iKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB6ZS5nZXROYW1lKCkuc3Vic3RyaW5nKCJXRUItSU5GL2xpYi8iLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgdG1wID0gY3JlYXRlVGVtcEZpbGUoc2FmZU5hbWUoemUpLCAiLmphciIpOwotICAgICAgICAgICAgZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXApOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSB6Zi5nZXRJbnB1dFN0cmVhbSh6ZSk7Ci0gICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotICAgICAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IGluLnJlYWQoYnVmLCAwLCBidWYubGVuZ3RoKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBqYXJzLnB1dChuYW1lLCB0bXAudG9VUkkoKS50b1VSTCgpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHplLmdldE5hbWUoKS5zdGFydHNXaXRoKCJXRUItSU5GL2xpYi8iKSkgeworICAgICAgICAgICAgZXh0cmFjdEphcih6ZiwgemUsIGphcnMpOworICAgICAgICAgIH0gZWxzZSBpZiAoemUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIldFQi1JTkYvcGdtLWxpYi8iKSkgeworICAgICAgICAgICAgZXh0cmFjdEphcih6ZiwgemUsIGphcnMpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKQEAgLTI0OCw3ICsyMzEsNyBAQAogICAgIG1vdmUoamFycywgImphdmF4LmluamVjdC0xLmphciIsIGV4dGFwaSk7CiAgICAgbW92ZShqYXJzLCAiYW9wYWxsaWFuY2UtMS4wLmphciIsIGV4dGFwaSk7CiAgICAgbW92ZShqYXJzLCAiZ3VpY2Utc2VydmxldC0iLCBleHRhcGkpOwotICAgIG1vdmUoamFycywgInNlcnZsZXQtYXBpLSIsIGV4dGFwaSk7CisgICAgbW92ZShqYXJzLCAidG9tY2F0LXNlcnZsZXQtYXBpLSIsIGV4dGFwaSk7CiAKICAgICBDbGFzc0xvYWRlciBwYXJlbnQgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwogICAgIGlmICghZXh0YXBpLmlzRW1wdHkoKSkgewpAQCAtMjYxLDYgKzI0NCwzMSBAQAogICAgICAgICBwYXJlbnQpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHRyYWN0SmFyKFppcEZpbGUgemYsIFppcEVudHJ5IHplLAorICAgICAgU29ydGVkTWFwPFN0cmluZywgVVJMPiBqYXJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEZpbGUgdG1wID0gY3JlYXRlVGVtcEZpbGUoc2FmZU5hbWUoemUpLCAiLmphciIpOworICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKTsKKyAgICB0cnkgeworICAgICAgSW5wdXRTdHJlYW0gaW4gPSB6Zi5nZXRJbnB1dFN0cmVhbSh6ZSk7CisgICAgICB0cnkgeworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgIGludCBuOworICAgICAgICB3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCkpID4gMCkgeworICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIG4pOworICAgICAgICB9CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpbi5jbG9zZSgpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgbmFtZSA9IHplLmdldE5hbWUoKTsKKyAgICBqYXJzLnB1dCgKKyAgICAgICAgbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLycpLCBuYW1lLmxlbmd0aCgpKSwKKyAgICAgICAgdG1wLnRvVVJJKCkudG9VUkwoKSk7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmUoU29ydGVkTWFwPFN0cmluZywgVVJMPiBqYXJzLAogICAgICAgU3RyaW5nIHByZWZpeCwKICAgICAgIExpc3Q8VVJMPiBleHRhcGkpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1tYWluL3BvbS54bWwgYi9nZXJyaXQtbWFpbi9wb20ueG1sCmluZGV4IGJiMmQ3NjMuLmQxNzRhZjEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1tYWluL3BvbS54bWwKKysrIGIvZ2Vycml0LW1haW4vcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LW1haW48L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2dlcnJpdC1vcGVuaWQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmluZGV4IGY5ZmUzNDUuLjgzOWQ2NDcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1vcGVuaWQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyBiL2dlcnJpdC1vcGVuaWQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCkBAIC0xLDQgKzEsNSBAQAogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVuY29kaW5nLy9zcmMvbWFpbi9qYXZhPVVURi04CitlbmNvZGluZy8vc3JjL21haW4vcmVzb3VyY2VzPVVURi04CiBlbmNvZGluZy8vc3JjL3Rlc3QvamF2YT1VVEYtOAogZW5jb2RpbmcvPHByb2plY3Q+PVVURi04CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3BvbS54bWwgYi9nZXJyaXQtb3BlbmlkL3BvbS54bWwKaW5kZXggMDFlMmUzZS4uZGJjZDZhOCAxMDA2NDQKLS0tIGEvZ2Vycml0LW9wZW5pZC9wb20ueG1sCisrKyBiL2dlcnJpdC1vcGVuaWQvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LW9wZW5pZDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9EaXNjb3ZlcnlSZXN1bHQuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9EaXNjb3ZlcnlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFmMjlhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL0Rpc2NvdmVyeVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLm9wZW5pZDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ZpbmFsIGNsYXNzIERpc2NvdmVyeVJlc3VsdCB7CisgIHN0YXRpYyBlbnVtIFN0YXR1cyB7CisgICAgLyoqIFByb3ZpZGVyIHdhcyBkaXNjb3ZlcmVkIGFuZCB7QGNvZGUgcHJvdmlkZXJVcmx9IGlzIHZhbGlkLiAqLworICAgIFZBTElELAorCisgICAgLyoqIElkZW50aWZpZXIgaXNuJ3QgZm9yIGFuIE9wZW5JRCBwcm92aWRlci4gKi8KKyAgICBOT19QUk9WSURFUiwKKworICAgIC8qKiBUaGUgcHJvdmlkZXIgd2FzIGRpc2NvdmVyZWQsIGJ1dCBzb21ldGhpbmcgZWxzZSBmYWlsZWQuICovCisgICAgRVJST1I7CisgIH0KKworICBTdGF0dXMgc3RhdHVzOworICBTdHJpbmcgcHJvdmlkZXJVcmw7CisgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvdmlkZXJBcmdzOworCisgIERpc2NvdmVyeVJlc3VsdCgpIHsKKyAgfQorCisgIERpc2NvdmVyeVJlc3VsdChTdHJpbmcgcmVkaXJlY3QsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncykgeworICAgIHN0YXR1cyA9IFN0YXR1cy5WQUxJRDsKKyAgICBwcm92aWRlclVybCA9IHJlZGlyZWN0OworICAgIHByb3ZpZGVyQXJncyA9IGFyZ3M7CisgIH0KKworICBEaXNjb3ZlcnlSZXN1bHQoU3RhdHVzIHMpIHsKKyAgICBzdGF0dXMgPSBzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvTG9naW5Gb3JtLmphdmEgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvTG9naW5Gb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkMzFlZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9Mb2dpbkZvcm0uamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGgub3BlbmlkOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkVXJsczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnRlbXBsYXRlLlNpdGVIZWFkZXJGb290ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqIEhhbmRsZXMgT3BlbklEIGJhc2VkIGxvZ2luIGZsb3cuICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK0BTaW5nbGV0b24KK2NsYXNzIExvZ2luRm9ybSBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvZ2luRm9ybS5jbGFzcyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN0cmluZz4gQUxMX1BST1ZJREVSUyA9IEltbXV0YWJsZU1hcC5vZigKKyAgICAgICJnb29nbGUiLCBPcGVuSWRVcmxzLlVSTF9HT09HTEUsCisgICAgICAieWFob28iLCBPcGVuSWRVcmxzLlVSTF9ZQUhPTyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8U3RyaW5nPiBzdWdnZXN0UHJvdmlkZXJzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgT3BlbklkU2VydmljZUltcGwgaW1wbDsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4UmVkaXJlY3RVcmxMZW5ndGg7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNzb1VybDsKKyAgcHJpdmF0ZSBmaW5hbCBTaXRlSGVhZGVyRm9vdGVyIGhlYWRlcjsKKworICBASW5qZWN0CisgIExvZ2luRm9ybSgKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCisgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjb25maWcsCisgICAgICBBdXRoQ29uZmlnIGF1dGhDb25maWcsCisgICAgICBPcGVuSWRTZXJ2aWNlSW1wbCBpbXBsLAorICAgICAgU2l0ZUhlYWRlckZvb3RlciBoZWFkZXIpIHsKKyAgICB0aGlzLnVybFByb3ZpZGVyID0gdXJsUHJvdmlkZXI7CisgICAgdGhpcy5pbXBsID0gaW1wbDsKKyAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKKyAgICB0aGlzLm1heFJlZGlyZWN0VXJsTGVuZ3RoID0gY29uZmlnLmdldEludCgKKyAgICAgICAgIm9wZW5pZCIsICJtYXhSZWRpcmVjdFVybExlbmd0aCIsCisgICAgICAgIDEwKTsKKworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkodXJsUHJvdmlkZXIuZ2V0KCkpKSB7CisgICAgICBsb2cuZXJyb3IoImdlcnJpdC5jYW5vbmljYWxXZWJVcmwgbXVzdCBiZSBzZXQgaW4gZ2Vycml0LmNvbmZpZyIpOworICAgIH0KKworICAgIGlmIChhdXRoQ29uZmlnLmdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuT1BFTklEX1NTTykgeworICAgICAgc3VnZ2VzdFByb3ZpZGVycyA9IEltbXV0YWJsZVNldC5vZigpOworICAgICAgc3NvVXJsID0gYXV0aENvbmZpZy5nZXRPcGVuSWRTc29VcmwoKTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0PFN0cmluZz4gcHJvdmlkZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IEFMTF9QUk9WSURFUlMuZW50cnlTZXQoKSkgeworICAgICAgICBpZiAoaW1wbC5pc0FsbG93ZWRPcGVuSUQoZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgIHByb3ZpZGVycy5hZGQoZS5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN1Z2dlc3RQcm92aWRlcnMgPSBJbW11dGFibGVTZXQuY29weU9mKHByb3ZpZGVycyk7CisgICAgICBzc29VcmwgPSBudWxsOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHNzb1VybCAhPSBudWxsKSB7CisgICAgICBTdHJpbmcgdG9rZW4gPSBnZXRUb2tlbihyZXEpOworICAgICAgU2lnbkluTW9kZSBtb2RlOworICAgICAgaWYgKFBhZ2VMaW5rcy5SRUdJU1RFUi5lcXVhbHModG9rZW4pKSB7CisgICAgICAgIG1vZGUgPSBTaWduSW5Nb2RlLlJFR0lTVEVSOworICAgICAgICB0b2tlbiA9IFBhZ2VMaW5rcy5NSU5FOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kZSA9IFNpZ25Jbk1vZGUuU0lHTl9JTjsKKyAgICAgIH0KKyAgICAgIGRpc2NvdmVyKHJlcSwgcmVzLCBmYWxzZSwgc3NvVXJsLCBmYWxzZSwgdG9rZW4sIG1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmcgaWQgPSBTdHJpbmdzLm51bGxUb0VtcHR5KHJlcS5nZXRQYXJhbWV0ZXIoImlkIikpLnRyaW0oKTsKKyAgICAgIGlmICghaWQuaXNFbXB0eSgpKSB7CisgICAgICAgIGRvUG9zdChyZXEsIHJlcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBib29sZWFuIGxpbmsgPSByZXEuZ2V0UGFyYW1ldGVyKCJsaW5rIikgIT0gbnVsbDsKKyAgICAgICAgc2VuZEZvcm0ocmVxLCByZXMsIGxpbmssIG51bGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJvb2xlYW4gbGluayA9IHJlcS5nZXRQYXJhbWV0ZXIoImxpbmsiKSAhPSBudWxsOworICAgIFN0cmluZyBpZCA9IFN0cmluZ3MubnVsbFRvRW1wdHkocmVxLmdldFBhcmFtZXRlcigiaWQiKSkudHJpbSgpOworICAgIGlmIChpZC5pc0VtcHR5KCkpIHsKKyAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBsaW5rLCBudWxsKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFpZC5zdGFydHNXaXRoKCJodHRwOi8vIikgJiYgIWlkLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikpIHsKKyAgICAgIGlkID0gImh0dHA6Ly8iICsgaWQ7CisgICAgfQorICAgIGlmICgoc3NvVXJsICE9IG51bGwgJiYgIXNzb1VybC5lcXVhbHMoaWQpKSB8fCAhaW1wbC5pc0FsbG93ZWRPcGVuSUQoaWQpKSB7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgbGluaywgIk9wZW5JRCBwcm92aWRlciBub3QgcGVybWl0dGVkIGJ5IHNpdGUgcG9saWN5LiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2xlYW4gcmVtZW1iZXIgPSAiMSIuZXF1YWxzKHJlcS5nZXRQYXJhbWV0ZXIoInJlbWVtYmVybWUiKSk7CisgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxKTsKKyAgICBTaWduSW5Nb2RlIG1vZGU7CisgICAgaWYgKGxpbmspIHsKKyAgICAgIG1vZGUgPSBTaWduSW5Nb2RlLkxJTktfSURFTlRJWTsKKyAgICB9IGVsc2UgaWYgKFBhZ2VMaW5rcy5SRUdJU1RFUi5lcXVhbHModG9rZW4pKSB7CisgICAgICBtb2RlID0gU2lnbkluTW9kZS5SRUdJU1RFUjsKKyAgICAgIHRva2VuID0gUGFnZUxpbmtzLk1JTkU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1vZGUgPSBTaWduSW5Nb2RlLlNJR05fSU47CisgICAgfQorCisgICAgZGlzY292ZXIocmVxLCByZXMsIGxpbmssIGlkLCByZW1lbWJlciwgdG9rZW4sIG1vZGUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRpc2NvdmVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgYm9vbGVhbiBsaW5rLCBTdHJpbmcgaWQsIGJvb2xlYW4gcmVtZW1iZXIsIFN0cmluZyB0b2tlbiwgU2lnbkluTW9kZSBtb2RlKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoc3NvVXJsICE9IG51bGwpIHsKKyAgICAgIHJlbWVtYmVyID0gZmFsc2U7CisgICAgfQorCisgICAgRGlzY292ZXJ5UmVzdWx0IHIgPSBpbXBsLmRpc2NvdmVyKGlkLCBtb2RlLCByZW1lbWJlciwgdG9rZW4pOworICAgIHN3aXRjaCAoci5zdGF0dXMpIHsKKyAgICAgIGNhc2UgVkFMSUQ6CisgICAgICAgIHJlZGlyZWN0KHIsIHJlcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5PX1BST1ZJREVSOgorICAgICAgICBzZW5kRm9ybShyZXEsIHJlcywgbGluaywKKyAgICAgICAgICAgICJQcm92aWRlciBpcyBub3Qgc3VwcG9ydGVkLCBvciB3YXMgaW5jb3JyZWN0bHkgZW50ZXJlZC4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRVJST1I6CisgICAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBsaW5rLCAiVW5hYmxlIHRvIGNvbm5lY3Qgd2l0aCBPcGVuSUQgcHJvdmlkZXIuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWRpcmVjdChEaXNjb3ZlcnlSZXN1bHQgciwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICB1cmwuYXBwZW5kKHIucHJvdmlkZXJVcmwpOworICAgIGlmIChyLnByb3ZpZGVyQXJncyAhPSBudWxsICYmICFyLnByb3ZpZGVyQXJncy5pc0VtcHR5KCkpIHsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gYXJnIDogci5wcm92aWRlckFyZ3MuZW50cnlTZXQoKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCc/Jyk7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCcmJyk7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZChVcmwuZW5jb2RlKGFyZy5nZXRLZXkoKSkpCisgICAgICAgICAgIC5hcHBlbmQoJz0nKQorICAgICAgICAgICAuYXBwZW5kKFVybC5lbmNvZGUoYXJnLmdldFZhbHVlKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHVybC5sZW5ndGgoKSA8PSBtYXhSZWRpcmVjdFVybExlbmd0aCkgeworICAgICAgcmVzLnNlbmRSZWRpcmVjdCh1cmwudG9TdHJpbmcoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKExvZ2luRm9ybS5jbGFzcywgIlJlZGlyZWN0Rm9ybS5odG1sIik7CisgICAgRWxlbWVudCBmb3JtID0gSHRtbERvbVV0aWwuZmluZChkb2MsICJyZWRpcmVjdF9mb3JtIik7CisgICAgZm9ybS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsIHIucHJvdmlkZXJVcmwpOworICAgIGlmIChyLnByb3ZpZGVyQXJncyAhPSBudWxsICYmICFyLnByb3ZpZGVyQXJncy5pc0VtcHR5KCkpIHsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBhcmcgOiByLnByb3ZpZGVyQXJncy5lbnRyeVNldCgpKSB7CisgICAgICAgIEVsZW1lbnQgaW4gPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgaW4uc2V0QXR0cmlidXRlKCJ0eXBlIiwgImhpZGRlbiIpOworICAgICAgICBpbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBhcmcuZ2V0S2V5KCkpOworICAgICAgICBpbi5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgYXJnLmdldFZhbHVlKCkpOworICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGluKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2VuZEh0bWwocmVzLCBkb2MpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRva2VuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBTdHJpbmcgdG9rZW4gPSByZXEuZ2V0UGF0aEluZm8oKTsKKyAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5pc0VtcHR5KCkpIHsKKyAgICAgIHRva2VuID0gUGFnZUxpbmtzLk1JTkU7CisgICAgfSBlbHNlIGlmICghdG9rZW4uc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICB0b2tlbiA9ICIvIiArIHRva2VuOworICAgIH0KKyAgICByZXR1cm4gdG9rZW47CisgIH0KKworICBwcml2YXRlIHZvaWQgc2VuZEZvcm0oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBib29sZWFuIGxpbmssIEBOdWxsYWJsZSBTdHJpbmcgZXJyb3JNZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBzZWxmID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICBTdHJpbmcgY2FuY2VsID0gT2JqZWN0cy5maXJzdE5vbk51bGwodXJsUHJvdmlkZXIuZ2V0KCksICIvIik7CisgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxKTsKKyAgICBpZiAoIXRva2VuLmVxdWFscygiLyIpKSB7CisgICAgICBjYW5jZWwgKz0gIiMiICsgdG9rZW47CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gaGVhZGVyLnBhcnNlKExvZ2luRm9ybS5jbGFzcywgIkxvZ2luRm9ybS5odG1sIik7CisgICAgSHRtbERvbVV0aWwuZmluZChkb2MsICJob3N0TmFtZSIpLnNldFRleHRDb250ZW50KHJlcS5nZXRTZXJ2ZXJOYW1lKCkpOworICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAibG9naW5fZm9ybSIpLnNldEF0dHJpYnV0ZSgiYWN0aW9uIiwgc2VsZik7CisgICAgSHRtbERvbVV0aWwuZmluZChkb2MsICJjYW5jZWxfbGluayIpLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGNhbmNlbCk7CisKKyAgICBpZiAoIWxpbmsgfHwgc3NvVXJsICE9IG51bGwpIHsKKyAgICAgIEVsZW1lbnQgaW5wdXQgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImZfbGluayIpOworICAgICAgaW5wdXQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGlucHV0KTsKKyAgICB9CisKKyAgICBTdHJpbmcgbGFzdCA9IGdldExhc3RJZChyZXEpOworICAgIGlmIChsYXN0ICE9IG51bGwpIHsKKyAgICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAiZl9vcGVuaWQiKS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgbGFzdCk7CisgICAgfQorCisgICAgRWxlbWVudCBlbXNnID0gSHRtbERvbVV0aWwuZmluZChkb2MsICJlcnJvcl9tZXNzYWdlIik7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShlcnJvck1lc3NhZ2UpKSB7CisgICAgICBlbXNnLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgZW1zZy5zZXRUZXh0Q29udGVudChlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBBTExfUFJPVklERVJTLmtleVNldCgpKSB7CisgICAgICBFbGVtZW50IGRpdiA9IEh0bWxEb21VdGlsLmZpbmQoZG9jLCAicHJvdmlkZXJfIiArIG5hbWUpOworICAgICAgaWYgKGRpdiA9PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFzdWdnZXN0UHJvdmlkZXJzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgIGRpdi5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZGl2KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBFbGVtZW50IGEgPSBIdG1sRG9tVXRpbC5maW5kKGRpdiwgImlkXyIgKyBuYW1lKTsKKyAgICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgICAgZGl2LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChkaXYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN0cmluZ0J1aWxkZXIgdSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICB1LmFwcGVuZChzZWxmKS5hcHBlbmQoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSk7CisgICAgICBpZiAobGluaykgeworICAgICAgICB1LmFwcGVuZCgiJmxpbmsiKTsKKyAgICAgIH0KKyAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgdS50b1N0cmluZygpKTsKKyAgICB9CisgICAgc2VuZEh0bWwocmVzLCBkb2MpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRIdG1sKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBEb2N1bWVudCBkb2MpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBiaW4gPSBIdG1sRG9tVXRpbC50b1VURjgoZG9jKTsKKyAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKTsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICByZXMuc2V0Q29udGVudExlbmd0aChiaW4ubGVuZ3RoKTsKKyAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgb3V0LndyaXRlKGJpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXN0SWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIENvb2tpZVtdIGNvb2tpZXMgPSByZXEuZ2V0Q29va2llcygpOworICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgIGZvciAoQ29va2llIGMgOiBjb29raWVzKSB7CisgICAgICAgIGlmIChPcGVuSWRVcmxzLkxBU1RJRF9DT09LSUUuZXF1YWxzKGMuZ2V0TmFtZSgpKSkgeworICAgICAgICAgIHJldHVybiBjLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRMb2dpblNlcnZsZXQuamF2YQppbmRleCBjZmI3NjdkLi40Y2JiMjJmIDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkTG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZExvZ2luU2VydmxldC5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtNDQsOSArNDUsNyBAQAogICBwdWJsaWMgdm9pZCBkb1Bvc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgaW1wbC5kb0F1dGgocmVxLCByc3ApOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgYXV0aGVudGljYXRpb24iLCBlKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRNb2R1bGUuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRNb2R1bGUuamF2YQppbmRleCBhOTI4Y2I4Li5jODdhMGNmIDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZE1vZHVsZS5qYXZhCkBAIC0xNCwyMiArMTQsMTYgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLm9wZW5pZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5ScGNTZXJ2bGV0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKIAotLyoqIFNlcnZsZXRzIGFuZCBSUEMgc3VwcG9ydCByZWxhdGVkIHRvIE9wZW5JRCBhdXRoZW50aWNhdGlvbi4gKi8KKy8qKiBTZXJ2bGV0cyByZWxhdGVkIHRvIE9wZW5JRCBhdXRoZW50aWNhdGlvbi4gKi8KIHB1YmxpYyBjbGFzcyBPcGVuSWRNb2R1bGUgZXh0ZW5kcyBTZXJ2bGV0TW9kdWxlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgeworICAgIHNlcnZlKCIvbG9naW4iLCAiL2xvZ2luLyoiKS53aXRoKExvZ2luRm9ybS5jbGFzcyk7CiAgICAgc2VydmUoIi8iICsgT3BlbklkU2VydmljZUltcGwuUkVUVVJOX1VSTCkud2l0aChPcGVuSWRMb2dpblNlcnZsZXQuY2xhc3MpOwogICAgIHNlcnZlKCIvIiArIFhyZHNTZXJ2bGV0LkxPQ0FUSU9OKS53aXRoKFhyZHNTZXJ2bGV0LmNsYXNzKTsKICAgICBmaWx0ZXIoIi8iKS50aHJvdWdoKFhyZHNGaWx0ZXIuY2xhc3MpOwotCi0gICAgaW5zdGFsbChuZXcgUnBjU2VydmxldE1vZHVsZShScGNTZXJ2bGV0TW9kdWxlLlBSRUZJWCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICAgICAgcnBjKE9wZW5JZFNlcnZpY2VJbXBsLmNsYXNzKTsKLSAgICAgIH0KLSAgICB9KTsKKyAgICBiaW5kKE9wZW5JZFNlcnZpY2VJbXBsLmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQppbmRleCAwOWE1ZDEwLi41MmYzYjAzIDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQorKysgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQpAQCAtMTUsMTAgKzE1LDYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLkRpc2NvdmVyeVJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkUHJvdmlkZXJQYXR0ZXJuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRTZXJ2aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRVcmxzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CkBAIC0yNiwxMiArMjIsMTEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuVXJsRW5jb2RlZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhNZXRob2Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGgub3BlbmlkLk9wZW5JZFByb3ZpZGVyUGF0dGVybjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC03NCw3ICs2OSw3IEBACiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CiAKIEBTaW5nbGV0b24KLWNsYXNzIE9wZW5JZFNlcnZpY2VJbXBsIGltcGxlbWVudHMgT3BlbklkU2VydmljZSB7CitjbGFzcyBPcGVuSWRTZXJ2aWNlSW1wbCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT3BlbklkU2VydmljZUltcGwuY2xhc3MpOwogCkBAIC0xMDIsNiArOTcsNyBAQAogICBwcml2YXRlIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyOwogICBwcml2YXRlIGZpbmFsIENvbnN1bWVyTWFuYWdlciBtYW5hZ2VyOwogICBwcml2YXRlIGZpbmFsIExpc3Q8T3BlbklkUHJvdmlkZXJQYXR0ZXJuPiBhbGxvd2VkT3BlbklEczsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gb3BlbklkRG9tYWluczsKIAogICAvKiogTWF4aW11bSBhZ2UsIGluIHNlY29uZHMsIGJlZm9yZSBmb3JjaW5nIHJlLWF1dGhlbnRpY2F0aW9uIG9mIGFjY291bnQuICovCiAgIHByaXZhdGUgZmluYWwgaW50IHBhcGVNYXhBdXRoQWdlOwpAQCAtMTQzLDI0ICsxMzksMTggQEAKICAgICBhY2NvdW50TWFuYWdlciA9IGFtOwogICAgIG1hbmFnZXIgPSBuZXcgQ29uc3VtZXJNYW5hZ2VyKCk7CiAgICAgYWxsb3dlZE9wZW5JRHMgPSBhYy5nZXRBbGxvd2VkT3BlbklEcygpOworICAgIG9wZW5JZERvbWFpbnMgPSBhYy5nZXRPcGVuSWREb21haW5zKCk7CiAgICAgcGFwZU1heEF1dGhBZ2UgPSAoaW50KSBDb25maWdVdGlsLmdldFRpbWVVbml0KGNvbmZpZywgLy8KICAgICAgICAgImF1dGgiLCBudWxsLCAibWF4T3BlbklkU2Vzc2lvbkFnZSIsIC0xLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgdm9pZCBkaXNjb3ZlcihmaW5hbCBTdHJpbmcgb3BlbmlkSWRlbnRpZmllciwgZmluYWwgU2lnbkluTW9kZSBtb2RlLAotICAgICAgZmluYWwgYm9vbGVhbiByZW1lbWJlciwgZmluYWwgU3RyaW5nIHJldHVyblRva2VuLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxEaXNjb3ZlcnlSZXN1bHQ+IGNiKSB7Ci0gICAgaWYgKCFpc0FsbG93ZWRPcGVuSUQob3BlbmlkSWRlbnRpZmllcikpIHsKLSAgICAgIGNiLm9uU3VjY2VzcyhuZXcgRGlzY292ZXJ5UmVzdWx0KERpc2NvdmVyeVJlc3VsdC5TdGF0dXMuTk9UX0FMTE9XRUQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KKyAgRGlzY292ZXJ5UmVzdWx0IGRpc2NvdmVyKGZpbmFsIFN0cmluZyBvcGVuaWRJZGVudGlmaWVyLCBmaW5hbCBTaWduSW5Nb2RlIG1vZGUsCisgICAgICBmaW5hbCBib29sZWFuIHJlbWVtYmVyLCBmaW5hbCBTdHJpbmcgcmV0dXJuVG9rZW4pIHsKICAgICBmaW5hbCBTdGF0ZSBzdGF0ZTsKICAgICBzdGF0ZSA9IGluaXQob3BlbmlkSWRlbnRpZmllciwgbW9kZSwgcmVtZW1iZXIsIHJldHVyblRva2VuKTsKICAgICBpZiAoc3RhdGUgPT0gbnVsbCkgewotICAgICAgY2Iub25TdWNjZXNzKG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5OT19QUk9WSURFUikpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5OT19QUk9WSURFUik7CiAgICAgfQogCiAgICAgZmluYWwgQXV0aFJlcXVlc3QgYVJlcTsKQEAgLTE4OCwxNiArMTc4LDE1IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoTWVzc2FnZUV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBjcmVhdGUgT3BlbklEIHJlZGlyZWN0IGZvciAiICsgb3BlbmlkSWRlbnRpZmllciwgZSk7Ci0gICAgICBjYi5vblN1Y2Nlc3MobmV3IERpc2NvdmVyeVJlc3VsdChEaXNjb3ZlcnlSZXN1bHQuU3RhdHVzLkVSUk9SKSk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gbmV3IERpc2NvdmVyeVJlc3VsdChEaXNjb3ZlcnlSZXN1bHQuU3RhdHVzLkVSUk9SKTsKICAgICB9IGNhdGNoIChDb25zdW1lckV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBjcmVhdGUgT3BlbklEIHJlZGlyZWN0IGZvciAiICsgb3BlbmlkSWRlbnRpZmllciwgZSk7Ci0gICAgICBjYi5vblN1Y2Nlc3MobmV3IERpc2NvdmVyeVJlc3VsdChEaXNjb3ZlcnlSZXN1bHQuU3RhdHVzLkVSUk9SKSk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gbmV3IERpc2NvdmVyeVJlc3VsdChEaXNjb3ZlcnlSZXN1bHQuU3RhdHVzLkVSUk9SKTsKICAgICB9CiAKLSAgICBjYi5vblN1Y2Nlc3MobmV3IERpc2NvdmVyeVJlc3VsdChhUmVxLmdldERlc3RpbmF0aW9uVXJsKGZhbHNlKSwgLy8KLSAgICAgICAgYVJlcS5nZXRQYXJhbWV0ZXJNYXAoKSkpOworICAgIHJldHVybiBuZXcgRGlzY292ZXJ5UmVzdWx0KAorICAgICAgICBhUmVxLmdldERlc3RpbmF0aW9uVXJsKGZhbHNlKSwKKyAgICAgICAgYVJlcS5nZXRQYXJhbWV0ZXJNYXAoKSk7CiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gcmVxdWVzdFJlZ2lzdHJhdGlvbihmaW5hbCBBdXRoUmVxdWVzdCBhUmVxKSB7CkBAIC0yMDgsNyArMTk3LDYgQEAKICAgICAgIC8vIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiwgaW4gY2FzZSB0aGUgaWRlbnRpdHkgaXMgbmV3IHRvIHVzLgogICAgICAgLy8KICAgICAgIHJldHVybiB0cnVlOwotCiAgICAgfQogCiAgICAgLy8gV2UgbWlnaHQgYWxyZWFkeSBoYXZlIHRoaXMgYWNjb3VudCBvbiBmaWxlLiBMb29rIGZvciBpdC4KQEAgLTIyMSw3ICsyMDksNyBAQAogICAgIH0KICAgfQogCi0gIC8qKiBDYWxsZWQgYnkge0BsaW5rIE9wZW5JZExvZ2luU2VydmxldH0gZG9HZXQsIGRvUG9zdCAqLworICAvKiogQ2FsbGVkIGJ5IHtAbGluayBPcGVuSWRMb2dpbkZvcm19IGRvR2V0LCBkb1Bvc3QgKi8KICAgdm9pZCBkb0F1dGgoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApCiAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBpZiAoT01PREVfQ0FOQ0VMLmVxdWFscyhyZXEuZ2V0UGFyYW1ldGVyKE9QRU5JRF9NT0RFKSkpIHsKQEAgLTM1Niw2ICszNDQsMzIgQEAKICAgICAgIGFyZXEuc2V0RW1haWxBZGRyZXNzKGZldGNoUnNwLmdldEF0dHJpYnV0ZVZhbHVlKCJFbWFpbCIpKTsKICAgICB9CiAKKyAgICBpZiAob3BlbklkRG9tYWlucyAhPSBudWxsICYmIG9wZW5JZERvbWFpbnMuc2l6ZSgpID4gMCkgeworICAgICAgLy8gQWRtaW5pc3RyYXRvciBsaW1pdGVkIGVtYWlsIGRvbWFpbnMsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBPcGVuSUQuCisgICAgICAvLyBMb2dpbiBwcm9jZXNzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBwYXNzZWQgZW1haWwgbWF0Y2hlcyBvbmUKKyAgICAgIC8vIG9mIHRoZXNlIGRvbWFpbnMuCisgICAgICAvLworICAgICAgZmluYWwgU3RyaW5nIGVtYWlsID0gYXJlcS5nZXRFbWFpbEFkZHJlc3MoKTsKKyAgICAgIGludCBlbWFpbEF0SW5kZXggPSBlbWFpbC5sYXN0SW5kZXhPZigiQCIpOworICAgICAgaWYgKGVtYWlsQXRJbmRleCA+PSAwICYmIGVtYWlsQXRJbmRleCA8IGVtYWlsLmxlbmd0aCgpIC0gMSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZW1haWxEb21haW4gPSBlbWFpbC5zdWJzdHJpbmcoZW1haWxBdEluZGV4KTsKKworICAgICAgICBib29sZWFuIG1hdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoU3RyaW5nIGRvbWFpbiA6IG9wZW5JZERvbWFpbnMpIHsKKyAgICAgICAgICBpZiAoZW1haWxEb21haW4uZXF1YWxzSWdub3JlQ2FzZShkb21haW4pKSB7CisgICAgICAgICAgICBtYXRjaCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1hdGNoKSB7CisgICAgICAgICAgbG9nLmVycm9yKCJEb21haW4gZGlzYWxsb3dlZDogIiArIGVtYWlsRG9tYWluKTsKKyAgICAgICAgICBjYW5jZWxXaXRoRXJyb3IocmVxLCByc3AsICJEb21haW4gZGlzYWxsb3dlZCIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKwogICAgIGlmIChjbGFpbWVkSWRlbnRpZmllciAhPSBudWxsKSB7CiAgICAgICAvLyBUaGUgdXNlciB1c2VkIGEgY2xhaW1lZCBpZGVudGl0eSB3aGljaCBoYXMgZGVsZWdhdGVkIHRvIHRoZSB2ZXJpZmllZAogICAgICAgLy8gaWRlbnRpdHkgd2UgaGF2ZSBpbiBvdXIgQXV0aFJlcXVlc3QgYWJvdmUuIFdlIHN0aWxsIHNob3VsZCBoYXZlIGEKQEAgLTQwOSw3ICs0MjMsNyBAQAogICAgICAgICAgIGFyc3AgPSBhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUoYXJlcSk7CiAKICAgICAgICAgICBmaW5hbCBDb29raWUgbGFzdElkID0gbmV3IENvb2tpZShPcGVuSWRVcmxzLkxBU1RJRF9DT09LSUUsICIiKTsKLSAgICAgICAgICBsYXN0SWQuc2V0UGF0aChyZXEuZ2V0Q29udGV4dFBhdGgoKSArICIvIik7CisgICAgICAgICAgbGFzdElkLnNldFBhdGgocmVxLmdldENvbnRleHRQYXRoKCkgKyAiL2xvZ2luLyIpOwogICAgICAgICAgIGlmIChyZW1lbWJlcikgewogICAgICAgICAgICAgbGFzdElkLnNldFZhbHVlKHJlZGlzY292ZXJJZGVudGlmaWVyKTsKICAgICAgICAgICAgIGxhc3RJZC5zZXRNYXhBZ2UoTEFTVElEX0FHRSk7CkBAIC00MTcsNyArNDMxLDcgQEAKICAgICAgICAgICAgIGxhc3RJZC5zZXRNYXhBZ2UoMCk7CiAgICAgICAgICAgfQogICAgICAgICAgIHJzcC5hZGRDb29raWUobGFzdElkKTsKLSAgICAgICAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyc3AsIEF1dGhNZXRob2QuQ09PS0lFLCByZW1lbWJlcik7CisgICAgICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCByZW1lbWJlcik7CiAgICAgICAgICAgaWYgKGFyc3AuaXNOZXcoKSAmJiBjbGFpbWVkSWRlbnRpZmllciAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdCBsaW5rUmVxID0KICAgICAgICAgICAgICAgICBuZXcgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlcXVlc3QoCkBAIC00MzEsNyArNDQ1LDcgQEAKIAogICAgICAgICBjYXNlIExJTktfSURFTlRJWTogewogICAgICAgICAgIGFyc3AgPSBhY2NvdW50TWFuYWdlci5saW5rKGlkZW50aWZpZWRVc2VyLmdldCgpLmdldEFjY291bnRJZCgpLCBhcmVxKTsKLSAgICAgICAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyc3AsIEF1dGhNZXRob2QuQ09PS0lFLCByZW1lbWJlcik7CisgICAgICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCByZW1lbWJlcik7CiAgICAgICAgICAgY2FsbGJhY2soZmFsc2UsIHJlcSwgcnNwKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTMyLDcgKzU0Niw3IEBACiAgICAgcmV0dXJuIG5ldyBTdGF0ZShkaXNjb3ZlcmVkLCByZXRUbywgY29udGV4dFVybCk7CiAgIH0KIAotICBwcml2YXRlIGJvb2xlYW4gaXNBbGxvd2VkT3BlbklEKGZpbmFsIFN0cmluZyBpZCkgeworICBib29sZWFuIGlzQWxsb3dlZE9wZW5JRChmaW5hbCBTdHJpbmcgaWQpIHsKICAgICBmb3IgKGZpbmFsIE9wZW5JZFByb3ZpZGVyUGF0dGVybiBwYXR0ZXJuIDogYWxsb3dlZE9wZW5JRHMpIHsKICAgICAgIGlmIChwYXR0ZXJuLm1hdGNoZXMoaWQpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL1NpZ25Jbk1vZGUuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9TaWduSW5Nb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhOTg1NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9TaWduSW5Nb2RlLmphdmEKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGgub3BlbmlkOworCitlbnVtIFNpZ25Jbk1vZGUgeworICBTSUdOX0lOLCBMSU5LX0lERU5USVksIFJFR0lTVEVSOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvTG9naW5Gb3JtLmh0bWwgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9Mb2dpbkZvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTczNGZmZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL0xvZ2luRm9ybS5odG1sCkBAIC0wLDAgKzEsOTAgQEAKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+R2Vycml0IENvZGUgUmV2aWV3IC0gU2lnbiBJbjwvdGl0bGU+CisgICAgPHN0eWxlPgorICAgICAgI2Vycm9yX21lc3NhZ2UgeworICAgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKKyAgICAgICAgd2lkdGg6IDIwZW07CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMTE2KTsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICB9CisgICAgICAjY2FuY2VsX2xpbmsgeworICAgICAgICBtYXJnaW4tbGVmdDogNDVweDsKKyAgICAgIH0KKyAgICAgICNsb2dvX2JveCB7CisgICAgICAgIHBhZGRpbmctbGVmdDogMTYwcHg7CisgICAgICB9CisgICAgICAjbG9nb19pbWcgeworICAgICAgICB3aWR0aDogMjAwcHg7CisgICAgICAgIGhlaWdodDogODBweDsKKyAgICAgICAgYmFja2dyb3VuZDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1nQUFBQlFDQVlBQUFCY2JUcXdBQUFOYlVsRVFWUjQydXhkZVhCVjFSbS9VUllwdU5EUkZqdHVaY2FPWlRwZDdEK08wN3BpNjVRcUZNUUVFN0t6aEYya1FFVXIxZ1VrSUJRaUlLRFVCWVJnVUJDQ0lIRUJCTEtSNUdVbEt3bFpTQUtKdHZVUFp6cjgrcjczdTgwZGZIbnYzaXl2ZWVGOXY1bHZRc2k1M3p2djNPOTN6L21XYzY2aFVDZ1VDb1ZDb1ZBb0ZBcUZRcUZRS0JRS2hVS2hVQ2dVQ29WQ29WQW9GQW9GUWFDbEF0Z1FEaFNtdzFBb0ZCYnd4UlpnemdnZ3dnQmNTaENGd2dNMEZBR3JIZ2FpREVxY1d3b1BLRUVVQ2h4SUJtWitINWdreEJCUmdpZ1VCcW96Z2VYM0FVOFlRTFJiNGtXVUlBcUZnVDFMZ1NsRFNJNTRFU1dJUW1INUc3RUdNRmtJb1FSUktDNEI2bDNBMUVGQXJCSkVvZWlFSUlYQTFNRktFSVZDQ2FKUUtFRVVDaVdJUXFFRVVTaVVJQXBGY09kQmxDQUtoUzljUE90eVJKQ0xXczJyQ0FWY3VIQmhha05EQTJwcWFsQldWWU9xSTN0d2Njb2dJTTRYUWZpemR2OG1sRlhYZWE2VDYwV1BvVkQwZDV3N2R3NlZsWlVvTEN4RWJtNHVjbkp5a0pXVjVaSE1Vd1VvUHJUVEVVSEtkNjlEWm41Ung3WFoyZGtlZlM2WHk2Ty9xYWxKWnhoRi8wQmpZeU5LU2tvOEJtd2F0QkJEUlA2dlE3THpDMUh5U2FvamdsUjhrSUpzRjNXYTBxRlR5Q0tmSWY5WFZGU0VzMmZQZG9rc0xTMHRPZTVaU1FtbUNCemEydHBHbno1OW1xVGdFOTZMRUpSZUlvaTNlSkdsckt3TTU4K2ZYMjc0Z2N3K0owK2VsS1ZiandtQ3Rqb2dPeFZJWHc1OHVKU3k5d1hneEx0QVE3RVNNQlFoQmlpemhSaW1MU204Q2NJbFZuY0lZaThkZlpMK1dVU3hacm04dkx5T0dlN01tVFBvTmpGS1B3WFdqZ2VTaHJKay8wOXVlY1NVc1FhM0RDY09CSmJmRDJUdnV1eUpndU52QTRuWEFuTnZBTTdYQXVWSGdablhVbVpjRFNRTjg1WVpibGw0Ry9EeWI0QjNaZ0paTy92L09Na1QyalJDUndiTEpaSGxnd2hCU2cvdmNrU1F5ZzlmY3hPa1ZEN0xhNFp5U2hUcHJ5eW5Ta3RMdWV6ajlUMGlDTGJOWVFSdWdsbXl2Mmdrc0g0aThPNHNZUHRjWUhNVXNQU1hRTHpaSnRJdEtST0E5c3QzU1ljdk5nSGhCcEJ3QmRCYURjOERKTnFnSklRQmlWZDZTM3dZRUdXTzBUaURENXFGdHdPSFUvcmZPTlhWMWRId25CSER5MGVRNVV4emMzT2I2UHEyT3RkUm1QZmIzRDM0bjc4Z3hseGNYSXhUcDA2UkxNNzc0VVhvbmhBRUt4OENIdmZNRU53TldiQVBQdHRXblFSZW0wQWplTXd0ejdsSmM2RVdseVZCam13UkErYzJodFlhb093ejN0L0VBY0NwRDRER0VxQyswSktHWXVCTUxwQzNGemk0Q2xnM0hwaitQV0NpUWFLdC9nUHdUZHRvb3ovZ08wOWZmOUxSVHBZNHNxVHBVYUt3Nk9OT3I1Zm9sZlRKL0R5bnk2OGVFd1NibmhCeWNOWklld2FPci92OGRTQmhFRy8rUzNlRkRrRmlER0RLUU9CY09SenBhQ29ETmtiSUE0WGp2T3FoNEIrci9QeDhKMC9yampaVlZWWDRmNWFhVkZkWFc1OGZRSUxneTdkb0FKUGNrcnFnNnpQUDBUZUE2REErSGRNV0k1UUlJdmU3YTl1eG53Y2lUWko4OEd4d2psVjdlL3RJeS9Ec28wamw1ZVhveTFvc2lhWkpYd0pHa0lVLzVnMTcrZTd1Ty9aYkpsUEh0S3VBeGxJb1FYd0Q2OGJKdzRSTy9vVzY0QnNyaWZiNE56aVNSOXFKajlEWHhZcmlud1NLSU82UUxXOStURmlQNnNPRUZKZzJoQ1I1MzVwRlJDZktqK0RTWmRrbTRQVklZTVVEUVBLRHdKby9BbWxMZ0xvOFozMXVxUUlPckFCU0pnTEpENGdlcnZQVFYzaWNhSy8yLzJwTmhTc2RLUDdFNmxkekJiQjdDYkI2REhXc0hBMXNqb1gwTGVBRXFjdVRLQ0JKY3ZEVjRDS0laS3JGK08zSUlVYloxOVc4c3FTemlXNzFuQ0RySHpPZDdKL2J0N2ZYUlYva21WRWdhVXI0WForK0F4MWtXZmdUQ1J1VFNERUd4eW5DalBRa0RnYTJ6L1BiRHpFb3pCZ09qRGZZN3hpSyszT3BkOVlOd09jYnFjTWlLWDJyR2RlQVVhbU53SlNoL013b3N3K1JudXRwdEl0SEFSWEhFQmlDRUc1U01zSzE5cEVnSVFnTlRvekgxcmpFQ2UvTGN2ZjYrbnBQWDA2Y09DSDk2YkxJZGVLL09PcnZreU5vYUR2bTk1d2dSOStrSVUwWkFMUlVBczBWL0s1TDd3Unkwb0NZSzJpb3NoekwyUVdjTFpDSUQvOG01RElqWWxnekJwM3FmMytSa0lsR3ZQeGU0TmhXb0RZUGtBTFJZLy9nYkJSdStsSjduNGRGa0hSKzdwenJnZjNMMkdiZXpVeUFWcDRBbWtvOXN3dTJ6NUZRTHNuNzVJMUEyMWtFaENEOEx2eXVDMjRLSG9MWVBZM2w3MUpqMVpmN1FWcGJXMVBGdUNWMExMTkFOMFRJd1VTaURYQW1sd1lSWmZSS0lzdHRyRUlPNnN2ZExXRmZoa0xuL3dpWWV5T1FkTDNmUTd2eDJVWWdsZ1lxeTU5TC9wYTlFNGcwamY4OTMyVEdqcWVrRGNsWWttSE5YSEVHK3hMbmxtWDNBTzMxOEpFVVpKdUpkS0lEUkJBdWJTT3BVeDRtd1pJRTlPdVF5ODlRMmpBRjEzN2U2SVFyZ1pvczlJck9XZGZSd0Q5WkkwYklzWWcyVE5La3djR1RsZGNuWFEyMFdGRkQ5N0tOVDl4MVkrMTFiSGljeTVmbDk5REFpdzdKbUxNUDgyNEV2bXFBalJQTjYxKzVEK2JNMlBzRWNhVlRSL3dWWE03MU5ZUUFka3VyMnRyYVVDSUl3N084OGIxV1c0VWxkOUEvMlBlU1pOZGxMTGdzV3ZtZ0kvMzRwbjJrZThZaEdUNTZBU2FSYWR3Smd4d1pKT3FMZ0lTQlFGd1lQTUdEMDE5d3pDZVpPbTJBakJTU2RNRXQvSHhadnZVeVFZUVVNbnVMSHZsK1JwK0JhM3BiMzBPeTJLRzI1UlpITnNNaVNCRjZSZWV6UHpNSjh2S2xCTWxZQjhjNjNwNUdoL25WMzlOQWQ4Nm5RNzM2WWVjNlhybVhzNEFzMnlUckgrdDhwa1RlWHZvc1NjTUNSNURLNCt4UFRGKy9Db041QkwvTEt6UFhFWG9FeVUwVFE2RGZVSmZmSy8xeE84SmN2MytjTEFTaDdqakRZMVJkY1BaSnFnVTMwMERYakNIcDlpeDFydU85dVN5czNENVB3c3hpaUN3Zy9MZjl4alNwY2tDMHRMODZVQVNoWHhScmNKWXIrN1J2YlVFY2IzOUxMSmxkdUg4aXhBaFNlVnpXd0RTR3ZMMDk3UTl6QzlNRzA1aE9iSk1rbURqR2xIckhNeFFOTklZR0twRWtMUDJWTExIbzdDOFo1Wlk3L0l2NEszTnZZTFFxWlJ4UTZOWVhTMzBPalRmZ0JKRXFhRXltRGk1dis3YWt4RFo2SmRHakVDTUlFMml6cnVWNis2TVhlMDRRM25SV3N0YWVFaWU3T3dUaCtqemV6TXJYNWtxWTJOVHJVT0lNVnRUR0RnWTJoZ2NuUVE2czRMalBIZzd4dTRLZElBeUxoaFJCQ0t5NG53NXg4Z005SjhoYlU0R0pWbXhmOGdzV1FRcTdPWVBVc1ZJNFFuSWJmd09heWtTWHZUUVU4ZWRYalRMVzFCZE1CRWtaejNGLzhTNEVRL1pjbDFnKzRQWVZhSHdKQSszOUVQdm9Fd215TlFGbVpiTVlFWTB0LzZPdStpQldGR25WNytpMDcxL1duZjR4VVJnZFBBVEJWMDNBck9HY1FkS2VEdjRjaVB5dG9xSWlOQWtpZnNKTUxyT2s1TDI3ZWlSOGlnaVdmVWhZOVpLeENLZUQzZlVvRnFOVzJEYWJVYXkxajZKTElleVVPSGdTZnlXSGcyb0djWk9DWXhVdlViWHN2cmNET2ZRZ016UFRYNUpRQ2hORGtDQ0VPMk5NSTU0Y0JtVHQ2UG9Ocjg0Q3BnL2o3TEYrQXJ6R0lwTDFXZDNPZzJTbjBrQ25Ed1hPMXpqVDgrZGJnREVHTnl4VkhnOFdnakJCbUhnVngycGp1SFZ0ZjBnVUNwRkNqeUFFbnY4MWIxclNkVUMrNDRnV3kxV2V1cFV6MEx3UlVrM3JUWkFZSnVtazlzbis2YnFZdW1aOEo1Tys4RmIyYi9Oa2V4MlN4WTh3ZFh6ZDNNWXRzZ0VpU0tQanVqMlcwaVNacy9YOG16aFdRYlJ6MEs3VWhNbkMwQ1FJSzI4WDNNWW5kOElBSU8wdlFGczkvTi93RGZJR1g1Tll3NEhTREhpTnhaUkJNaDQwaU9nd1NGMlQzMzBYOFFOcFFDdzI3SUJVNkNMQ3JMcE5YZWhiUjhFK1lPb3dKZ2wzTFFJTi91T0FFVVFlRUg1MTFlUUFoMVlETDk3TnZqOG01TGlONVNYQmRnS2lnekozVnZLR0hrR3NQTWF5MzRxQjhrYk8reUd3TlJFNHZJNTdyd3YyUzJhYWh6Y3N2bDBNbHUyZUhnVlVmb2xPeHlKeGdCZ2FmWUhaMTFQMzJySEF5VzFTaGV0VnpjdGwya1IwMnI4M1lxMDk4MUs1ZS93ZHF5SllpaVBmakpQRUc4bXg4aUh2YXQ2a29UQnM0ZDBlUjdjQ2s1aFFKVUUrdFVyMUY0MWszbVhKVHp0RWZwY1NmOHk4UmtMZS9FN2pEVjd6OTBlQjVuSVl3UWh4eEIyVXV6T3JIc0tudTh2SkcxaDBPNTk0WXowM2x3YnloRW1JUjgyUzh6ay9BSFl0QnY3SkF5dDhFSVJ5dnBvSEdUeDNwK2lnME1pb2E1d1k0QkRPRG40ZytScnVCL0doSXpZTTJCek5ReEdzR2NFcUhiR0ZkM3NjRTRLWU00WjFhSU1JMjBWMUtyelAwNGFRTkc5TkIwcVlNUTlxRkJRVU9Ob3dKWkd2VUgvOUFmTDNBYnVmQVRaRWNNZmR5Z2Y1OU44eG56UEMxK2RnTXhhZDVrR1FsY3F6b3BKSGN6ZmcrbkFKNFRxdUIwTnJGWEJvRGZCNkZHZVNaRlBIaDM4RnFqTnRkaFI2dzY0OTJ1czVleFlkNU8vdWNoVVBpVnh1S2ZRaEJlbEErVEV1VS9zWDZMQTdjZG9sZnlMNzEvWDlJRFp3UmhBOWliRS9uY2h1T3VhT0RvYVREVWhLRUNWSVNKS0V5eTM3UGQ0UzRaTGRla29RSlVqb2dKVytRZ0JIeDR5YTdTVHJ6dUxHSHIxaEtsMEpvdWdIc0U0UEVYRkNGTGJsc1VEaXpFdUNzZU1GT1ArcHpmZFBrQmd6R3VRS0FZTFU1VXNrakZLWHJ3VHA3Njg3a0hOMnZZNGh0U2VMOWI0UVZ6SEtNdDczZlhoMUZBa2k4WHpKOEJxWE9TU0NJeFcrSXU1L0swSDZQM2cycm5sMlZ0ZVAvTXh6ZGZiNkE2dlU0dGxmQUs1OWFpaUsvZzg1clYyeTZ2UTlyRm1sS3kvUUVlRTVVVmRKUWsySm9iZzhJZEVyYzArSjE3czhmQklreWlUSEsvZkxvUUZLRGtVb2dDZWtpR011dXhTdGR4YVNOSm15eERxNEF4ZUZITE5IQUJtdktURVV1aFNUODdRazlGdFVWb0hUR1dtNHVDVldqdDFVY2lnVUNvVkNvVkFvRkFxRlFxRlFLQlFLaFVLaFVDZ1VDc1YvMjRNREVnQUFBQUJCLzErM0kxQUJBR0FpbFZaMklLdnZ6RU1BQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCAwcHggMHB4OworICAgICAgfQorICAgICAgI2Zfb3BlbmlkIHsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAyNXB4OworICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OworICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmIHVybCgnZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoRUFBUUFNUUFBTzN0N2VIaDRzckt5dno4L1A1cERQOXJFTkxTMHYvMjhQLzE3dFhWMWRIRXZQRHc4TTNOemZuNStkM2QzZjVqQTk3U3l2bnY2TWZMemNmSHgvMW1DUHg0S2MvUzFQZjE4OUMrdFAreGd2L2sxTjNPeGZIeTlOTFYxLzM5L2YvLy95SDVCQUFBQUFBQUxBQUFBQUFRQUJBQUFBVnE0Q2VPWkdtZTZLaGxTRG9leGRPNkgwSVVSK290d1VZUmtNRENVd0lZSmhMRlR5R1pKQUNBd1FjZ0VBUTRrVnVFRTJBSUdBT1BRUUFRd1hDZlM4S1FHQXdNaklZSVVTaTAzQjdpSitBY25tY2xIZzRUQWgwUUR6SXBDdzRXR0JVWmVpa0RGemswbHBjaklRQTcnKSBuby1yZXBlYXQgc2Nyb2xsIDVweCA1MCUKKyAgICAgIH0KKyAgICA8L3N0eWxlPgorICAgIDxzdHlsZSBpZD0iZ2Vycml0X3NpdGVjc3MiIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImdlcnJpdF90b3BtZW51IiBzdHlsZT0iaGVpZ2h0OjQ1cHg7IiBjbGFzcz0iZ2Vycml0VG9wTWVudSI+PC9kaXY+CisgICAgPGRpdiBpZD0iZ2Vycml0X2hlYWRlciI+PC9kaXY+CisgICAgPGRpdiBpZD0iZ2Vycml0X2JvZHkiIGNsYXNzPSJnZXJyaXRCb2R5Ij4KKyAgICAgIDxoMT5TaWduIEluIHRvIEdlcnJpdCBDb2RlIFJldmlldyBhdCA8c3BhbiBpZD0iaG9zdE5hbWUiPmV4YW1wbGUuY29tPC9zcGFuPjwvaDE+CisgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIyIgaWQ9ImxvZ2luX2Zvcm0iPgorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJsaW5rIiBpZD0iZl9saW5rIiB2YWx1ZT0iMSIgLz4KKyAgICAgICAgPGRpdiBpZD0ibG9nb19ib3giPjxkaXYgaWQ9ImxvZ29faW1nIj48L2Rpdj48L2Rpdj4KKyAgICAgICAgPGRpdiBpZD0iZXJyb3JfbWVzc2FnZSI+SW52YWxpZCBPcGVuSUQgaWRlbnRpZmllci48L2Rpdj4KKyAgICAgICAgPGRpdj4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgbmFtZT0iaWQiCisgICAgICAgICAgICAgICAgIGlkPSJmX29wZW5pZCIKKyAgICAgICAgICAgICAgICAgc2l6ZT0iNjAiCisgICAgICAgICAgICAgICAgIHRhYmluZGV4PSIxIiAvPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdj4KKyAgICAgICAgICA8aW5wdXQgbmFtZT0icmVtZW1iZXJtZSIgaWQ9ImZfcmVtZW1iZXIiCisgICAgICAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgorICAgICAgICAgICAgICAgICB2YWx1ZT0iMSIKKyAgICAgICAgICAgICAgICAgdGFiaW5kZXg9IjIiIC8+CisgICAgICAgICAgPGxhYmVsIGZvcj0iZl9yZW1lbWJlciI+UmVtZW1iZXIgbWU8L2xhYmVsPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMjVweDsiPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTaWduIEluIiBpZD0iZl9zdWJtaXQiIHRhYmluZGV4PSIzIiAvPgorICAgICAgICAgIDxhIGhyZWY9Ii4uLyIgaWQ9ImNhbmNlbF9saW5rIj5DYW5jZWw8L2E+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgaWQ9InByb3ZpZGVyX2dvb2dsZSI+CisgICAgICAgICAgPGltZyBoZWlnaHQ9IjE2IiB3aWR0aD0iMTYiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FZQUFBQWY4LzloQUFBQnNVbEVRVlI0MnJXU3kwc2JZUlJIODhmWWhXNUtRWFRoSWtVUU42SVNKRkJCVzZGRkJOMlVxbEM3OExWS0ZsSElvcVdHYWtGOGdVWjhnYWpWektTS1pwUW1BV3RLMHBCbWhreG1TZ1B1aXVhWW1SS2hTRXdVL09EeURaZnpPOHlkT3hiTFF4MU5CMEg0eThGQmxtTXB5OUx5T2F2cktVb0tCNElYdkJzSUlvcFJQSjQ0MWRZLzJGcjhmQXRGU3hPMGRrUnk0ZUExUERwK1RrVmxtR2hNS1M1SUpPRnBiWWdqNmZRYWxoVjRVaFZtMGVzdkxvakVMaW12MUppWU9Qd1BmbFMyZ005M1dOb0lYWjFuUEM0L0lSRFF6WURUcVRBMFBNMmR0dUNaOHZHbVY2U3ZQNXNyTC9kYTVjKzRUbk5MRmx2VE1ZbUVWcnBrYXp1TTJ4MW5hT1E3RGMxZnFMT21hYXlYa2FTejRoTEhld203ZlkrWjJSMGlQK0ptWUdweW0vcTZERGI3NnUwQ3dSK2c5KzBGSHo0dTN3QWRMaDlWTld1NVVYNFZscXlzZmFYUkRvT0ROeithdzduRHM5WlBwTlBwd2dKVjFXaHZGNm0xL3FiNzlUNmZwd1htNWtWR1JuZDUvbUlkUVN6d0gyaWFocTcvMjdueGlxNXhMeTlmYmREV3NVdFB6eWF1c1JWQzRWTU16bUFNTnY5c3lUZGtXVFpMVlZVeW1ZeDVKNU5KczVkS3BWQVV4YXc4Wi9TTTdCVitmejlVYzR5WVJBQUFBQUJKUlU1RXJrSmdnZz09IiAvPgorICAgICAgICAgIDxhIGhyZWY9Ij9pZD1odHRwczovL3d3dy5nb29nbGUuY29tL2FjY291bnRzL284L2lkIiBpZD0iaWRfZ29vZ2xlIj5TaWduIGluIHdpdGggYSBHb29nbGUgQWNjb3VudDwvYT4KKyAgICAgICAgPC9kaXY+CisgICAgICAgIDxkaXYgaWQ9InByb3ZpZGVyX3lhaG9vIj4KKyAgICAgICAgICA8aW1nIGhlaWdodD0iMTYiIHdpZHRoPSIxNiIgc3JjPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQVBFQ0FBQUFBUDhBQVAvLy84ek16Q0g1QkFFQUFBTUFMQUFBQUFBUUFCQUFBQUlxbkkrcHkzMEJZM0FnQWpDa2ZKRGppSUFRbGdVa054cVdrcXJtMGhvbktrN0toWk96dy9mK2Z5Z0FBRHM9IiAvPgorICAgICAgICAgIDxhIGhyZWY9Ij9pZD1odHRwczovL21lLnlhaG9vLmNvbSIgaWQ9ImlkX3lhaG9vIj5TaWduIGluIHdpdGggYSBZYWhvbyEgSUQ8L2E+CisgICAgICAgIDwvZGl2PgorCisgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDI1cHg7Ij4KKyAgICAgICAgICA8aDI+V2hhdCBpcyBPcGVuSUQ/PC9oMj4KKyAgICAgICAgICA8cD5PcGVuSUQgcHJvdmlkZXMgc2VjdXJlIHNpbmdsZS1zaWduLW9uLCB3aXRob3V0IHJldmVhbGluZyB5b3VyIHBhc3N3b3JkcyB0byB0aGlzIHdlYnNpdGUuPC9wPgorICAgICAgICAgIDxwPlRoZXJlIGFyZSBtYW55IE9wZW5JRCBwcm92aWRlcnMgYXZhaWxhYmxlLiAgWW91IG1heSBhbHJlYWR5IGJlIG1lbWJlciBvZiBvbmUhPC9wPgorICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9vcGVuaWQubmV0L2dldC8iIHRhcmdldD0iX2JsYW5rIj5HZXQgT3BlbklEPC9hPjwvcD4KKyAgICAgICAgPC9kaXY+CisgICAgICA8L2Zvcm0+CisgICAgPC9kaXY+CisgICAgPGRpdiBzdHlsZT0iY2xlYXI6IGJvdGg7IG1hcmdpbi10b3A6IDE1cHg7IHBhZGRpbmctdG9wOiAycHg7IG1hcmdpbi1ib3R0b206IDE1cHg7Ij4KKyAgICAgIDxkaXYgaWQ9ImdlcnJpdF9mb290ZXIiPjwvZGl2PgorICAgIDwvZGl2PgorCisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgdmFyIGZfb3BlbmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zfb3BlbmlkJyk7CisgICAgICB2YXIgZl9zdWJtaXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9zdWJtaXQnKTsKKyAgICAgIGlmIChmX29wZW5pZC52YWx1ZSA9PSAnJykKKyAgICAgICAgZl9vcGVuaWQuZm9jdXMoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgZl9zdWJtaXQuZm9jdXMoKTsKKyAgICA8L3NjcmlwdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvUmVkaXJlY3RGb3JtLmh0bWwgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9SZWRpcmVjdEZvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM0ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvUmVkaXJlY3RGb3JtLmh0bWwKQEAgLTAsMCArMSwxNiBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBSZWRpcmVjdGluZyAuLi48L3RpdGxlPgorICA8L2hlYWQ+CisgIDxib2R5PgorICAgIDxkaXY+UmVkaXJlY3RpbmcgLi4uPC9kaXY+CisJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiMiIGlkPSJyZWRpcmVjdF9mb3JtIj4KKwkgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDb250aW51ZSIgLz4KKyAgICA8L2Zvcm0+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KKyAgICAgIHZhciByID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlZGlyZWN0X2Zvcm0nKTsKKyAgICAgIHIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICAgIHIuc3VibWl0KCk7CisgICAgPC9zY3JpcHQ+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvLmdpdGlnbm9yZSBiL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2YjA1Yy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcGFja2FnZS1wbHVnaW5zLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS90YXJnZXQKLS8uY2xhc3NwYXRoCi0vLnByb2plY3QKLS8uc2V0dGluZ3Mvb3JnLm1hdmVuLmlkZS5lY2xpcHNlLnByZWZzCi0vLnNldHRpbmdzL29yZy5lY2xpcHNlLm0yZS5jb3JlLnByZWZzCi0vZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy5pbWwKZGlmZiAtLWdpdCBhL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvcG9tLnhtbCBiL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3MjcxOS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcGFja2FnZS1wbHVnaW5zL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFja2FnZS1wbHVnaW5zPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPG5hbWU+R2Vycml0IENvZGUgUmV2aWV3IC0gUGFja2FnZSBQbHVnaW5zPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvPC91cmw+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgICBVVEYtOAotICAgIDwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC13YXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICA8dHlwZT53YXI8L3R5cGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZXNvdXJjZS5nZXJyaXQucGx1Z2lucy5yZXBsaWNhdGlvbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnJlcGxpY2F0aW9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPmNvcHktZGVwZW5kZW5jaWVzPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8aW5jbHVkZVR5cGVzPmphcjwvaW5jbHVkZVR5cGVzPgotICAgICAgICAgICAgICA8c3RyaXBWZXJzaW9uPnRydWU8L3N0cmlwVmVyc2lvbj4KLSAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS9XRUItSU5GL3BsdWdpbnM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4xLjE8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDx3YXJOYW1lPmdlcnJpdC1mdWxsLSR7cHJvamVjdC52ZXJzaW9ufTwvd2FyTmFtZT4KLSAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgIDxhZGRNYXZlbkRlc2NyaXB0b3I+ZmFsc2U8L2FkZE1hdmVuRGVzY3JpcHRvcj4KLSAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgIDxNYWluLUNsYXNzPk1haW48L01haW4tQ2xhc3M+Ci0gICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1UaXRsZT5HZXJyaXQgQ29kZSBSZXZpZXc8L0ltcGxlbWVudGF0aW9uLVRpdGxlPgotICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+Ci0gICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wYXRjaC1jb21tb25zbmV0L3BvbS54bWwgYi9nZXJyaXQtcGF0Y2gtY29tbW9uc25ldC9wb20ueG1sCmluZGV4IGYxYThiM2UuLjc4Y2E2MWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wYXRjaC1jb21tb25zbmV0L3BvbS54bWwKKysrIGIvZ2Vycml0LXBhdGNoLWNvbW1vbnNuZXQvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhdGNoLWNvbW1vbnNuZXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGF0Y2gtamdpdC9wb20ueG1sIGIvZ2Vycml0LXBhdGNoLWpnaXQvcG9tLnhtbAppbmRleCA2NTIyM2ZiLi43ZTUwYWY4IDEwMDY0NAotLS0gYS9nZXJyaXQtcGF0Y2gtamdpdC9wb20ueG1sCisrKyBiL2dlcnJpdC1wYXRjaC1qZ2l0L3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXRjaC1qZ2l0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBhdGNoLWpnaXQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZVN0YXRBY2Nlc3Nvci5qYXZhIGIvZ2Vycml0LXBhdGNoLWpnaXQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZVN0YXRBY2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNDFkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGF0Y2gtamdpdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlU3RhdEFjY2Vzc29yLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuV2luZG93Q2FjaGU7CisKKy8vIEhhY2sgdG8gb2J0YWluIHZpc2liaWxpdHkgdG8gcGFja2FnZSBsZXZlbCBtZXRob2RzIG9ubHkuCisvLyBUaGVzZSBhcmVuJ3QgeWV0IHBhcnQgb2YgdGhlIHB1YmxpYyBKR2l0IEFQSS4KKworcHVibGljIGNsYXNzIFdpbmRvd0NhY2hlU3RhdEFjY2Vzc29yIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgZ2V0T3BlbkZpbGVzKCkgeworICAgIHJldHVybiBXaW5kb3dDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE9wZW5GaWxlcygpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nIGdldE9wZW5CeXRlcygpIHsKKyAgICByZXR1cm4gV2luZG93Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuQnl0ZXMoKTsKKyAgfQorCisgIHByaXZhdGUgV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wYXRjaC1qZ2l0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IuamF2YSBiL2dlcnJpdC1wYXRjaC1qZ2l0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyOTUzNi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcGF0Y2gtamdpdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlU3RhdEFjY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7Ci0KLS8vIEhhY2sgdG8gb2J0YWluIHZpc2liaWxpdHkgdG8gcGFja2FnZSBsZXZlbCBtZXRob2RzIG9ubHkuCi0vLyBUaGVzZSBhcmVuJ3QgeWV0IHBhcnQgb2YgdGhlIHB1YmxpYyBKR2l0IEFQSS4KLQotcHVibGljIGNsYXNzIFdpbmRvd0NhY2hlU3RhdEFjY2Vzc29yIHsKLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0T3BlbkZpbGVzKCkgewotICAgIHJldHVybiBXaW5kb3dDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE9wZW5GaWxlcygpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBsb25nIGdldE9wZW5CeXRlcygpIHsKLSAgICByZXR1cm4gV2luZG93Q2FjaGUuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuQnl0ZXMoKTsKLSAgfQotCi0gIHByaXZhdGUgV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IoKSB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vcG9tLnhtbCBiL2dlcnJpdC1wZ20vcG9tLnhtbAppbmRleCBhMDE1MjE5Li5mNzNhMmIwIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3BvbS54bWwKKysrIGIvZ2Vycml0LXBnbS9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGdtPC9hcnRpZmFjdElkPgpAQCAtNjUsNiArNjUsMTIgQEAKICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXNlcnZlcjwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KQEAgLTkyLDcgKzk4LDcgQEAKIAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxhcnRpZmFjdElkPnRvbWNhdC1zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vRGFlbW9uLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0RhZW1vbi5qYXZhCmluZGV4IGE4MjZjODguLmNhOThhODQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vRGFlbW9uLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9EYWVtb24uamF2YQpAQCAtMTksMTAgKzE5LDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuQWxsUmVxdWVzdEZpbHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5DYWNoZUJhc2VkV2ViU2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HZXJyaXRVaU9wdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuR2l0T3Zlckh0dHBNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLlJlcXVlc3RDb250ZXh0RmlsdGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLlNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNzaEdsdWVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQuT3BlbklkTW9kdWxlOwpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS5odHRwLmpldHR5LkpldHR5TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS5odHRwLmpldHR5LlByb2plY3RRb1NGaWx0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuRXJyb3JMb2dGaWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkdhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Mb2dGaWxlQ29tcHJlc3NvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5SdW50aW1lU2h1dGRvd247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuU2l0ZVByb2dyYW07CkBAIC01MSwxMiArNTIsMTUgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5TaWduZWRUb2tlbkVtYWlsVG9rZW5WZXJpZmllcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5TbXRwRW1haWxTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkludHJhTGluZVdvcmtlclBvb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luR3VpY2VFbnZpcm9ubWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5Nb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFVcGRhdGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuU2NoZW1hVmVyc2lvbkNoZWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuVXBkYXRlVUk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Ob1NzaEtleUNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guTm9Tc2hNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hLZXlDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kcy5NYXN0ZXJDb21tYW5kTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHMuU2xhdmVDb21tYW5kTW9kdWxlOwpAQCAtNjUsNiArNjksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlN0YXRlbWVudEV4ZWN1dG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CkBAIC0xMTMsNiArMTE4LDkgQEAKICAgQE9wdGlvbihuYW1lID0gIi0tcnVuLWlkIiwgdXNhZ2UgPSAiQ29va2llIHRvIHN0b3JlIGluICRzaXRlX3BhdGgvbG9ncy9nZXJyaXQucnVuIikKICAgcHJpdmF0ZSBTdHJpbmcgcnVuSWQ7CiAKKyAgQE9wdGlvbihuYW1lID0gIi0taGVhZGxlc3MiLCB1c2FnZSA9ICJEb24ndCBzdGFydCB0aGUgVUkgZnJvbnRlbmQiKQorICBwcml2YXRlIGJvb2xlYW4gaGVhZGxlc3M7CisKICAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcigpOwogICBwcml2YXRlIEluamVjdG9yIGRiSW5qZWN0b3I7CiAgIHByaXZhdGUgSW5qZWN0b3IgY2ZnSW5qZWN0b3I7CkBAIC0xMjIsNiArMTMwLDE1IEBACiAgIHByaXZhdGUgSW5qZWN0b3IgaHR0cGRJbmplY3RvcjsKICAgcHJpdmF0ZSBGaWxlIHJ1bkZpbGU7CiAKKyAgcHJpdmF0ZSBSdW5uYWJsZSBzZXJ2ZXJTdGFydGVkOworCisgIHB1YmxpYyBEYWVtb24oKSB7CisgIH0KKworICBwdWJsaWMgRGFlbW9uKFJ1bm5hYmxlIHNlcnZlclN0YXJ0ZWQpIHsKKyAgICB0aGlzLnNlcnZlclN0YXJ0ZWQgPSBzZXJ2ZXJTdGFydGVkOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgbXVzdEhhdmVWYWxpZFNpdGUoKTsKQEAgLTE0Nyw2ICsxNjQsNyBAQAogICAgICAgdGhyb3cgZGllKCJDYW5ub3QgY29tYmluZSAtLXNsYXZlIGFuZCAtLWVuYWJsZS1odHRwZCIpOwogICAgIH0KIAorICAgIG1hbmFnZXIuYWRkKEdhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZS5zdGFydChnZXRTaXRlUGF0aCgpKSk7CiAgICAgaWYgKGNvbnNvbGVMb2cpIHsKICAgICB9IGVsc2UgewogICAgICAgbWFuYWdlci5hZGQoRXJyb3JMb2dGaWxlLnN0YXJ0KGdldFNpdGVQYXRoKCkpKTsKQEAgLTE5OCw2ICsyMTYsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogCisgICAgICBpZiAoc2VydmVyU3RhcnRlZCAhPSBudWxsKSB7CisgICAgICAgIHNlcnZlclN0YXJ0ZWQucnVuKCk7CisgICAgICB9CisKICAgICAgIFJ1bnRpbWVTaHV0ZG93bi53YWl0Rm9yKCk7CiAgICAgICByZXR1cm4gMDsKICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXJyKSB7CkBAIC0yOTEsMTEgKzMxMywxMSBAQAogICAgIG1vZHVsZXMuYWRkKG5ldyBXb3JrUXVldWUuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBDaGFuZ2VIb29rUnVubmVyLk1vZHVsZSgpKTsKICAgICBtb2R1bGVzLmFkZChuZXcgUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZSgpKTsKKyAgICBtb2R1bGVzLmFkZChuZXcgSW50cmFMaW5lV29ya2VyUG9vbC5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQoY2ZnSW5qZWN0b3IuZ2V0SW5zdGFuY2UoR2Vycml0R2xvYmFsTW9kdWxlLmNsYXNzKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IERlZmF1bHRDYWNoZUZhY3RvcnkuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTbXRwRW1haWxTZW5kZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTaWduZWRUb2tlbkVtYWlsVG9rZW5WZXJpZmllci5Nb2R1bGUoKSk7Ci0gICAgbW9kdWxlcy5hZGQobmV3IFNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBQbHVnaW5Nb2R1bGUoKSk7CiAgICAgaWYgKGh0dHBkKSB7CiAgICAgICBtb2R1bGVzLmFkZChuZXcgQ2Fub25pY2FsV2ViVXJsTW9kdWxlKCkgewpAQCAtMzEyLDkgKzMzNCwyMCBAQAogICAgICAgICB9CiAgICAgICB9KTsKICAgICB9CisgICAgaWYgKHNzaGQpIHsKKyAgICAgIG1vZHVsZXMuYWRkKFNzaEtleUNhY2hlSW1wbC5tb2R1bGUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1vZHVsZXMuYWRkKE5vU3NoS2V5Q2FjaGUubW9kdWxlKCkpOworICAgIH0KICAgICBpZiAoIXNsYXZlKSB7CiAgICAgICBtb2R1bGVzLmFkZChuZXcgTWFzdGVyTm9kZVN0YXJ0dXAoKSk7CiAgICAgfQorICAgIG1vZHVsZXMuYWRkKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKEdlcnJpdFVpT3B0aW9ucy5jbGFzcykudG9JbnN0YW5jZShuZXcgR2Vycml0VWlPcHRpb25zKGhlYWRsZXNzKSk7CisgICAgICB9CisgICAgfSk7CiAgICAgcmV0dXJuIGNmZ0luamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobW9kdWxlcyk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9FeHBvcnRSZXZpZXdOb3Rlcy5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9FeHBvcnRSZXZpZXdOb3Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUzNjBkLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vRXhwb3J0UmV2aWV3Tm90ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZVByb3ZpZGVyLkNvbnRleHQuTVVMVElfVVNFUjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5TaXRlUHJvZ3JhbTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGVJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGVJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jYWNoZS5oMi5EZWZhdWx0Q2FjaGVGYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXBwcm92YWxUeXBlc1Byb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5GYWN0b3J5TW9kdWxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkNyZWF0ZUNvZGVSZXZpZXdOb3RlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Ob3Rlc0JyYW5jaFV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFWZXJzaW9uQ2hlY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuVGV4dFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UaHJlYWRTYWZlUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CbG9ja0xpc3Q7Ci1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0vKiogRXhwb3J0IHJldmlldyBub3RlcyBmb3IgYWxsIHN1Ym1pdHRlZCBjaGFuZ2VzIGluIGFsbCBwcm9qZWN0cy4gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRSZXZpZXdOb3RlcyBleHRlbmRzIFNpdGVQcm9ncmFtIHsKLSAgQE9wdGlvbihuYW1lID0gIi0tdGhyZWFkcyIsIHVzYWdlID0gIk51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgdG8gcnVuIikKLSAgcHJpdmF0ZSBpbnQgdGhyZWFkcyA9IDI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcigpOwotICBwcml2YXRlIGZpbmFsIFRleHRQcm9ncmVzc01vbml0b3IgdGV4dE1vbml0b3IgPSBuZXcgVGV4dFByb2dyZXNzTW9uaXRvcigpOwotICBwcml2YXRlIGZpbmFsIFRocmVhZFNhZmVQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9Ci0gICAgICBuZXcgVGhyZWFkU2FmZVByb2dyZXNzTW9uaXRvcih0ZXh0TW9uaXRvcik7Ci0KLSAgcHJpdmF0ZSBJbmplY3RvciBkYkluamVjdG9yOwotICBwcml2YXRlIEluamVjdG9yIGdpdEluamVjdG9yOwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBkYXRhYmFzZTsKLQotICBASW5qZWN0Ci0gIHByaXZhdGUgQ3JlYXRlQ29kZVJldmlld05vdGVzLkZhY3RvcnkgY29kZVJldmlld05vdGVzRmFjdG9yeTsKLQotICBwcml2YXRlIE1hcDxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4gY2hhbmdlczsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBpZiAodGhyZWFkcyA8PSAwKSB7Ci0gICAgICB0aHJlYWRzID0gMTsKLSAgICB9Ci0KLSAgICBkYkluamVjdG9yID0gY3JlYXRlRGJJbmplY3RvcihNVUxUSV9VU0VSKTsKLSAgICBnaXRJbmplY3RvciA9IGRiSW5qZWN0b3IuY3JlYXRlQ2hpbGRJbmplY3RvcihuZXcgQWJzdHJhY3RNb2R1bGUoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgaW5zdGFsbChTY2hlbWFWZXJzaW9uQ2hlY2subW9kdWxlKCkpOwotICAgICAgICBiaW5kKEFwcHJvdmFsVHlwZXMuY2xhc3MpLnRvUHJvdmlkZXIoQXBwcm92YWxUeXBlc1Byb3ZpZGVyLmNsYXNzKS5pbigKLSAgICAgICAgICAgIFNjb3Blcy5TSU5HTEVUT04pOwotICAgICAgICBiaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChDYW5vbmljYWxXZWJVcmwuY2xhc3MpCi0gICAgICAgICAgICAudG9Qcm92aWRlcihDYW5vbmljYWxXZWJVcmxQcm92aWRlci5jbGFzcykuaW4oU2NvcGVzLlNJTkdMRVRPTik7Ci0KLSAgICAgICAgaW5zdGFsbChBY2NvdW50Q2FjaGVJbXBsLm1vZHVsZSgpKTsKLSAgICAgICAgaW5zdGFsbChHcm91cENhY2hlSW1wbC5tb2R1bGUoKSk7Ci0gICAgICAgIGluc3RhbGwobmV3IERlZmF1bHRDYWNoZUZhY3RvcnkuTW9kdWxlKCkpOwotICAgICAgICBpbnN0YWxsKG5ldyBGYWN0b3J5TW9kdWxlKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgICAgIGZhY3RvcnkoQ3JlYXRlQ29kZVJldmlld05vdGVzLkZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgICAgZmFjdG9yeShOb3Rlc0JyYW5jaFV0aWwuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW5zdGFsbChuZXcgTGlmZWN5Y2xlTW9kdWxlKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyKCkudG8oTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXIuTGlmZWN5Y2xlLmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH0pOwotCi0gICAgbWFuYWdlci5hZGQoZGJJbmplY3RvciwgZ2l0SW5qZWN0b3IpOwotICAgIG1hbmFnZXIuc3RhcnQoKTsKLSAgICBnaXRJbmplY3Rvci5pbmplY3RNZW1iZXJzKHRoaXMpOwotCi0gICAgTGlzdDxDaGFuZ2U+IGFsbENoYW5nZUxpc3QgPSBhbGxDaGFuZ2VzKCk7Ci0gICAgbW9uaXRvci5iZWdpblRhc2soIlNjYW5uaW5nIGNoYW5nZXMiLCBhbGxDaGFuZ2VMaXN0LnNpemUoKSk7Ci0gICAgY2hhbmdlcyA9IGNsdXN0ZXIoYWxsQ2hhbmdlTGlzdCk7Ci0gICAgYWxsQ2hhbmdlTGlzdCA9IG51bGw7Ci0KLSAgICBtb25pdG9yLnN0YXJ0V29ya2Vycyh0aHJlYWRzKTsKLSAgICBmb3IgKGludCB0aWQgPSAwOyB0aWQgPCB0aHJlYWRzOyB0aWQrKykgewotICAgICAgbmV3IFdvcmtlcigpLnN0YXJ0KCk7Ci0gICAgfQotICAgIG1vbml0b3Iud2FpdEZvckNvbXBsZXRpb24oKTsKLSAgICBtb25pdG9yLmVuZFRhc2soKTsKLSAgICBtYW5hZ2VyLnN0b3AoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHByaXZhdGUgTGlzdDxDaGFuZ2U+IGFsbENoYW5nZXMoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IGRhdGFiYXNlLm9wZW4oKTsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGRiLmNoYW5nZXMoKS5hbGwoKS50b0xpc3QoKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgZGIuY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIE1hcDxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4gY2x1c3RlcihMaXN0PENoYW5nZT4gY2hhbmdlcykgewotICAgIEhhc2hNYXA8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IG0gPQotICAgICAgICBuZXcgSGFzaE1hcDxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4oKTsKLSAgICBmb3IgKENoYW5nZSBjaGFuZ2UgOiBjaGFuZ2VzKSB7Ci0gICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuTUVSR0VEKSB7Ci0gICAgICAgIExpc3Q8Q2hhbmdlPiBsID0gbS5nZXQoY2hhbmdlLmdldFByb2plY3QoKSk7Ci0gICAgICAgIGlmIChsID09IG51bGwpIHsKLSAgICAgICAgICBsID0gbmV3IEJsb2NrTGlzdDxDaGFuZ2U+KCk7Ci0gICAgICAgICAgbS5wdXQoY2hhbmdlLmdldFByb2plY3QoKSwgbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbC5hZGQoY2hhbmdlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vbml0b3IudXBkYXRlKDEpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBleHBvcnQoUmV2aWV3RGIgZGIsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBMaXN0PENoYW5nZT4gY2hhbmdlcykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uLAotICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0OwotICAgIHRyeSB7Ci0gICAgICBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHByb2plY3QpOwotICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBDcmVhdGVDb2RlUmV2aWV3Tm90ZXMgbm90ZXMgPSBjb2RlUmV2aWV3Tm90ZXNGYWN0b3J5LmNyZWF0ZShkYiwgZ2l0KTsKLSAgICAgIG5vdGVzLmNyZWF0ZShjaGFuZ2VzLCBudWxsLAotICAgICAgICAgICJFeHBvcnRlZCBwcmlvciByZXZpZXdzIGZyb20gR2Vycml0IENvZGUgUmV2aWV3XG4iLCBtb25pdG9yKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgZ2l0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBNYXAuRW50cnk8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IG5leHQoKSB7Ci0gICAgc3luY2hyb25pemVkIChjaGFuZ2VzKSB7Ci0gICAgICBpZiAoY2hhbmdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBuYW1lID0gY2hhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBsaXN0ID0gY2hhbmdlcy5yZW1vdmUobmFtZSk7Ci0gICAgICByZXR1cm4gbmV3IE1hcC5FbnRyeTxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldEtleSgpIHsKLSAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTGlzdDxDaGFuZ2U+IGdldFZhbHVlKCkgewotICAgICAgICAgIHJldHVybiBsaXN0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMaXN0PENoYW5nZT4gc2V0VmFsdWUoTGlzdDxDaGFuZ2U+IHZhbHVlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBUaHJlYWQgewotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgIFJldmlld0RiIGRiOwotICAgICAgdHJ5IHsKLSAgICAgICAgZGIgPSBkYXRhYmFzZS5vcGVuKCk7Ci0gICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgRW50cnk8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IG5leHQgPSBuZXh0KCk7Ci0gICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgZXhwb3J0KGRiLCBuZXh0LmdldEtleSgpLCBuZXh0LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIG1vbml0b3IuZW5kV29ya2VyKCk7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0luaXQuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vSW5pdC5qYXZhCmluZGV4IDk1Yjg0ODdmLi4zYzc4MjJjIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0luaXQuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0luaXQuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0LkJyb3dzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuSW5pdEZsYWdzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0LkluaXRNb2R1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuUmVsb2FkU2l0ZUxpYnJhcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuU2l0ZVBhdGhJbml0aWFsaXplcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Db25zb2xlVUk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuRGllOwpAQCAtMTIxLDEyICsxMjAsNiBAQAogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICBiaW5kKENvbnNvbGVVSS5jbGFzcykudG9JbnN0YW5jZSh1aSk7CiAgICAgICAgIGJpbmQoRmlsZS5jbGFzcykuYW5ub3RhdGVkV2l0aChTaXRlUGF0aC5jbGFzcykudG9JbnN0YW5jZShzaXRlUGF0aCk7Ci0gICAgICAgIGJpbmQoUmVsb2FkU2l0ZUxpYnJhcnkuY2xhc3MpLnRvSW5zdGFuY2UobmV3IFJlbG9hZFNpdGVMaWJyYXJ5KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKLSAgICAgICAgICAgIEluaXQuc3VwZXIubG9hZFNpdGVMaWIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwogICAgICAgfQogICAgIH0pOwogCkBAIC0xNDAsOCArMTMzLDkgQEAKICAgICAgICAgdGhyb3cgKERpZSkgd2h5OwogICAgICAgfQogCi0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKGNlLmdldE1lc3NhZ2UoKSk7CiAgICAgICB3aGlsZSAod2h5ICE9IG51bGwpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKICAgICAgICAgYnVmLmFwcGVuZCh3aHkuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgd2h5ID0gd2h5LmdldENhdXNlKCk7CiAgICAgICAgIGlmICh3aHkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9Qcm90b0dlbi5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9Qcm90b0dlbi5qYXZhCmluZGV4IDE3YjcwMTcuLjQ1MTIwNzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vUHJvdG9HZW4uamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL1Byb3RvR2VuLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLmphdmEuSmF2YVNjaGVtYU1vZGVsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5JTzsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9odHRwL2pldHR5L0pldHR5U2VydmVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2h0dHAvamV0dHkvSmV0dHlTZXJ2ZXIuamF2YQppbmRleCA1ODIzOTQwLi4zYTdhODc0IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2h0dHAvamV0dHkvSmV0dHlTZXJ2ZXIuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2h0dHAvamV0dHkvSmV0dHlTZXJ2ZXIuamF2YQpAQCAtNDIsMTAgKzQyLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLnNzbC5Tc2xTZWxlY3RDaGFubmVsQ29ubmVjdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuRGVmYXVsdFNlcnZsZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5GaWx0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5GaWx0ZXJNYXBwaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldEhvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsLlNzbENvbnRleHRGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkLlF1ZXVlZFRocmVhZFBvb2w7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQuVGhyZWFkUG9vbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02MCw2ICs2MCw3IEBACiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTY3LDYgKzY4LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAoraW1wb3J0IGphdmF4LnNlcnZsZXQuRGlzcGF0Y2hlclR5cGU7CisKIEBTaW5nbGV0b24KIHB1YmxpYyBjbGFzcyBKZXR0eVNlcnZlciB7CiAgIHN0YXRpYyBjbGFzcyBMaWZlY3ljbGUgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CkBAIC0xNjEsMjMgKzE2NCwyMyBAQAogICAgICAgICBkZWZhdWx0UG9ydCA9IDgwOwogICAgICAgICBjID0gbmV3IFNlbGVjdENoYW5uZWxDb25uZWN0b3IoKTsKICAgICAgIH0gZWxzZSBpZiAoImh0dHBzIi5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKLSAgICAgICAgZmluYWwgU3NsU2VsZWN0Q2hhbm5lbENvbm5lY3RvciBzc2wgPSBuZXcgU3NsU2VsZWN0Q2hhbm5lbENvbm5lY3RvcigpOworICAgICAgICBTc2xDb250ZXh0RmFjdG9yeSBzc2wgPSBuZXcgU3NsQ29udGV4dEZhY3RvcnkoKTsKICAgICAgICAgZmluYWwgRmlsZSBrZXlzdG9yZSA9IGdldEZpbGUoY2ZnLCAic3Nsa2V5c3RvcmUiLCAiZXRjL2tleXN0b3JlIik7CiAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IGNmZy5nZXRTdHJpbmcoImh0dHBkIiwgbnVsbCwgInNzbGtleXBhc3N3b3JkIik7CiAgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7CiAgICAgICAgICAgcGFzc3dvcmQgPSAiZ2Vycml0IjsKICAgICAgICAgfQotICAgICAgICBzc2wuc2V0S2V5c3RvcmUoa2V5c3RvcmUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBzc2wuc2V0VHJ1c3RzdG9yZShrZXlzdG9yZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIHNzbC5zZXRLZXlQYXNzd29yZChwYXNzd29yZCk7Ci0gICAgICAgIHNzbC5zZXRUcnVzdFBhc3N3b3JkKHBhc3N3b3JkKTsKKyAgICAgICAgc3NsLnNldEtleVN0b3JlUGF0aChrZXlzdG9yZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHNzbC5zZXRUcnVzdFN0b3JlKGtleXN0b3JlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgc3NsLnNldEtleVN0b3JlUGFzc3dvcmQocGFzc3dvcmQpOworICAgICAgICBzc2wuc2V0VHJ1c3RTdG9yZVBhc3N3b3JkKHBhc3N3b3JkKTsKIAogICAgICAgICBpZiAoQXV0aFR5cGUuQ0xJRU5UX1NTTF9DRVJUX0xEQVAuZXF1YWxzKGF1dGhUeXBlKSkgewogICAgICAgICAgIHNzbC5zZXROZWVkQ2xpZW50QXV0aCh0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHRQb3J0ID0gNDQzOwotICAgICAgICBjID0gc3NsOworICAgICAgICBjID0gbmV3IFNzbFNlbGVjdENoYW5uZWxDb25uZWN0b3Ioc3NsKTsKIAogICAgICAgfSBlbHNlIGlmICgicHJveHktaHR0cCIuZXF1YWxzKHUuZ2V0U2NoZW1lKCkpKSB7CiAgICAgICAgIGRlZmF1bHRQb3J0ID0gODA4MDsKQEAgLTMzNiw3ICszMzksOSBAQAogICAgIC8vIGFscmVhZHkgaGF2ZSBidWlsdC4KICAgICAvLwogICAgIEd1aWNlRmlsdGVyIGZpbHRlciA9IGVudi53ZWJJbmplY3Rvci5nZXRJbnN0YW5jZShHdWljZUZpbHRlci5jbGFzcyk7Ci0gICAgYXBwLmFkZEZpbHRlcihuZXcgRmlsdGVySG9sZGVyKGZpbHRlciksICIvKiIsIEZpbHRlck1hcHBpbmcuREVGQVVMVCk7CisgICAgYXBwLmFkZEZpbHRlcihuZXcgRmlsdGVySG9sZGVyKGZpbHRlciksICIvKiIsIEVudW1TZXQub2YoCisgICAgICAgIERpc3BhdGNoZXJUeXBlLlJFUVVFU1QsCisgICAgICAgIERpc3BhdGNoZXJUeXBlLkFTWU5DKSk7CiAgICAgYXBwLmFkZEV2ZW50TGlzdGVuZXIobmV3IEd1aWNlU2VydmxldENvbnRleHRMaXN0ZW5lcigpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIEluamVjdG9yIGdldEluamVjdG9yKCkgewpAQCAtNDkxLDcgKzQ5Niw3IEBACiAgICAgZm9yIChGaWxlIGUgOiBlbnRyaWVzKSB7CiAgICAgICBpZiAoZS5pc0RpcmVjdG9yeSgpIC8qIG11c3QgYmUgYSBkaXJlY3RvcnkgKi8KICAgICAgICAgICAmJiBlLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXJyaXQtZ3d0dWktIikKLSAgICAgICAgICAmJiBuZXcgRmlsZShlLCAiZ2Vycml0L2dlcnJpdC5ub2NhY2hlLmpzIikuaXNGaWxlKCkpIHsKKyAgICAgICAgICAmJiBuZXcgRmlsZShlLCAiZ2Vycml0X3VpL2dlcnJpdF91aS5ub2NhY2hlLmpzIikuaXNGaWxlKCkpIHsKICAgICAgICAgcmV0dXJuIFJlc291cmNlLm5ld1Jlc291cmNlKGUudG9VUkkoKSk7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0Jyb3dzZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Ccm93c2VyLmphdmEKaW5kZXggZWExMzA0My4uOGUzOTQ4ZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0Jyb3dzZXIuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvQnJvd3Nlci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC00Miw3ICs0Myw2IEBACiAgICAgaWYgKHVybCA9PSBudWxsKSB7CiAgICAgICByZXR1cm47CiAgICAgfQotCiAgICAgaWYgKHVybC5zdGFydHNXaXRoKCJwcm94eS0iKSkgewogICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygicHJveHktIi5sZW5ndGgoKSk7CiAgICAgfQpAQCAtNTQsMTUgKzU0LDE5IEBACiAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImVycm9yOiBpbnZhbGlkIGh0dHBkLmxpc3RlblVybDogIiArIHVybCk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGZpbmFsIFN0cmluZyBob3N0bmFtZSA9IHVyaS5nZXRIb3N0KCk7Ci0gICAgZmluYWwgaW50IHBvcnQgPSBJbml0VXRpbC5wb3J0T2YodXJpKTsKKyAgICB3YWl0Rm9yU2VydmVyKHVyaSk7CisgICAgb3BlbkJyb3dzZXIodXJpLCBsaW5rKTsKKyAgfQogCi0gICAgU3lzdGVtLmVyci5wcmludCgiV2FpdGluZyBmb3Igc2VydmVyIHRvIHN0YXJ0IC4uLiAiKTsKKyAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTZXJ2ZXIoVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgaG9zdCA9IHVyaS5nZXRIb3N0KCk7CisgICAgaW50IHBvcnQgPSBJbml0VXRpbC5wb3J0T2YodXJpKTsKKyAgICBTeXN0ZW0uZXJyLmZvcm1hdCgiV2FpdGluZyBmb3Igc2VydmVyIG9uICVzOiVkIC4uLiAiLCBob3N0LCBwb3J0KTsKICAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7CiAgICAgZm9yICg7OykgewotICAgICAgZmluYWwgU29ja2V0IHM7CisgICAgICBTb2NrZXQgczsKICAgICAgIHRyeSB7Ci0gICAgICAgIHMgPSBuZXcgU29ja2V0KGhvc3RuYW1lLCBwb3J0KTsKKyAgICAgICAgcyA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CkBAIC03NCwxOCArNzgsMzMgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk9LIik7CisgIH0KIAotICAgIHVybCA9IGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJjYW5vbmljYWxXZWJVcmwiKTsKLSAgICBpZiAodXJsID09IG51bGwgfHwgdXJsLmlzRW1wdHkoKSkgeworICBwcml2YXRlIFN0cmluZyByZXNvbHZlVXJsKFVSSSB1cmksIFN0cmluZyBsaW5rKSB7CisgICAgU3RyaW5nIHVybCA9IGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJjYW5vbmljYWxXZWJVcmwiKTsKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KHVybCkpIHsKICAgICAgIHVybCA9IHVyaS50b1N0cmluZygpOwogICAgIH0KICAgICBpZiAoIXVybC5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICB1cmwgKz0gIi8iOwogICAgIH0KLSAgICBpZiAobGluayAhPSBudWxsICYmICFsaW5rLmlzRW1wdHkoKSkgeworICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGxpbmspKSB7CiAgICAgICB1cmwgKz0gIiMiICsgbGluazsKICAgICB9Ci0gICAgU3lzdGVtLmVyci5wcmludGxuKCJPcGVuaW5nIGJyb3dzZXIgLi4uIik7Ci0gICAgb3JnLmgyLnRvb2xzLlNlcnZlci5vcGVuQnJvd3Nlcih1cmwpOworICAgIHJldHVybiB1cmw7CisgIH0KKworICBwcml2YXRlIHZvaWQgb3BlbkJyb3dzZXIoVVJJIHVyaSwgU3RyaW5nIGxpbmspIHsKKyAgICBTdHJpbmcgdXJsID0gcmVzb2x2ZVVybCh1cmksIGxpbmspOworICAgIFN5c3RlbS5lcnIuZm9ybWF0KCJPcGVuaW5nICVzIC4uLiIsIHVybCk7CisgICAgU3lzdGVtLmVyci5mbHVzaCgpOworICAgIHRyeSB7CisgICAgICBvcmcuaDIudG9vbHMuU2VydmVyLm9wZW5Ccm93c2VyKHVybCk7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk9LIik7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRkFJTEVEIik7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk9wZW4gR2Vycml0IHdpdGggYSBKYXZhU2NyaXB0IGNhcGFibGUgYnJvd3NlcjoiKTsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiICAiICsgdXJsKTsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9EYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvRGF0YWJhc2VDb25maWdJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzFlZDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvRGF0YWJhc2VDb25maWdJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKKworLyoqIEFic3RyYWN0aW9uIG9mIGluaXRpYWxpemVyIGZvciB0aGUgZGF0YWJhc2Ugc2VjdGlvbiAqLworaW50ZXJmYWNlIERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIgeworCisgIC8qKgorICAgKiBQZXJmb3JtcyBkYXRhYmFzZSBwbGF0Zm9ybSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHN0ZXBzIGFuZCB3cml0ZXMKKyAgICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gdGhlIGdpdmVuIGRhdGFiYXNlIHNlY3Rpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIGluaXRDb25maWcoU2VjdGlvbiBkYXRhYmFzZVNlY3Rpb24pOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0RhdGFiYXNlQ29uZmlnTW9kdWxlLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvRGF0YWJhc2VDb25maWdNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmY4YzJlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0RhdGFiYXNlQ29uZmlnTW9kdWxlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lczsKKworcHVibGljIGNsYXNzIERhdGFiYXNlQ29uZmlnTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworCisgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CisKKyAgcHVibGljIERhdGFiYXNlQ29uZmlnTW9kdWxlKGZpbmFsIFNpdGVQYXRocyBzaXRlKSB7CisgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChTaXRlUGF0aHMuY2xhc3MpLnRvSW5zdGFuY2Uoc2l0ZSk7CisgICAgYmluZChEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKAorICAgICAgICBOYW1lcy5uYW1lZCgiaDIiKSkudG8oSDJJbml0aWFsaXplci5jbGFzcyk7CisgICAgYmluZChEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKAorICAgICAgICBOYW1lcy5uYW1lZCgiamRiYyIpKS50byhKREJDSW5pdGlhbGl6ZXIuY2xhc3MpOworICAgIGJpbmQoRGF0YWJhc2VDb25maWdJbml0aWFsaXplci5jbGFzcykuYW5ub3RhdGVkV2l0aCgKKyAgICAgICAgTmFtZXMubmFtZWQoIm15c3FsIikpLnRvKE15U3FsSW5pdGlhbGl6ZXIuY2xhc3MpOworICAgIGJpbmQoRGF0YWJhc2VDb25maWdJbml0aWFsaXplci5jbGFzcykuYW5ub3RhdGVkV2l0aCgKKyAgICAgICAgTmFtZXMubmFtZWQoInBvc3RncmVzcWwiKSkudG8oUG9zdGdyZVNRTEluaXRpYWxpemVyLmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0gySW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9IMkluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhM2ZmMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9IMkluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitjbGFzcyBIMkluaXRpYWxpemVyIGltcGxlbWVudHMgRGF0YWJhc2VDb25maWdJbml0aWFsaXplciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZTsKKworICBASW5qZWN0CisgIEgySW5pdGlhbGl6ZXIoZmluYWwgU2l0ZVBhdGhzIHNpdGUpIHsKKyAgICB0aGlzLnNpdGUgPSBzaXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXRDb25maWcoU2VjdGlvbiBkYXRhYmFzZVNlY3Rpb24pIHsKKyAgICBTdHJpbmcgcGF0aCA9IGRhdGFiYXNlU2VjdGlvbi5nZXQoImRhdGFiYXNlIik7CisgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgcGF0aCA9ICJkYi9SZXZpZXdEQiI7CisgICAgICBkYXRhYmFzZVNlY3Rpb24uc2V0KCJkYXRhYmFzZSIsIHBhdGgpOworICAgIH0KKyAgICBGaWxlIGRiID0gc2l0ZS5yZXNvbHZlKHBhdGgpOworICAgIGlmIChkYiA9PSBudWxsKSB7CisgICAgICB0aHJvdyBJbml0VXRpbC5kaWUoImRhdGFiYXNlLmRhdGFiYXNlIG11c3QgYmUgc3VwcGxpZWQgZm9yIEgyIik7CisgICAgfQorICAgIGRiID0gZGIuZ2V0UGFyZW50RmlsZSgpOworICAgIGlmICghZGIuZXhpc3RzKCkgJiYgIWRiLm1rZGlycygpKSB7CisgICAgICB0aHJvdyBJbml0VXRpbC5kaWUoImNhbm5vdCBjcmVhdGUgZGF0YWJhc2UuZGF0YWJhc2UgIgorICAgICAgICAgICsgZGIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0QXV0aC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRBdXRoLmphdmEKaW5kZXggZmE0ZGMxNC4uMTUyNDcwNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRBdXRoLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRBdXRoLmphdmEKQEAgLTMyLDggKzMyLDggQEAKICAgQEluamVjdAogICBJbml0QXV0aChmaW5hbCBDb25zb2xlVUkgdWksIGZpbmFsIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9ucykgewogICAgIHRoaXMudWkgPSB1aTsKLSAgICB0aGlzLmF1dGggPSBzZWN0aW9ucy5nZXQoImF1dGgiKTsKLSAgICB0aGlzLmxkYXAgPSBzZWN0aW9ucy5nZXQoImxkYXAiKTsKKyAgICB0aGlzLmF1dGggPSBzZWN0aW9ucy5nZXQoImF1dGgiLCBudWxsKTsKKyAgICB0aGlzLmxkYXAgPSBzZWN0aW9ucy5nZXQoImxkYXAiLCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTU0LDYgKzU0LDE1IEBACiAgICAgICAgIGF1dGguc3RyaW5nKCJTU08gbG9nb3V0IFVSTCIsICJsb2dvdXRVcmwiLCBudWxsKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisKKyAgICAgIGNhc2UgQ0xJRU5UX1NTTF9DRVJUX0xEQVA6CisgICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046CisgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKKyAgICAgIGNhc2UgTERBUDoKKyAgICAgIGNhc2UgTERBUF9CSU5EOgorICAgICAgY2FzZSBPUEVOSUQ6CisgICAgICBjYXNlIE9QRU5JRF9TU086CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHN3aXRjaCAoYXV0aF90eXBlKSB7CkBAIC04MCw2ICs4OSwxNCBAQAogICAgICAgICBsZGFwLnN0cmluZygiR3JvdXAgQmFzZUROIiwgImdyb3VwQmFzZSIsIGFCYXNlKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisKKyAgICAgIGNhc2UgQ0xJRU5UX1NTTF9DRVJUX0xEQVA6CisgICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046CisgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKKyAgICAgIGNhc2UgSFRUUDoKKyAgICAgIGNhc2UgT1BFTklEOgorICAgICAgY2FzZSBPUEVOSURfU1NPOgorICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoYXV0aC5nZXRTZWN1cmUoInJlZ2lzdGVyRW1haWxQcml2YXRlS2V5IikgPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDYWNoZS5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDYWNoZS5qYXZhCmluZGV4IGZiMWE5MjQuLjJiNTcyOWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0Q2FjaGUuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENhY2hlLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAKICAgQEluamVjdAogICBJbml0Q2FjaGUoZmluYWwgU2l0ZVBhdGhzIHNpdGUsIGZpbmFsIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9ucykgewogICAgIHRoaXMuc2l0ZSA9IHNpdGU7Ci0gICAgdGhpcy5jYWNoZSA9IHNlY3Rpb25zLmdldCgiY2FjaGUiKTsKKyAgICB0aGlzLmNhY2hlID0gc2VjdGlvbnMuZ2V0KCJjYWNoZSIsIG51bGwpOwogICB9CiAKICAgcHVibGljIHZvaWQgcnVuKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDb250YWluZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0Q29udGFpbmVyLmphdmEKaW5kZXggNzA2M2Y1NC4uZmJkNTQzZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDb250YWluZXIuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENvbnRhaW5lci5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkxvY2tGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkxvY2tGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgIGZpbmFsIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9ucykgewogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLnNpdGUgPSBzaXRlOwotICAgIHRoaXMuY29udGFpbmVyID0gc2VjdGlvbnMuZ2V0KCJjb250YWluZXIiKTsKKyAgICB0aGlzLmNvbnRhaW5lciA9IHNlY3Rpb25zLmdldCgiY29udGFpbmVyIiwgbnVsbCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdERhdGFiYXNlLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdERhdGFiYXNlLmphdmEKaW5kZXggZDUwMWVhNS4uMDMzNmRkYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXREYXRhYmFzZS5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0RGF0YWJhc2UuamF2YQpAQCAtMTQsMTcgKzE0LDI2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuSW5pdFV0aWwuZGllOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC51c2VybmFtZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXIuVHlwZS5IMjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU3RhZ2UuUFJPRFVDVElPTjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuQ29uc29sZVVJOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZVByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIAogLyoqIEluaXRpYWxpemUgdGhlIHtAY29kZSBkYXRhYmFzZX0gY29uZmlndXJhdGlvbiBzZWN0aW9uLiAqLwogQFNpbmdsZXRvbgpAQCAtNDAsNjUgKzQ5LDM5IEBACiAgICAgdGhpcy51aSA9IHVpOwogICAgIHRoaXMuc2l0ZSA9IHNpdGU7CiAgICAgdGhpcy5saWJyYXJpZXMgPSBsaWJyYXJpZXM7Ci0gICAgdGhpcy5kYXRhYmFzZSA9IHNlY3Rpb25zLmdldCgiZGF0YWJhc2UiKTsKKyAgICB0aGlzLmRhdGFiYXNlID0gc2VjdGlvbnMuZ2V0KCJkYXRhYmFzZSIsIG51bGwpOwogICB9CiAKICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgIHVpLmhlYWRlcigiU1FMIERhdGFiYXNlIik7CiAKLSAgICBmaW5hbCBEYXRhU291cmNlUHJvdmlkZXIuVHlwZSBkYl90eXBlID0KLSAgICAgICAgZGF0YWJhc2Uuc2VsZWN0KCJEYXRhYmFzZSBzZXJ2ZXIgdHlwZSIsICJ0eXBlIiwgSDIpOworICAgIFNldDxTdHJpbmc+IGFsbG93ZWRWYWx1ZXMgPSBTZXRzLm5ld1RyZWVTZXQoKTsKKyAgICBJbmplY3RvciBpID0gR3VpY2UuY3JlYXRlSW5qZWN0b3IoUFJPRFVDVElPTiwgbmV3IERhdGFiYXNlQ29uZmlnTW9kdWxlKHNpdGUpKTsKKyAgICBMaXN0PEJpbmRpbmc8RGF0YWJhc2VDb25maWdJbml0aWFsaXplcj4+IGRiQ29uZmlnQmluZGluZ3MgPQorICAgICAgICBpLmZpbmRCaW5kaW5nc0J5VHlwZShuZXcgVHlwZUxpdGVyYWw8RGF0YWJhc2VDb25maWdJbml0aWFsaXplcj4oKSB7fSk7CisgICAgZm9yIChCaW5kaW5nPERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXI+IGJpbmRpbmcgOiBkYkNvbmZpZ0JpbmRpbmdzKSB7CisgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBiaW5kaW5nLmdldEtleSgpLmdldEFubm90YXRpb24oKTsKKyAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTmFtZWQpIHsKKyAgICAgICAgYWxsb3dlZFZhbHVlcy5hZGQoKChOYW1lZCkgYW5ub3RhdGlvbikudmFsdWUoKSk7CisgICAgICB9CisgICAgfQogCi0gICAgc3dpdGNoIChkYl90eXBlKSB7Ci0gICAgICBjYXNlIE1ZU1FMOgorICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGRhdGFiYXNlLmdldCgidXJsIikpCisgICAgICAgICYmIFN0cmluZ3MuaXNOdWxsT3JFbXB0eShkYXRhYmFzZS5nZXQoInR5cGUiKSkpIHsKKyAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsICJqZGJjIik7CisgICAgfQorCisgICAgU3RyaW5nIGRiVHlwZSA9CisgICAgICAgIGRhdGFiYXNlLnNlbGVjdCgiRGF0YWJhc2Ugc2VydmVyIHR5cGUiLCAidHlwZSIsICJoMiIsIGFsbG93ZWRWYWx1ZXMpOworCisgICAgRGF0YWJhc2VDb25maWdJbml0aWFsaXplciBkY2kgPQorICAgICAgICBpLmdldEluc3RhbmNlKEtleS5nZXQoRGF0YWJhc2VDb25maWdJbml0aWFsaXplci5jbGFzcywKKyAgICAgICAgICAgIE5hbWVzLm5hbWVkKGRiVHlwZS50b0xvd2VyQ2FzZSgpKSkpOworCisgICAgaWYgKGRjaSBpbnN0YW5jZW9mIE15U3FsSW5pdGlhbGl6ZXIpIHsKICAgICAgICAgbGlicmFyaWVzLm15c3FsRHJpdmVyLmRvd25sb2FkUmVxdWlyZWQoKTsKLSAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZmluYWwgYm9vbGVhbiB1c2VyUGFzc0F1dGg7Ci0gICAgc3dpdGNoIChkYl90eXBlKSB7Ci0gICAgICBjYXNlIEgyOiB7Ci0gICAgICAgIHVzZXJQYXNzQXV0aCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGRhdGFiYXNlLmdldCgiZGF0YWJhc2UiKTsKLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgIHBhdGggPSAiZGIvUmV2aWV3REIiOwotICAgICAgICAgIGRhdGFiYXNlLnNldCgiZGF0YWJhc2UiLCBwYXRoKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIGRiID0gc2l0ZS5yZXNvbHZlKHBhdGgpOwotICAgICAgICBpZiAoZGIgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IGRpZSgiZGF0YWJhc2UuZGF0YWJhc2UgbXVzdCBiZSBzdXBwbGllZCBmb3IgSDIiKTsKLSAgICAgICAgfQotICAgICAgICBkYiA9IGRiLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgaWYgKCFkYi5leGlzdHMoKSAmJiAhZGIubWtkaXJzKCkpIHsKLSAgICAgICAgICB0aHJvdyBkaWUoImNhbm5vdCBjcmVhdGUgZGF0YWJhc2UuZGF0YWJhc2UgIiArIGRiLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBKREJDOiB7Ci0gICAgICAgIHVzZXJQYXNzQXV0aCA9IHRydWU7Ci0gICAgICAgIGRhdGFiYXNlLnN0cmluZygiRHJpdmVyIGNsYXNzIG5hbWUiLCAiZHJpdmVyIiwgbnVsbCk7Ci0gICAgICAgIGRhdGFiYXNlLnN0cmluZygiVVJMIiwgInVybCIsIG51bGwpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBQT1NUR1JFU1FMOgotICAgICAgY2FzZSBNWVNRTDogewotICAgICAgICB1c2VyUGFzc0F1dGggPSB0cnVlOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVmUG9ydCA9ICIoIiArIGRiX3R5cGUudG9TdHJpbmcoKSArICIgZGVmYXVsdCkiOwotICAgICAgICBkYXRhYmFzZS5zdHJpbmcoIlNlcnZlciBob3N0bmFtZSIsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiKTsKLSAgICAgICAgZGF0YWJhc2Uuc3RyaW5nKCJTZXJ2ZXIgcG9ydCIsICJwb3J0IiwgZGVmUG9ydCwgdHJ1ZSk7Ci0gICAgICAgIGRhdGFiYXNlLnN0cmluZygiRGF0YWJhc2UgbmFtZSIsICJkYXRhYmFzZSIsICJyZXZpZXdkYiIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgZGllKCJpbnRlcm5hbCBidWcsIGRhdGFiYXNlICIgKyBkYl90eXBlICsgIiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgfQotCi0gICAgaWYgKHVzZXJQYXNzQXV0aCkgewotICAgICAgZGF0YWJhc2Uuc3RyaW5nKCJEYXRhYmFzZSB1c2VybmFtZSIsICJ1c2VybmFtZSIsIHVzZXJuYW1lKCkpOwotICAgICAgZGF0YWJhc2UucGFzc3dvcmQoInVzZXJuYW1lIiwgInBhc3N3b3JkIik7Ci0gICAgfQorICAgIGRjaS5pbml0Q29uZmlnKGRhdGFiYXNlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRHaXRNYW5hZ2VyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEdpdE1hbmFnZXIuamF2YQppbmRleCBmMGNkMzFmLi5iNmY4NTE5IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEdpdE1hbmFnZXIuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEdpdE1hbmFnZXIuamF2YQpAQCAtMzEsNyArMzEsNyBAQAogICBASW5qZWN0CiAgIEluaXRHaXRNYW5hZ2VyKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2VjdGlvbi5GYWN0b3J5IHNlY3Rpb25zKSB7CiAgICAgdGhpcy51aSA9IHVpOwotICAgIHRoaXMuZ2Vycml0ID0gc2VjdGlvbnMuZ2V0KCJnZXJyaXQiKTsKKyAgICB0aGlzLmdlcnJpdCA9IHNlY3Rpb25zLmdldCgiZ2Vycml0IiwgbnVsbCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBydW4oKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEh0dHBkLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEh0dHBkLmphdmEKaW5kZXggOThkMmU0Ny4uM2U3OTAxYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRIdHRwZC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0SHR0cGQuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC50b1VSSTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkNvbnNvbGVVSTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuU2lnbmVkVG9rZW47CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNDgsOCArNDYsOCBAQAogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLnNpdGUgPSBzaXRlOwogICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKLSAgICB0aGlzLmh0dHBkID0gc2VjdGlvbnMuZ2V0KCJodHRwZCIpOwotICAgIHRoaXMuZ2Vycml0ID0gc2VjdGlvbnMuZ2V0KCJnZXJyaXQiKTsKKyAgICB0aGlzLmh0dHBkID0gc2VjdGlvbnMuZ2V0KCJodHRwZCIsIG51bGwpOworICAgIHRoaXMuZ2Vycml0ID0gc2VjdGlvbnMuZ2V0KCJnZXJyaXQiLCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewpAQCAtMTIxLDEyICsxMTksNyBAQAogICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBkaWUoImludmFsaWQgaHR0cGQubGlzdGVuVXJsIik7CiAgICAgfQotICAgIGlmIChnZXJyaXQuZ2V0KCJjYW5vbmljYWxXZWJVcmwiKSAhPSBudWxsIC8vCi0gICAgICAgIHx8ICghcHJveHkgJiYgc3NsKSAvLwotICAgICAgICB8fCBnZXRBdXRoVHlwZSgpID09IEF1dGhUeXBlLk9QRU5JRCkgewotICAgICAgZ2Vycml0LnN0cmluZygiQ2Fub25pY2FsIFVSTCIsICJjYW5vbmljYWxXZWJVcmwiLCB1cmkudG9TdHJpbmcoKSk7Ci0gICAgfQotCisgICAgZ2Vycml0LnN0cmluZygiQ2Fub25pY2FsIFVSTCIsICJjYW5vbmljYWxXZWJVcmwiLCB1cmkudG9TdHJpbmcoKSk7CiAgICAgZ2VuZXJhdGVTc2xDZXJ0aWZpY2F0ZSgpOwogICB9CiAKQEAgLTE5Niw4ICsxODksNCBAQAogICAgICAgdGhyb3cgZGllKCJDYW5ub3QgZGVsZXRlICIgKyB0bXBkaXIpOwogICAgIH0KICAgfQotCi0gIHByaXZhdGUgQXV0aFR5cGUgZ2V0QXV0aFR5cGUoKSB7Ci0gICAgcmV0dXJuIENvbmZpZ1V0aWwuZ2V0RW51bShmbGFncy5jZmcsICJhdXRoIiwgbnVsbCwgInR5cGUiLCBBdXRoVHlwZS5PUEVOSUQpOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFBsdWdpblN0ZXBzTG9hZGVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFBsdWdpblN0ZXBzTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ODcwMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0UGx1Z2luU3RlcHNMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5QbHVnaW5OYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkNvbnNvbGVVSTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgSW5pdFBsdWdpblN0ZXBzTG9hZGVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBGaWxlIHBsdWdpbnNEaXI7CisgIHByaXZhdGUgZmluYWwgSW5qZWN0b3IgaW5pdEluamVjdG9yOworICBmaW5hbCBDb25zb2xlVUkgdWk7CisKKyAgQEluamVjdAorICBwdWJsaWMgSW5pdFBsdWdpblN0ZXBzTG9hZGVyKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2l0ZVBhdGhzIHNpdGVQYXRocywKKyAgICAgIGZpbmFsIEluamVjdG9yIGluaXRJbmplY3RvcikgeworICAgIHRoaXMucGx1Z2luc0RpciA9IHNpdGVQYXRocy5wbHVnaW5zX2RpcjsKKyAgICB0aGlzLmluaXRJbmplY3RvciA9IGluaXRJbmplY3RvcjsKKyAgICB0aGlzLnVpID0gdWk7CisgIH0KKworICBwdWJsaWMgQ29sbGVjdGlvbjxJbml0U3RlcD4gZ2V0SW5pdFN0ZXBzKCkgeworICAgIExpc3Q8RmlsZT4gamFycyA9IHNjYW5KYXJzSW5QbHVnaW5zRGlyZWN0b3J5KCk7CisgICAgQXJyYXlMaXN0PEluaXRTdGVwPiBwbHVnaW5zSW5pdFN0ZXBzID0gbmV3IEFycmF5TGlzdDxJbml0U3RlcD4oKTsKKworICAgIGZvciAoRmlsZSBqYXIgOiBqYXJzKSB7CisgICAgICBJbml0U3RlcCBpbml0ID0gbG9hZEluaXRTdGVwKGphcik7CisgICAgICBpZiAoaW5pdCAhPSBudWxsKSB7CisgICAgICAgIHBsdWdpbnNJbml0U3RlcHMuYWRkKGluaXQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGx1Z2luc0luaXRTdGVwczsKKyAgfQorCisgIHByaXZhdGUgSW5pdFN0ZXAgbG9hZEluaXRTdGVwKEZpbGUgamFyKSB7CisgICAgdHJ5IHsKKyAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9CisgICAgICAgICAgbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7amFyLnRvVVJJKCkudG9VUkwoKX0sCisgICAgICAgICAgICAgIEluaXRQbHVnaW5TdGVwc0xvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgIEphckZpbGUgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGphcik7CisgICAgICBBdHRyaWJ1dGVzIGphckZpbGVBdHRyaWJ1dGVzID0gamFyRmlsZS5nZXRNYW5pZmVzdCgpLmdldE1haW5BdHRyaWJ1dGVzKCk7CisgICAgICBTdHJpbmcgaW5pdENsYXNzTmFtZSA9IGphckZpbGVBdHRyaWJ1dGVzLmdldFZhbHVlKCJHZXJyaXQtSW5pdFN0ZXAiKTsKKyAgICAgIGlmIChpbml0Q2xhc3NOYW1lID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIENsYXNzPD8gZXh0ZW5kcyBJbml0U3RlcD4gaW5pdFN0ZXBDbGFzcyA9CisgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBJbml0U3RlcD4pIHBsdWdpbkxvYWRlci5sb2FkQ2xhc3MoaW5pdENsYXNzTmFtZSk7CisgICAgICByZXR1cm4gZ2V0UGx1Z2luSW5qZWN0b3IoamFyKS5nZXRJbnN0YW5jZShpbml0U3RlcENsYXNzKTsKKyAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgdWkubWVzc2FnZSgKKyAgICAgICAgICAiV0FSTjogSW5pdFN0ZXAgZnJvbSBwbHVnaW4gJXMgZG9lcyBub3QgaW1wbGVtZW50ICVzIChFeGNlcHRpb246ICVzKSIsCisgICAgICAgICAgamFyLmdldE5hbWUoKSwgSW5pdFN0ZXAuY2xhc3MuZ2V0TmFtZSgpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdWkubWVzc2FnZSgKKyAgICAgICAgICAiV0FSTjogQ2Fubm90IGxvYWQgYW5kIGdldCBwbHVnaW4gaW5pdCBzdGVwIGZvciAlcyAoRXhjZXB0aW9uOiAlcykiLAorICAgICAgICAgIGphciwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBJbmplY3RvciBnZXRQbHVnaW5JbmplY3RvcihGaWxlIGphckZpbGUpIHsKKyAgICBTdHJpbmcgamFyRmlsZU5hbWUgPSBqYXJGaWxlLmdldE5hbWUoKTsKKyAgICBmaW5hbCBTdHJpbmcgcGx1Z2luTmFtZSA9CisgICAgICAgIGphckZpbGVOYW1lLnN1YnN0cmluZygwLCBqYXJGaWxlTmFtZS5sYXN0SW5kZXhPZignLicpKTsKKyAgICByZXR1cm4gaW5pdEluamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobmV3IEFic3RyYWN0TW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoU3RyaW5nLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKFBsdWdpbk5hbWUuY2xhc3MpLnRvSW5zdGFuY2UoCisgICAgICAgICAgICBwbHVnaW5OYW1lKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxGaWxlPiBzY2FuSmFyc0luUGx1Z2luc0RpcmVjdG9yeSgpIHsKKyAgICBpZiAocGx1Z2luc0RpciA9PSBudWxsIHx8ICFwbHVnaW5zRGlyLmV4aXN0cygpKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorICAgIEZpbGVbXSBtYXRjaGVzID0gcGx1Z2luc0Rpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7CisgICAgICAgIFN0cmluZyBuID0gcGF0aG5hbWUuZ2V0TmFtZSgpOworICAgICAgICByZXR1cm4gKG4uZW5kc1dpdGgoIi5qYXIiKSAmJiBwYXRobmFtZS5pc0ZpbGUoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkgeworICAgICAgdWkubWVzc2FnZSgiV0FSTjogQ2Fubm90IGxpc3QgJXMiLCBwbHVnaW5zRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgICAgQXJyYXlzLnNvcnQobWF0Y2hlcywgbmV3IENvbXBhcmF0b3I8RmlsZT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShGaWxlIG8xLCBGaWxlIG8yKSB7CisgICAgICAgIHJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobWF0Y2hlcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0UGx1Z2lucy5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRQbHVnaW5zLmphdmEKaW5kZXggMTU1ZmU0Yy4uYjgyZGY2NCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRQbHVnaW5zLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRQbHVnaW5zLmphdmEKQEAgLTM5LDE3ICszOSwyNCBAQAogCiAgIHByaXZhdGUgZmluYWwgQ29uc29sZVVJIHVpOwogICBwcml2YXRlIGZpbmFsIFNpdGVQYXRocyBzaXRlOworICBwcml2YXRlIEluaXRQbHVnaW5TdGVwc0xvYWRlciBwbHVnaW5Mb2FkZXI7CiAKICAgQEluamVjdAotICBJbml0UGx1Z2lucyhmaW5hbCBDb25zb2xlVUkgdWksIGZpbmFsIFNpdGVQYXRocyBzaXRlKSB7CisgIEluaXRQbHVnaW5zKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2l0ZVBhdGhzIHNpdGUsIEluaXRQbHVnaW5TdGVwc0xvYWRlciBwbHVnaW5Mb2FkZXIpIHsKICAgICB0aGlzLnVpID0gdWk7CiAgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgICB0aGlzLnBsdWdpbkxvYWRlciA9IHBsdWdpbkxvYWRlcjsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICB1aS5oZWFkZXIoIlBsdWdpbnMiKTsKIAorICAgIGluc3RhbGxQbHVnaW5zKCk7CisgICAgaW5pdFBsdWdpbnMoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbnN0YWxsUGx1Z2lucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgRmlsZSBteVdhcjsKICAgICB0cnkgewogICAgICAgbXlXYXIgPSBHZXJyaXRMYXVuY2hlci5nZXREaXN0cmlidXRpb25BcmNoaXZlKCk7CkBAIC0xMjcsNiArMTM0LDEyIEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGluaXRQbHVnaW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZm9yIChJbml0U3RlcCBpbml0U3RlcCA6IHBsdWdpbkxvYWRlci5nZXRJbml0U3RlcHMoKSkgeworICAgICAgaW5pdFN0ZXAucnVuKCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb24oZmluYWwgRmlsZSBwbHVnaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUocGx1Z2luKTsKICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTZW5kRW1haWwuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0U2VuZEVtYWlsLmphdmEKaW5kZXggYzU3MzJlOS4uZTRiODI3ZDEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0U2VuZEVtYWlsLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTZW5kRW1haWwuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogICBJbml0U2VuZEVtYWlsKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2l0ZVBhdGhzIHNpdGUsCiAgICAgICBmaW5hbCBTZWN0aW9uLkZhY3Rvcnkgc2VjdGlvbnMpIHsKICAgICB0aGlzLnVpID0gdWk7Ci0gICAgdGhpcy5zZW5kZW1haWwgPSBzZWN0aW9ucy5nZXQoInNlbmRlbWFpbCIpOworICAgIHRoaXMuc2VuZGVtYWlsID0gc2VjdGlvbnMuZ2V0KCJzZW5kZW1haWwiLCBudWxsKTsKICAgICB0aGlzLnNpdGUgPSBzaXRlOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0U3NoZC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTc2hkLmphdmEKaW5kZXggYmZjMGVhZi4uMGMyYTNjNiAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTc2hkLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTc2hkLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB0aGlzLnVpID0gdWk7CiAgICAgdGhpcy5zaXRlID0gc2l0ZTsKICAgICB0aGlzLmxpYnJhcmllcyA9IGxpYnJhcmllczsKLSAgICB0aGlzLnNzaGQgPSBzZWN0aW9ucy5nZXQoInNzaGQiKTsKKyAgICB0aGlzLnNzaGQgPSBzZWN0aW9ucy5nZXQoInNzaGQiLCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRVdGlsLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFV0aWwuamF2YQppbmRleCAxMzgyZjY1Li4wYWQ3NTYwIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFV0aWwuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFV0aWwuamF2YQpAQCAtMTYsOSArMTYsOSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuRGllOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVCYXNlZENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSkRCQ0luaXRpYWxpemVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSkRCQ0luaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwMzRjMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9KREJDSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuSW5pdFV0aWwudXNlcm5hbWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKK2NsYXNzIEpEQkNJbml0aWFsaXplciBpbXBsZW1lbnRzIERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdENvbmZpZyhTZWN0aW9uIGRhdGFiYXNlKSB7CisgICAgYm9vbGVhbiBoYXNVcmwgPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGRhdGFiYXNlLmdldCgidXJsIikpICE9IG51bGw7CisgICAgZGF0YWJhc2Uuc3RyaW5nKCJVUkwiLCAidXJsIiwgbnVsbCk7CisgICAgZ3Vlc3NEcml2ZXIoZGF0YWJhc2UpOworICAgIGRhdGFiYXNlLnN0cmluZygiRHJpdmVyIGNsYXNzIG5hbWUiLCAiZHJpdmVyIiwgbnVsbCk7CisgICAgZGF0YWJhc2Uuc3RyaW5nKCJEYXRhYmFzZSB1c2VybmFtZSIsICJ1c2VybmFtZSIsIGhhc1VybCA/IG51bGwgOiB1c2VybmFtZSgpKTsKKyAgICBkYXRhYmFzZS5wYXNzd29yZCgidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBndWVzc0RyaXZlcihTZWN0aW9uIGRhdGFiYXNlKSB7CisgICAgU3RyaW5nIHVybCA9IFN0cmluZ3MuZW1wdHlUb051bGwoZGF0YWJhc2UuZ2V0KCJ1cmwiKSk7CisgICAgaWYgKHVybCAhPSBudWxsICYmIFN0cmluZ3MuaXNOdWxsT3JFbXB0eShkYXRhYmFzZS5nZXQoImRyaXZlciIpKSkgeworICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOmgyOiIpKSB7CisgICAgICAgIGRhdGFiYXNlLnNldCgiZHJpdmVyIiwgIm9yZy5oMi5Ecml2ZXIiKTsKKyAgICAgIH0gZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6bXlzcWw6IikpIHsKKyAgICAgICAgZGF0YWJhc2Uuc2V0KCJkcml2ZXIiLCAiY29tLm15c3FsLmpkYmMuRHJpdmVyIik7CisgICAgICB9IGVsc2UgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOnBvc3RncmVzcWw6IikpIHsKKyAgICAgICAgZGF0YWJhc2Uuc2V0KCJkcml2ZXIiLCAib3JnLnBvc3RncmVzcWwuRHJpdmVyIik7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzLmphdmEKaW5kZXggZmYxZWRkZi4uYjFmYTBjMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcmllcy5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXMuamF2YQpAQCAtNzgsNiArNzgsNyBAQAogICAgIGRsLnNldE5hbWUoZ2V0KGNmZywgbiwgIm5hbWUiKSk7CiAgICAgZGwuc2V0SmFyVXJsKGdldChjZmcsIG4sICJ1cmwiKSk7CiAgICAgZGwuc2V0U0hBMShnZXQoY2ZnLCBuLCAic2hhMSIpKTsKKyAgICBkbC5zZXRSZW1vdmUoZ2V0KGNmZywgbiwgInJlbW92ZSIpKTsKICAgICBmaWVsZC5zZXQodGhpcywgZGwpOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJ5RG93bmxvYWRlci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcnlEb3dubG9hZGVyLmphdmEKaW5kZXggZWExYjUxNS4uYmYzNThmNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcnlEb3dubG9hZGVyLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcnlEb3dubG9hZGVyLmphdmEKQEAgLTE0LDggKzE0LDEwIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuQ29uc29sZVVJOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkRpZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Jb1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0yNiw2ICsyOCw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtNDAsMjAgKzQzLDE4IEBACiBjbGFzcyBMaWJyYXJ5RG93bmxvYWRlciB7CiAgIHByaXZhdGUgZmluYWwgQ29uc29sZVVJIHVpOwogICBwcml2YXRlIGZpbmFsIEZpbGUgbGliX2RpcjsKLSAgcHJpdmF0ZSBmaW5hbCBSZWxvYWRTaXRlTGlicmFyeSByZWxvYWQ7CiAKICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkOwogICBwcml2YXRlIFN0cmluZyBuYW1lOwogICBwcml2YXRlIFN0cmluZyBqYXJVcmw7CiAgIHByaXZhdGUgU3RyaW5nIHNoYTE7CisgIHByaXZhdGUgU3RyaW5nIHJlbW92ZTsKICAgcHJpdmF0ZSBGaWxlIGRzdDsKIAogICBASW5qZWN0Ci0gIExpYnJhcnlEb3dubG9hZGVyKGZpbmFsIFJlbG9hZFNpdGVMaWJyYXJ5IHJlbG9hZCwgZmluYWwgQ29uc29sZVVJIHVpLAotICAgICAgZmluYWwgU2l0ZVBhdGhzIHNpdGUpIHsKKyAgTGlicmFyeURvd25sb2FkZXIoQ29uc29sZVVJIHVpLCBTaXRlUGF0aHMgc2l0ZSkgewogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLmxpYl9kaXIgPSBzaXRlLmxpYl9kaXI7Ci0gICAgdGhpcy5yZWxvYWQgPSByZWxvYWQ7CiAgIH0KIAogICB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKQEAgLTY4LDYgKzY5LDEwIEBACiAgICAgdGhpcy5zaGExID0gc2hhMTsKICAgfQogCisgIHZvaWQgc2V0UmVtb3ZlKFN0cmluZyByZW1vdmUpIHsKKyAgICB0aGlzLnJlbW92ZSA9IHJlbW92ZTsKKyAgfQorCiAgIHZvaWQgZG93bmxvYWRSZXF1aXJlZCgpIHsKICAgICB0aGlzLnJlcXVpcmVkID0gdHJ1ZTsKICAgICBkb3dubG9hZCgpOwpAQCAtMTIzLDYgKzEyOCw3IEBACiAgICAgfQogCiAgICAgdHJ5IHsKKyAgICAgIHJlbW92ZVN0YWxlVmVyc2lvbnMoKTsKICAgICAgIGRvR2V0QnlIdHRwKCk7CiAgICAgICB2ZXJpZnlGaWxlQ2hlY2tzdW0oKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKQEAgLTE1NSw3ICsxNjEsMjkgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICByZWxvYWQucmVsb2FkKCk7CisgICAgaWYgKGRzdC5leGlzdHMoKSkgeworICAgICAgSW9VdGlsLmxvYWRKQVJzKGRzdCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YWxlVmVyc2lvbnMoKSB7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkocmVtb3ZlKSkgeworICAgICAgU3RyaW5nW10gbmFtZXMgPSBsaWJfZGlyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgIHJldHVybiBuYW1lLm1hdGNoZXMoIl4iICsgcmVtb3ZlICsgIiQiKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBpZiAobmFtZXMgIT0gbnVsbCkgeworICAgICAgICBmb3IgKFN0cmluZyBvbGQgOiBuYW1lcykgeworICAgICAgICAgIFN0cmluZyBiYWsgPSAiLiIgKyBvbGQgKyAiLmJhY2t1cCI7CisgICAgICAgICAgdWkubWVzc2FnZSgiUmVuYW1pbmcgJXMgdG8gJXMiLCBvbGQsIGJhayk7CisgICAgICAgICAgaWYgKCFuZXcgRmlsZShsaWJfZGlyLCBvbGQpLnJlbmFtZVRvKG5ldyBGaWxlKGxpYl9kaXIsIGJhaykpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRGllKCJjYW5ub3QgcmVuYW1lICIgKyBvbGQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCBkb0dldEJ5SHR0cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTXlTcWxJbml0aWFsaXplci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L015U3FsSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZhNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L015U3FsSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuSW5pdFV0aWwudXNlcm5hbWU7CisKK2NsYXNzIE15U3FsSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdENvbmZpZyhTZWN0aW9uIGRhdGFiYXNlU2VjdGlvbikgeworICAgIGZpbmFsIFN0cmluZyBkZWZQb3J0ID0gIihteXNxbCBkZWZhdWx0KSI7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiU2VydmVyIGhvc3RuYW1lIiwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOworICAgIGRhdGFiYXNlU2VjdGlvbi5zdHJpbmcoIlNlcnZlciBwb3J0IiwgInBvcnQiLCBkZWZQb3J0LCB0cnVlKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJEYXRhYmFzZSBuYW1lIiwgImRhdGFiYXNlIiwgInJldmlld2RiIik7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiRGF0YWJhc2UgdXNlcm5hbWUiLCAidXNlcm5hbWUiLCB1c2VybmFtZSgpKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24ucGFzc3dvcmQoInVzZXJuYW1lIiwgInBhc3N3b3JkIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Qb3N0Z3JlU1FMSW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Qb3N0Z3JlU1FMSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI1NjYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1Bvc3RncmVTUUxJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC51c2VybmFtZTsKKworY2xhc3MgUG9zdGdyZVNRTEluaXRpYWxpemVyIGltcGxlbWVudHMgRGF0YWJhc2VDb25maWdJbml0aWFsaXplciB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGluaXRDb25maWcoU2VjdGlvbiBkYXRhYmFzZVNlY3Rpb24pIHsKKyAgICBmaW5hbCBTdHJpbmcgZGVmUG9ydCA9ICIocG9zdGdyZXNxbCBkZWZhdWx0KSI7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiU2VydmVyIGhvc3RuYW1lIiwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOworICAgIGRhdGFiYXNlU2VjdGlvbi5zdHJpbmcoIlNlcnZlciBwb3J0IiwgInBvcnQiLCBkZWZQb3J0LCB0cnVlKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJEYXRhYmFzZSBuYW1lIiwgImRhdGFiYXNlIiwgInJldmlld2RiIik7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiRGF0YWJhc2UgdXNlcm5hbWUiLCAidXNlcm5hbWUiLCB1c2VybmFtZSgpKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24ucGFzc3dvcmQoInVzZXJuYW1lIiwgInBhc3N3b3JkIik7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvUmVsb2FkU2l0ZUxpYnJhcnkuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9SZWxvYWRTaXRlTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFkM2MwLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9SZWxvYWRTaXRlTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OwotCi0vKiogUmVxdWVzdHMgdGhlIHNpdGUncyB7QGNvZGUgbGliL30gZGlyZWN0b3J5IGJlIHNjYW5uZWQgYWdhaW4uICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbG9hZFNpdGVMaWJyYXJ5IHsKLSAgcHVibGljIHZvaWQgcmVsb2FkKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2VjdGlvbi5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1NlY3Rpb24uamF2YQppbmRleCAwMmVkOTkxLi4zODdiOTNhIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2VjdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TZWN0aW9uLmphdmEKQEAgLTIzLDUzICsyMyw2MCBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIC8qKiBIZWxwZXIgdG8gZWRpdCBhIHNlY3Rpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMuICovCi1jbGFzcyBTZWN0aW9uIHsKLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFNlY3Rpb24gZ2V0KFN0cmluZyBuYW1lKTsKK3B1YmxpYyBjbGFzcyBTZWN0aW9uIHsKKyAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBTZWN0aW9uIGdldChAQXNzaXN0ZWQoInNlY3Rpb24iKSBTdHJpbmcgc2VjdGlvbiwKKyAgICAgICAgQEFzc2lzdGVkKCJzdWJzZWN0aW9uIikgU3RyaW5nIHN1YnNlY3Rpb24pOwogICB9CiAKICAgcHJpdmF0ZSBmaW5hbCBJbml0RmxhZ3MgZmxhZ3M7CiAgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CiAgIHByaXZhdGUgZmluYWwgQ29uc29sZVVJIHVpOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZWN0aW9uOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdWJzZWN0aW9uOwogCiAgIEBJbmplY3QKLSAgU2VjdGlvbihmaW5hbCBJbml0RmxhZ3MgZmxhZ3MsIGZpbmFsIFNpdGVQYXRocyBzaXRlLCBmaW5hbCBDb25zb2xlVUkgdWksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgU3RyaW5nIHNlY3Rpb24pIHsKKyAgcHVibGljIFNlY3Rpb24oZmluYWwgSW5pdEZsYWdzIGZsYWdzLCBmaW5hbCBTaXRlUGF0aHMgc2l0ZSwKKyAgICAgIGZpbmFsIENvbnNvbGVVSSB1aSwgQEFzc2lzdGVkKCJzZWN0aW9uIikgZmluYWwgU3RyaW5nIHNlY3Rpb24sCisgICAgICBAQXNzaXN0ZWQoInN1YnNlY3Rpb24iKSBATnVsbGFibGUgZmluYWwgU3RyaW5nIHN1YnNlY3Rpb24pIHsKICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CiAgICAgdGhpcy5zaXRlID0gc2l0ZTsKICAgICB0aGlzLnVpID0gdWk7CiAgICAgdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKKyAgICB0aGlzLnN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uOwogICB9CiAKICAgU3RyaW5nIGdldChTdHJpbmcgbmFtZSkgewogICAgIHJldHVybiBmbGFncy5jZmcuZ2V0U3RyaW5nKHNlY3Rpb24sIG51bGwsIG5hbWUpOwogICB9CiAKLSAgdm9pZCBzZXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewogICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IGFsbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGFsbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmbGFncy5jZmcuZ2V0U3RyaW5nTGlzdChzZWN0aW9uLCBudWxsLCBuYW1lKSkpOworICAgIGFsbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmbGFncy5jZmcuZ2V0U3RyaW5nTGlzdChzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lKSkpOwogCiAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgIGlmIChhbGwuc2l6ZSgpID09IDAgfHwgYWxsLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIGZsYWdzLmNmZy5zZXRTdHJpbmcoc2VjdGlvbiwgbnVsbCwgbmFtZSwgdmFsdWUpOworICAgICAgICBmbGFncy5jZmcuc2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIHZhbHVlKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGFsbC5zZXQoMCwgdmFsdWUpOwotICAgICAgICBmbGFncy5jZmcuc2V0U3RyaW5nTGlzdChzZWN0aW9uLCBudWxsLCBuYW1lLCBhbGwpOworICAgICAgICBmbGFncy5jZmcuc2V0U3RyaW5nTGlzdChzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLCBhbGwpOwogICAgICAgfQogCiAgICAgfSBlbHNlIGlmIChhbGwuc2l6ZSgpID09IDApIHsKICAgICB9IGVsc2UgaWYgKGFsbC5zaXplKCkgPT0gMSkgewotICAgICAgZmxhZ3MuY2ZnLnVuc2V0KHNlY3Rpb24sIG51bGwsIG5hbWUpOworICAgICAgZmxhZ3MuY2ZnLnVuc2V0KHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOwogICAgIH0gZWxzZSB7CiAgICAgICBhbGwucmVtb3ZlKDApOwotICAgICAgZmxhZ3MuY2ZnLnNldFN0cmluZ0xpc3Qoc2VjdGlvbiwgbnVsbCwgbmFtZSwgYWxsKTsKKyAgICAgIGZsYWdzLmNmZy5zZXRTdHJpbmdMaXN0KHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIGFsbCk7CiAgICAgfQogICB9CiAKLSAgPFQgZXh0ZW5kcyBFbnVtPD8+PiB2b2lkIHNldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVCB2YWx1ZSkgeworICBwdWJsaWMgPFQgZXh0ZW5kcyBFbnVtPD8+PiB2b2lkIHNldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVCB2YWx1ZSkgewogICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICBzZXQobmFtZSwgdmFsdWUubmFtZSgpKTsKICAgICB9IGVsc2UgewpAQCAtNzcsMTUgKzg0LDE1IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB1bnNldChTdHJpbmcgbmFtZSkgeworICBwdWJsaWMgdm9pZCB1bnNldChTdHJpbmcgbmFtZSkgewogICAgIHNldChuYW1lLCAoU3RyaW5nKSBudWxsKTsKICAgfQogCi0gIFN0cmluZyBzdHJpbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGR2KSB7CisgIHB1YmxpYyBTdHJpbmcgc3RyaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkdikgewogICAgIHJldHVybiBzdHJpbmcodGl0bGUsIG5hbWUsIGR2LCBmYWxzZSk7CiAgIH0KIAotICBTdHJpbmcgc3RyaW5nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkdiwKKyAgcHVibGljIFN0cmluZyBzdHJpbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGR2LAogICAgICAgZmluYWwgYm9vbGVhbiBudWxsSWZEZWZhdWx0KSB7CiAgICAgZmluYWwgU3RyaW5nIG92ID0gZ2V0KG5hbWUpOwogICAgIFN0cmluZyBudiA9IHVpLnJlYWRTdHJpbmcob3YgIT0gbnVsbCA/IG92IDogZHYsICIlcyIsIHRpdGxlKTsKQEAgLTk4LDE5ICsxMDUsMTkgQEAKICAgICByZXR1cm4gbnY7CiAgIH0KIAotICBGaWxlIHBhdGgoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlZlZhbHVlKSB7CisgIHB1YmxpYyBGaWxlIHBhdGgoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlZlZhbHVlKSB7CiAgICAgcmV0dXJuIHNpdGUucmVzb2x2ZShzdHJpbmcodGl0bGUsIG5hbWUsIGRlZlZhbHVlKSk7CiAgIH0KIAotICA8VCBleHRlbmRzIEVudW08Pz4+IFQgc2VsZWN0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUsCisgIHB1YmxpYyA8VCBleHRlbmRzIEVudW08Pz4+IFQgc2VsZWN0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUsCiAgICAgICBmaW5hbCBUIGRlZlZhbHVlKSB7CiAgICAgcmV0dXJuIHNlbGVjdCh0aXRsZSwgbmFtZSwgZGVmVmFsdWUsIGZhbHNlKTsKICAgfQogCi0gIDxUIGV4dGVuZHMgRW51bTw/Pj4gVCBzZWxlY3QoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgcHVibGljIDxUIGV4dGVuZHMgRW51bTw/Pj4gVCBzZWxlY3QoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwKICAgICAgIGZpbmFsIFQgZGVmVmFsdWUsIGZpbmFsIGJvb2xlYW4gbnVsbElmRGVmYXVsdCkgewogICAgIGZpbmFsIGJvb2xlYW4gc2V0ID0gZ2V0KG5hbWUpICE9IG51bGw7Ci0gICAgVCBvbGRWYWx1ZSA9IENvbmZpZ1V0aWwuZ2V0RW51bShmbGFncy5jZmcsIHNlY3Rpb24sIG51bGwsIG5hbWUsIGRlZlZhbHVlKTsKKyAgICBUIG9sZFZhbHVlID0gQ29uZmlnVXRpbC5nZXRFbnVtKGZsYWdzLmNmZywgc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwgZGVmVmFsdWUpOwogICAgIFQgbmV3VmFsdWUgPSB1aS5yZWFkRW51bShvbGRWYWx1ZSwgIiVzIiwgdGl0bGUpOwogICAgIGlmIChudWxsSWZEZWZhdWx0ICYmIG5ld1ZhbHVlID09IGRlZlZhbHVlKSB7CiAgICAgICBuZXdWYWx1ZSA9IG51bGw7CkBAIC0xMjUsMTYgKzEzMiwyNiBAQAogICAgIHJldHVybiBuZXdWYWx1ZTsKICAgfQogCi0gIFN0cmluZyBwYXNzd29yZChmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgeworICBwdWJsaWMgU3RyaW5nIHNlbGVjdChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHYsCisgICAgICBTZXQ8U3RyaW5nPiBhbGxvd2VkVmFsdWVzKSB7CisgICAgZmluYWwgU3RyaW5nIG92ID0gZ2V0KG5hbWUpOworICAgIFN0cmluZyBudiA9IHVpLnJlYWRTdHJpbmcob3YgIT0gbnVsbCA/IG92IDogZHYsIGFsbG93ZWRWYWx1ZXMsICIlcyIsIHRpdGxlKTsKKyAgICBpZiAoIWVxKG92LCBudikpIHsKKyAgICAgIHNldChuYW1lLCBudik7CisgICAgfQorICAgIHJldHVybiBudjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcGFzc3dvcmQoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQpIHsKICAgICBmaW5hbCBTdHJpbmcgb3YgPSBnZXRTZWN1cmUocGFzc3dvcmQpOwogCi0gICAgU3RyaW5nIHVzZXIgPSBmbGFncy5zZWMuZ2V0U3RyaW5nKHNlY3Rpb24sIG51bGwsIHVzZXJuYW1lKTsKKyAgICBTdHJpbmcgdXNlciA9IGZsYWdzLnNlYy5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgdXNlcm5hbWUpOwogICAgIGlmICh1c2VyID09IG51bGwpIHsKICAgICAgIHVzZXIgPSBnZXQodXNlcm5hbWUpOwogICAgIH0KIAogICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgIGZsYWdzLnNlYy51bnNldChzZWN0aW9uLCBudWxsLCBwYXNzd29yZCk7CisgICAgICBmbGFncy5zZWMudW5zZXQoc2VjdGlvbiwgc3Vic2VjdGlvbiwgcGFzc3dvcmQpOwogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCkBAIC0xNTQsMTggKzE3MSwyMiBAQAogICAgIHJldHVybiBudjsKICAgfQogCi0gIFN0cmluZyBnZXRTZWN1cmUoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gZmxhZ3Muc2VjLmdldFN0cmluZyhzZWN0aW9uLCBudWxsLCBuYW1lKTsKKyAgcHVibGljIFN0cmluZyBnZXRTZWN1cmUoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gZmxhZ3Muc2VjLmdldFN0cmluZyhzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lKTsKICAgfQogCi0gIHZvaWQgc2V0U2VjdXJlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgcHVibGljIHZvaWQgc2V0U2VjdXJlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgZmxhZ3Muc2VjLnNldFN0cmluZyhzZWN0aW9uLCBudWxsLCBuYW1lLCB2YWx1ZSk7CisgICAgICBmbGFncy5zZWMuc2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIHZhbHVlKTsKICAgICB9IGVsc2UgewotICAgICAgZmxhZ3Muc2VjLnVuc2V0KHNlY3Rpb24sIG51bGwsIG5hbWUpOworICAgICAgZmxhZ3Muc2VjLnVuc2V0KHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOwogICAgIH0KICAgfQogCisgIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBzZWN0aW9uOworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKICAgICBpZiAoYSA9PSBudWxsICYmIGIgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2l0ZVBhdGhJbml0aWFsaXplci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1NpdGVQYXRoSW5pdGlhbGl6ZXIuamF2YQppbmRleCBmOGVmNjM3Li5iZjBhZjdmIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2l0ZVBhdGhJbml0aWFsaXplci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TaXRlUGF0aEluaXRpYWxpemVyLmphdmEKQEAgLTg5LDYgKzg5LDggQEAKICAgICBleHRyYWN0TWFpbEV4YW1wbGUoIkNoYW5nZUZvb3Rlci52bSIpOwogICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiQ2hhbmdlU3ViamVjdC52bSIpOwogICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiQ29tbWVudC52bSIpOworICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiQ29tbWVudEZvb3Rlci52bSIpOworICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiQ29tbWl0TWVzc2FnZUVkaXRlZC52bSIpOwogICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiTWVyZ2VkLnZtIik7CiAgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJNZXJnZUZhaWwudm0iKTsKICAgICBleHRyYWN0TWFpbEV4YW1wbGUoIk5ld0NoYW5nZS52bSIpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1VwZ3JhZGVGcm9tMl8wX3guamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9VcGdyYWRlRnJvbTJfMF94LmphdmEKaW5kZXggOWY2MmZjNS4uYjk4MmFlMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1VwZ3JhZGVGcm9tMl8wX3guamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Db25zb2xlVUk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuU29ja2V0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtMTE4LDExICsxMTcsMTEgQEAKIAogICAgIGZpbmFsIFByb3BlcnRpZXMgb2xkcHJvcCA9IHJlYWRHZXJyaXRTZXJ2ZXJQcm9wZXJ0aWVzKCk7CiAgICAgaWYgKG9sZHByb3AgIT0gbnVsbCkgewotICAgICAgZmluYWwgU2VjdGlvbiBkYXRhYmFzZSA9IHNlY3Rpb25zLmdldCgiZGF0YWJhc2UiKTsKKyAgICAgIGZpbmFsIFNlY3Rpb24gZGF0YWJhc2UgPSBzZWN0aW9ucy5nZXQoImRhdGFiYXNlIiwgbnVsbCk7CiAKICAgICAgIFN0cmluZyB1cmwgPSBvbGRwcm9wLmdldFByb3BlcnR5KCJ1cmwiKTsKICAgICAgIGlmICh1cmwgIT0gbnVsbCAmJiAhY29udmVydFVybChkYXRhYmFzZSwgdXJsKSkgewotICAgICAgICBkYXRhYmFzZS5zZXQoInR5cGUiLCBEYXRhU291cmNlUHJvdmlkZXIuVHlwZS5KREJDKTsKKyAgICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgImpkYmMiKTsKICAgICAgICAgZGF0YWJhc2Uuc2V0KCJkcml2ZXIiLCBvbGRwcm9wLmdldFByb3BlcnR5KCJkcml2ZXIiKSk7CiAgICAgICAgIGRhdGFiYXNlLnNldCgidXJsIiwgdXJsKTsKICAgICAgIH0KQEAgLTE4OSw3ICsxODgsNyBAQAogCiAgICAgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOmgyOmZpbGU6IikpIHsKICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoImpkYmM6aDI6ZmlsZToiLmxlbmd0aCgpKTsKLSAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsIERhdGFTb3VyY2VQcm92aWRlci5UeXBlLkgyKTsKKyAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsICJoMiIpOwogICAgICAgZGF0YWJhc2Uuc2V0KCJkYXRhYmFzZSIsIHVybCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yMDIsNyArMjAxLDcgQEAKICAgICAgIH0KIAogICAgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYWRkciA9IFNvY2tldFV0aWwucGFyc2UodXJsLnN1YnN0cmluZygwLCBzbCksIDApOwotICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgRGF0YVNvdXJjZVByb3ZpZGVyLlR5cGUuUE9TVEdSRVNRTCk7CisgICAgICBkYXRhYmFzZS5zZXQoInR5cGUiLCAicG9zdGdyZXNxbCIpOwogICAgICAgc2V0aG9zdChkYXRhYmFzZSwgYWRkcik7CiAgICAgICBkYXRhYmFzZS5zZXQoImRhdGFiYXNlIiwgdXJsLnN1YnN0cmluZyhzbCArIDEpKTsKICAgICAgIHNldHVzZXIoZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZCk7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAogICAgIGlmICh1cmwuc3RhcnRzV2l0aCgiamRiYzpwb3N0Z3Jlc3FsOiIpKSB7CiAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKCJqZGJjOnBvc3RncmVzcWw6Ii5sZW5ndGgoKSk7Ci0gICAgICBkYXRhYmFzZS5zZXQoInR5cGUiLCBEYXRhU291cmNlUHJvdmlkZXIuVHlwZS5QT1NUR1JFU1FMKTsKKyAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsICJwb3N0Z3Jlc3FsIik7CiAgICAgICBkYXRhYmFzZS5zZXQoImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOwogICAgICAgZGF0YWJhc2Uuc2V0KCJkYXRhYmFzZSIsIHVybCk7CiAgICAgICBzZXR1c2VyKGRhdGFiYXNlLCB1c2VybmFtZSwgcGFzc3dvcmQpOwpAQCAtMjI2LDcgKzIyNSw3IEBACiAgICAgICB9CiAKICAgICAgIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBTb2NrZXRVdGlsLnBhcnNlKHVybC5zdWJzdHJpbmcoMCwgc2wpLCAwKTsKLSAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsIERhdGFTb3VyY2VQcm92aWRlci5UeXBlLk1ZU1FMKTsKKyAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsICJteXNxbCIpOwogICAgICAgc2V0aG9zdChkYXRhYmFzZSwgYWRkcik7CiAgICAgICBkYXRhYmFzZS5zZXQoImRhdGFiYXNlIiwgdXJsLnN1YnN0cmluZyhzbCArIDEpKTsKICAgICAgIHNldHVzZXIoZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvQ29uc29sZVVJLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvQ29uc29sZVVJLmphdmEKaW5kZXggYjRlMGZhZC4uZThjZjBhYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0NvbnNvbGVVSS5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Db25zb2xlVUkuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgamF2YS5pby5Db25zb2xlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqIENvbnNvbGUgYmFzZWQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgaW52b2tpbmcgdXNlci4gKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zb2xlVUkgewpAQCAtNzMsNiArNzQsMTAgQEAKICAgLyoqIFByb21wdCB0aGUgdXNlciBmb3IgYSBzdHJpbmcsIHN1Z2dlc3RpbmcgYSBkZWZhdWx0LCBhbmQgcmV0dXJuaW5nIGNob2ljZS4gKi8KICAgcHVibGljIGFic3RyYWN0IFN0cmluZyByZWFkU3RyaW5nKFN0cmluZyBkZWYsIFN0cmluZyBmbXQsIE9iamVjdC4uLiBhcmdzKTsKIAorICAvKiogUHJvbXB0IHRoZSB1c2VyIHRvIG1ha2UgYSBjaG9pY2UgZnJvbSBhbiBhbGxvd2VkIGxpc3Qgb2YgdmFsdWVzLiAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlYWRTdHJpbmcoU3RyaW5nIGRlZiwgU2V0PFN0cmluZz4gYWxsb3dlZFZhbHVlcywKKyAgICAgIFN0cmluZyBmbXQsIE9iamVjdC4uLiBhcmdzKTsKKwogICAvKiogUHJvbXB0IHRoZSB1c2VyIGZvciBhbiBpbnRlZ2VyIHZhbHVlLCBzdWdnZXN0aW5nIGEgZGVmYXVsdC4gKi8KICAgcHVibGljIGludCByZWFkSW50KGludCBkZWYsIFN0cmluZyBmbXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgZm9yICg7OykgewpAQCAtMTYyLDYgKzE2NywyNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZyhTdHJpbmcgZGVmLCBTZXQ8U3RyaW5nPiBhbGxvd2VkVmFsdWVzLCBTdHJpbmcgZm10LAorICAgICAgICBPYmplY3QuLi4gYXJncykgeworICAgICAgZm9yICg7OykgeworICAgICAgICBTdHJpbmcgciA9IHJlYWRTdHJpbmcoZGVmLCBmbXQsIGFyZ3MpOworICAgICAgICBpZiAoYWxsb3dlZFZhbHVlcy5jb250YWlucyhyLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgcmV0dXJuIHIudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISI/Ii5lcXVhbHMocikpIHsKKyAgICAgICAgICBjb25zb2xlLnByaW50ZigiZXJyb3I6ICclcycgaXMgbm90IGEgdmFsaWQgY2hvaWNlXG4iLCByKTsKKyAgICAgICAgfQorICAgICAgICBjb25zb2xlLnByaW50ZigiICAgICAgIFN1cHBvcnRlZCBvcHRpb25zIGFyZTpcbiIpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2IDogYWxsb3dlZFZhbHVlcykgeworICAgICAgICAgIGNvbnNvbGUucHJpbnRmKCIgICAgICAgICAlc1xuIiwgdi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBwYXNzd29yZChTdHJpbmcgZm10LCBPYmplY3QuLi4gYXJncykgewogICAgICAgZmluYWwgU3RyaW5nIHByb21wdCA9IFN0cmluZy5mb3JtYXQoZm10LCBhcmdzKTsKICAgICAgIGZvciAoOzspIHsKQEAgLTI0Miw2ICsyNjUsMTIgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoU3RyaW5nIGRlZiwgU2V0PFN0cmluZz4gYWxsb3dlZFZhbHVlcywgU3RyaW5nIGZtdCwKKyAgICAgICAgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgIHJldHVybiBkZWY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd2FpdEZvclVzZXIoKSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlNTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9HYXJiYWdlQ29sbGVjdGlvbkxvZ0ZpbGUuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HYXJiYWdlQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5EYWlseVJvbGxpbmdGaWxlQXBwZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5MZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ01hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0OworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouaGVscGVycy5Pbmx5T25jZUVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5FcnJvckhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5zcGkuTG9nZ2luZ0V2ZW50OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdGlvbkxvZ0ZpbGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEdhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZS5jbGFzcyk7CisKKyAgcHVibGljIHN0YXRpYyBMaWZlY3ljbGVMaXN0ZW5lciBzdGFydChGaWxlIHNpdGVQYXRoKQorICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgRmlsZSBsb2dkaXIgPSBuZXcgU2l0ZVBhdGhzKHNpdGVQYXRoKS5sb2dzX2RpcjsKKyAgICBpZiAoIWxvZ2Rpci5leGlzdHMoKSAmJiAhbG9nZGlyLm1rZGlycygpKSB7CisgICAgICB0aHJvdyBuZXcgRGllKCJDYW5ub3QgY3JlYXRlIGxvZyBkaXJlY3Rvcnk6ICIgKyBsb2dkaXIpOworICAgIH0KKworICAgIFBhdHRlcm5MYXlvdXQgbGF5b3V0ID0gbmV3IFBhdHRlcm5MYXlvdXQoKTsKKyAgICBsYXlvdXQuc2V0Q29udmVyc2lvblBhdHRlcm4oIlslZF0gJS01cCAleDogJW0lbiIpOworCisgICAgRGFpbHlSb2xsaW5nRmlsZUFwcGVuZGVyIGRzdCA9IG5ldyBEYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIoKTsKKyAgICBkc3Quc2V0TmFtZShHYXJiYWdlQ29sbGVjdGlvbi5MT0dfTkFNRSk7CisgICAgZHN0LnNldExheW91dChsYXlvdXQpOworICAgIGRzdC5zZXRFbmNvZGluZygiVVRGLTgiKTsKKyAgICBkc3Quc2V0RmlsZShuZXcgRmlsZShyZXNvbHZlKGxvZ2RpciksIEdhcmJhZ2VDb2xsZWN0aW9uLkxPR19OQU1FKS5nZXRQYXRoKCkpOworICAgIGRzdC5zZXRJbW1lZGlhdGVGbHVzaCh0cnVlKTsKKyAgICBkc3Quc2V0QXBwZW5kKHRydWUpOworICAgIGRzdC5zZXRUaHJlc2hvbGQoTGV2ZWwuSU5GTyk7CisgICAgZHN0LnNldEVycm9ySGFuZGxlcihuZXcgTG9nRXJyb3JIYW5kbGVyKCkpOworICAgIGRzdC5hY3RpdmF0ZU9wdGlvbnMoKTsKKyAgICBkc3Quc2V0RXJyb3JIYW5kbGVyKG5ldyBPbmx5T25jZUVycm9ySGFuZGxlcigpKTsKKworICAgIExvZ2dlciBnY0xvZ2dlciA9IExvZ01hbmFnZXIuZ2V0TG9nZ2VyKEdhcmJhZ2VDb2xsZWN0aW9uLkxPR19OQU1FKTsKKyAgICBnY0xvZ2dlci5yZW1vdmVBbGxBcHBlbmRlcnMoKTsKKyAgICBnY0xvZ2dlci5hZGRBcHBlbmRlcihkc3QpOworICAgIGdjTG9nZ2VyLnNldEFkZGl0aXZpdHkoZmFsc2UpOworCisgICAgcmV0dXJuIG5ldyBMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dnZXIoR2FyYmFnZUNvbGxlY3Rpb24uTE9HX05BTUUpLnJlbW92ZUFsbEFwcGVuZGVycygpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBGaWxlIHJlc29sdmUoRmlsZSBsb2dzX2RpcikgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbG9nc19kaXIuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBsb2dzX2Rpci5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZSgpIHsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExvZ0Vycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlLCBpbnQgZXJyb3JDb2RlLAorICAgICAgICBMb2dnaW5nRXZlbnQgZXZlbnQpIHsKKyAgICAgIGVycm9yKGUgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogbWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlLCBpbnQgZXJyb3JDb2RlKSB7CisgICAgICBlcnJvcihlICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IG1lc3NhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBvcGVuICciICsgR2FyYmFnZUNvbGxlY3Rpb24uTE9HX05BTUUgKyAiJyBsb2cgZmlsZTogIgorICAgICAgICAgICsgbWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWN0aXZhdGVPcHRpb25zKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFwcGVuZGVyKEFwcGVuZGVyIGFwcGVuZGVyKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QmFja3VwQXBwZW5kZXIoQXBwZW5kZXIgYXBwZW5kZXIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dnZXIoTG9nZ2VyIGxvZ2dlcikgeworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0lvVXRpbC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0lvVXRpbC5qYXZhCmluZGV4IDkzOTg4NTEuLmY3NTA3NDhhIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvSW9VdGlsLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0lvVXRpbC5qYXZhCkBAIC0xNCw5ICsxNCwxOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGZpbmFsIGNsYXNzIElvVXRpbCB7CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5V2l0aFRocmVhZChmaW5hbCBJbnB1dFN0cmVhbSBzcmMsCkBAIC00Miw2ICs1Miw0NyBAQAogICAgIH0uc3RhcnQoKTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkSkFScyhGaWxlLi4uIGphcnMpIHsKKyAgICBDbGFzc0xvYWRlciBjbCA9IElvVXRpbC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgIGlmICghKGNsIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpKSB7CisgICAgICB0aHJvdyBub0FkZFVSTCgiTm90IGxvYWRlZCBieSBVUkxDbGFzc0xvYWRlciIsIG51bGwpOworICAgIH0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIFVSTENsYXNzTG9hZGVyIHVybENsYXNzTG9hZGVyID0gKFVSTENsYXNzTG9hZGVyKSBjbDsKKworICAgIE1ldGhvZCBhZGRVUkw7CisgICAgdHJ5IHsKKyAgICAgIGFkZFVSTCA9IFVSTENsYXNzTG9hZGVyLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJhZGRVUkwiLCBVUkwuY2xhc3MpOworICAgICAgYWRkVVJMLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbm9BZGRVUkwoIk1ldGhvZCBhZGRVUkwgbm90IGF2YWlsYWJsZSIsIGUpOworICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBub0FkZFVSTCgiTWV0aG9kIGFkZFVSTCBub3QgYXZhaWxhYmxlIiwgZSk7CisgICAgfQorCisgICAgU2V0PFVSTD4gaGF2ZSA9IFNldHMubmV3SGFzaFNldChBcnJheXMuYXNMaXN0KHVybENsYXNzTG9hZGVyLmdldFVSTHMoKSkpOworICAgIGZvciAoRmlsZSBwYXRoIDogamFycykgeworICAgICAgdHJ5IHsKKyAgICAgICAgVVJMIHVybCA9IHBhdGgudG9VUkkoKS50b1VSTCgpOworICAgICAgICBpZiAoaGF2ZS5hZGQodXJsKSkgeworICAgICAgICAgIGFkZFVSTC5pbnZva2UoY2wsIHVybCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5vQWRkVVJMKCJhZGRVUkwgIiArIHBhdGggKyAiIGZhaWxlZCIsIGUpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7CisgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZS5nZXRDYXVzZSgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub0FkZFVSTChTdHJpbmcgbSwgVGhyb3dhYmxlIHdoeSkgeworICAgIFN0cmluZyBwcmVmaXggPSAiQ2Fubm90IGV4dGVuZCBjbGFzc3BhdGg6ICI7CisgICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihwcmVmaXggKyBtLCB3aHkpOworICB9CiAgIHByaXZhdGUgSW9VdGlsKCkgewogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvTG9nRmlsZUNvbXByZXNzb3IuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Mb2dGaWxlQ29tcHJlc3Nvci5qYXZhCmluZGV4IDU3Y2M3YzQuLmNkYTY1M2UgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Mb2dGaWxlQ29tcHJlc3Nvci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Mb2dGaWxlQ29tcHJlc3Nvci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtOTcsNiArOTgsNyBAQAogICBwcml2YXRlIGJvb2xlYW4gaXNMaXZlKGZpbmFsIEZpbGUgZW50cnkpIHsKICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKICAgICByZXR1cm4gRXJyb3JMb2dGaWxlLkxPR19OQU1FLmVxdWFscyhuYW1lKSAvLworICAgICAgICB8fCBHYXJiYWdlQ29sbGVjdGlvbi5MT0dfTkFNRS5lcXVhbHMobmFtZSkgLy8KICAgICAgICAgfHwgInNzaGRfbG9nIi5lcXVhbHMobmFtZSkgLy8KICAgICAgICAgfHwgImh0dHBkX2xvZyIuZXF1YWxzKG5hbWUpIC8vCiAgICAgICAgIHx8ICJnZXJyaXQucnVuIi5lcXVhbHMobmFtZSkgLy8KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9SdW50aW1lU2h1dGRvd24uamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9SdW50aW1lU2h1dGRvd24uamF2YQppbmRleCAxOGI3MDY0Li5jMDBhZDdmIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvUnVudGltZVNodXRkb3duLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1J1bnRpbWVTaHV0ZG93bi5qYXZhCkBAIC0xMDMsOSArMTAzLDcgQEAKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgd2FpdCgpOwogICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKCJUaHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIGdyYWNlZnVsIHNodXRkb3duOyIKLSAgICAgICAgICAgICAgICArICIgaWdub3JpbmcgaW50ZXJydXB0IHJlcXVlc3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9TaXRlTGlicmFyeUJhc2VkRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjczOTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CisKKy8qKiBMb2FkcyB0aGUgc2l0ZSBsaWJyYXJ5IGlmIG5vdCB5ZXQgbG9hZGVkLiAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFNpdGVMaWJyYXJ5QmFzZWREYXRhU291cmNlUHJvdmlkZXIgZXh0ZW5kcyBEYXRhU291cmNlUHJvdmlkZXIgeworICBwcml2YXRlIGZpbmFsIEZpbGUgbGliZGlyOworICBwcml2YXRlIGJvb2xlYW4gaW5pdDsKKworICBASW5qZWN0CisgIFNpdGVMaWJyYXJ5QmFzZWREYXRhU291cmNlUHJvdmlkZXIoU2l0ZVBhdGhzIHNpdGUsCisgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsCisgICAgICBEYXRhU291cmNlUHJvdmlkZXIuQ29udGV4dCBjdHgsCisgICAgICBEYXRhU291cmNlVHlwZSBkc3QpIHsKKyAgICBzdXBlcihzaXRlLCBjZmcsIGN0eCwgZHN0KTsKKyAgICBsaWJkaXIgPSBzaXRlLmxpYl9kaXI7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIERhdGFTb3VyY2UgZ2V0KCkgeworICAgIGlmICghaW5pdCkgeworICAgICAgbG9hZFNpdGVMaWIoKTsKKyAgICAgIGluaXQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3VwZXIuZ2V0KCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgbG9hZFNpdGVMaWIoKSB7CisgICAgRmlsZVtdIGphcnMgPSBsaWJkaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gcGF0aC5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiAobmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IG5hbWUuZW5kc1dpdGgoIi56aXAiKSkKKyAgICAgICAgICAgICYmIHBhdGguaXNGaWxlKCk7CisgICAgICB9CisgICAgfSk7CisgICAgaWYgKGphcnMgIT0gbnVsbCAmJiAwIDwgamFycy5sZW5ndGgpIHsKKyAgICAgIEFycmF5cy5zb3J0KGphcnMsIG5ldyBDb21wYXJhdG9yPEZpbGU+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKEZpbGUgYSwgRmlsZSBiKSB7CisgICAgICAgICAgLy8gU29ydCBieSByZXZlcnNlIGxhc3QtbW9kaWZpZWQgdGltZSBzbyBuZXdlciBKQVJzIGFyZSBmaXJzdC4KKyAgICAgICAgICBpbnQgY21wID0gTG9uZ3MuY29tcGFyZShiLmxhc3RNb2RpZmllZCgpLCBhLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICBpZiAoY21wICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBhLmdldE5hbWUoKS5jb21wYXJlVG8oYi5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIElvVXRpbC5sb2FkSkFScyhqYXJzKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9TaXRlUHJvZ3JhbS5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1NpdGVQcm9ncmFtLmphdmEKaW5kZXggNDg5MzU3OS4uYWFlNWI0OCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1NpdGVQcm9ncmFtLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1NpdGVQcm9ncmFtLmphdmEKQEAgLTE4LDEwICsxOCwxMyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmluamVjdC5TdGFnZS5QUk9EVUNUSU9OOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZ01vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZVByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZVR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhYmFzZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLlNjaGVtYU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwpAQCAtMzQsMjIgKzM3LDEzIEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zcGkuTWVzc2FnZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IGphdmF4LnNxbC5EYXRhU291cmNlOwogCkBAIC03NCw5NSArNjgsNDQgQEAKICAgICB9CiAgIH0KIAotICAvKiogTG9hZCBleHRyYSBKQVJzIGZyb20ge0Bjb2RlIGxpYi99IHN1YmRpcmVjdG9yeSBvZiB7QGxpbmsgI2dldFNpdGVQYXRoKCl9ICovCi0gIHByb3RlY3RlZCB2b2lkIGxvYWRTaXRlTGliKCkgewotICAgIGZpbmFsIEZpbGUgbGliZGlyID0gbmV3IEZpbGUoZ2V0U2l0ZVBhdGgoKSwgImxpYiIpOwotICAgIGZpbmFsIEZpbGVbXSBsaXN0ID0gbGliZGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aCkgewotICAgICAgICBpZiAoIXBhdGguaXNGaWxlKCkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhdGguZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikgLy8KLSAgICAgICAgICAgIHx8IHBhdGguZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIik7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgaWYgKGxpc3QgIT0gbnVsbCAmJiAwIDwgbGlzdC5sZW5ndGgpIHsKLSAgICAgIEFycmF5cy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPEZpbGU+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKEZpbGUgYSwgRmlsZSBiKSB7Ci0gICAgICAgICAgcmV0dXJuIGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgYWRkVG9DbGFzc0xvYWRlcihsaXN0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYWRkVG9DbGFzc0xvYWRlcihmaW5hbCBGaWxlW10gYWRkaXRpb25hbExvY2F0aW9ucykgewotICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgIGlmICghKGNsIGluc3RhbmNlb2YgVVJMQ2xhc3NMb2FkZXIpKSB7Ci0gICAgICB0aHJvdyBub0FkZFVSTCgiTm90IGxvYWRlZCBieSBVUkxDbGFzc0xvYWRlciIsIG51bGwpOwotICAgIH0KLQotICAgIGZpbmFsIFVSTENsYXNzTG9hZGVyIHVjbCA9IChVUkxDbGFzc0xvYWRlcikgY2w7Ci0gICAgZmluYWwgU2V0PFVSTD4gaGF2ZSA9IG5ldyBIYXNoU2V0PFVSTD4oKTsKLSAgICBoYXZlLmFkZEFsbChBcnJheXMuYXNMaXN0KHVjbC5nZXRVUkxzKCkpKTsKLQotICAgIGZpbmFsIE1ldGhvZCBtOwotICAgIHRyeSB7Ci0gICAgICBtID0gVVJMQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImFkZFVSTCIsIFVSTC5jbGFzcyk7Ci0gICAgICBtLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbm9BZGRVUkwoIk1ldGhvZCBhZGRVUkwgbm90IGF2YWlsYWJsZSIsIGUpOwotICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBub0FkZFVSTCgiTWV0aG9kIGFkZFVSTCBub3QgYXZhaWxhYmxlIiwgZSk7Ci0gICAgfQotCi0gICAgZm9yIChmaW5hbCBGaWxlIHBhdGggOiBhZGRpdGlvbmFsTG9jYXRpb25zKSB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBVUkwgdXJsID0gcGF0aC50b1VSSSgpLnRvVVJMKCk7Ci0gICAgICAgIGlmIChoYXZlLmFkZCh1cmwpKSB7Ci0gICAgICAgICAgbS5pbnZva2UoY2wsIHVybCk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5vQWRkVVJMKCJhZGRVUkwgIiArIHBhdGggKyAiIGZhaWxlZCIsIGUpOwotICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7Ci0gICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7Ci0gICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZS5nZXRDYXVzZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub0FkZFVSTChTdHJpbmcgbSwgVGhyb3dhYmxlIHdoeSkgewotICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiQ2Fubm90IGV4dGVuZCBjbGFzc3BhdGg6ICI7Ci0gICAgcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihwcmVmaXggKyBtLCB3aHkpOwotICB9Ci0KICAgLyoqIEByZXR1cm4gcHJvdmlkZXMgZGF0YWJhc2UgY29ubmVjdGl2aXR5IGFuZCBzaXRlIHBhdGguICovCiAgIHByb3RlY3RlZCBJbmplY3RvciBjcmVhdGVEYkluamVjdG9yKGZpbmFsIERhdGFTb3VyY2VQcm92aWRlci5Db250ZXh0IGNvbnRleHQpIHsKLSAgICBsb2FkU2l0ZUxpYigpOwotCiAgICAgZmluYWwgRmlsZSBzaXRlUGF0aCA9IGdldFNpdGVQYXRoKCk7CiAgICAgZmluYWwgTGlzdDxNb2R1bGU+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZT4oKTsKLSAgICBtb2R1bGVzLmFkZChuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CisKKyAgICBNb2R1bGUgc2l0ZVBhdGhNb2R1bGUgPSBuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICAgICAgYmluZChGaWxlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKFNpdGVQYXRoLmNsYXNzKS50b0luc3RhbmNlKHNpdGVQYXRoKTsKICAgICAgIH0KLSAgICB9KTsKKyAgICB9OworICAgIG1vZHVsZXMuYWRkKHNpdGVQYXRoTW9kdWxlKTsKKwogICAgIG1vZHVsZXMuYWRkKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICAgICAgYmluZChEYXRhU291cmNlUHJvdmlkZXIuQ29udGV4dC5jbGFzcykudG9JbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgYmluZChLZXkuZ2V0KERhdGFTb3VyY2UuY2xhc3MsIE5hbWVzLm5hbWVkKCJSZXZpZXdEYiIpKSkudG9Qcm92aWRlcigKLSAgICAgICAgICAgIERhdGFTb3VyY2VQcm92aWRlci5jbGFzcykuaW4oU0lOR0xFVE9OKTsKLSAgICAgICAgbGlzdGVuZXIoKS50byhEYXRhU291cmNlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBiaW5kKEtleS5nZXQoRGF0YVNvdXJjZS5jbGFzcywgTmFtZXMubmFtZWQoIlJldmlld0RiIikpKQorICAgICAgICAgIC50b1Byb3ZpZGVyKFNpdGVMaWJyYXJ5QmFzZWREYXRhU291cmNlUHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgLmluKFNJTkdMRVRPTik7CisgICAgICAgIGxpc3RlbmVyKCkudG8oU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlci5jbGFzcyk7CiAgICAgICB9CiAgICAgfSk7Ci0gICAgbW9kdWxlcy5hZGQobmV3IEdlcnJpdFNlcnZlckNvbmZpZ01vZHVsZSgpKTsKKyAgICBNb2R1bGUgY29uZmlnTW9kdWxlID0gbmV3IEdlcnJpdFNlcnZlckNvbmZpZ01vZHVsZSgpOworICAgIG1vZHVsZXMuYWRkKGNvbmZpZ01vZHVsZSk7CisgICAgSW5qZWN0b3IgY2ZnSW5qZWN0b3IgPSBHdWljZS5jcmVhdGVJbmplY3RvcihzaXRlUGF0aE1vZHVsZSwgY29uZmlnTW9kdWxlKTsKKyAgICBDb25maWcgY2ZnID0gY2ZnSW5qZWN0b3IuZ2V0SW5zdGFuY2UoS2V5LmdldChDb25maWcuY2xhc3MsIEdlcnJpdFNlcnZlckNvbmZpZy5jbGFzcykpOworICAgIFN0cmluZyBkYlR5cGUgPSBjZmcuZ2V0U3RyaW5nKCJkYXRhYmFzZSIsIG51bGwsICJ0eXBlIik7CisKKyAgICBmaW5hbCBEYXRhU291cmNlVHlwZSBkc3QgPSBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgRGF0YVNvdXJjZU1vZHVsZSgpLCBjb25maWdNb2R1bGUsCisgICAgICAgICAgICBzaXRlUGF0aE1vZHVsZSkuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICBLZXkuZ2V0KERhdGFTb3VyY2VUeXBlLmNsYXNzLCBOYW1lcy5uYW1lZChkYlR5cGUudG9Mb3dlckNhc2UoKSkpKTsKKworICAgIG1vZHVsZXMuYWRkKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKERhdGFTb3VyY2VUeXBlLmNsYXNzKS50b0luc3RhbmNlKGRzdCk7CisgICAgICB9fSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IERhdGFiYXNlTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTY2hlbWFNb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IExvY2FsRGlza1JlcG9zaXRvcnlNYW5hZ2VyLk1vZHVsZSgpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9nZXJyaXQuc2ggYi9nZXJyaXQtcGdtL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vZ2Vycml0LnNoCmluZGV4IDM4NTdlYmQuLjlhYTRlYTMgMTAwNzU1Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9nZXJyaXQuc2gKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2dlcnJpdC5zaApAQCAtOSw2ICs5LDE3IEBACiAjIHByb2Nlc3NuYW1lOiBnZXJyaXQKICMgPT09PT09PT09PT09PT09PT09PT09PT09CiAKKyMjIyBCRUdJTiBJTklUIElORk8KKyMgUHJvdmlkZXM6ICAgICAgICAgIGdlcnJpdAorIyBSZXF1aXJlZC1TdGFydDogICAgJG5hbWVkICRyZW1vdGVfZnMgJHN5c2xvZworIyBSZXF1aXJlZC1TdG9wOiAgICAgJG5hbWVkICRyZW1vdGVfZnMgJHN5c2xvZworIyBEZWZhdWx0LVN0YXJ0OiAgICAgMiAzIDQgNQorIyBEZWZhdWx0LVN0b3A6ICAgICAgMCAxIDYKKyMgU2hvcnQtRGVzY3JpcHRpb246IFN0YXJ0L3N0b3AgR2Vycml0IENvZGUgUmV2aWV3CisjIERlc2NyaXB0aW9uOiAgICAgICBHZXJyaXQgaXMgYSB3ZWIgYmFzZWQgY29kZSByZXZpZXcgc3lzdGVtLCBmYWNpbGl0YXRpbmcgb25saW5lIGNvZGUgcmV2aWV3cworIyAgICAgICAgICAgICAgICAgICAgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHaXQgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KKyMjIyBFTkQgSU5JVCBJTkZPCisKICMgQ29uZmlndXJhdGlvbiBmaWxlczoKICMKICMgL2V0Yy9kZWZhdWx0L2dlcnJpdGNvZGVyZXZpZXcKQEAgLTM2LDcgKzQ3LDcgQEAKIAogdXNhZ2UoKSB7CiAgICAgbWU9YGJhc2VuYW1lICIkMCJgCi0gICAgZWNobyA+JjIgIlVzYWdlOiAkbWUge3N0YXJ0fHN0b3B8cmVzdGFydHxjaGVja3xydW58c3VwZXJ2aXNlfSBbLWQgc2l0ZV0iCisgICAgZWNobyA+JjIgIlVzYWdlOiAkbWUge3N0YXJ0fHN0b3B8cmVzdGFydHxjaGVja3xzdGF0dXN8cnVufHN1cGVydmlzZX0gWy1kIHNpdGVdIgogICAgIGV4aXQgMQogfQogCkBAIC0xMDgsNyArMTE5LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFNlZSBpZiB0aGVyZSdzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpbGUKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZiB0ZXN0IC1mIC9ldGMvZGVmYXVsdC9nZXJyaXRjb2RlcmV2aWV3IDsgdGhlbiAKK2lmIHRlc3QgLWYgL2V0Yy9kZWZhdWx0L2dlcnJpdGNvZGVyZXZpZXcgOyB0aGVuCiAgIC4gL2V0Yy9kZWZhdWx0L2dlcnJpdGNvZGVyZXZpZXcKIGZpCiAKQEAgLTEyNiw3ICsxMzcsNyBAQAogR0VSUklUX0lOU1RBTExfVFJBQ0VfRklMRT1ldGMvZ2Vycml0LmNvbmZpZwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBObyBnaXQgaW4gUEFUSD8gTmVlZGVkIGZvciBnZXJyaXQuY29uZmcgcGFyc2luZworIyBObyBnaXQgaW4gUEFUSD8gTmVlZGVkIGZvciBnZXJyaXQuY29uZmlnIHBhcnNpbmcKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpZiB0eXBlIGdpdCA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCiAgIDogT0sKQEAgLTEzOSwxMCArMTUwLDkgQEAKICMgVHJ5IHRvIGRldGVybWluZSBHRVJSSVRfU0lURSBpZiBub3Qgc2V0CiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWYgdGVzdCAteiAiJEdFUlJJVF9TSVRFIiA7IHRoZW4KLSAgR0VSUklUX1NJVEVfMT1gZGlybmFtZSAiJDAiYAotICBHRVJSSVRfU0lURV8xPWBkaXJuYW1lICIkR0VSUklUX1NJVEVfMSJgCi0gIGlmIHRlc3QgLWYgIiR7R0VSUklUX1NJVEVfMX0vJHtHRVJSSVRfSU5TVEFMTF9UUkFDRV9GSUxFfSIgOyB0aGVuIAotICAgIEdFUlJJVF9TSVRFPSR7R0VSUklUX1NJVEVfMX0gCisgIEdFUlJJVF9TSVRFXzE9YGRpcm5hbWUgIiQwImAvLi4KKyAgaWYgdGVzdCAtZiAiJHtHRVJSSVRfU0lURV8xfS8ke0dFUlJJVF9JTlNUQUxMX1RSQUNFX0ZJTEV9IiA7IHRoZW4KKyAgICBHRVJSSVRfU0lURT0ke0dFUlJJVF9TSVRFXzF9CiAgIGZpCiBmaQogCkBAIC0xNTAsMTAgKzE2MCwxMSBAQAogIyBObyBHRVJSSVRfU0lURSB5ZXQ/IFdlJ3JlIG91dCBvZiBsdWNrIQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmIHRlc3QgLXogIiRHRVJSSVRfU0lURSIgOyB0aGVuCi0gICAgZWNobyA+JjIgIioqIEVSUk9SOiBHRVJSSVRfU0lURSBub3Qgc2V0IiAKKyAgICBlY2hvID4mMiAiKiogRVJST1I6IEdFUlJJVF9TSVRFIG5vdCBzZXQiCiAgICAgZXhpdCAxCiBmaQogCitJTklUSUFMX0RJUj1gcHdkYAogaWYgY2QgIiRHRVJSSVRfU0lURSIgOyB0aGVuCiAgIEdFUlJJVF9TSVRFPWBwd2RgCiBlbHNlCkBAIC0yMDYsNyArMjE3LDcgQEAKICAgICAiCiAgICAgZm9yIE4gaW4gamF2YSBqZGsganJlIDsgZG8KICAgICAgIGZvciBMIGluICRKQVZBX0xPQ0FUSU9OUyA7IGRvCi0gICAgICAgIHRlc3QgLWQgIiRMIiB8fCBjb250aW51ZSAKKyAgICAgICAgdGVzdCAtZCAiJEwiIHx8IGNvbnRpbnVlCiAgICAgICAgIGZpbmQgJEwgLW5hbWUgIiROIiAhIC10eXBlIGQgfCBncmVwIC12IHRocmVhZHMgfCB3aGlsZSByZWFkIEogOyBkbwogICAgICAgICAgIHRlc3QgLXggIiRKIiB8fCBjb250aW51ZQogICAgICAgICAgIFZFUlNJT049YGV2YWwgIiRKIiAtdmVyc2lvbiAyPiYxYApAQCAtMjQxLDcgKzI1Miw5IEBACiBmaQogCiBpZiB0ZXN0IC16ICIkSkFWQSIgOyB0aGVuCi0gIGVjaG8gPiYyICJDYW5ub3QgZmluZCBhIEpSRSBvciBKREsuIFBsZWFzZSBzZXQgSkFWQV9IT01FIHRvIGEgPj0xLjYgSlJFIgorICBlY2hvID4mMiAiQ2Fubm90IGZpbmQgYSBKUkUgb3IgSkRLLiBQbGVhc2Ugc2V0IEpBVkFfSE9NRSBvciIKKyAgZWNobyA+JjIgImNvbnRhaW5lci5qYXZhSG9tZSBpbiAkR0VSUklUX1NJVEUvZXRjL2dlcnJpdC5jb25maWciCisgIGVjaG8gPiYyICJ0byBhID49MS42IEpSRSIKICAgZXhpdCAxCiBmaQogCkBAIC0zNDAsNyArMzUzLDcgQEAKICAgc3RhcnQpCiAgICAgcHJpbnRmICclcycgIlN0YXJ0aW5nIEdlcnJpdCBDb2RlIFJldmlldzogIgogCi0gICAgaWYgdGVzdCAxID0gIiROT19TVEFSVCIgOyB0aGVuIAorICAgIGlmIHRlc3QgMSA9ICIkTk9fU1RBUlQiIDsgdGhlbgogICAgICAgZWNobyAiTm90IHN0YXJ0aW5nIGdlcnJpdCAtIE5PX1NUQVJUPTEgaW4gL2V0Yy9kZWZhdWx0L2dlcnJpdGNvZGVyZXZpZXciCiAgICAgICBleGl0IDAKICAgICBmaQpAQCAtMzY1LDIyICszNzgsMjIgQEAKICAgICAgICAgICBlY2hvID4mMiAiZmF0YWw6IHN0YXJ0LXN0b3AtZGFlbW9uIGZhaWxlZCIKICAgICAgICAgICByYz0xCiAgICAgICAgIGZpCi0gICAgICAgIGV4aXQgJHJjIAorICAgICAgICBleGl0ICRyYwogICAgICAgZmkKICAgICBlbHNlCiAgICAgICBpZiB0ZXN0IC1mICIkR0VSUklUX1BJRCIgOyB0aGVuCiAgICAgICAgIGlmIHJ1bm5pbmcgIiRHRVJSSVRfUElEIiA7IHRoZW4KICAgICAgICAgICBlY2hvICJBbHJlYWR5IFJ1bm5pbmchISIKLSAgICAgICAgICBleGl0IDEKKyAgICAgICAgICBleGl0IDAKICAgICAgICAgZWxzZQogICAgICAgICAgIHJtIC1mICIkR0VSUklUX1BJRCIgIiRHRVJSSVRfUlVOIgogICAgICAgICBmaQogICAgICAgZmkKIAotICAgICAgaWYgdGVzdCAkVUlEID0gMCAtYSAtbiAiJEdFUlJJVF9VU0VSIiA7IHRoZW4gCisgICAgICBpZiB0ZXN0ICRVSUQgPSAwIC1hIC1uICIkR0VSUklUX1VTRVIiIDsgdGhlbgogICAgICAgICB0b3VjaCAiJEdFUlJJVF9QSUQiCiAgICAgICAgIGNob3duICRHRVJSSVRfVVNFUiAiJEdFUlJJVF9QSUQiCi0gICAgICAgIHN1IC0gJEdFUlJJVF9VU0VSIC1jICIKKyAgICAgICAgc3UgLSAkR0VSUklUX1VTRVIgLXMgL2Jpbi9zaCAtYyAiCiAgICAgICAgICAgSkFWQT0nJEpBVkEnIDsgZXhwb3J0IEpBVkEgOwogICAgICAgICAgICRSVU5fRVhFQyAkUlVOX0FyZzEgJyRSVU5fQXJnMicgJFJVTl9BcmczICRSVU5fQVJHUyA8L2Rldi9udWxsID4vZGV2L251bGwgMj4mMSAmCiAgICAgICAgICAgUElEPVwkISA7CkBAIC00MjYsNyArNDM5LDcgQEAKIAogICAgIGlmIHRlc3QgMSA9ICIkU1RBUlRfU1RPUF9EQUVNT04iICYmIHR5cGUgc3RhcnQtc3RvcC1kYWVtb24gPi9kZXYvbnVsbCAyPiYxCiAgICAgdGhlbgotICAgICAgc3RhcnQtc3RvcC1kYWVtb24gLUsgLXAgIiRHRVJSSVRfUElEIiAtcyBIVVAgCisgICAgICBzdGFydC1zdG9wLWRhZW1vbiAtSyAtcCAiJEdFUlJJVF9QSUQiIC1zIEhVUAogICAgICAgc2xlZXAgMQogICAgICAgaWYgcnVubmluZyAiJEdFUlJJVF9QSUQiIDsgdGhlbgogICAgICAgICBzbGVlcCAzCkBAIC00NTgsOCArNDcxLDEzIEBACiAgICAgaWYgdGVzdCAtZiAiJEdFUlJJVF9TSCIgOyB0aGVuCiAgICAgICA6IE9LCiAgICAgZWxzZQotICAgICAgZWNobyA+JjIgIioqIEVSUk9SOiBDYW5ub3QgbG9jYXRlIGdlcnJpdC5zaCIKLSAgICAgIGV4aXQgMQorICAgICAgR0VSUklUX1NIPSIkSU5JVElBTF9ESVIvJEdFUlJJVF9TSCIKKyAgICAgIGlmIHRlc3QgLWYgIiRHRVJSSVRfU0giIDsgdGhlbgorICAgICAgICA6IE9LCisgICAgICBlbHNlCisgICAgICAgIGVjaG8gPiYyICIqKiBFUlJPUjogQ2Fubm90IGxvY2F0ZSBnZXJyaXQuc2giCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKICAgICBmaQogICAgICRHRVJSSVRfU0ggc3RvcCAkKgogICAgIHNsZWVwIDUKQEAgLTQ4MCw3ICs0OTgsNyBAQAogICAgIGlmIHRlc3QgLWYgIiRHRVJSSVRfUElEIiA7IHRoZW4KICAgICAgICAgaWYgcnVubmluZyAiJEdFUlJJVF9QSUQiIDsgdGhlbgogICAgICAgICAgIGVjaG8gIkFscmVhZHkgUnVubmluZyEhIgotICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGV4aXQgMAogICAgICAgICBlbHNlCiAgICAgICAgICAgcm0gLWYgIiRHRVJSSVRfUElEIgogICAgICAgICBmaQpAQCAtNDg5LDcgKzUwNyw3IEBACiAgICAgZXhlYyAiJFJVTl9FWEVDIiAkUlVOX0FyZzEgIiRSVU5fQXJnMiIgJFJVTl9BcmczICRSVU5fQVJHUyAtLWNvbnNvbGUtbG9nCiAgIDs7CiAKLSAgY2hlY2spCisgIGNoZWNrfHN0YXR1cykKICAgICBlY2hvICJDaGVja2luZyBhcmd1bWVudHMgdG8gR2Vycml0IENvZGUgUmV2aWV3OiIKICAgICBlY2hvICIgIEdFUlJJVF9TSVRFICAgICA9ICAkR0VSUklUX1NJVEUiCiAgICAgZWNobyAiICBHRVJSSVRfQ09ORklHICAgPSAgJEdFUlJJVF9DT05GSUciCkBAIC01MTAsNyArNTI4LDcgQEAKICAgICAgICAgICAgIGV4aXQgMAogICAgICAgICBmaQogICAgIGZpCi0gICAgZXhpdCAxCisgICAgZXhpdCAzCiAgIDs7CiAKICAgKikKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9saWJyYXJpZXMuY29uZmlnIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2xpYnJhcmllcy5jb25maWcKaW5kZXggYjk5MjY3Yy4uZjFlY2FkZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2xpYnJhcmllcy5jb25maWcKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2xpYnJhcmllcy5jb25maWcKQEAgLTE3LDggKzE3LDEwIEBACiAgIG5hbWUgPSBCb3VuY3kgQ2FzdGxlIENyeXB0byB2MTQ0CiAgIHVybCA9IGh0dHA6Ly93d3cuYm91bmN5Y2FzdGxlLm9yZy9kb3dubG9hZC9iY3Byb3YtamRrMTYtMTQ0LmphcgogICBzaGExID0gNjMyN2E1ZjdhM2RjNDVlMGZkNzM1YWRiNWQwOGM1YTc0YzA1YzIwYworICByZW1vdmUgPSBiY3Byb3YtLipbLl1qYXIKIAogW2xpYnJhcnkgIm15c3FsRHJpdmVyIl0KLSAgbmFtZSA9IE15U1FMIENvbm5lY3Rvci9KIDUuMS4xMAotICB1cmwgPSBodHRwOi8vcmVwbzIubWF2ZW4ub3JnL21hdmVuMi9teXNxbC9teXNxbC1jb25uZWN0b3ItamF2YS81LjEuMTAvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4xLjEwLmphcgotICBzaGExID0gYjgzNTc0MTI0ZjFhMDBkNmY3MGQ1NmJhNjRhYTUyYjhlMTU4OGU2ZAorICBuYW1lID0gTXlTUUwgQ29ubmVjdG9yL0ogNS4xLjIxCisgIHVybCA9IGh0dHA6Ly9yZXBvMi5tYXZlbi5vcmcvbWF2ZW4yL215c3FsL215c3FsLWNvbm5lY3Rvci1qYXZhLzUuMS4yMS9teXNxbC1jb25uZWN0b3ItamF2YS01LjEuMjEuamFyCisgIHNoYTEgPSA3YWJiZDE5ZmMyZTJkNWI5MmMwODk1YWY4NTIwZjdmYTMwMjY2YmU5CisgIHJlbW92ZSA9IG15c3FsLWNvbm5lY3Rvci1qYXZhLS4qWy5damFyCmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzVGVzdC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcmllc1Rlc3QuamF2YQppbmRleCBlNzIzNDYzLi5kZjFmNDQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzVGVzdC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXNUZXN0LmphdmEKQEAgLTMwLDE2ICszMCwxNCBAQAogcHVibGljIGNsYXNzIExpYnJhcmllc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZSA9IG5ldyBTaXRlUGF0aHMobmV3IEZpbGUoIi4iKSk7Ci0gICAgZmluYWwgUmVsb2FkU2l0ZUxpYnJhcnkgcmVsb2FkID0gY3JlYXRlU3RyaWN0TW9jayhSZWxvYWRTaXRlTGlicmFyeS5jbGFzcyk7CiAgICAgZmluYWwgQ29uc29sZVVJIHVpID0gY3JlYXRlU3RyaWN0TW9jayhDb25zb2xlVUkuY2xhc3MpOwogCiAgICAgcmVwbGF5KHVpKTsKLSAgICByZXBsYXkocmVsb2FkKTsKIAogICAgIExpYnJhcmllcyBsaWIgPSBuZXcgTGlicmFyaWVzKG5ldyBQcm92aWRlcjxMaWJyYXJ5RG93bmxvYWRlcj4oKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyBMaWJyYXJ5RG93bmxvYWRlciBnZXQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeURvd25sb2FkZXIocmVsb2FkLCB1aSwgc2l0ZSk7CisgICAgICAgIHJldHVybiBuZXcgTGlicmFyeURvd25sb2FkZXIodWksIHNpdGUpOwogICAgICAgfQogICAgIH0pOwogCkBAIC00Nyw2ICs0NSw1IEBACiAgICAgYXNzZXJ0Tm90TnVsbChsaWIubXlzcWxEcml2ZXIpOwogCiAgICAgdmVyaWZ5KHVpKTsKLSAgICB2ZXJpZnkocmVsb2FkKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1VwZ3JhZGVGcm9tMl8wX3hUZXN0LmphdmEgYi9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeFRlc3QuamF2YQppbmRleCA0OTNhNDQwLi44NmYwMjYwIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeFRlc3QuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeFRlc3QuamF2YQpAQCAtNzIsOCArNzIsOCBAQAogICAgIGZpbmFsIENvbnNvbGVVSSB1aSA9IGNyZWF0ZVN0cmljdE1vY2soQ29uc29sZVVJLmNsYXNzKTsKICAgICBTZWN0aW9uLkZhY3Rvcnkgc2VjdGlvbnMgPSBuZXcgU2VjdGlvbi5GYWN0b3J5KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgU2VjdGlvbiBnZXQoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTZWN0aW9uKGZsYWdzLCBzaXRlLCB1aSwgbmFtZSk7CisgICAgICBwdWJsaWMgU2VjdGlvbiBnZXQoU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJzZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU2VjdGlvbihmbGFncywgc2l0ZSwgdWksIG5hbWUsIHN1YnNlY3Rpb24pOwogICAgICAgfQogICAgIH07CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tYXBpL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWFwaS9wb20ueG1sCmluZGV4IDg0ZjZmN2IuLjgxYTUwOTg0IDEwMDY0NAotLS0gYS9nZXJyaXQtcGx1Z2luLWFwaS9wb20ueG1sCisrKyBiL2dlcnJpdC1wbHVnaW4tYXBpL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgpAQCAtNDYsNiArNDYsMTggQEAKICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBnbTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CkBAIC02Niw4ICs3OCw4IEBACiAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5nb29nbGUuZ2Vycml0OmdlcnJpdC1wYXRjaC1jb21tb25zbmV0PC9leGNsdWRlPgogICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlLmdlcnJpdDpnZXJyaXQtcGF0Y2gtamdpdDwvZXhjbHVkZT4KICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmdvb2dsZS5nZXJyaXQ6Z2Vycml0LXV0aWwtc3NsPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlLmdlcnJpdDpqdW5pdmVyc2FsY2hhcmRldDwvZXhjbHVkZT4KIAorICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlY29kZS5qdW5pdmVyc2FsY2hhcmRldDpqdW5pdmVyc2FsY2hhcmRldDwvZXhjbHVkZT4KICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmdvb2dsZWNvZGUucHJvbG9nLWNhZmU6UHJvbG9nQ2FmZTwvZXhjbHVkZT4KICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLnNsZjRqOnNsZjRqLWxvZzRqMTI8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgIDxleGNsdWRlPmxvZzRqOmxvZzRqPC9leGNsdWRlPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1hcmNoZXR5cGUvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tYXJjaGV0eXBlL3BvbS54bWwKaW5kZXggZGQxNzk0Yi4uNzFmZWFiYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXBsdWdpbi1hcmNoZXR5cGUvcG9tLnhtbAorKysgYi9nZXJyaXQtcGx1Z2luLWFyY2hldHlwZS9wb20ueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWFyY2hldHlwZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS8uZ2l0aWdub3JlIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3NWEyZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNkMTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3BvbS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkdlcnJpdCBDb2RlIFJldmlldyAtIFdlYiBVaSBHV1QgUGx1Z2luIEFyY2hldHlwZTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8ZGVmYXVsdEdlcnJpdEFwaVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9kZWZhdWx0R2Vycml0QXBpVmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWw8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sPC9leGNsdWRlPgorICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjI5NDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFyY2hldHlwZS1kZXNjcmlwdG9yIG5hbWU9IkdlcnJpdCBQbHVnaW4iPgorICA8cmVxdWlyZWRQcm9wZXJ0aWVzPgorICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0icGx1Z2luTmFtZSIvPgorCisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiLz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9IkltcGxlbWVudGF0aW9uLVVybCIvPgorICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iR3d0LVZlcnNpb24iLz4KKworICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iZ2Vycml0QXBpVmVyc2lvbiI+CisgICAgICA8ZGVmYXVsdFZhbHVlPiR7ZGVmYXVsdEdlcnJpdEFwaVZlcnNpb259PC9kZWZhdWx0VmFsdWU+CisgICAgPC9yZXF1aXJlZFByb3BlcnR5PgorICA8L3JlcXVpcmVkUHJvcGVydGllcz4KKworICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIj4KKyAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qLmNzczwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5wbmc8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPioqLyouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5nd3QueG1sPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSI+CisgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy9Eb2N1bWVudGF0aW9uPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyoubWQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKworICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT48L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+LmdpdGlnbm9yZTwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy8uZ2l0aWdub3JlIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkNjI1NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMKKy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubTJlLmNvcmUucHJlZnMKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9MSUNFTlNFIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjllZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9MSUNFTlNFCkBAIC0wLDAgKzEsMjAxIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxYmEyMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCkBAIC0wLDAgKzEsMTI5IEBACis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgPG5hbWU+JHtwbHVnaW5OYW1lfTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8R2Vycml0LUFwaVR5cGU+ZXh0ZW5zaW9uPC9HZXJyaXQtQXBpVHlwZT4KKyAgICA8R2Vycml0LUFwaVZlcnNpb24+JHtnZXJyaXRBcGlWZXJzaW9ufTwvR2Vycml0LUFwaVZlcnNpb24+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+KiovKi4qPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yPiR7SW1wbGVtZW50YXRpb24tVmVuZG9yfTwvSW1wbGVtZW50YXRpb24tVmVuZG9yPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVVJMPiR7SW1wbGVtZW50YXRpb24tVXJsfTwvSW1wbGVtZW50YXRpb24tVVJMPgorCisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1UaXRsZT4ke0dlcnJpdC1BcGlUeXBlfSAke3Byb2plY3QuYXJ0aWZhY3RJZH08L0ltcGxlbWVudGF0aW9uLVRpdGxlPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+CisKKyAgICAgICAgICAgICAgPEdlcnJpdC1BcGlUeXBlPiR7R2Vycml0LUFwaVR5cGV9PC9HZXJyaXQtQXBpVHlwZT4KKyAgICAgICAgICAgICAgPEdlcnJpdC1BcGlWZXJzaW9uPiR7R2Vycml0LUFwaVZlcnNpb259PC9HZXJyaXQtQXBpVmVyc2lvbj4KKyAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgorICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtHd3QtVmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxtb2R1bGU+JHtwYWNrYWdlfS5IZWxsb1BsdWdpbnM8L21vZHVsZT4KKyAgICAgICAgICA8ZGlzYWJsZUNsYXNzTWV0YWRhdGE+dHJ1ZTwvZGlzYWJsZUNsYXNzTWV0YWRhdGE+CisgICAgICAgICAgPGRpc2FibGVDYXN0Q2hlY2tpbmc+dHJ1ZTwvZGlzYWJsZUNhc3RDaGVja2luZz4KKyAgICAgICAgICA8d2ViYXBwRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvc3RhdGljPC93ZWJhcHBEaXJlY3Rvcnk+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC0ke0dlcnJpdC1BcGlUeXBlfS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke0dlcnJpdC1BcGlWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wbHVnaW4tZ3d0dWk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke0dlcnJpdC1BcGlWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3d0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3d0LXVzZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke0d3dC1WZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC44LjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworICA8cmVwb3NpdG9yaWVzPgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmdlcnJpdC1hcGktcmVwb3NpdG9yeTwvaWQ+CisjaWYgKCRnZXJyaXRBcGlWZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpKQorICAgICAgPHVybD5odHRwczovL2dlcnJpdC1hcGkuY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vc25hcHNob3QvPC91cmw+CisjZWxzZQorICAgICAgPHVybD5odHRwczovL2dlcnJpdC1hcGkuY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmVsZWFzZS88L3VybD4KKyNlbmQKKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvcmVwb3NpdG9yaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9QbHVnaW5zLmd3dC54bWwgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1BsdWdpbnMuZ3d0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzcwZmNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9QbHVnaW5zLmd3dC54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtb2R1bGUgcmVuYW1lLXRvPSJoZWxsb19nd3RfcGx1Z2lucyI+CisgIDwhLS0gSW5oZXJpdCB0aGUgY29yZSBXZWIgVG9vbGtpdCBzdHVmZi4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgPGluaGVyaXRzIG5hbWU9ImNvbS5nb29nbGUuZ3d0LnVzZXIuVXNlciIvPgorICA8IS0tIE90aGVyIG1vZHVsZSBpbmhlcml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xlLmdlcnJpdC5QbHVnaW4iLz4KKyAgPGluaGVyaXRzIG5hbWU9ImNvbS5nb29nbGUuZ3d0Lmh0dHAuSFRUUCIvPgorICA8IS0tIFVzaW5nIEdXVCBidWlsdC1pbiB0aGVtZXMgYWRkcyBhIG51bWJlciBvZiBzdGF0aWMgICAgICAgICAgLS0+CisgIDwhLS0gcmVzb3VyY2VzIHRvIHRoZSBwbHVnaW4uIE5vIHRoZW1lIGluaGVyaXRzIGxpbmVzIHdlcmUgICAgICAtLT4KKyAgPCEtLSBhZGRlZCBpbiBvcmRlciB0byBtYWtlIHRoaXMgcGx1Z2luIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSAgIC0tPgorICA8IS0tIFNwZWNpZnkgdGhlIGFwcCBlbnRyeSBwb2ludCBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDxlbnRyeS1wb2ludCBjbGFzcz0iJHtwYWNrYWdlfS5jbGllbnQuSGVsbG9QbHVnaW5zIi8+CisgIDxzdHlsZXNoZWV0IHNyYz0iaGVsbG8uY3NzIi8+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015RXh0ZW5zaW9uLmphdmEgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeUV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZGJiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeUV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlICR7cGFja2FnZX07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLndlYnVpLkd3dFBsdWdpbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkxpc3RlbjsKKworQExpc3RlbgorcHVibGljIGNsYXNzIE15RXh0ZW5zaW9uIGV4dGVuZHMgR3d0UGx1Z2luIHsKKyAgcHVibGljIE15RXh0ZW5zaW9uKCkgeworICAgIHN1cGVyKCJoZWxsb19nd3RfcGx1Z2lucyIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9jbGllbnQvSGVsbG9QbHVnaW5zLmphdmEgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9jbGllbnQvSGVsbG9QbHVnaW5zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL2NsaWVudC9IZWxsb1BsdWdpbnMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYworLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgJHtwYWNrYWdlfS5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuUGx1Z2luOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRGlhbG9nQm94OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlJvb3RQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOworCisvKioKKyAqIEhlbGxvV29ybGQgUGx1Z2lucy4KKyAqLworcHVibGljIGNsYXNzIEhlbGxvUGx1Z2lucyBleHRlbmRzIFBsdWdpbiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uTW9kdWxlTG9hZCgpIHsKKyAgICBJbWFnZSBpbWcgPSBuZXcgSW1hZ2UoImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vd2VidG9vbGtpdC9sb2dvLTE4NXgxNzUucG5nIik7CisgICAgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oIkNsaWNrIG1lIik7CisKKyAgICBWZXJ0aWNhbFBhbmVsIHZQYW5lbCA9IG5ldyBWZXJ0aWNhbFBhbmVsKCk7CisgICAgdlBhbmVsLnNldFdpZHRoKCIxMDAlIik7CisgICAgdlBhbmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoVmVydGljYWxQYW5lbC5BTElHTl9DRU5URVIpOworICAgIHZQYW5lbC5hZGQoaW1nKTsKKyAgICB2UGFuZWwuYWRkKGJ1dHRvbik7CisKKyAgICBSb290UGFuZWwuZ2V0KCkuYWRkKHZQYW5lbCk7CisKKyAgICAvLyBDcmVhdGUgdGhlIGRpYWxvZyBib3gKKyAgICBmaW5hbCBEaWFsb2dCb3ggZGlhbG9nQm94ID0gbmV3IERpYWxvZ0JveCgpOworCisgICAgLy8gVGhlIGNvbnRlbnQgb2YgdGhlIGRpYWxvZyBjb21lcyBmcm9tIGEgVXNlciBzcGVjaWZpZWQgUHJlZmVyZW5jZQorICAgIGRpYWxvZ0JveC5zZXRUZXh0KCJIZWxsbyBmcm9tIEdXVCBHZXJyaXQgVUkgcGx1Z2luIik7CisgICAgZGlhbG9nQm94LnNldEFuaW1hdGlvbkVuYWJsZWQodHJ1ZSk7CisgICAgQnV0dG9uIGNsb3NlQnV0dG9uID0gbmV3IEJ1dHRvbigiQ2xvc2UiKTsKKyAgICBWZXJ0aWNhbFBhbmVsIGRpYWxvZ1ZQYW5lbCA9IG5ldyBWZXJ0aWNhbFBhbmVsKCk7CisgICAgZGlhbG9nVlBhbmVsLnNldFdpZHRoKCIxMDAlIik7CisgICAgZGlhbG9nVlBhbmVsLnNldEhvcml6b250YWxBbGlnbm1lbnQoVmVydGljYWxQYW5lbC5BTElHTl9DRU5URVIpOworICAgIGRpYWxvZ1ZQYW5lbC5hZGQoY2xvc2VCdXR0b24pOworCisgICAgY2xvc2VCdXR0b24uYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZGlhbG9nQm94LmhpZGUoKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIC8vIFNldCB0aGUgY29udGVudHMgb2YgdGhlIFdpZGdldAorICAgIGRpYWxvZ0JveC5zZXRXaWRnZXQoZGlhbG9nVlBhbmVsKTsKKworICAgIGJ1dHRvbi5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBkaWFsb2dCb3guY2VudGVyKCk7CisgICAgICAgIGRpYWxvZ0JveC5zaG93KCk7CisgICAgICB9CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLXRodW1iLnBuZyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLXRodW1iLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTcwNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvcHVibGljL2d3dC1oZWxsby1nYWRnZXRzLWlnb29nbGUtdGh1bWIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLnBuZyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQxMTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvcHVibGljL2d3dC1oZWxsby1nYWRnZXRzLWlnb29nbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9oZWxsby5jc3MgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvaGVsbG8uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODA1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvaGVsbG8uY3NzCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqIFRoZSBmaWxlIGNvbnRhaW5zIHN0eWxlcyBmb3IgYSBzYW1wbGUgcGx1Z2luIGRlcml2ZWQgZnJvbSB0aGUKKyAqIEdXVCBzdGFuZGFyZCB0aGVtZS4KKyAqIEltYWdlcyBpbiB0aGUgc3R5bGVzaGVldCBoYXZlIGJlZW4gcmVtb3ZlZCwgYXMgd2VsbCBhcyBzdHlsZXMgZm9yIHdpZGdldHMKKyAqIG5vdCBjdXJyZW50bHkgaW4gdXNlLgorICovCisKK2JvZHksIHRhYmxlIHRkLCBzZWxlY3QgeworICBmb250LWZhbWlseTogQXJpYWwgVW5pY29kZSBNUywgQXJpYWwsIHNhbnMtc2VyaWY7CisgIGZvbnQtc2l6ZTogc21hbGw7Cit9CitwcmUgeworICBmb250LWZhbWlseTogImNvdXJpZXIgbmV3IiwgY291cmllcjsKKyAgZm9udC1zaXplOiBzbWFsbDsKK30KK2JvZHkgeworICBjb2xvcjogYmxhY2s7CisgIG1hcmdpbjogMHB4OworICBib3JkZXI6IDBweDsKKyAgcGFkZGluZzogMHB4OworICBiYWNrZ3JvdW5kOiAjZmZmOworICBkaXJlY3Rpb246IGx0cjsKK30KK2EsIGE6dmlzaXRlZCwgYTpob3ZlciB7CisgIGNvbG9yOiAjMDAwMEFBOworfQorCisvKioKKyAqIFRoZSByZWZlcmVuY2UgdGhlbWUgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdGhpcyBzdHlsZSBzaGVldCBoYXMKKyAqIGxvYWRlZC4gIENyZWF0ZSBhIGhpZGRlbiBkaXYgZWxlbWVudCB3aXRoIGFic29sdXRlIHBvc2l0aW9uLCBhc3NpZ24gdGhlIHN0eWxlCisgKiBuYW1lIGJlbG93LCBhbmQgYXR0YWNoIGl0IHRvIHRoZSBET00uICBVc2UgYSB0aW1lciB0byBkZXRlY3Qgd2hlbiB0aGUKKyAqIGVsZW1lbnQncyBoZWlnaHQgYW5kIHdpZHRoIGFyZSBzZXQgdG8gNXB4LgorICovCisuZ3d0LVJlZmVyZW5jZS1zdGFuZGFyZCB7CisgIGhlaWdodDogNXB4OworICB3aWR0aDogNXB4OworICB6b29tOiAxOworfQorCisuZ3d0LUJ1dHRvbiB7CisgIG1hcmdpbjogMDsKKyAgcGFkZGluZzogM3B4IDVweDsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICBmb250LXNpemU6IHNtYWxsOworICBjdXJzb3I6IHBvaW50ZXI7CisgIGN1cnNvcjogaGFuZDsKKyAgYm9yZGVyOiAxcHggb3V0c2V0ICNjY2M7Cit9CisuZ3d0LUJ1dHRvbjphY3RpdmUgeworICBib3JkZXI6IDFweCBpbnNldCAjY2NjOworfQorLmd3dC1CdXR0b246aG92ZXIgeworICBib3JkZXItY29sb3I6ICM5Y2YgIzY5ZSAjNjllICM3YWY7Cit9CisuZ3d0LUJ1dHRvbltkaXNhYmxlZF0geworICBjdXJzb3I6IGRlZmF1bHQ7CisgIGNvbG9yOiAjODg4OworfQorLmd3dC1CdXR0b25bZGlzYWJsZWRdOmhvdmVyIHsKKyAgYm9yZGVyOiAxcHggb3V0c2V0ICNjY2M7Cit9CisKKy5nd3QtRGlhbG9nQm94IC5DYXB0aW9uIHsKKyAgYmFja2dyb3VuZDogI2UzZThmMzsKKyAgcGFkZGluZzogNHB4IDRweCA0cHggOHB4OworICBjdXJzb3I6IGRlZmF1bHQ7CisgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYmJiYmJiOworICBib3JkZXItdG9wOiA1cHggc29saWQgI2QwZTRmNjsKKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZDBlNGY2OworICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCAjZDBlNGY2OworfQorCisuZ3d0LURpYWxvZ0JveCAuZGlhbG9nQ29udGVudCB7Cit9CisKKy5nd3QtRGlhbG9nQm94IC5kaWFsb2dNaWRkbGVDZW50ZXIgeworICBwYWRkaW5nOiAzcHg7CisgIGJhY2tncm91bmQ6IHdoaXRlOworICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNkMGU0ZjY7CisgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkICNkMGU0ZjY7CisgIGJvcmRlci1ib3R0b206IDVweCBzb2xpZCAjZDBlNGY2OworfQorCisuZ3d0LURpYWxvZ0JveCAuZGlhbG9nVG9wTGVmdElubmVyIHsKKyAgd2lkdGg6IDVweDsKKyAgem9vbTogMTsKK30KKy5nd3QtRGlhbG9nQm94IC5kaWFsb2dUb3BSaWdodElubmVyIHsKKyAgd2lkdGg6IDhweDsKKyAgem9vbTogMTsKK30KKy5nd3QtRGlhbG9nQm94IC5kaWFsb2dCb3R0b21MZWZ0SW5uZXIgeworICB3aWR0aDogNXB4OworICBoZWlnaHQ6IDhweDsKKyAgem9vbTogMTsKK30KKworLmd3dC1EaWFsb2dCb3ggLmRpYWxvZ0JvdHRvbVJpZ2h0SW5uZXIgeworICB3aWR0aDogNXB4OworICBoZWlnaHQ6IDhweDsKKyAgem9vbTogMTsKK30KKwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3R1aS8uZ2l0aWdub3JlIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2YxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpLy5naXRpZ25vcmUKQEAgLTAsMCArMSw2IEBACisvdGFyZ2V0CisvLmNsYXNzcGF0aAorLy5wcm9qZWN0CisvLnNldHRpbmdzL29yZy5tYXZlbi5pZGUuZWNsaXBzZS5wcmVmcworLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5tMmUuY29yZS5wcmVmcworL2dlcnJpdC1nd3R1aS1wbHVnaW4uaW1sCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWQ2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMCwwICsxLDUgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlbmNvZGluZy8vc3JjL21haW4vamF2YT1VVEYtOAorZW5jb2RpbmcvL3NyYy9tYWluL3Jlc291cmNlcz1VVEYtOAorZW5jb2RpbmcvL3NyYy90ZXN0L2phdmE9VVRGLTgKK2VuY29kaW5nLzxwcm9qZWN0Pj1VVEYtOApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9nZXJyaXQtcGx1Z2luLWd3dHVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTVlMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTAsMCArMSwyOTUgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2xpbmVfY29tbWVudF9zdGFydGluZ19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX2xpbmVzX2luX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5qb2luX3dyYXBwZWRfbGluZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0zCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTg4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw3IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZm9ybWF0dGVyX3Byb2ZpbGU9X0dvb2dsZSBGb3JtYXQKK2Zvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCitvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQorb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYwODcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9wb20ueG1sCkBAIC0wLDAgKzEsMTI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorCisgIDxhcnRpZmFjdElkPmdlcnJpdC1wbHVnaW4tZ3d0dWk8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkdlcnJpdCBDb2RlIFJldmlldyAtIFBsdWdpbiBHV1QgVUk8L25hbWU+CisKKyAgPGRlc2NyaXB0aW9uPgorICAgIEFQSSBmb3IgVUkgcGx1Z2lucyB0byBidWlsZCB3aXRoIEdXVCBhbmQgaW50ZWdyYXRlIHdpdGggR2Vycml0CisgIDwvZGVzY3JpcHRpb24+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3d0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3d0LXVzZXI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd3dC1kZXY8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworICAgPGJ1aWxkPgorICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm0yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlmZWN5Y2xlLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICA8bGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uUmFuZ2U+WzIuNS4wLCk8L3ZlcnNpb25SYW5nZT4KKyAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVzb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5pMThuPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZUFzeW5jPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGUgLz4KKyAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPlsyLjEuMSwpPC92ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmV4cGxvZGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICA8YWN0aW9uPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGUgLz4KKyAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb24+CisgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgPC9saWZlY3ljbGVNYXBwaW5nTWV0YWRhdGE+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPG1vZHVsZT5jb20uZ29vZ2xlLmdlcnJpdC5QbHVnaW48L21vZHVsZT4KKyAgICAgICAgICA8ZGlzYWJsZUNsYXNzTWV0YWRhdGE+dHJ1ZTwvZGlzYWJsZUNsYXNzTWV0YWRhdGE+CisgICAgICAgICAgPGRpc2FibGVDYXN0Q2hlY2tpbmc+dHJ1ZTwvZGlzYWJsZUNhc3RDaGVja2luZz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5yZXNvdXJjZXM8L2dvYWw+CisgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9QbHVnaW4uZ3d0LnhtbCBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9QbHVnaW4uZ3d0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2VkZjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L1BsdWdpbi5nd3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzwhLS0KKyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtb2R1bGU+CisgIDxkZWZpbmUtbGlua2VyIG5hbWU9ImdlcnJpdF9wbHVnaW4iIGNsYXNzPSJjb20uZ29vZ2xlLmdlcnJpdC5saW5rZXIuR2Vycml0UGx1Z2luTGlua2VyIi8+CisgIDxhZGQtbGlua2VyIG5hbWU9ImdlcnJpdF9wbHVnaW4iLz4KKyAgPGdlbmVyYXRlLXdpdGggY2xhc3M9ImNvbS5nb29nbGUuZ2Vycml0LnJlYmluZC5QbHVnaW5HZW5lcmF0b3IiPgorICAgIDx3aGVuLXR5cGUtYXNzaWduYWJsZSBjbGFzcz0iY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlBsdWdpbiIvPgorICA8L2dlbmVyYXRlLXdpdGg+CisgIDxzb3VyY2UgcGF0aD0iY2xpZW50Ii8+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvUGx1Z2luLmphdmEgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1BsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOTFiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1BsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5FbnRyeVBvaW50OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHdyaXRpbmcgR2Vycml0IFdlYiBVSSBwbHVnaW5zCisgKgorICogV3JpdGluZyBhIHBsdWdpbjoKKyAqIDxvbD4KKyAqIDxsaT5EZWNsYXJlIHN1YnR5cGUgb2YgUGx1Z2luPC9saT4KKyAqIDxsaT5CaW5kIFdlYlVpUGx1Z2luIHRvIEd3dFBsdWdpbiBpbXBsZW1lbnRhdGlvbiBpbiBHZXJyaXQtTW9kdWxlPC9saT4KKyAqIDwvb2w+CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBQbHVnaW4gaW1wbGVtZW50cyBFbnRyeVBvaW50IHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9saW5rZXIvR2Vycml0UGx1Z2luTGlua2VyLmphdmEgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvbGlua2VyL0dlcnJpdFBsdWdpbkxpbmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDMzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvbGlua2VyL0dlcnJpdFBsdWdpbkxpbmtlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5saW5rZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmV4dC5MaW5rZXJDb250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUubGlua2VyLkNyb3NzU2l0ZUlmcmFtZUxpbmtlcjsKKworLyoqIEZpbmFsaXplcyB0aGUgbW9kdWxlIG1hbmlmZXN0IGZpbGUgd2l0aCB0aGUgc2VsZWN0aW9uIHNjcmlwdC4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHZXJyaXRQbHVnaW5MaW5rZXIgZXh0ZW5kcyBDcm9zc1NpdGVJZnJhbWVMaW5rZXIgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gIkdlcnJpdCBHV1QgVUkgcGx1Z2luIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgU3RyaW5nIGdldEpzQ29tcHV0ZVVybEZvclJlc291cmNlKExpbmtlckNvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiAiY29tL2dvb2dsZS9nZXJyaXQvbGlua2VyL2NvbXB1dGVVcmxGb3JQbHVnaW5SZXNvdXJjZS5qcyI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZWJpbmQvUGx1Z2luR2VuZXJhdG9yLmphdmEgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmViaW5kL1BsdWdpbkdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzNlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmViaW5kL1BsdWdpbkdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmViaW5kOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmV4dC5HZW5lcmF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQuR2VuZXJhdG9yQ29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmV4dC5UcmVlTG9nZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuZXh0LlVuYWJsZVRvQ29tcGxldGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQudHlwZWluZm8uSkNsYXNzVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmV4dC50eXBlaW5mby5UeXBlT3JhY2xlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIucmViaW5kLkNsYXNzU291cmNlRmlsZUNvbXBvc2VyRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLnJlYmluZC5Tb3VyY2VXcml0ZXI7CisKKy8qKgorICogV3JpdGUgdGhlIHRvcCBsYXllciBpbiB0aGUgR2FkZ2V0IGJvb3RzdHJhcCBzYW5kd2ljaCBhbmQgZ2VuZXJhdGUgYSBzdHViCisgKiBtYW5pZmVzdCB0aGF0IHdpbGwgYmUgY29tcGxldGVkIGJ5IHRoZSBsaW5rZXIuCisgKgorICogQmFzZWQgb24gZ3d0LWdhZGdldHMgR2FkZ2V0R2VuZXJhdG9yIGNsYXNzCisgKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5HZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShUcmVlTG9nZ2VyIGxvZ2dlciwgR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0LAorICAgICAgU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgVW5hYmxlVG9Db21wbGV0ZUV4Y2VwdGlvbiB7CisKKyAgICAvLyBUaGUgVHlwZU9yYWNsZSBrbm93cyBhYm91dCBhbGwgdHlwZXMgaW4gdGhlIHR5cGUgc3lzdGVtCisgICAgVHlwZU9yYWNsZSB0eXBlT3JhY2xlID0gY29udGV4dC5nZXRUeXBlT3JhY2xlKCk7CisKKyAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgdGhhdCB0aGUgZ2VuZXJhdG9yIHNob3VsZCBpbXBsZW1lbnQKKyAgICBKQ2xhc3NUeXBlIHNvdXJjZVR5cGUgPSB0eXBlT3JhY2xlLmZpbmRUeXBlKHR5cGVOYW1lKTsKKworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSByZXF1ZXN0ZWQgdHlwZSBleGlzdHMKKyAgICBpZiAoc291cmNlVHlwZSA9PSBudWxsKSB7CisgICAgICBsb2dnZXIubG9nKFRyZWVMb2dnZXIuRVJST1IsICJDb3VsZCBub3QgZmluZCByZXF1ZXN0ZWQgdHlwZU5hbWUiLCBudWxsKTsKKyAgICAgIHRocm93IG5ldyBVbmFibGVUb0NvbXBsZXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRoZSBHYWRnZXQgdHlwZSBpcyBjb3JyZWN0bHkgZGVmaW5lZAorICAgIHZhbGlkYXRlVHlwZShsb2dnZXIsIHNvdXJjZVR5cGUpOworCisgICAgLy8gUGljayBhIG5hbWUgZm9yIHRoZSBnZW5lcmF0ZWQgY2xhc3MgdG8gbm90IGNvbmZsaWN0LgorICAgIFN0cmluZyBnZW5lcmF0ZWRTaW1wbGVTb3VyY2VOYW1lID0gc291cmNlVHlwZS5nZXRTaW1wbGVTb3VyY2VOYW1lKCkKKyAgICAgICAgKyAiUGx1Z2luSW1wbCI7CisKKyAgICAvLyBCZWdpbiB3cml0aW5nIHRoZSBnZW5lcmF0ZWQgc291cmNlLgorICAgIENsYXNzU291cmNlRmlsZUNvbXBvc2VyRmFjdG9yeSBmID0gbmV3IENsYXNzU291cmNlRmlsZUNvbXBvc2VyRmFjdG9yeSgKKyAgICAgICAgc291cmNlVHlwZS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBnZW5lcmF0ZWRTaW1wbGVTb3VyY2VOYW1lKTsKKyAgICBmLmFkZEltcG9ydChHV1QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBmLnNldFN1cGVyY2xhc3ModHlwZU5hbWUpOworCisgICAgLy8gQWxsIHNvdXJjZSBnZXRzIHdyaXR0ZW4gdGhyb3VnaCB0aGlzIFdyaXRlcgorICAgIFByaW50V3JpdGVyIG91dCA9IGNvbnRleHQudHJ5Q3JlYXRlKGxvZ2dlciwKKyAgICAgICAgc291cmNlVHlwZS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBnZW5lcmF0ZWRTaW1wbGVTb3VyY2VOYW1lKTsKKworICAgIC8vIElmIGFuIGltcGxlbWVudGF0aW9uIGFscmVhZHkgZXhpc3RzLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSB3b3JrCisgICAgaWYgKG91dCAhPSBudWxsKSB7CisKKyAgICAgIC8vIFdlIHJlYWxseSB1c2UgYSBTb3VyY2VXcml0ZXIgc2luY2UgaXQncyBjb252ZW5pZW50CisgICAgICBTb3VyY2VXcml0ZXIgc3cgPSBmLmNyZWF0ZVNvdXJjZVdyaXRlcihjb250ZXh0LCBvdXQpOworICAgICAgc3cuY29tbWl0KGxvZ2dlcik7CisgICAgfQorCisgICAgcmV0dXJuIGYuZ2V0Q3JlYXRlZENsYXNzTmFtZSgpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKFRyZWVMb2dnZXIgbG9nZ2VyLCBKQ2xhc3NUeXBlIHR5cGUpCisgICAgICB0aHJvd3MgVW5hYmxlVG9Db21wbGV0ZUV4Y2VwdGlvbiB7CisgICAgaWYgKCF0eXBlLmlzRGVmYXVsdEluc3RhbnRpYWJsZSgpKSB7CisgICAgICBsb2dnZXIubG9nKFRyZWVMb2dnZXIuRVJST1IsICJQbHVnaW4gdHlwZXMgbXVzdCBiZSBkZWZhdWx0IGluc3RhbnRpYWJsZSIsCisgICAgICAgICAgbnVsbCk7CisgICAgICB0aHJvdyBuZXcgVW5hYmxlVG9Db21wbGV0ZUV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvbGlua2VyL2NvbXB1dGVVcmxGb3JQbHVnaW5SZXNvdXJjZS5qcyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9jb21wdXRlVXJsRm9yUGx1Z2luUmVzb3VyY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyMGU5NAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9jb21wdXRlVXJsRm9yUGx1Z2luUmVzb3VyY2UuanMKQEAgLTAsMCArMSwzIEBACitmdW5jdGlvbiBjb21wdXRlVXJsRm9yUmVzb3VyY2UocmVzb3VyY2UpIHsKKyAgcmV0dXJuIF9fTU9EVUxFX0ZVTkNfXy5fX21vZHVsZUJhc2UgKyByZXNvdXJjZTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlLy5naXRpZ25vcmUgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzVhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwZjUzYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3BvbS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZTwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+R2Vycml0IENvZGUgUmV2aWV3IC0gV2ViIFVJIEphdmFTY3JpcHQgUGx1Z2luIEFyY2hldHlwZTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8ZGVmYXVsdEdlcnJpdEFwaVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9kZWZhdWx0R2Vycml0QXBpVmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxidWlsZD4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWw8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sPC9leGNsdWRlPgorICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRjYWFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGFyY2hldHlwZS1kZXNjcmlwdG9yIG5hbWU9IkdlcnJpdCBQbHVnaW4iPgorICA8cmVxdWlyZWRQcm9wZXJ0aWVzPgorICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0icGx1Z2luTmFtZSIvPgorCisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJJbXBsZW1lbnRhdGlvbi1WZW5kb3IiLz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9IkltcGxlbWVudGF0aW9uLVVybCIvPgorCisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJnZXJyaXRBcGlUeXBlIj4KKyAgICAgIDxkZWZhdWx0VmFsdWU+anM8L2RlZmF1bHRWYWx1ZT4KKyAgICA8L3JlcXVpcmVkUHJvcGVydHk+CisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJnZXJyaXRBcGlWZXJzaW9uIj4KKyAgICAgIDxkZWZhdWx0VmFsdWU+JHtkZWZhdWx0R2Vycml0QXBpVmVyc2lvbn08L2RlZmF1bHRWYWx1ZT4KKyAgICA8L3JlcXVpcmVkUHJvcGVydHk+CisgIDwvcmVxdWlyZWRQcm9wZXJ0aWVzPgorCisgIDxmaWxlU2V0cz4KKyAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiPgorICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyouamF2YTwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2pzPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyouanM8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKworICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIj4KKyAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzL0RvY3VtZW50YXRpb248L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5tZDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorCisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4uZ2l0aWdub3JlPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+Cis8L2FyY2hldHlwZS1kZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvLmdpdGlnbm9yZSBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkNjI1NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw1IEBACisvdGFyZ2V0CisvLmNsYXNzcGF0aAorLy5wcm9qZWN0CisvLnNldHRpbmdzL29yZy5tYXZlbi5pZGUuZWNsaXBzZS5wcmVmcworLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5tMmUuY29yZS5wcmVmcwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvTElDRU5TRSBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjllZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMDEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKK1RFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisxLiBEZWZpbml0aW9ucy4KKworICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKzIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCiszLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCis2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCis3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCis5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKK0VORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCitBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCisKKyAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCisgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCisgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQorICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQorICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQorICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCisgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCisKK0NvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4YjQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTAsMCArMSwxMjEgQEAKKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICA8bmFtZT4ke3BsdWdpbk5hbWV9PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxHZXJyaXQtQXBpVHlwZT4ke2dlcnJpdEFwaVR5cGV9PC9HZXJyaXQtQXBpVHlwZT4KKyAgICA8R2Vycml0LUFwaVZlcnNpb24+JHtnZXJyaXRBcGlWZXJzaW9ufTwvR2Vycml0LUFwaVZlcnNpb24+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+KiovKi5qczwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPioqLyouY2xhc3M8L2luY2x1ZGU+CisgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZW5kb3I+JHtJbXBsZW1lbnRhdGlvbi1WZW5kb3J9PC9JbXBsZW1lbnRhdGlvbi1WZW5kb3I+CisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1VUkw+JHtJbXBsZW1lbnRhdGlvbi1Vcmx9PC9JbXBsZW1lbnRhdGlvbi1VUkw+CisKKyAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPiR7R2Vycml0LUFwaVR5cGV9ICR7cHJvamVjdC5hcnRpZmFjdElkfTwvSW1wbGVtZW50YXRpb24tVGl0bGU+CisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvSW1wbGVtZW50YXRpb24tVmVyc2lvbj4KKworICAgICAgICAgICAgICA8R2Vycml0LUFwaVR5cGU+JHtHZXJyaXQtQXBpVHlwZX08L0dlcnJpdC1BcGlUeXBlPgorICAgICAgICAgICAgICA8R2Vycml0LUFwaVZlcnNpb24+JHtHZXJyaXQtQXBpVmVyc2lvbn08L0dlcnJpdC1BcGlWZXJzaW9uPgorICAgICAgICAgICAgPC9tYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMy4yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8c291cmNlPjEuNjwvc291cmNlPgorICAgICAgICAgIDx0YXJnZXQ+MS42PC90YXJnZXQ+CisgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXJlc291cmNlczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1yZXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jb3B5LXJlc291cmNlczwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC9jbGFzc2VzL3N0YXRpYzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vanM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtZXh0ZW5zaW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7R2Vycml0LUFwaVZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCisgIDxyZXBvc2l0b3JpZXM+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+Z2Vycml0LWFwaS1yZXBvc2l0b3J5PC9pZD4KKyNpZiAoJGdlcnJpdEFwaVZlcnNpb24uZW5kc1dpdGgoIlNOQVBTSE9UIikpCisgICAgICA8dXJsPmh0dHBzOi8vZ2Vycml0LWFwaS5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9zbmFwc2hvdC88L3VybD4KKyNlbHNlCisgICAgICA8dXJsPmh0dHBzOi8vZ2Vycml0LWFwaS5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9yZWxlYXNlLzwvdXJsPgorI2VuZAorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9yZXBvc2l0b3JpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015SnNFeHRlbnNpb24uamF2YSBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlKc0V4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzkxNGRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeUpzRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlICR7cGFja2FnZX07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkxpc3RlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLndlYnVpLkphdmFTY3JpcHRQbHVnaW47CisKK0BMaXN0ZW4KK3B1YmxpYyBjbGFzcyBNeUpzRXh0ZW5zaW9uIGV4dGVuZHMgSmF2YVNjcmlwdFBsdWdpbiB7CisgIHB1YmxpYyBNeUpzRXh0ZW5zaW9uKCkgeworICAgIHN1cGVyKCJoZWxsby1qcy1wbHVnaW5zLmpzIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2pzL2hlbGxvLWpzLXBsdWdpbnMuanMgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qcy9oZWxsby1qcy1wbHVnaW5zLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTFhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qcy9oZWxsby1qcy1wbHVnaW5zLmpzCkBAIC0wLDAgKzEgQEAKK2FsZXJ0KCJHcmVldGluZyBmcm9tIEphdmFTY3JpcHQgR2Vycml0IHBsdWdpbiEiKTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvcG9tLnhtbCBiL2dlcnJpdC1wcmV0dGlmeS9wb20ueG1sCmluZGV4IDkzNTQyNzQuLjRkYjEwNTYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9wb20ueG1sCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcHJldHRpZnk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvQ2xpZW50U2lkZUZvcm1hdHRlci5qYXZhIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L0NsaWVudFNpZGVGb3JtYXR0ZXIuamF2YQppbmRleCA0YmNlOTU0Li4xNDM2YmJhIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvQ2xpZW50U2lkZUZvcm1hdHRlci5qYXZhCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9DbGllbnRTaWRlRm9ybWF0dGVyLmphdmEKQEAgLTM5LDE1ICszOSwyNSBAQAogICAgIFJvb3RQYW5lbC5nZXQoKS5hZGQocHJldHRpZnkpOwogCiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5jb3JlKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19hcG9sbG8oKSk7CisgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX2NsaigpKTsKICAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfY3NzKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19kYXJ0KCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19nbygpKTsKICAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfaHMoKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX2xpc3AoKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX2x1YSgpKTsKICAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfbWwoKSk7CisgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX24oKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX3Byb3RvKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19zY2FsYSgpKTsKICAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfc3FsKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ190ZXgoKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX3ZiKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ192aGRsKCkpOwogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ193aWtpKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ194cSgpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfeWFtbCgpKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L1Jlc291cmNlcy5qYXZhIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L1Jlc291cmNlcy5qYXZhCmluZGV4IDc0NWM5MjEuLmY1M2M5MWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9SZXNvdXJjZXMuamF2YQorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvUmVzb3VyY2VzLmphdmEKQEAgLTMyLDMzICszMiwyMyBAQAogICBAU291cmNlKCJwcmV0dGlmeS5qcyIpCiAgIFRleHRSZXNvdXJjZSBjb3JlKCk7CiAKLSAgQFNvdXJjZSgibGFuZy1hcG9sbG8uanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19hcG9sbG8oKTsKLQotICBAU291cmNlKCJsYW5nLWNzcy5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX2NzcygpOwotCi0gIEBTb3VyY2UoImxhbmctaHMuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19ocygpOwotCi0gIEBTb3VyY2UoImxhbmctbGlzcC5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX2xpc3AoKTsKLQotICBAU291cmNlKCJsYW5nLWx1YS5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX2x1YSgpOwotCi0gIEBTb3VyY2UoImxhbmctbWwuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19tbCgpOwotCi0gIEBTb3VyY2UoImxhbmctcHJvdG8uanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19wcm90bygpOwotCi0gIEBTb3VyY2UoImxhbmctc3FsLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfc3FsKCk7Ci0KLSAgQFNvdXJjZSgibGFuZy12Yi5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX3ZiKCk7Ci0KLSAgQFNvdXJjZSgibGFuZy13aWtpLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfd2lraSgpOworICBAU291cmNlKCJsYW5nLWFwb2xsby5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2Fwb2xsbygpOworICBAU291cmNlKCJsYW5nLWNsai5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2NsaigpOworICBAU291cmNlKCJsYW5nLWNzcy5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2NzcygpOworICBAU291cmNlKCJsYW5nLWRhcnQuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19kYXJ0KCk7CisgIEBTb3VyY2UoImxhbmctZ28uanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19nbygpOworICBAU291cmNlKCJsYW5nLWhzLmpzIikgVGV4dFJlc291cmNlIGxhbmdfaHMoKTsKKyAgQFNvdXJjZSgibGFuZy1saXNwLmpzIikgVGV4dFJlc291cmNlIGxhbmdfbGlzcCgpOworICBAU291cmNlKCJsYW5nLWx1YS5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2x1YSgpOworICBAU291cmNlKCJsYW5nLW1sLmpzIikgVGV4dFJlc291cmNlIGxhbmdfbWwoKTsKKyAgQFNvdXJjZSgibGFuZy1uLmpzIikgVGV4dFJlc291cmNlIGxhbmdfbigpOworICBAU291cmNlKCJsYW5nLXByb3RvLmpzIikgVGV4dFJlc291cmNlIGxhbmdfcHJvdG8oKTsKKyAgQFNvdXJjZSgibGFuZy1zY2FsYS5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3NjYWxhKCk7CisgIEBTb3VyY2UoImxhbmctc3FsLmpzIikgVGV4dFJlc291cmNlIGxhbmdfc3FsKCk7CisgIEBTb3VyY2UoImxhbmctdGV4LmpzIikgVGV4dFJlc291cmNlIGxhbmdfdGV4KCk7CisgIEBTb3VyY2UoImxhbmctdmIuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ192YigpOworICBAU291cmNlKCJsYW5nLXZoZGwuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ192aGRsKCk7CisgIEBTb3VyY2UoImxhbmctd2lraS5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3dpa2koKTsKKyAgQFNvdXJjZSgibGFuZy14cS5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3hxKCk7CisgIEBTb3VyY2UoImxhbmcteWFtbC5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3lhbWwoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9QcmV0dHlGb3JtYXR0ZXIuamF2YSBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9QcmV0dHlGb3JtYXR0ZXIuamF2YQppbmRleCAxNTExNDliLi41MTFiMDU2IDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jb21tb24vUHJldHR5Rm9ybWF0dGVyLmphdmEKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY29tbW9uL1ByZXR0eUZvcm1hdHRlci5qYXZhCkBAIC0xMzUsMTEgKzEzNSwyMSBAQAogICAgICAgLy8gY29uZnVzZSB0aGUgcGFyc2VyLgogICAgICAgLy8KICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2VBbGwoIiYjMzk7IiwgIiciKTsKLSAgICAgIGh0bWwgPSBwcmV0dGlmeShodG1sLCBnZXRGaWxlVHlwZSgpKTsKIAorICAgICAgLy8gSWYgYSBsaW5lIGlzIG1vZGlmaWVkIGF0IGl0cyBlbmQgYW5kIHRoZSBsaW5lIGVuZGluZyBpcyBjaGFuZ2VkIGZyb20KKyAgICAgIC8vICdcbicgdG8gJ1xyXG4nIHRoZW4gdGhlICdccicgb2YgdGhlIG5ldyBsaW5lIGlzIHBhcnQgb2YgdGhlIG1vZGlmaWVkCisgICAgICAvLyB0ZXh0LiBJZiBpbnRyYWxpbmUgZGlmZnMgYXJlIGhpZ2hsaWdodGVkIHRoZSBtb2RpZmllZCB0ZXh0IGlzCisgICAgICAvLyBzdXJyb3VuZGVkIGJ5IGEgJ3NwYW4nIHRhZy4gQXMgcmVzdWx0ICdccicgYW5kICdcbicgb2YgdGhlIG5ldyBsaW5lIGdldAorICAgICAgLy8gc2VwYXJhdGVkIGJ5ICc8L3NwYW4+Jy4gRm9yIHRoZSBwcmV0dGlmeSBwYXJzZXIgdGhpcyBub3cgbG9va3MgbGlrZSB0d28KKyAgICAgIC8vIHNlcGFyYXRlIGxpbmUgZW5kaW5ncy4gVGhpcyBtZXNzZXMgdXAgdGhlIGxpbmUgY291bnRpbmcgYmVsb3cuCisgICAgICAvLyBEcm9wIGFueSAnXHInIHRvIGF2b2lkIHRoaXMgcHJvYmxlbS4KKyAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoIlxyPC9zcGFuPlxuIiwgIjwvc3Bhbj5cbiIpOworCisgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCJcbiIsICIgXG4iKTsKKyAgICAgIGh0bWwgPSBwcmV0dGlmeShodG1sLCBnZXRGaWxlVHlwZSgpKTsKKyAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoIiBcbiIsICJcbiIpOwogICAgIH0gZWxzZSB7CiAgICAgICBodG1sID0gZXhwYW5kVGFicyhodG1sKTsKLSAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2VBbGwoIlxuIiwgIjxiciAvPiIpOwogICAgIH0KIAogICAgIGludCBwb3MgPSAwOwpAQCAtMTUyLDggKzE2Miw5IEBACiAgICAgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICB3aGlsZSAocG9zIDw9IGh0bWwubGVuZ3RoKCkpIHsKICAgICAgIGludCB0YWdTdGFydCA9IGh0bWwuaW5kZXhPZignPCcsIHBvcyk7CisgICAgICBpbnQgbGYgPSBodG1sLmluZGV4T2YoJ1xuJywgcG9zKTsKIAotICAgICAgaWYgKHRhZ1N0YXJ0IDwgMCkgeworICAgICAgaWYgKHRhZ1N0YXJ0IDwgMCAmJiBsZiA8IDApIHsKICAgICAgICAgLy8gTm8gbW9yZSB0YWdzIHJlbWFpbmluZy4gV2hhdCdzIGxlZnQgaXMgcGxhaW4gdGV4dC4KICAgICAgICAgLy8KICAgICAgICAgYXNzZXJ0IGxhc3RUYWcgPT0gVGFnLk5VTEw7CkBAIC0xNjcsNiArMTc4LDIyIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogCisgICAgICAvLyBMaW5lIGVuZCBvY2N1cnMgYmVmb3JlIHRoZSBuZXh0IEhUTUwgdGFnLiBCcmVhayB0aGUgbGluZS4KKyAgICAgIGlmICgwIDw9IGxmICYmIChsZiA8IHRhZ1N0YXJ0IHx8IHRhZ1N0YXJ0IDwgMCkpIHsKKyAgICAgICAgaWYgKHRleHRDaHVua1N0YXJ0IDwgbGYpIHsKKyAgICAgICAgICBsYXN0VGFnLm9wZW4oYnVmLCBodG1sKTsKKyAgICAgICAgICBodG1sVGV4dChodG1sLnN1YnN0cmluZyh0ZXh0Q2h1bmtTdGFydCwgbGYpKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBsZiArIDE7CisgICAgICAgIHRleHRDaHVua1N0YXJ0ID0gcG9zOworCisgICAgICAgIGxhc3RUYWcuY2xvc2UoYnVmLCBodG1sKTsKKyAgICAgICAgY29udGVudC5hZGRMaW5lKHNyYy5tYXBJbmRleFRvTGluZShsaW5lSWR4KyspLCBidWYudG9TdHJpbmcoKSk7CisgICAgICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCiAgICAgICAvLyBBc3N1bWUgbm8gYXR0cmlidXRlIGNvbnRhaW5zICc+JyBhbmQgdGhhdCBhbGwgdGFncwogICAgICAgLy8gd2l0aGluIHRoZSBIVE1MIHdpbGwgYmUgd2VsbC1mb3JtZWQuCiAgICAgICAvLwpAQCAtMTgzLDE0ICsyMTAsNyBAQAogICAgICAgfQogICAgICAgdGV4dENodW5rU3RhcnQgPSBwb3M7CiAKLSAgICAgIGlmIChpc0JSKGh0bWwsIHRhZ1N0YXJ0LCB0YWdFbmQpKSB7Ci0gICAgICAgIGxhc3RUYWcuY2xvc2UoYnVmLCBodG1sKTsKLSAgICAgICAgY29udGVudC5hZGRMaW5lKHNyYy5tYXBJbmRleFRvTGluZShsaW5lSWR4KSwgYnVmLnRvU3RyaW5nKCkpOwotICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBjb2wgPSAwOwotICAgICAgICBsaW5lSWR4Kys7Ci0KLSAgICAgIH0gZWxzZSBpZiAoaHRtbC5jaGFyQXQodGFnU3RhcnQgKyAxKSA9PSAnLycpIHsKKyAgICAgIGlmIChodG1sLmNoYXJBdCh0YWdTdGFydCArIDEpID09ICcvJykgewogICAgICAgICBsYXN0VGFnID0gbGFzdFRhZy5wb3AoYnVmLCBodG1sKTsKIAogICAgICAgfSBlbHNlIGlmIChodG1sLmNoYXJBdCh0YWdFbmQgLSAxKSAhPSAnLycpIHsKQEAgLTI0NSwxMyArMjY1LDYgQEAKICAgLyoqIFJ1biB0aGUgcHJldHRpZnkgZW5naW5lIG92ZXIgdGhlIHRleHQgYW5kIHJldHVybiB0aGUgcmVzdWx0LiAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHByZXR0aWZ5KFN0cmluZyBodG1sLCBTdHJpbmcgdHlwZSk7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0JSKFN0cmluZyBodG1sLCBpbnQgdGFnU3RhcnQsIGludCB0YWdFbmQpIHsKLSAgICByZXR1cm4gdGFnRW5kIC0gdGFnU3RhcnQgPT0gNSAvLwotICAgICAgICAmJiBodG1sLmNoYXJBdCh0YWdTdGFydCArIDEpID09ICdiJyAvLwotICAgICAgICAmJiBodG1sLmNoYXJBdCh0YWdTdGFydCArIDIpID09ICdyJyAvLwotICAgICAgICAmJiBodG1sLmNoYXJBdCh0YWdTdGFydCArIDMpID09ICcgJzsKLSAgfQotCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhZyB7CiAgICAgc3RhdGljIGZpbmFsIFRhZyBOVUxMID0gbmV3IFRhZyhudWxsLCAwLCAwKSB7CiAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9TcGFyc2VGaWxlQ29udGVudC5qYXZhIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY29tbW9uL1NwYXJzZUZpbGVDb250ZW50LmphdmEKaW5kZXggMWE1NDY4Yy4uNjA5ZjA5MSAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY29tbW9uL1NwYXJzZUZpbGVDb250ZW50LmphdmEKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY29tbW9uL1NwYXJzZUZpbGVDb250ZW50LmphdmEKQEAgLTI5Niw2ICsyOTYsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIC8vIFVzYWdlIG9mIFsgYW5kICkgaXMgaW50ZW50aW9uYWwgdG8gZGVub3RlIGluY2x1c2l2ZS9leGNsdXNpdmUgcmFuZ2UKICAgICAgIHJldHVybiAiUmFuZ2VbIiArIGJhc2UgKyAiLCIgKyBlbmQoKSArICIpIjsKICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctYXBvbGxvLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1hcG9sbG8uanMKaW5kZXggNDA0MjAzMC4uOTllNGE5NyAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1hcG9sbG8uanMKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1hcG9sbG8uanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX0NPTU1FTlQsL14jW15cclxuXSovLG51bGwsJyMnXSxbUFIuUFJfUExBSU4sL15bXHRcblxyIFx4QTBdKy8sbnVsbCwnCVxuXHIgXHhhMCddLFtQUi5QUl9TVFJJTkcsL15cIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpLyxudWxsLCdcIiddXSxbW1BSLlBSX0tFWVdPUkQsL14oPzpBRFN8QUR8QVVHfEJaRnxCWk1GfENBRXxDQUZ8Q0F8Q0NTfENPTXxDU3xEQVN8RENBfERDT018RENTfERET1VCTHxESU18RE9VQkxFfERUQ0J8RFRDRnxEVnxEWENIfEVEUlVQVHxFWFRFTkR8SU5DUnxJTkRFWHxORFh8SU5ISU5UfExYQ0h8TUFTS3xNU0t8TVB8TVNVfE5PT1B8T1ZTS3xRWENIfFJBTkR8UkVBRHxSRUxJTlR8UkVTVU1FfFJFVFVSTnxST1J8UlhPUnxTUVVBUkV8U1V8VENSfFRDQUF8T1ZTS3xUQ0Z8VEN8VFN8V0FORHxXT1J8V1JJVEV8WENIfFhMUXxYWEFMUXxaTHxaUXxBRER8QURafFNVQnxTVVp8TVBZfE1QUnxNUFp8RFZQfENPTXxBQlN8Q0xBfENMWnxMRFF8U1RPfFNUUXxBTFN8TExTfExSU3xUUkF8VFNRfFRNSXxUT1Z8QVhUfFRJWHxETFl8SU5QfE9VVClccy8sbnVsbF0sW1BSLlBSX1RZUEUsL14oPzotP0dFTkFEUnw9TUlOVVN8MkJDQURSfFZOfEJPRnxNTXwtPzJDQURSfC0/WzEtNl1ETkFEUnxBRFJFU3xCQkNPTnxbU0VdP0JBTktcPT98QkxPQ0t8Qk5LU1VNfEU/Q0FEUnxDT1VOVFwqP3wyP0RFQ1wqP3wtP0ROQ0hBTnwtP0ROUFRSfEVRVUFMU3xFUkFTRXxNRU1PUll8Mj9PQ1R8UkVNQURSfFNFVExPQ3xTVUJST3xPUkd8QlNTfEJFU3xTWU58RVFVfERFRklORXxFTkQpXHMvLG51bGxdLFtQUi5QUl9MSVRFUkFMLC9eXCcoPzotKig/Olx3fFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/KT8vXSxbUFIuUFJfUExBSU4sL14tKig/OlshLXpfXXxcXFtceDIxLVx4N2VdKSg/Oltcdy1dKnxcXFtceDIxLVx4N2VdKVs9IT9dPy9pXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bXlx3XHRcblxyIFx4QTAoKVwiXFxcJztdKy9dXSksWydhcG9sbG8nLCdhZ2MnLCdhZWEnXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbImNvbSIsL14jW15cblxyXSovLG51bGwsIiMiXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIFx1MDBhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLG51bGwsJyInXV0sW1sia3dkIiwvXig/OkFEU3xBRHxBVUd8QlpGfEJaTUZ8Q0FFfENBRnxDQXxDQ1N8Q09NfENTfERBU3xEQ0F8RENPTXxEQ1N8RERPVUJMfERJTXxET1VCTEV8RFRDQnxEVENGfERWfERYQ0h8RURSVVBUfEVYVEVORHxJTkNSfElOREVYfE5EWHxJTkhJTlR8TFhDSHxNQVNLfE1TS3xNUHxNU1V8Tk9PUHxPVlNLfFFYQ0h8UkFORHxSRUFEfFJFTElOVHxSRVNVTUV8UkVUVVJOfFJPUnxSWE9SfFNRVUFSRXxTVXxUQ1J8VENBQXxPVlNLfFRDRnxUQ3xUU3xXQU5EfFdPUnxXUklURXxYQ0h8WExRfFhYQUxRfFpMfFpRfEFERHxBRFp8U1VCfFNVWnxNUFl8TVBSfE1QWnxEVlB8Q09NfEFCU3xDTEF8Q0xafExEUXxTVE98U1RRfEFMU3xMTFN8TFJTfFRSQXxUU1F8VE1JfFRPVnxBWFR8VElYfERMWXxJTlB8T1VUKVxzLywKK251bGxdLFsidHlwIiwvXig/Oi0/R0VOQURSfD1NSU5VU3wyQkNBRFJ8Vk58Qk9GfE1NfC0/MkNBRFJ8LT9bMS02XUROQURSfEFEUkVTfEJCQ09OfFtFU10/QkFOSz0/fEJMT0NLfEJOS1NVTXxFP0NBRFJ8Q09VTlRcKj98Mj9ERUNcKj98LT9ETkNIQU58LT9ETlBUUnxFUVVBTFN8RVJBU0V8TUVNT1JZfDI/T0NUfFJFTUFEUnxTRVRMT0N8U1VCUk98T1JHfEJTU3xCRVN8U1lOfEVRVXxERUZJTkV8RU5EKVxzLyxudWxsXSxbImxpdCIsL14nKD86LSooPzpcd3xcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPyk/L10sWyJwbG4iLC9eLSooPzpbIS16XXxcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPy9dLFsicHVuIiwvXlteXHdcdFxuXHIgIictKTtcXFx4YTBdKy9dXSksWyJhcG9sbG8iLCJhZ2MiLCJhZWEiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNsai5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctY2xqLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjUzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNsai5qcwpAQCAtMCwwICsxLDE4IEBACisvKgorIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgorCisgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLwordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sib3BuIiwvXlsoW3tdKy8sYSwiKFt7Il0sWyJjbG8iLC9eWylcXX1dKy8sYSwiKV19Il0sWyJjb20iLC9eO1teXG5ccl0qLyxhLCI7Il0sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLGEsIlx0XG5cciBcdTAwYTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxhLCciJ11dLFtbImt3ZCIsL14oPzpkZWZ8aWZ8ZG98bGV0fHF1b3RlfHZhcnxmbnxsb29wfHJlY3VyfHRocm93fHRyeXxtb25pdG9yLWVudGVyfG1vbml0b3ItZXhpdHxkZWZtYWNyb3xkZWZufGRlZm4tfG1hY3JvZXhwYW5kfG1hY3JvZXhwYW5kLTF8Zm9yfGRvc2VxfGRvc3luY3xkb3RpbWVzfGFuZHxvcnx3aGVufG5vdHxhc3NlcnR8ZG90b3xwcm94eXxkZWZzdHJ1Y3R8Zmlyc3R8cmVzdHxjb25zfGRlZnByb3RvY29sfGRlZnR5cGV8ZGVmcmVjb3JkfHJlaWZ5fGRlZm11bHRpfGRlZm1ldGhvZHxtZXRhfHdpdGgtbWV0YXxuc3xpbi1uc3xjcmVhdGUtbnN8aW1wb3J0fGludGVybnxyZWZlcnxhbGlhc3xuYW1lc3BhY2V8cmVzb2x2ZXxyZWZ8ZGVyZWZ8cmVmc2V0fG5ld3xzZXQhfG1lbWZufHRvLWFycmF5fGludG8tYXJyYXl8YXNldHxnZW4tY2xhc3N8cmVkdWNlfG1hcHxmaWx0ZXJ8ZmluZHxuaWw/fGVtcHR5P3xoYXNoLW1hcHxoYXNoLXNldHx2ZWN8dmVjdG9yfHNlcXxmbGF0dGVufHJldmVyc2V8YXNzb2N8ZGlzc29jfGxpc3R8bGlzdD98ZGlzanxnZXR8dW5pb258ZGlmZmVyZW5jZXxpbnRlcnNlY3Rpb258ZXh0ZW5kfGV4dGVuZC10eXBlfGV4dGVuZC1wcm90b2NvbHxwcm4pXGIvLGFdLAorWyJ0eXAiLC9eOltcZEEtWmEtei1dKy9dXSksWyJjbGoiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNzcy5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctY3NzLmpzCmluZGV4IGM2NTBkOGYuLjIwODZiZDUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctY3NzLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctY3NzLmpzCkBAIC0xICsxLDIgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1tQUi5QUl9QTEFJTiwvXlsgXHRcclxuXGZdKy8sbnVsbCwnIAlcclxuDCddXSxbW1BSLlBSX1NUUklORywvXlwiKD86W15cblxyXGZcXFwiXXxcXCg/OlxyXG4/fFxufFxmKXxcXFtcc1xTXSkqXCIvLG51bGxdLFtQUi5QUl9TVFJJTkcsL15cJyg/OlteXG5cclxmXFxcJ118XFwoPzpcclxuP3xcbnxcZil8XFxbXHNcU10pKlwnLyxudWxsXSxbJ2xhbmctY3NzLXN0cicsL151cmxcKChbXlwpXCJcJ10qKVwpL2ldLFtQUi5QUl9LRVlXT1JELC9eKD86dXJsfHJnYnxcIWltcG9ydGFudHxAaW1wb3J0fEBwYWdlfEBtZWRpYXxAY2hhcnNldHxpbmhlcml0KSg/PVteXC1cd118JCkvaSxudWxsXSxbJ2xhbmctY3NzLWt3JywvXigtPyg/OltfYS16XXwoPzpcXFswLTlhLWZdKyA/KSkoPzpbX2EtejAtOVwtXXxcXCg/OlxcWzAtOWEtZl0rID8pKSopXHMqOi9pXSxbUFIuUFJfQ09NTUVOVCwvXlwvXCpbXipdKlwqKyg/OlteXC8qXVteKl0qXCorKSpcLy9dLFtQUi5QUl9DT01NRU5ULC9eKD86PCEtLXwtLT4pL10sW1BSLlBSX0xJVEVSQUwsL14oPzpcZCt8XGQqXC5cZCspKD86JXxbYS16XSspPy9pXSxbUFIuUFJfTElURVJBTCwvXiMoPzpbMC05YS1mXXszfSl7MSwyfS9pXSxbUFIuUFJfUExBSU4sL14tPyg/OltfYS16XXwoPzpcXFtcZGEtZl0rID8pKSg/OltfYS16XGRcLV18XFwoPzpcXFtcZGEtZl0rID8pKSovaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cc1x3XCdcIl0rL11dKSxbJ2NzcyddKSxQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbUFIuUFJfS0VZV09SRCwvXi0/KD86W19hLXpdfCg/OlxcW1xkYS1mXSsgPykpKD86W19hLXpcZFwtXXxcXCg/OlxcW1xkYS1mXSsgPykpKi9pXV0pLFsnY3NzLWt3J10pLFBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1tQUi5QUl9TVFJJTkcsL15bXlwpXCJcJ10rL11dKSxbJ2Nzcy1zdHInXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxmXHIgXSsvLG51bGwsIiBcdFxyXG5cdTAwMGMiXV0sW1sic3RyIiwvXiIoPzpbXlxuXGZcciJcXF18XFwoPzpcclxuP3xcbnxcZil8XFxbXFNcc10pKiIvLG51bGxdLFsic3RyIiwvXicoPzpbXlxuXGZccidcXF18XFwoPzpcclxuP3xcbnxcZil8XFxbXFNcc10pKicvLG51bGxdLFsibGFuZy1jc3Mtc3RyIiwvXnVybFwoKFteIicpXSspXCkvaV0sWyJrd2QiLC9eKD86dXJsfHJnYnwhaW1wb3J0YW50fEBpbXBvcnR8QHBhZ2V8QG1lZGlhfEBjaGFyc2V0fGluaGVyaXQpKD89W15cdy1dfCQpL2ksbnVsbF0sWyJsYW5nLWNzcy1rdyIsL14oLT8oPzpbX2Etel18XFxbXGRhLWZdKyA/KSg/Oltcdy1dfFxcXFxbXGRhLWZdKyA/KSopXHMqOi9pXSxbImNvbSIsL15cL1wqW14qXSpcKisoPzpbXiovXVteKl0qXCorKSpcLy9dLAorWyJjb20iLC9eKD86PFwhLS18LS1cPikvXSxbImxpdCIsL14oPzpcZCt8XGQqXC5cZCspKD86JXxbYS16XSspPy9pXSxbImxpdCIsL14jW1xkYS1mXXszLDZ9L2ldLFsicGxuIiwvXi0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqL2ldLFsicHVuIiwvXlteXHNcdyInXSsvXV0pLFsiY3NzIl0pO1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1sia3dkIiwvXi0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqL2ldXSksWyJjc3Mta3ciXSk7UFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbWyJzdHIiLC9eW14iJyldKy9dXSksWyJjc3Mtc3RyIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1kYXJ0LmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1kYXJ0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZmNjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWRhcnQuanMKQEAgLTAsMCArMSwzIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIFx1MDBhMCJdXSxbWyJjb20iLC9eIyEuKi9dLFsia3dkIiwvXlxiKD86aW1wb3J0fGxpYnJhcnl8cGFydCBvZnxwYXJ0fGFzfHNob3d8aGlkZSlcYi9pXSxbImNvbSIsL15cL1wvLiovXSxbImNvbSIsL15cL1wqW14qXSpcKisoPzpbXiovXVteKl0qXCorKSpcLy9dLFsia3dkIiwvXlxiKD86Y2xhc3N8aW50ZXJmYWNlKVxiL2ldLFsia3dkIiwvXlxiKD86YXNzZXJ0fGJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkb3xlbHNlfGZpbmFsbHl8Zm9yfGlmfGlufGlzfG5ld3xyZXR1cm58c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHdoaWxlKVxiL2ldLFsia3dkIiwvXlxiKD86YWJzdHJhY3R8Y29uc3R8ZXh0ZW5kc3xmYWN0b3J5fGZpbmFsfGdldHxpbXBsZW1lbnRzfG5hdGl2ZXxvcGVyYXRvcnxzZXR8c3RhdGljfHR5cGVkZWZ8dmFyKVxiL2ldLAorWyJ0eXAiLC9eXGIoPzpib29sfGRvdWJsZXxkeW5hbWljfGludHxudW18b2JqZWN0fHN0cmluZ3x2b2lkKVxiL2ldLFsia3dkIiwvXlxiKD86ZmFsc2V8bnVsbHx0cnVlKVxiL2ldLFsic3RyIiwvXnI/JycnW1xTXHNdKj9bXlxcXScnJy9dLFsic3RyIiwvXnI/IiIiW1xTXHNdKj9bXlxcXSIiIi9dLFsic3RyIiwvXnI/JygnfFteXG5cZlxyXSo/W15cXF0nKS9dLFsic3RyIiwvXnI/IigifFteXG5cZlxyXSo/W15cXF0iKS9dLFsicGxuIiwvXlskX2Etel1cdyovaV0sWyJwdW4iLC9eWyElJiorLzo8LT9efH4tXS9dLFsibGl0IiwvXlxiMHhbXGRhLWZdKy9pXSxbImxpdCIsL15cYlxkKyg/OlwuXGQqKT8oPzplWystXT9cZCspPy9pXSxbImxpdCIsL15cYlwuXGQrKD86ZVsrLV0/XGQrKT8vaV0sWyJwdW4iLC9eWygpLC47W1xde31dL11dKSwKK1siZGFydCJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctZ28uanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWdvLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWNhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWdvLmpzCkBAIC0wLDAgKzEgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJwbG4iLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSsoPzonfCQpfGBbXmBdKig/OmB8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/OlwvXC9bXlxuXHJdKnxcL1wqW1xTXHNdKj9cKlwvKS9dLFsicGxuIiwvXig/OlteIicvYF18XC8oPyFbKi9dKSkrL11dKSxbImdvIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1ocy5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctaHMuanMKaW5kZXggMjdiMjIxYS4uZmYzNzI5YiAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1ocy5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWhzLmpzCkBAIC0xICsxLDIgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1tQUi5QUl9QTEFJTiwvXltcdFxuXHgwQlx4MENcciBdKy8sbnVsbCwnCVxuCwxcciAnXSxbUFIuUFJfU1RSSU5HLC9eXCIoPzpbXlwiXFxcblx4MENccl18XFxbXHNcU10pKig/OlwifCQpLyxudWxsLCdcIiddLFtQUi5QUl9TVFJJTkcsL15cJyg/OlteXCdcXFxuXHgwQ1xyXXxcXFteJl0pXCc/LyxudWxsLCdcJyddLFtQUi5QUl9MSVRFUkFMLC9eKD86MG9bMC03XSt8MHhbXGRhLWZdK3xcZCsoPzpcLlxkKyk/KD86ZVsrXC1dP1xkKyk/KS9pLG51bGwsJzAxMjM0NTY3ODknXV0sW1tQUi5QUl9DT01NRU5ULC9eKD86KD86LS0rKD86W15cclxuXHgwQ10qKT8pfCg/Olx7LSg/OlteLV18LStbXi1cfV0pKi1cfSkpL10sW1BSLlBSX0tFWVdPUkQsL14oPzpjYXNlfGNsYXNzfGRhdGF8ZGVmYXVsdHxkZXJpdmluZ3xkb3xlbHNlfGlmfGltcG9ydHxpbnxpbmZpeHxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGxldHxtb2R1bGV8bmV3dHlwZXxvZnx0aGVufHR5cGV8d2hlcmV8XykoPz1bXmEtekEtWjAtOVwnXXwkKS8sbnVsbF0sW1BSLlBSX1BMQUlOLC9eKD86W0EtWl1bXHdcJ10qXC4pKlthLXpBLVpdW1x3XCddKi9dLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHRcblx4MEJceDBDXHIgYS16QS1aMC05XCdcIl0rL11dKSxbJ2hzJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0LVxyIF0rLyxudWxsLCJcdFxuXHUwMDBiXHUwMDBjXHIgIl0sWyJzdHIiLC9eIig/OlteXG5cZlxyIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sbnVsbCwnIiddLFsic3RyIiwvXicoPzpbXlxuXGZccidcXF18XFxbXiZdKSc/LyxudWxsLCInIl0sWyJsaXQiLC9eKD86MG9bMC03XSt8MHhbXGRhLWZdK3xcZCsoPzpcLlxkKyk/KD86ZVsrLV0/XGQrKT8pL2ksbnVsbCwiMDEyMzQ1Njc4OSJdXSxbWyJjb20iLC9eKD86LS0rW15cblxmXHJdKnx7LSg/OlteLV18LStbXn0tXSkqLX0pL10sWyJrd2QiLC9eKD86Y2FzZXxjbGFzc3xkYXRhfGRlZmF1bHR8ZGVyaXZpbmd8ZG98ZWxzZXxpZnxpbXBvcnR8aW58aW5maXh8aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bW9kdWxlfG5ld3R5cGV8b2Z8dGhlbnx0eXBlfHdoZXJlfF8pKD89W15cZCdBLVphLXpdfCQpLywKK251bGxdLFsicGxuIiwvXig/OltBLVpdW1x3J10qXC4pKltBLVphLXpdW1x3J10qL10sWyJwdW4iLC9eW15cZFx0LVxyICInQS1aYS16XSsvXV0pLFsiaHMiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWxpc3AuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWxpc3AuanMKaW5kZXggODVjNmMyMy4uOWM4Y2ZhNSAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1saXNwLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbGlzcC5qcwpAQCAtMSArMSwzIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbJ29wbicsL15cKC8sbnVsbCwnKCddLFsnY2xvJywvXlwpLyxudWxsLCcpJ10sW1BSLlBSX0NPTU1FTlQsL147W15cclxuXSovLG51bGwsJzsnXSxbUFIuUFJfUExBSU4sL15bXHRcblxyIFx4QTBdKy8sbnVsbCwnCVxuXHIgXHhhMCddLFtQUi5QUl9TVFJJTkcsL15cIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpLyxudWxsLCdcIiddXSxbW1BSLlBSX0tFWVdPUkQsL14oPzpibG9ja3xjW2FkXStyfGNhdGNofGNvbnN8ZGVmdW58ZG98ZXF8ZXFsfGVxdWFsfGVxdWFscHxldmFsLXdoZW58ZmxldHxmb3JtYXR8Z298aWZ8bGFiZWxzfGxhbWJkYXxsZXR8bG9hZC10aW1lLXZhbHVlfGxvY2FsbHl8bWFjcm9sZXR8bXVsdGlwbGUtdmFsdWUtY2FsbHxuaWx8cHJvZ258cHJvZ3Z8cXVvdGV8cmVxdWlyZXxyZXR1cm4tZnJvbXxzZXRxfHN5bWJvbC1tYWNyb2xldHx0fHRhZ2JvZHl8dGhlfHRocm93fHVud2luZClcYi8sbnVsbF0sW1BSLlBSX0xJVEVSQUwsL15bK1wtXT8oPzoweFswLTlhLWZdK3xcZCtcL1xkK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OltlZF1bK1wtXT9cZCspPykvaV0sW1BSLlBSX0xJVEVSQUwsL15cJyg/Oi0qKD86XHd8XFxbXHgyMS1ceDdlXSkoPzpbXHctXSp8XFxbXHgyMS1ceDdlXSlbPSE/XT8pPy9dLFtQUi5QUl9QTEFJTiwvXi0qKD86W2Etel9dfFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/L2ldLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHdcdFxuXHIgXHhBMCgpXCJcXFwnO10rL11dKSxbJ2NsJywnZWwnLCdsaXNwJywnc2NtJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sib3BuIiwvXlwoKy8sYSwiKCJdLFsiY2xvIiwvXlwpKy8sYSwiKSJdLFsiY29tIiwvXjtbXlxuXHJdKi8sYSwiOyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxhLCJcdFxuXHIgXHUwMGEwIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sYSwnIiddXSxbWyJrd2QiLC9eKD86YmxvY2t8Y1thZF0rcnxjYXRjaHxjb25bZHNdfGRlZig/OmluZXx1bil8ZG98ZXF8ZXFsfGVxdWFsfGVxdWFscHxldmFsLXdoZW58ZmxldHxmb3JtYXR8Z298aWZ8bGFiZWxzfGxhbWJkYXxsZXR8bG9hZC10aW1lLXZhbHVlfGxvY2FsbHl8bWFjcm9sZXR8bXVsdGlwbGUtdmFsdWUtY2FsbHxuaWx8cHJvZ258cHJvZ3Z8cXVvdGV8cmVxdWlyZXxyZXR1cm4tZnJvbXxzZXRxfHN5bWJvbC1tYWNyb2xldHx0fHRhZ2JvZHl8dGhlfHRocm93fHVud2luZClcYi8sYV0sCitbImxpdCIsL15bKy1dPyg/OlsjMF14W1xkYS1mXSt8XGQrXC9cZCt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzpbZGVdWystXT9cZCspPykvaV0sWyJsaXQiLC9eJyg/Oi0qKD86XHd8XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8pPy9dLFsicGxuIiwvXi0qKD86W19hLXpdfFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/L2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIictKTtcXFx4YTBdKy9dXSksWyJjbCIsImVsIiwibGlzcCIsImxzcCIsInNjbSIsInNzIiwicmt0Il0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1sdWEuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWx1YS5qcwppbmRleCBkMTA3YmFiLi43ZTQ0Y2NhIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWx1YS5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWx1YS5qcwpAQCAtMSArMSwyIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bXHRcblxyIFx4QTBdKy8sbnVsbCwnCVxuXHIgXHhhMCddLFtQUi5QUl9TVFJJTkcsL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkqKD86XCd8JCkpLyxudWxsLCdcIlwnJ11dLFtbUFIuUFJfQ09NTUVOVCwvXi0tKD86XFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKXxbXlxyXG5dKikvXSxbUFIuUFJfU1RSSU5HLC9eXFsoPSopXFtbXHNcU10qPyg/OlxdXDFcXXwkKS9dLFtQUi5QUl9LRVlXT1JELC9eKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sbnVsbF0sW1BSLlBSX0xJVEVSQUwsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWytcLV0/XGQrKT8pKS9pXSxbUFIuUFJfUExBSU4sL15bYS16X11cdyovaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cd1x0XG5cciBceEEwXVteXHdcdFxuXHIgXHhBMFwiXCdcLVwrPV0qL11dKSxbJ2x1YSddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSooPzonfCQpKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14tLSg/OlxbKD0qKVxbW1xTXHNdKj8oPzpdXDFdfCQpfFteXG5ccl0qKS9dLFsic3RyIiwvXlxbKD0qKVxbW1xTXHNdKj8oPzpdXDFdfCQpL10sWyJrd2QiLC9eKD86YW5kfGJyZWFrfGRvfGVsc2V8ZWxzZWlmfGVuZHxmYWxzZXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sbnVsbF0sWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLAorWyJwbG4iLC9eW19hLXpdXHcqL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgXHhhMF1bXlx3XHRcblxyICInKz1ceGEwLV0qL11dKSxbImx1YSJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbWwuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLW1sLmpzCmluZGV4IDY5OGQ2ZGUuLjhlZDJiMGMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbWwuanMKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1tbC5qcwpAQCAtMSArMSwyIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bXHRcblxyIFx4QTBdKy8sbnVsbCwnCVxuXHIgXHhhMCddLFtQUi5QUl9DT01NRU5ULC9eIyg/OmlmW1x0XG5cciBceEEwXSsoPzpbYS16XyRdW1x3XCddKnxgYFteXHJcblx0YF0qKD86YGB8JCkpfGVsc2V8ZW5kaWZ8bGlnaHQpL2ksbnVsbCwnIyddLFtQUi5QUl9TVFJJTkcsL14oPzpcIig/OlteXCJcXF18XFxbXHNcU10pKig/OlwifCQpfFwnKD86W15cJ1xcXXxcXFtcc1xTXSkqKD86XCd8JCkpLyxudWxsLCdcIlwnJ11dLFtbUFIuUFJfQ09NTUVOVCwvXig/OlwvXC9bXlxyXG5dKnxcKFwqW1xzXFNdKj9cKlwpKS9dLFtQUi5QUl9LRVlXT1JELC9eKD86YWJzdHJhY3R8YW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xkZWZhdWx0fGRlbGVnYXRlfGRvfGRvbmV8ZG93bmNhc3R8ZG93bnRvfGVsaWZ8ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybnxmYWxzZXxmaW5hbGx5fGZvcnxmdW58ZnVuY3Rpb258aWZ8aW58aW5oZXJpdHxpbmxpbmV8aW50ZXJmYWNlfGludGVybmFsfGxhenl8bGV0fG1hdGNofG1lbWJlcnxtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b2Z8b3BlbnxvcnxvdmVycmlkZXxwcml2YXRlfHB1YmxpY3xyZWN8cmV0dXJufHN0YXRpY3xzdHJ1Y3R8dGhlbnx0b3x0cnVlfHRyeXx0eXBlfHVwY2FzdHx1c2V8dmFsfHZvaWR8d2hlbnx3aGlsZXx3aXRofHlpZWxkfGFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kfHNpZ3xhdG9taWN8YnJlYWt8Y2hlY2tlZHxjb21wb25lbnR8Y29uc3R8Y29uc3RyYWludHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxlYWdlcnxldmVudHxleHRlcm5hbHxmaXhlZHxmdW5jdG9yfGdsb2JhbHxpbmNsdWRlfG1ldGhvZHxtaXhpbnxvYmplY3R8cGFyYWxsZWx8cHJvY2Vzc3xwcm90ZWN0ZWR8cHVyZXxzZWFsZWR8dHJhaXR8dmlydHVhbHx2b2xhdGlsZSlcYi9dLFtQUi5QUl9MSVRFUkFMLC9eWytcLV0/KD86MHhbXGRhLWZdK3woPzooPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbK1wtXT9cZCspPykpL2ldLFtQUi5QUl9QTEFJTiwvXig/OlthLXpfXVx3KlshPyNdP3xgYFteXHJcblx0YF0qKD86YGB8JCkpL2ldLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHRcblxyIFx4QTBcIlwnXHddKy9dXSksWydmcycsJ21sJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXSxbImNvbSIsL14jKD86aWZbXHRcblxyIFx4YTBdKyg/OlskX2Etel1bXHcnXSp8YGBbXlx0XG5ccmBdKig/OmBgfCQpKXxlbHNlfGVuZGlmfGxpZ2h0KS9pLG51bGwsIiMiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKD86J3wkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86XC9cL1teXG5ccl0qfFwoXCpbXFNcc10qP1wqXCkpL10sWyJrd2QiLC9eKD86YWJzdHJhY3R8YW5kfGFzfGFzc2VydHxiZWdpbnxjbGFzc3xkZWZhdWx0fGRlbGVnYXRlfGRvfGRvbmV8ZG93bmNhc3R8ZG93bnRvfGVsaWZ8ZWxzZXxlbmR8ZXhjZXB0aW9ufGV4dGVybnxmYWxzZXxmaW5hbGx5fGZvcnxmdW58ZnVuY3Rpb258aWZ8aW58aW5oZXJpdHxpbmxpbmV8aW50ZXJmYWNlfGludGVybmFsfGxhenl8bGV0fG1hdGNofG1lbWJlcnxtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b2Z8b3BlbnxvcnxvdmVycmlkZXxwcml2YXRlfHB1YmxpY3xyZWN8cmV0dXJufHN0YXRpY3xzdHJ1Y3R8dGhlbnx0b3x0cnVlfHRyeXx0eXBlfHVwY2FzdHx1c2V8dmFsfHZvaWR8d2hlbnx3aGlsZXx3aXRofHlpZWxkfGFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kfHNpZ3xhdG9taWN8YnJlYWt8Y2hlY2tlZHxjb21wb25lbnR8Y29uc3R8Y29uc3RyYWludHxjb25zdHJ1Y3Rvcnxjb250aW51ZXxlYWdlcnxldmVudHxleHRlcm5hbHxmaXhlZHxmdW5jdG9yfGdsb2JhbHxpbmNsdWRlfG1ldGhvZHxtaXhpbnxvYmplY3R8cGFyYWxsZWx8cHJvY2Vzc3xwcm90ZWN0ZWR8cHVyZXxzZWFsZWR8dHJhaXR8dmlydHVhbHx2b2xhdGlsZSlcYi9dLAorWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLFsicGxuIiwvXig/OltfYS16XVtcdyddKlshIz9dP3xgYFteXHRcblxyYF0qKD86YGB8JCkpL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXSsvXV0pLFsiZnMiLCJtbCJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbi5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzgxMmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1uLmpzCkBAIC0wLDAgKzEsNCBAQAordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sic3RyIiwvXig/OicoPzpbXlxuXHInXFxdfFxcLikqJ3wiKD86W15cblxyIlxcXXxcXC4pKig/OiJ8JCkpLyxhLCciJ10sWyJjb20iLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLGEsIiMiXSxbInBsbiIsL15ccysvLGEsIiBcclxuXHRcdTAwYTAiXV0sW1sic3RyIiwvXkAiKD86W14iXXwiIikqKD86InwkKS8sYV0sWyJzdHIiLC9ePCNbXiM+XSooPzojPnwkKS8sYV0sWyJzdHIiLC9ePCg/Oig/Oig/OlwuXC5cLykqfFwvPykoPzpbXHctXSsoPzpcL1tcdy1dKykrKT9bXHctXStcLmh8W2Etel1cdyopPi8sYV0sWyJjb20iLC9eXC9cL1teXG5ccl0qLyxhXSxbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLywKK2FdLFsia3dkIiwvXig/OmFic3RyYWN0fGFuZHxhc3xiYXNlfGNhdGNofGNsYXNzfGRlZnxkZWxlZ2F0ZXxlbnVtfGV2ZW50fGV4dGVybnxmYWxzZXxmaW5hbGx5fGZ1bnxpbXBsZW1lbnRzfGludGVyZmFjZXxpbnRlcm5hbHxpc3xtYWNyb3xtYXRjaHxtYXRjaGVzfG1vZHVsZXxtdXRhYmxlfG5hbWVzcGFjZXxuZXd8bnVsbHxvdXR8b3ZlcnJpZGV8cGFyYW1zfHBhcnRpYWx8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZnxzZWFsZWR8c3RhdGljfHN0cnVjdHxzeW50YXh8dGhpc3x0aHJvd3x0cnVlfHRyeXx0eXBlfHR5cGVvZnx1c2luZ3x2YXJpYW50fHZpcnR1YWx8dm9sYXRpbGV8d2hlbnx3aGVyZXx3aXRofGFzc2VydHxhc3NlcnQyfGFzeW5jfGJyZWFrfGNoZWNrZWR8Y29udGludWV8ZG98ZWxzZXxlbnN1cmVzfGZvcnxmb3JlYWNofGlmfGxhdGV8bG9ja3xuZXd8bm9sYXRlfG90aGVyd2lzZXxyZWdleHB8cmVwZWF0fHJlcXVpcmVzfHJldHVybnxzdXJyb3VuZHdpdGh8dW5jaGVja2VkfHVubGVzc3x1c2luZ3x3aGlsZXx5aWVsZClcYi8sCithXSxbInR5cCIsL14oPzphcnJheXxib29sfGJ5dGV8Y2hhcnxkZWNpbWFsfGRvdWJsZXxmbG9hdHxpbnR8bGlzdHxsb25nfG9iamVjdHxzYnl0ZXxzaG9ydHxzdHJpbmd8dWxvbmd8dWludHx1ZmxvYXR8dWxvbmd8dXNob3J0fHZvaWQpXGIvLGFdLFsibGl0IiwvXkBbJF9hLXpdW1x3JEBdKi9pLGFdLFsidHlwIiwvXkBbQS1aXStbYS16XVtcdyRAXSovLGFdLFsicGxuIiwvXic/WyRfYS16XVtcdyRAXSovaSxhXSxbImxpdCIsL14oPzoweFtcZGEtZl0rfCg/OlxkKD86X1xkKykqXGQqKD86XC5cZCopP3xcLlxkXCspKD86ZVsrLV0/XGQrKT8pW2Etel0qL2ksYSwiMDEyMzQ1Njc4OSJdLFsicHVuIiwvXi5bXlxzXHciLSQnLi9AYF0qLyxhXV0pLFsibiIsIm5lbWVybGUiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXByb3RvLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1wcm90by5qcwppbmRleCBlNjc5NjdmLi5mMDA2YWQ4IDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXByb3RvLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctcHJvdG8uanMKQEAgLTEgKzEgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuc291cmNlRGVjb3JhdG9yKHtrZXl3b3JkczonYm9vbCBieXRlcyBkZWZhdWx0IGRvdWJsZSBlbnVtIGV4dGVuZCBleHRlbnNpb25zIGZhbHNlIGZpeGVkMzIgZml4ZWQ2NCBmbG9hdCBncm91cCBpbXBvcnQgaW50MzIgaW50NjQgbWF4IG1lc3NhZ2Ugb3B0aW9uIG9wdGlvbmFsIHBhY2thZ2UgcmVwZWF0ZWQgcmVxdWlyZWQgcmV0dXJucyBycGMgc2VydmljZSBzZml4ZWQzMiBzZml4ZWQ2NCBzaW50MzIgc2ludDY0IHN0cmluZyBzeW50YXggdG8gdHJ1ZSB1aW50MzIgdWludDY0JyxjU3R5bGVDb21tZW50czp0cnVlfSksWydwcm90byddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuc291cmNlRGVjb3JhdG9yKHtrZXl3b3JkczoiYnl0ZXMsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlbmQsZXh0ZW5zaW9ucyxmYWxzZSxncm91cCxpbXBvcnQsbWF4LG1lc3NhZ2Usb3B0aW9uLG9wdGlvbmFsLHBhY2thZ2UscmVwZWF0ZWQscmVxdWlyZWQscmV0dXJucyxycGMsc2VydmljZSxzeW50YXgsdG8sdHJ1ZSIsdHlwZXM6L14oYm9vbHwoZG91YmxlfHM/Zml4ZWR8W3N1XT9pbnQpKDMyfDY0KXxmbG9hdHxzdHJpbmcpXGIvLGNTdHlsZUNvbW1lbnRzOiEwfSksWyJwcm90byJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctc2NhbGEuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXNjYWxhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTdkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXNjYWxhLmpzCkBAIC0wLDAgKzEsMiBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXSxbInN0ciIsL14iKD86IiIoPzoiIj8oPyEiKXxbXiJcXF18XFwuKSoiezAsM318KD86W15cblxyIlxcXXxcXC4pKiI/KS8sbnVsbCwnIiddLFsibGl0IiwvXmAoPzpbXlxuXHJcXGBdfFxcLikqYD8vLG51bGwsImAiXSxbInB1biIsL15bISMlJigtLTotQFstXnstfl0rLyxudWxsLCIhIyUmKCkqKywtOjs8PT4/QFtcXF1ee3x9fiJdXSxbWyJzdHIiLC9eJyg/OlteXG5ccidcXF18XFwoPzonfFteXG5cciddKykpJy9dLFsibGl0IiwvXidbJEEtWl9hLXpdW1x3JF0qKD8hW1x3JCddKS9dLFsia3dkIiwvXig/OmFic3RyYWN0fGNhc2V8Y2F0Y2h8Y2xhc3N8ZGVmfGRvfGVsc2V8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZvcnxmb3JTb21lfGlmfGltcGxpY2l0fGltcG9ydHxsYXp5fG1hdGNofG5ld3xvYmplY3R8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxyZXF1aXJlc3xyZXR1cm58c2VhbGVkfHN1cGVyfHRocm93fHRyYWl0fHRyeXx0eXBlfHZhbHx2YXJ8d2hpbGV8d2l0aHx5aWVsZClcYi9dLAorWyJsaXQiLC9eKD86dHJ1ZXxmYWxzZXxudWxsfHRoaXMpXGIvXSxbImxpdCIsL14oPzowKD86WzAtN10rfHhbXGRhLWZdKylsP3woPzowfFsxLTldXGQqKSg/Oig/OlwuXGQrKT8oPzplWystXT9cZCspP2Y/fGw/KXxcXC5cZCsoPzplWystXT9cZCspP2Y/KS9pXSxbInR5cCIsL15bJF9dKltBLVpdW1xkJEEtWl9dKlthLXpdW1x3JF0qL10sWyJwbG4iLC9eWyRBLVpfYS16XVtcdyRdKi9dLFsiY29tIiwvXlwvKD86XC8uKnxcKig/OlwvfFwqKlteKi9dKSooPzpcKitcLz8pPykvXSxbInB1biIsL14oPzpcLit8XC8pL11dKSxbInNjYWxhIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zcWwuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXNxbC5qcwppbmRleCBmZjM4MWNkNC4uMmZkZGQzZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zcWwuanMKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zcWwuanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXSsvLG51bGwsJwlcblxyIFx4YTAnXSxbUFIuUFJfU1RSSU5HLC9eKD86Iig/OlteXCJcXF18XFwuKSoifCcoPzpbXlwnXFxdfFxcLikqJykvLG51bGwsJ1wiXCcnXV0sW1tQUi5QUl9DT01NRU5ULC9eKD86LS1bXlxyXG5dKnxcL1wqW1xzXFNdKj8oPzpcKlwvfCQpKS9dLFtQUi5QUl9LRVlXT1JELC9eKD86QUREfEFMTHxBTFRFUnxBTkR8QU5ZfEFTfEFTQ3xBVVRIT1JJWkFUSU9OfEJBQ0tVUHxCRUdJTnxCRVRXRUVOfEJSRUFLfEJST1dTRXxCVUxLfEJZfENBU0NBREV8Q0FTRXxDSEVDS3xDSEVDS1BPSU5UfENMT1NFfENMVVNURVJFRHxDT0FMRVNDRXxDT0xMQVRFfENPTFVNTnxDT01NSVR8Q09NUFVURXxDT05TVFJBSU5UfENPTlRBSU5TfENPTlRBSU5TVEFCTEV8Q09OVElOVUV8Q09OVkVSVHxDUkVBVEV8Q1JPU1N8Q1VSUkVOVHxDVVJSRU5UX0RBVEV8Q1VSUkVOVF9USU1FfENVUlJFTlRfVElNRVNUQU1QfENVUlJFTlRfVVNFUnxDVVJTT1J8REFUQUJBU0V8REJDQ3xERUFMTE9DQVRFfERFQ0xBUkV8REVGQVVMVHxERUxFVEV8REVOWXxERVNDfERJU0t8RElTVElOQ1R8RElTVFJJQlVURUR8RE9VQkxFfERST1B8RFVNTVl8RFVNUHxFTFNFfEVORHxFUlJMVkx8RVNDQVBFfEVYQ0VQVHxFWEVDfEVYRUNVVEV8RVhJU1RTfEVYSVR8RkVUQ0h8RklMRXxGSUxMRkFDVE9SfEZPUnxGT1JFSUdOfEZSRUVURVhUfEZSRUVURVhUVEFCTEV8RlJPTXxGVUxMfEZVTkNUSU9OfEdPVE98R1JBTlR8R1JPVVB8SEFWSU5HfEhPTERMT0NLfElERU5USVRZfElERU5USVRZQ09MfElERU5USVRZX0lOU0VSVHxJRnxJTnxJTkRFWHxJTk5FUnxJTlNFUlR8SU5URVJTRUNUfElOVE98SVN8Sk9JTnxLRVl8S0lMTHxMRUZUfExJS0V8TElORU5PfExPQUR8TkFUSU9OQUx8Tk9DSEVDS3xOT05DTFVTVEVSRUR8Tk9UfE5VTEx8TlVMTElGfE9GfE9GRnxPRkZTRVRTfE9OfE9QRU58T1BFTkRBVEFTT1VSQ0V8T1BFTlFVRVJZfE9QRU5ST1dTRVR8T1BFTlhNTHxPUFRJT058T1J8T1JERVJ8T1VURVJ8T1ZFUnxQRVJDRU5UfFBMQU58UFJFQ0lTSU9OfFBSSU1BUll8UFJJTlR8UFJPQ3xQUk9DRURVUkV8UFVCTElDfFJBSVNFUlJPUnxSRUFEfFJFQURURVhUfFJFQ09ORklHVVJFfFJFRkVSRU5DRVN8UkVQTElDQVRJT058UkVTVE9SRXxSRVNUUklDVHxSRVRVUk58UkVWT0tFfFJJR0hUfFJPTExCQUNLfFJPV0NPVU5UfFJPV0dVSURDT0x8UlVMRXxTQVZFfFNDSEVNQXxTRUxFQ1R8U0VTU0lPTl9VU0VSfFNFVHxTRVRVU0VSfFNIVVRET1dOfFNPTUV8U1RBVElTVElDU3xTWVNURU1fVVNFUnxUQUJMRXxURVhUU0laRXxUSEVOfFRPfFRPUHxUUkFOfFRSQU5TQUNUSU9OfFRSSUdHRVJ8VFJVTkNBVEV8VFNFUVVBTHxVTklPTnxVTklRVUV8VVBEQVRFfFVQREFURVRFWFR8VVNFfFVTRVJ8VkFMVUVTfFZBUllJTkd8VklFV3xXQUlURk9SfFdIRU58V0hFUkV8V0hJTEV8V0lUSHxXUklURVRFWFQpKD89W15cdy1dfCQpL2ksbnVsbF0sW1BSLlBSX0xJVEVSQUwsL15bKy1dPyg/OjB4W1xkYS1mXSt8KD86KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWytcLV0/XGQrKT8pKS9pXSxbUFIuUFJfUExBSU4sL15bYS16X11bXHctXSovaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cd1x0XG5cciBceEEwXCJcJ11bXlx3XHRcblxyIFx4QTArXC1cIlwnXSovXV0pLFsnc3FsJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXSxbInN0ciIsL14oPzoiKD86W14iXFxdfFxcLikqInwnKD86W14nXFxdfFxcLikqJykvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eKD86LS1bXlxuXHJdKnxcL1wqW1xTXHNdKj8oPzpcKlwvfCQpKS9dLFsia3dkIiwvXig/OmFkZHxhbGx8YWx0ZXJ8YW5kfGFueXxhcHBseXxhc3xhc2N8YXV0aG9yaXphdGlvbnxiYWNrdXB8YmVnaW58YmV0d2VlbnxicmVha3xicm93c2V8YnVsa3xieXxjYXNjYWRlfGNhc2V8Y2hlY2t8Y2hlY2twb2ludHxjbG9zZXxjbHVzdGVyZWR8Y29hbGVzY2V8Y29sbGF0ZXxjb2x1bW58Y29tbWl0fGNvbXB1dGV8Y29uc3RyYWludHxjb250YWluc3xjb250YWluc3RhYmxlfGNvbnRpbnVlfGNvbnZlcnR8Y3JlYXRlfGNyb3NzfGN1cnJlbnR8Y3VycmVudF9kYXRlfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxjdXJyZW50X3VzZXJ8Y3Vyc29yfGRhdGFiYXNlfGRiY2N8ZGVhbGxvY2F0ZXxkZWNsYXJlfGRlZmF1bHR8ZGVsZXRlfGRlbnl8ZGVzY3xkaXNrfGRpc3RpbmN0fGRpc3RyaWJ1dGVkfGRvdWJsZXxkcm9wfGR1bW15fGR1bXB8ZWxzZXxlbmR8ZXJybHZsfGVzY2FwZXxleGNlcHR8ZXhlY3xleGVjdXRlfGV4aXN0c3xleGl0fGZldGNofGZpbGV8ZmlsbGZhY3Rvcnxmb2xsb3dpbmd8Zm9yfGZvcmVpZ258ZnJlZXRleHR8ZnJlZXRleHR0YWJsZXxmcm9tfGZ1bGx8ZnVuY3Rpb258Z290b3xncmFudHxncm91cHxoYXZpbmd8aG9sZGxvY2t8aWRlbnRpdHl8aWRlbnRpdHljb2x8aWRlbnRpdHlfaW5zZXJ0fGlmfGlufGluZGV4fGlubmVyfGluc2VydHxpbnRlcnNlY3R8aW50b3xpc3xqb2lufGtleXxraWxsfGxlZnR8bGlrZXxsaW5lbm98bG9hZHxtYXRjaHxtZXJnZXxuYXRpb25hbHxub2NoZWNrfG5vbmNsdXN0ZXJlZHxub3R8bnVsbHxudWxsaWZ8b2Z8b2ZmfG9mZnNldHN8b258b3BlbnxvcGVuZGF0YXNvdXJjZXxvcGVucXVlcnl8b3BlbnJvd3NldHxvcGVueG1sfG9wdGlvbnxvcnxvcmRlcnxvdXRlcnxvdmVyfHBlcmNlbnR8cGxhbnxwcmVjZWRpbmd8cHJlY2lzaW9ufHByaW1hcnl8cHJpbnR8cHJvY3xwcm9jZWR1cmV8cHVibGljfHJhaXNlcnJvcnxyZWFkfHJlYWR0ZXh0fHJlY29uZmlndXJlfHJlZmVyZW5jZXN8cmVwbGljYXRpb258cmVzdG9yZXxyZXN0cmljdHxyZXR1cm58cmV2b2tlfHJpZ2h0fHJvbGxiYWNrfHJvd2NvdW50fHJvd2d1aWRjb2x8cm93cz98cnVsZXxzYXZlfHNjaGVtYXxzZWxlY3R8c2Vzc2lvbl91c2VyfHNldHxzZXR1c2VyfHNodXRkb3dufHNvbWV8c3RhdGlzdGljc3xzeXN0ZW1fdXNlcnx0YWJsZXx0ZXh0c2l6ZXx0aGVufHRvfHRvcHx0cmFufHRyYW5zYWN0aW9ufHRyaWdnZXJ8dHJ1bmNhdGV8dHNlcXVhbHx1bmJvdW5kZWR8dW5pb258dW5pcXVlfHVwZGF0ZXx1cGRhdGV0ZXh0fHVzZXx1c2VyfHVzaW5nfHZhbHVlc3x2YXJ5aW5nfHZpZXd8d2FpdGZvcnx3aGVufHdoZXJlfHdoaWxlfHdpdGh8d3JpdGV0ZXh0KSg/PVteXHctXXwkKS9pLAorbnVsbF0sWyJsaXQiLC9eWystXT8oPzoweFtcZGEtZl0rfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrLV0/XGQrKT8pL2ldLFsicGxuIiwvXltfYS16XVtcdy1dKi9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF1bXlx3XHRcblxyICInK1x4YTAtXSovXV0pLFsic3FsIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy10ZXguanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXRleC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ZkYWRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy10ZXguanMKQEAgLTAsMCArMSBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXSxbImNvbSIsL14lW15cblxyXSovLG51bGwsIiUiXV0sW1sia3dkIiwvXlxcW0AtWmEtel0rL10sWyJrd2QiLC9eXFwuL10sWyJ0eXAiLC9eWyQmXS9dLFsibGl0IiwvWystXT8oPzpcLlxkK3xcZCsoPzpcLlxkKik/KShjbXxlbXxleHxpbnxwY3xwdHxicHxtbSkvaV0sWyJwdW4iLC9eWygpPVtcXXt9XSsvXV0pLFsibGF0ZXgiLCJ0ZXgiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZiLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy12Yi5qcwppbmRleCBjYWJjZTg1Li5iMTUxYjdjIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZiLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctdmIuanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXHUyMDI4XHUyMDI5XSsvLG51bGwsJwlcblxyIFx4YTBcdTIwMjhcdTIwMjknXSxbUFIuUFJfU1RSSU5HLC9eKD86W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKD86W1wiXHUyMDFDXHUyMDFEXWN8JCl8W1wiXHUyMDFDXHUyMDFEXSg/OlteXCJcdTIwMUNcdTIwMURdfFtcIlx1MjAxQ1x1MjAxRF17Mn0pKig/OltcIlx1MjAxQ1x1MjAxRF18JCkpL2ksbnVsbCwnXCJcdTIwMWNcdTIwMWQnXSxbUFIuUFJfQ09NTUVOVCwvXltcJ1x1MjAxOFx1MjAxOV1bXlxyXG5cdTIwMjhcdTIwMjldKi8sbnVsbCwnXCdcdTIwMThcdTIwMTknXV0sW1tQUi5QUl9LRVlXT1JELC9eKD86QWRkSGFuZGxlcnxBZGRyZXNzT2Z8QWxpYXN8QW5kfEFuZEFsc298QW5zaXxBc3xBc3NlbWJseXxBdXRvfEJvb2xlYW58QnlSZWZ8Qnl0ZXxCeVZhbHxDYWxsfENhc2V8Q2F0Y2h8Q0Jvb2x8Q0J5dGV8Q0NoYXJ8Q0RhdGV8Q0RibHxDRGVjfENoYXJ8Q0ludHxDbGFzc3xDTG5nfENPYmp8Q29uc3R8Q1Nob3J0fENTbmd8Q1N0cnxDVHlwZXxEYXRlfERlY2ltYWx8RGVjbGFyZXxEZWZhdWx0fERlbGVnYXRlfERpbXxEaXJlY3RDYXN0fERvfERvdWJsZXxFYWNofEVsc2V8RWxzZUlmfEVuZHxFbmRJZnxFbnVtfEVyYXNlfEVycm9yfEV2ZW50fEV4aXR8RmluYWxseXxGb3J8RnJpZW5kfEZ1bmN0aW9ufEdldHxHZXRUeXBlfEdvU3VifEdvVG98SGFuZGxlc3xJZnxJbXBsZW1lbnRzfEltcG9ydHN8SW58SW5oZXJpdHN8SW50ZWdlcnxJbnRlcmZhY2V8SXN8TGV0fExpYnxMaWtlfExvbmd8TG9vcHxNZXxNb2R8TW9kdWxlfE11c3RJbmhlcml0fE11c3RPdmVycmlkZXxNeUJhc2V8TXlDbGFzc3xOYW1lc3BhY2V8TmV3fE5leHR8Tm90fE5vdEluaGVyaXRhYmxlfE5vdE92ZXJyaWRhYmxlfE9iamVjdHxPbnxPcHRpb258T3B0aW9uYWx8T3J8T3JFbHNlfE92ZXJsb2Fkc3xPdmVycmlkYWJsZXxPdmVycmlkZXN8UGFyYW1BcnJheXxQcmVzZXJ2ZXxQcml2YXRlfFByb3BlcnR5fFByb3RlY3RlZHxQdWJsaWN8UmFpc2VFdmVudHxSZWFkT25seXxSZURpbXxSZW1vdmVIYW5kbGVyfFJlc3VtZXxSZXR1cm58U2VsZWN0fFNldHxTaGFkb3dzfFNoYXJlZHxTaG9ydHxTaW5nbGV8U3RhdGljfFN0ZXB8U3RvcHxTdHJpbmd8U3RydWN0dXJlfFN1YnxTeW5jTG9ja3xUaGVufFRocm93fFRvfFRyeXxUeXBlT2Z8VW5pY29kZXxVbnRpbHxWYXJpYW50fFdlbmR8V2hlbnxXaGlsZXxXaXRofFdpdGhFdmVudHN8V3JpdGVPbmx5fFhvcnxFbmRJZnxHb1N1YnxMZXR8VmFyaWFudHxXZW5kKVxiL2ksbnVsbF0sW1BSLlBSX0NPTU1FTlQsL15SRU1bXlxyXG5cdTIwMjhcdTIwMjldKi9pXSxbUFIuUFJfTElURVJBTCwvXig/OlRydWVcYnxGYWxzZVxifE5vdGhpbmdcYnxcZCsoPzpFWytcLV0/XGQrW0ZSRF0/fFtGUkRTSUxdKT98KD86JkhbMC05QS1GXSt8Jk9bMC03XSspW1NJTF0/fFxkKlwuXGQrKD86RVsrXC1dP1xkKyk/W0ZSRF0/fCNccysoPzpcZCtbXC1cL11cZCtbXC1cL11cZCsoPzpccytcZCs6XGQrKD86OlxkKyk/KFxzKig/OkFNfFBNKSk/KT98XGQrOlxkKyg/OjpcZCspPyhccyooPzpBTXxQTSkpPylccysjKS9pXSxbUFIuUFJfUExBSU4sL14oPzooPzpbYS16XXxfXHcpXHcqfFxbKD86W2Etel18X1x3KVx3KlxdKS9pXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bXlx3XHRcblxyIFwiXCdcW1xdXHhBMFx1MjAxOFx1MjAxOVx1MjAxQ1x1MjAxRFx1MjAyOFx1MjAyOV0rL10sW1BSLlBSX1BVTkNUVUFUSU9OLC9eKD86XFt8XF0pL11dKSxbJ3ZiJywndmJzJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXHUyMDI4XHUyMDI5XSsvLG51bGwsIlx0XG5cciBcdTAwYTBcdTIwMjhcdTIwMjkiXSxbInN0ciIsL14oPzpbIlx1MjAxY1x1MjAxZF0oPzpbXiJcdTIwMWNcdTIwMWRdfFsiXHUyMDFjXHUyMDFkXXsyfSkoPzpbIlx1MjAxY1x1MjAxZF1jfCQpfFsiXHUyMDFjXHUyMDFkXSg/OlteIlx1MjAxY1x1MjAxZF18WyJcdTIwMWNcdTIwMWRdezJ9KSooPzpbIlx1MjAxY1x1MjAxZF18JCkpL2ksbnVsbCwnIlx1MjAxY1x1MjAxZCddLFsiY29tIiwvXlsnXHUyMDE4XHUyMDE5XSg/Ol8oPzpcclxuP3xbXlxyXT8pfFteXG5ccl9cdTIwMjhcdTIwMjldKSovLG51bGwsIidcdTIwMThcdTIwMTkiXV0sW1sia3dkIiwvXig/OmFkZGhhbmRsZXJ8YWRkcmVzc29mfGFsaWFzfGFuZHxhbmRhbHNvfGFuc2l8YXN8YXNzZW1ibHl8YXV0b3xib29sZWFufGJ5cmVmfGJ5dGV8Ynl2YWx8Y2FsbHxjYXNlfGNhdGNofGNib29sfGNieXRlfGNjaGFyfGNkYXRlfGNkYmx8Y2RlY3xjaGFyfGNpbnR8Y2xhc3N8Y2xuZ3xjb2JqfGNvbnN0fGNzaG9ydHxjc25nfGNzdHJ8Y3R5cGV8ZGF0ZXxkZWNpbWFsfGRlY2xhcmV8ZGVmYXVsdHxkZWxlZ2F0ZXxkaW18ZGlyZWN0Y2FzdHxkb3xkb3VibGV8ZWFjaHxlbHNlfGVsc2VpZnxlbmR8ZW5kaWZ8ZW51bXxlcmFzZXxlcnJvcnxldmVudHxleGl0fGZpbmFsbHl8Zm9yfGZyaWVuZHxmdW5jdGlvbnxnZXR8Z2V0dHlwZXxnb3N1Ynxnb3RvfGhhbmRsZXN8aWZ8aW1wbGVtZW50c3xpbXBvcnRzfGlufGluaGVyaXRzfGludGVnZXJ8aW50ZXJmYWNlfGlzfGxldHxsaWJ8bGlrZXxsb25nfGxvb3B8bWV8bW9kfG1vZHVsZXxtdXN0aW5oZXJpdHxtdXN0b3ZlcnJpZGV8bXliYXNlfG15Y2xhc3N8bmFtZXNwYWNlfG5ld3xuZXh0fG5vdHxub3Rpbmhlcml0YWJsZXxub3RvdmVycmlkYWJsZXxvYmplY3R8b258b3B0aW9ufG9wdGlvbmFsfG9yfG9yZWxzZXxvdmVybG9hZHN8b3ZlcnJpZGFibGV8b3ZlcnJpZGVzfHBhcmFtYXJyYXl8cHJlc2VydmV8cHJpdmF0ZXxwcm9wZXJ0eXxwcm90ZWN0ZWR8cHVibGljfHJhaXNlZXZlbnR8cmVhZG9ubHl8cmVkaW18cmVtb3ZlaGFuZGxlcnxyZXN1bWV8cmV0dXJufHNlbGVjdHxzZXR8c2hhZG93c3xzaGFyZWR8c2hvcnR8c2luZ2xlfHN0YXRpY3xzdGVwfHN0b3B8c3RyaW5nfHN0cnVjdHVyZXxzdWJ8c3luY2xvY2t8dGhlbnx0aHJvd3x0b3x0cnl8dHlwZW9mfHVuaWNvZGV8dW50aWx8dmFyaWFudHx3ZW5kfHdoZW58d2hpbGV8d2l0aHx3aXRoZXZlbnRzfHdyaXRlb25seXx4b3J8ZW5kaWZ8Z29zdWJ8bGV0fHZhcmlhbnR8d2VuZClcYi9pLAorbnVsbF0sWyJjb20iLC9ecmVtLiovaV0sWyJsaXQiLC9eKD86dHJ1ZVxifGZhbHNlXGJ8bm90aGluZ1xifFxkKyg/OmVbKy1dP1xkK1tkZnJdP3xbZGZpbHJzXSk/fCg/OiZoW1xkYS1mXSt8Jm9bMC03XSspW2lsc10/fFxkKlwuXGQrKD86ZVsrLV0/XGQrKT9bZGZyXT98I1xzKyg/OlxkK1svLV1cZCtbLy1dXGQrKD86XHMrXGQrOlxkKyg/OjpcZCspPyhccyooPzphbXxwbSkpPyk/fFxkKzpcZCsoPzo6XGQrKT8oXHMqKD86YW18cG0pKT8pXHMrIykvaV0sWyJwbG4iLC9eKD86KD86W2Etel18X1x3KVx3KnxcWyg/OlthLXpdfF9cdylcdypdKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInW1xdXHhhMFx1MjAxOFx1MjAxOVx1MjAxY1x1MjAxZFx1MjAyOFx1MjAyOV0rL10sWyJwdW4iLC9eKD86XFt8XSkvXV0pLFsidmIiLCJ2YnMiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZoZGwuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZoZGwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMzAxNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctdmhkbC5qcwpAQCAtMCwwICsxLDMgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl1dLFtbInN0ciIsL14oPzpbYm94XT8iKD86W14iXXwiIikqInwnLicpL2ldLFsiY29tIiwvXi0tW15cblxyXSovXSxbImt3ZCIsL14oPzphYnN8YWNjZXNzfGFmdGVyfGFsaWFzfGFsbHxhbmR8YXJjaGl0ZWN0dXJlfGFycmF5fGFzc2VydHxhdHRyaWJ1dGV8YmVnaW58YmxvY2t8Ym9keXxidWZmZXJ8YnVzfGNhc2V8Y29tcG9uZW50fGNvbmZpZ3VyYXRpb258Y29uc3RhbnR8ZGlzY29ubmVjdHxkb3dudG98ZWxzZXxlbHNpZnxlbmR8ZW50aXR5fGV4aXR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2VuZXJhdGV8Z2VuZXJpY3xncm91cHxndWFyZGVkfGlmfGltcHVyZXxpbnxpbmVydGlhbHxpbm91dHxpc3xsYWJlbHxsaWJyYXJ5fGxpbmthZ2V8bGl0ZXJhbHxsb29wfG1hcHxtb2R8bmFuZHxuZXd8bmV4dHxub3J8bm90fG51bGx8b2Z8b258b3BlbnxvcnxvdGhlcnN8b3V0fHBhY2thZ2V8cG9ydHxwb3N0cG9uZWR8cHJvY2VkdXJlfHByb2Nlc3N8cHVyZXxyYW5nZXxyZWNvcmR8cmVnaXN0ZXJ8cmVqZWN0fHJlbXxyZXBvcnR8cmV0dXJufHJvbHxyb3J8c2VsZWN0fHNldmVyaXR5fHNoYXJlZHxzaWduYWx8c2xhfHNsbHxzcmF8c3JsfHN1YnR5cGV8dGhlbnx0b3x0cmFuc3BvcnR8dHlwZXx1bmFmZmVjdGVkfHVuaXRzfHVudGlsfHVzZXx2YXJpYWJsZXx3YWl0fHdoZW58d2hpbGV8d2l0aHx4bm9yfHhvcikoPz1bXlx3LV18JCkvaSwKK251bGxdLFsidHlwIiwvXig/OmJpdHxiaXRfdmVjdG9yfGNoYXJhY3Rlcnxib29sZWFufGludGVnZXJ8cmVhbHx0aW1lfHN0cmluZ3xzZXZlcml0eV9sZXZlbHxwb3NpdGl2ZXxuYXR1cmFsfHNpZ25lZHx1bnNpZ25lZHxsaW5lfHRleHR8c3RkX3U/bG9naWMoPzpfdmVjdG9yKT8pKD89W15cdy1dfCQpL2ksbnVsbF0sWyJ0eXAiLC9eJyg/OmFjdGl2ZXxhc2NlbmRpbmd8YmFzZXxkZWxheWVkfGRyaXZpbmd8ZHJpdmluZ192YWx1ZXxldmVudHxoaWdofGltYWdlfGluc3RhbmNlX25hbWV8bGFzdF9hY3RpdmV8bGFzdF9ldmVudHxsYXN0X3ZhbHVlfGxlZnR8bGVmdG9mfGxlbmd0aHxsb3d8cGF0aF9uYW1lfHBvc3xwcmVkfHF1aWV0fHJhbmdlfHJldmVyc2VfcmFuZ2V8cmlnaHR8cmlnaHRvZnxzaW1wbGVfbmFtZXxzdGFibGV8c3VjY3x0cmFuc2FjdGlvbnx2YWx8dmFsdWUpKD89W15cdy1dfCQpL2ksbnVsbF0sWyJsaXQiLC9eXGQrKD86X1xkKykqKD86I1tcdy5cXF0rIyg/OlsrLV0/XGQrKD86X1xkKykqKT98KD86XC5cZCsoPzpfXGQrKSopPyg/OmVbKy1dP1xkKyg/Ol9cZCspKik/KS9pXSwKK1sicGxuIiwvXig/OlthLXpdXHcqfFxcW15cXF0qXFwpL2ldLFsicHVuIiwvXlteXHdcdFxuXHIgIidceGEwXVteXHdcdFxuXHIgIidceGEwLV0qL11dKSxbInZoZGwiLCJ2aGQiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXdpa2kuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXdpa2kuanMKaW5kZXggMDBhMWI2Yi4uOTZjMWUzNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy13aWtpLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctd2lraS5qcwpAQCAtMSArMSwyIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bXHQgXHhBMGEtZ2ktejAtOV0rLyxudWxsLCcJIFx4YTBhYmNkZWZnaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSddLFtQUi5QUl9QVU5DVFVBVElPTiwvXls9Kn5cXlxbXF1dKy8sbnVsbCwnPSp+XltdJ11dLFtbJ2xhbmctd2lraS5tZXRhJywvKD86Xl58XHJcbj98XG4pKCNbYS16XSspXGIvXSxbUFIuUFJfTElURVJBTCwvXig/OltBLVpdW2Etel1bYS16MC05XStbQS1aXVthLXpdW2EtekEtWjAtOV0rKVxiL10sWydsYW5nLScsL15ce1x7XHsoW1xzXFNdKz8pXH1cfVx9L10sWydsYW5nLScsL15gKFteXHJcbmBdKylgL10sW1BSLlBSX1NUUklORywvXmh0dHBzPzpcL1wvW15cLz8jXHNdKig/OlwvW14/I1xzXSopPyg/Olw/W14jXHNdKik/KD86I1xTKik/L2ldLFtQUi5QUl9QTEFJTiwvXig/OlxyXG58W1xzXFNdKVteIz0qfl5BLVpoXHtgXFtcclxuXSovXV0pLFsnd2lraSddKSxQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfS0VZV09SRCwvXiNbYS16XSsvaSxudWxsLCcjJ11dLFtdKSxbJ3dpa2kubWV0YSddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcZFx0IGEtZ2ktelx4YTBdKy8sbnVsbCwiXHQgXHUwMGEwYWJjZGVmZ2lqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiXSxbInB1biIsL15bKj1bXF1efl0rLyxudWxsLCI9Kn5eW10iXV0sW1sibGFuZy13aWtpLm1ldGEiLC8oPzpeXnxcclxuP3xcbikoI1thLXpdKylcYi9dLFsibGl0IiwvXltBLVpdW2Etel1bXGRhLXpdK1tBLVpdW2Etel1bXlxXX10rXGIvXSxbImxhbmctIiwvXnt7eyhbXFNcc10rPyl9fX0vXSxbImxhbmctIiwvXmAoW15cblxyYF0rKWAvXSxbInN0ciIsL15odHRwcz86XC9cL1teXHMjLz9dKig/OlwvW15ccyM/XSopPyg/Olw/W15ccyNdKik/KD86I1xTKik/L2ldLFsicGxuIiwvXig/OlxyXG58W1xTXHNdKVteXG5cciMqPUEtW15gaHt+XSovXV0pLFsid2lraSJdKTsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sia3dkIiwvXiNbYS16XSsvaSxudWxsLCIjIl1dLFtdKSxbIndpa2kubWV0YSJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmcteHEuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXhxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXhxLmpzCkBAIC0wLDAgKzEsMyBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJ2YXIgcGxuIiwvXlwkW1x3LV0rLyxudWxsLCIkIl1dLFtbInBsbiIsL15bXHM9XVs8Pl1bXHM9XS9dLFsibGl0IiwvXkBbXHctXSsvXSxbInRhZyIsL148XC8/W2Etel0oPzpbXHctLjpdKlx3KT98XC8/PiQvaV0sWyJjb20iLC9eXCg6W1xTXHNdKj86XCkvXSxbInBsbiIsL15bKCksLztbXF17fV0kL10sWyJzdHIiLC9eKD86Iig/OlteIlxce118XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xce118XFxbXFNcc10pKig/Oid8JCkpLyxudWxsLCJcIiciXSxbImt3ZCIsL14oPzp4cXVlcnl8d2hlcmV8dmVyc2lvbnx2YXJpYWJsZXx1bmlvbnx0eXBlc3dpdGNofHRyZWF0fHRvfHRoZW58dGV4dHxzdGFibGV8c29ydGJ5fHNvbWV8c2VsZnxzY2hlbWF8c2F0aXNmaWVzfHJldHVybnN8cmV0dXJufHJlZnxwcm9jZXNzaW5nLWluc3RydWN0aW9ufHByZWNlZGluZy1zaWJsaW5nfHByZWNlZGluZ3xwcmVjZWRlc3xwYXJlbnR8b25seXxvZnxub2RlfG5hbWVzcGFjZXxtb2R1bGV8bGV0fGl0ZW18aW50ZXJzZWN0fGluc3RhbmNlfGlufGltcG9ydHxpZnxmdW5jdGlvbnxmb3J8Zm9sbG93c3xmb2xsb3dpbmctc2libGluZ3xmb2xsb3dpbmd8ZXh0ZXJuYWx8ZXhjZXB0fGV2ZXJ5fGVsc2V8ZWxlbWVudHxkZXNjZW5kaW5nfGRlc2NlbmRhbnQtb3Itc2VsZnxkZXNjZW5kYW50fGRlZmluZXxkZWZhdWx0fGRlY2xhcmV8Y29tbWVudHxjaGlsZHxjYXN0fGNhc2V8YmVmb3JlfGF0dHJpYnV0ZXxhc3NlcnR8YXNjZW5kaW5nfGFzfGFuY2VzdG9yLW9yLXNlbGZ8YW5jZXN0b3J8YWZ0ZXJ8ZXF8b3JkZXJ8Ynl8b3J8YW5kfHNjaGVtYS1lbGVtZW50fGRvY3VtZW50LW5vZGV8bm9kZXxhdClcYi9dLAorWyJ0eXAiLC9eKD86eHM6eWVhck1vbnRoRHVyYXRpb258eHM6dW5zaWduZWRMb25nfHhzOnRpbWV8eHM6c3RyaW5nfHhzOnNob3J0fHhzOlFOYW1lfHhzOk5hbWV8eHM6bG9uZ3x4czppbnRlZ2VyfHhzOmludHx4czpnWWVhck1vbnRofHhzOmdZZWFyfHhzOmdNb250aERheXx4czpnRGF5fHhzOmZsb2F0fHhzOmR1cmF0aW9ufHhzOmRvdWJsZXx4czpkZWNpbWFsfHhzOmRheVRpbWVEdXJhdGlvbnx4czpkYXRlVGltZXx4czpkYXRlfHhzOmJ5dGV8eHM6Ym9vbGVhbnx4czphbnlVUkl8eGY6eWVhck1vbnRoRHVyYXRpb24pXGIvLG51bGxdLFsiZnVuIHBsbiIsL14oPzp4cDpkZXJlZmVyZW5jZXx4aW5jOm5vZGUtZXhwYW5kfHhpbmM6bGluay1yZWZlcmVuY2VzfHhpbmM6bGluay1leHBhbmR8eGh0bWw6cmVzdHJ1Y3R1cmV8eGh0bWw6Y2xlYW58eGh0bWw6YWRkLWxpc3RzfHhkbXA6emlwLW1hbmlmZXN0fHhkbXA6emlwLWdldHx4ZG1wOnppcC1jcmVhdGV8eGRtcDp4cXVlcnktdmVyc2lvbnx4ZG1wOndvcmQtY29udmVydHx4ZG1wOndpdGgtbmFtZXNwYWNlc3x4ZG1wOnZlcnNpb258eGRtcDp2YWx1ZXx4ZG1wOnVzZXItcm9sZXN8eGRtcDp1c2VyLWxhc3QtbG9naW58eGRtcDp1c2VyfHhkbXA6dXJsLWVuY29kZXx4ZG1wOnVybC1kZWNvZGV8eGRtcDp1cmktaXMtZmlsZXx4ZG1wOnVyaS1mb3JtYXR8eGRtcDp1cmktY29udGVudC10eXBlfHhkbXA6dW5xdW90ZXx4ZG1wOnVucGF0aHx4ZG1wOnRyaWdnZXJzLWRhdGFiYXNlfHhkbXA6dHJhY2V8eGRtcDp0by1qc29ufHhkbXA6dGlkeXx4ZG1wOnN1YmJpbmFyeXx4ZG1wOnN0cmZ0aW1lfHhkbXA6c3Bhd24taW58eGRtcDpzcGF3bnx4ZG1wOnNsZWVwfHhkbXA6c2h1dGRvd258eGRtcDpzZXQtc2Vzc2lvbi1maWVsZHx4ZG1wOnNldC1yZXNwb25zZS1lbmNvZGluZ3x4ZG1wOnNldC1yZXNwb25zZS1jb250ZW50LXR5cGV8eGRtcDpzZXQtcmVzcG9uc2UtY29kZXx4ZG1wOnNldC1yZXF1ZXN0LXRpbWUtbGltaXR8eGRtcDpzZXR8eGRtcDpzZXJ2ZXJzfHhkbXA6c2VydmVyLXN0YXR1c3x4ZG1wOnNlcnZlci1uYW1lfHhkbXA6c2VydmVyfHhkbXA6c2VjdXJpdHktZGF0YWJhc2V8eGRtcDpzZWN1cml0eS1hc3NlcnR8eGRtcDpzY2hlbWEtZGF0YWJhc2V8eGRtcDpzYXZlfHhkbXA6cm9sZS1yb2xlc3x4ZG1wOnJvbGV8eGRtcDpyZXRocm93fHhkbXA6cmVzdGFydHx4ZG1wOnJlcXVlc3QtdGltZXN0YW1wfHhkbXA6cmVxdWVzdC1zdGF0dXN8eGRtcDpyZXF1ZXN0LWNhbmNlbHx4ZG1wOnJlcXVlc3R8eGRtcDpyZWRpcmVjdC1yZXNwb25zZXx4ZG1wOnJhbmRvbXx4ZG1wOnF1b3RlfHhkbXA6cXVlcnktdHJhY2V8eGRtcDpxdWVyeS1tZXRlcnN8eGRtcDpwcm9kdWN0LWVkaXRpb258eGRtcDpwcml2aWxlZ2Utcm9sZXN8eGRtcDpwcml2aWxlZ2V8eGRtcDpwcmV0dHktcHJpbnR8eGRtcDpwb3dlcnBvaW50LWNvbnZlcnR8eGRtcDpwbGF0Zm9ybXx4ZG1wOnBlcm1pc3Npb258eGRtcDpwZGYtY29udmVydHx4ZG1wOnBhdGh8eGRtcDpvY3RhbC10by1pbnRlZ2VyfHhkbXA6bm9kZS11cml8eGRtcDpub2RlLXJlcGxhY2V8eGRtcDpub2RlLWtpbmR8eGRtcDpub2RlLWluc2VydC1jaGlsZHx4ZG1wOm5vZGUtaW5zZXJ0LWJlZm9yZXx4ZG1wOm5vZGUtaW5zZXJ0LWFmdGVyfHhkbXA6bm9kZS1kZWxldGV8eGRtcDpub2RlLWRhdGFiYXNlfHhkbXA6bXVsNjR8eGRtcDptb2R1bGVzLXJvb3R8eGRtcDptb2R1bGVzLWRhdGFiYXNlfHhkbXA6bWVyZ2luZ3x4ZG1wOm1lcmdlLWNhbmNlbHx4ZG1wOm1lcmdlfHhkbXA6bWQ1fHhkbXA6bG9nb3V0fHhkbXA6bG9naW58eGRtcDpsb2ctbGV2ZWx8eGRtcDpsb2d8eGRtcDpsb2NrLXJlbGVhc2V8eGRtcDpsb2NrLWFjcXVpcmV8eGRtcDpsb2FkfHhkbXA6aW52b2tlLWlufHhkbXA6aW52b2tlfHhkbXA6aW50ZWdlci10by1vY3RhbHx4ZG1wOmludGVnZXItdG8taGV4fHhkbXA6aHR0cC1wdXR8eGRtcDpodHRwLXBvc3R8eGRtcDpodHRwLW9wdGlvbnN8eGRtcDpodHRwLWhlYWR8eGRtcDpodHRwLWdldHx4ZG1wOmh0dHAtZGVsZXRlfHhkbXA6aG9zdHN8eGRtcDpob3N0LXN0YXR1c3x4ZG1wOmhvc3QtbmFtZXx4ZG1wOmhvc3R8eGRtcDpoZXgtdG8taW50ZWdlcnx4ZG1wOmhhc2g2NHx4ZG1wOmhhc2gzMnx4ZG1wOmhhcy1wcml2aWxlZ2V8eGRtcDpncm91cHN8eGRtcDpncm91cC1zZXJ2ZXN8eGRtcDpncm91cC1zZXJ2ZXJzfHhkbXA6Z3JvdXAtbmFtZXx4ZG1wOmdyb3VwLWhvc3RzfHhkbXA6Z3JvdXB8eGRtcDpnZXQtc2Vzc2lvbi1maWVsZC1uYW1lc3x4ZG1wOmdldC1zZXNzaW9uLWZpZWxkfHhkbXA6Z2V0LXJlc3BvbnNlLWVuY29kaW5nfHhkbXA6Z2V0LXJlc3BvbnNlLWNvZGV8eGRtcDpnZXQtcmVxdWVzdC11c2VybmFtZXx4ZG1wOmdldC1yZXF1ZXN0LXVzZXJ8eGRtcDpnZXQtcmVxdWVzdC11cmx8eGRtcDpnZXQtcmVxdWVzdC1wcm90b2NvbHx4ZG1wOmdldC1yZXF1ZXN0LXBhdGh8eGRtcDpnZXQtcmVxdWVzdC1tZXRob2R8eGRtcDpnZXQtcmVxdWVzdC1oZWFkZXItbmFtZXN8eGRtcDpnZXQtcmVxdWVzdC1oZWFkZXJ8eGRtcDpnZXQtcmVxdWVzdC1maWVsZC1uYW1lc3x4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkLWZpbGVuYW1lfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGQtY29udGVudC10eXBlfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGR8eGRtcDpnZXQtcmVxdWVzdC1jbGllbnQtY2VydGlmaWNhdGV8eGRtcDpnZXQtcmVxdWVzdC1jbGllbnQtYWRkcmVzc3x4ZG1wOmdldC1yZXF1ZXN0LWJvZHl8eGRtcDpnZXQtY3VycmVudC11c2VyfHhkbXA6Z2V0LWN1cnJlbnQtcm9sZXN8eGRtcDpnZXR8eGRtcDpmdW5jdGlvbi1uYW1lfHhkbXA6ZnVuY3Rpb24tbW9kdWxlfHhkbXA6ZnVuY3Rpb258eGRtcDpmcm9tLWpzb258eGRtcDpmb3Jlc3RzfHhkbXA6Zm9yZXN0LXN0YXR1c3x4ZG1wOmZvcmVzdC1yZXN0b3JlfHhkbXA6Zm9yZXN0LXJlc3RhcnR8eGRtcDpmb3Jlc3QtbmFtZXx4ZG1wOmZvcmVzdC1kZWxldGV8eGRtcDpmb3Jlc3QtZGF0YWJhc2VzfHhkbXA6Zm9yZXN0LWNvdW50c3x4ZG1wOmZvcmVzdC1jbGVhcnx4ZG1wOmZvcmVzdC1iYWNrdXB8eGRtcDpmb3Jlc3R8eGRtcDpmaWxlc3lzdGVtLWZpbGV8eGRtcDpmaWxlc3lzdGVtLWRpcmVjdG9yeXx4ZG1wOmV4aXN0c3x4ZG1wOmV4Y2VsLWNvbnZlcnR8eGRtcDpldmFsLWlufHhkbXA6ZXZhbHx4ZG1wOmVzdGltYXRlfHhkbXA6ZW1haWx8eGRtcDplbGVtZW50LWNvbnRlbnQtdHlwZXx4ZG1wOmVsYXBzZWQtdGltZXx4ZG1wOmRvY3VtZW50LXNldC1xdWFsaXR5fHhkbXA6ZG9jdW1lbnQtc2V0LXByb3BlcnR5fHhkbXA6ZG9jdW1lbnQtc2V0LXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1zZXQtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1zZXQtY29sbGVjdGlvbnN8eGRtcDpkb2N1bWVudC1yZW1vdmUtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LXJlbW92ZS1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LXJlbW92ZS1jb2xsZWN0aW9uc3x4ZG1wOmRvY3VtZW50LXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1sb2Nrc3x4ZG1wOmRvY3VtZW50LWxvYWR8eGRtcDpkb2N1bWVudC1pbnNlcnR8eGRtcDpkb2N1bWVudC1nZXQtcXVhbGl0eXx4ZG1wOmRvY3VtZW50LWdldC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtZ2V0LXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtZ2V0LWNvbGxlY3Rpb25zfHhkbXA6ZG9jdW1lbnQtZ2V0fHhkbXA6ZG9jdW1lbnQtZm9yZXN0fHhkbXA6ZG9jdW1lbnQtZGVsZXRlfHhkbXA6ZG9jdW1lbnQtYWRkLXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1hZGQtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1hZGQtY29sbGVjdGlvbnN8eGRtcDpkaXJlY3RvcnktcHJvcGVydGllc3x4ZG1wOmRpcmVjdG9yeS1sb2Nrc3x4ZG1wOmRpcmVjdG9yeS1kZWxldGV8eGRtcDpkaXJlY3RvcnktY3JlYXRlfHhkbXA6ZGlyZWN0b3J5fHhkbXA6ZGlhY3JpdGljLWxlc3N8eGRtcDpkZXNjcmliZXx4ZG1wOmRlZmF1bHQtcGVybWlzc2lvbnN8eGRtcDpkZWZhdWx0LWNvbGxlY3Rpb25zfHhkbXA6ZGF0YWJhc2VzfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZS12YWxpZGF0ZXx4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtc3RhdHVzfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZS1jYW5jZWx8eGRtcDpkYXRhYmFzZS1yZXN0b3JlfHhkbXA6ZGF0YWJhc2UtbmFtZXx4ZG1wOmRhdGFiYXNlLWZvcmVzdHN8eGRtcDpkYXRhYmFzZS1iYWNrdXAtdmFsaWRhdGV8eGRtcDpkYXRhYmFzZS1iYWNrdXAtc3RhdHVzfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXB1cmdlfHhkbXA6ZGF0YWJhc2UtYmFja3VwLWNhbmNlbHx4ZG1wOmRhdGFiYXNlLWJhY2t1cHx4ZG1wOmRhdGFiYXNlfHhkbXA6Y29sbGVjdGlvbi1wcm9wZXJ0aWVzfHhkbXA6Y29sbGVjdGlvbi1sb2Nrc3x4ZG1wOmNvbGxlY3Rpb24tZGVsZXRlfHhkbXA6Y29sbGF0aW9uLWNhbm9uaWNhbC11cml8eGRtcDpjYXN0YWJsZS1hc3x4ZG1wOmNhbi1ncmFudC1yb2xlc3x4ZG1wOmJhc2U2NC1lbmNvZGV8eGRtcDpiYXNlNjQtZGVjb2RlfHhkbXA6YXJjaGl0ZWN0dXJlfHhkbXA6YXBwbHl8eGRtcDphbXAtcm9sZXN8eGRtcDphbXB8eGRtcDphZGQ2NHx4ZG1wOmFkZC1yZXNwb25zZS1oZWFkZXJ8eGRtcDphY2Nlc3N8dHJncjp0cmlnZ2VyLXNldC1yZWN1cnNpdmV8dHJncjp0cmlnZ2VyLXNldC1wZXJtaXNzaW9uc3x0cmdyOnRyaWdnZXItc2V0LW5hbWV8dHJncjp0cmlnZ2VyLXNldC1tb2R1bGV8dHJncjp0cmlnZ2VyLXNldC1ldmVudHx0cmdyOnRyaWdnZXItc2V0LWRlc2NyaXB0aW9ufHRyZ3I6dHJpZ2dlci1yZW1vdmUtcGVybWlzc2lvbnN8dHJncjp0cmlnZ2VyLW1vZHVsZXx0cmdyOnRyaWdnZXItZ2V0LXBlcm1pc3Npb25zfHRyZ3I6dHJpZ2dlci1lbmFibGV8dHJncjp0cmlnZ2VyLWRpc2FibGV8dHJncjp0cmlnZ2VyLWRhdGFiYXNlLW9ubGluZS1ldmVudHx0cmdyOnRyaWdnZXItZGF0YS1ldmVudHx0cmdyOnRyaWdnZXItYWRkLXBlcm1pc3Npb25zfHRyZ3I6cmVtb3ZlLXRyaWdnZXJ8dHJncjpwcm9wZXJ0eS1jb250ZW50fHRyZ3I6cHJlLWNvbW1pdHx0cmdyOnBvc3QtY29tbWl0fHRyZ3I6Z2V0LXRyaWdnZXItYnktaWR8dHJncjpnZXQtdHJpZ2dlcnx0cmdyOmRvY3VtZW50LXNjb3BlfHRyZ3I6ZG9jdW1lbnQtY29udGVudHx0cmdyOmRpcmVjdG9yeS1zY29wZXx0cmdyOmNyZWF0ZS10cmlnZ2VyfHRyZ3I6Y29sbGVjdGlvbi1zY29wZXx0cmdyOmFueS1wcm9wZXJ0eS1jb250ZW50fHRoc3I6c2V0LWVudHJ5fHRoc3I6cmVtb3ZlLXRlcm18dGhzcjpyZW1vdmUtc3lub255bXx0aHNyOnJlbW92ZS1lbnRyeXx0aHNyOnF1ZXJ5LWxvb2t1cHx0aHNyOmxvb2t1cHx0aHNyOmxvYWR8dGhzcjppbnNlcnR8dGhzcjpleHBhbmR8dGhzcjphZGQtc3lub255bXxzcGVsbDpzdWdnZXN0LWRldGFpbGVkfHNwZWxsOnN1Z2dlc3R8c3BlbGw6cmVtb3ZlLXdvcmR8c3BlbGw6bWFrZS1kaWN0aW9uYXJ5fHNwZWxsOmxvYWR8c3BlbGw6bGV2ZW5zaHRlaW4tZGlzdGFuY2V8c3BlbGw6aXMtY29ycmVjdHxzcGVsbDppbnNlcnR8c3BlbGw6ZG91YmxlLW1ldGFwaG9uZXxzcGVsbDphZGQtd29yZHxzZWM6dXNlcnMtY29sbGVjdGlvbnxzZWM6dXNlci1zZXQtcm9sZXN8c2VjOnVzZXItc2V0LXBhc3N3b3JkfHNlYzp1c2VyLXNldC1uYW1lfHNlYzp1c2VyLXNldC1kZXNjcmlwdGlvbnxzZWM6dXNlci1zZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6dXNlci1zZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6dXNlci1yZW1vdmUtcm9sZXN8c2VjOnVzZXItcHJpdmlsZWdlc3xzZWM6dXNlci1nZXQtcm9sZXN8c2VjOnVzZXItZ2V0LWRlc2NyaXB0aW9ufHNlYzp1c2VyLWdldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzp1c2VyLWdldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzp1c2VyLWRvYy1wZXJtaXNzaW9uc3xzZWM6dXNlci1kb2MtY29sbGVjdGlvbnN8c2VjOnVzZXItYWRkLXJvbGVzfHNlYzp1bnByb3RlY3QtY29sbGVjdGlvbnxzZWM6dWlkLWZvci1uYW1lfHNlYzpzZXQtcmVhbG18c2VjOnNlY3VyaXR5LXZlcnNpb258c2VjOnNlY3VyaXR5LW5hbWVzcGFjZXxzZWM6c2VjdXJpdHktaW5zdGFsbGVkfHNlYzpzZWN1cml0eS1jb2xsZWN0aW9ufHNlYzpyb2xlcy1jb2xsZWN0aW9ufHNlYzpyb2xlLXNldC1yb2xlc3xzZWM6cm9sZS1zZXQtbmFtZXxzZWM6cm9sZS1zZXQtZGVzY3JpcHRpb258c2VjOnJvbGUtc2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnJvbGUtc2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnJvbGUtcmVtb3ZlLXJvbGVzfHNlYzpyb2xlLXByaXZpbGVnZXN8c2VjOnJvbGUtZ2V0LXJvbGVzfHNlYzpyb2xlLWdldC1kZXNjcmlwdGlvbnxzZWM6cm9sZS1nZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6cm9sZS1nZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6cm9sZS1kb2MtcGVybWlzc2lvbnN8c2VjOnJvbGUtZG9jLWNvbGxlY3Rpb25zfHNlYzpyb2xlLWFkZC1yb2xlc3xzZWM6cmVtb3ZlLXVzZXJ8c2VjOnJlbW92ZS1yb2xlLWZyb20tdXNlcnN8c2VjOnJlbW92ZS1yb2xlLWZyb20tcm9sZXxzZWM6cmVtb3ZlLXJvbGUtZnJvbS1wcml2aWxlZ2VzfHNlYzpyZW1vdmUtcm9sZS1mcm9tLWFtcHN8c2VjOnJlbW92ZS1yb2xlfHNlYzpyZW1vdmUtcHJpdmlsZWdlfHNlYzpyZW1vdmUtYW1wfHNlYzpwcm90ZWN0LWNvbGxlY3Rpb258c2VjOnByaXZpbGVnZXMtY29sbGVjdGlvbnxzZWM6cHJpdmlsZWdlLXNldC1yb2xlc3xzZWM6cHJpdmlsZWdlLXNldC1uYW1lfHNlYzpwcml2aWxlZ2UtcmVtb3ZlLXJvbGVzfHNlYzpwcml2aWxlZ2UtZ2V0LXJvbGVzfHNlYzpwcml2aWxlZ2UtYWRkLXJvbGVzfHNlYzpwcml2LWRvYy1wZXJtaXNzaW9uc3xzZWM6cHJpdi1kb2MtY29sbGVjdGlvbnN8c2VjOmdldC11c2VyLW5hbWVzfHNlYzpnZXQtdW5pcXVlLWVsZW0taWR8c2VjOmdldC1yb2xlLW5hbWVzfHNlYzpnZXQtcm9sZS1pZHN8c2VjOmdldC1wcml2aWxlZ2V8c2VjOmdldC1kaXN0aW5jdC1wZXJtaXNzaW9uc3xzZWM6Z2V0LWNvbGxlY3Rpb258c2VjOmdldC1hbXB8c2VjOmNyZWF0ZS11c2VyLXdpdGgtcm9sZXxzZWM6Y3JlYXRlLXVzZXJ8c2VjOmNyZWF0ZS1yb2xlfHNlYzpjcmVhdGUtcHJpdmlsZWdlfHNlYzpjcmVhdGUtYW1wfHNlYzpjb2xsZWN0aW9ucy1jb2xsZWN0aW9ufHNlYzpjb2xsZWN0aW9uLXNldC1wZXJtaXNzaW9uc3xzZWM6Y29sbGVjdGlvbi1yZW1vdmUtcGVybWlzc2lvbnN8c2VjOmNvbGxlY3Rpb24tZ2V0LXBlcm1pc3Npb25zfHNlYzpjb2xsZWN0aW9uLWFkZC1wZXJtaXNzaW9uc3xzZWM6Y2hlY2stYWRtaW58c2VjOmFtcHMtY29sbGVjdGlvbnxzZWM6YW1wLXNldC1yb2xlc3xzZWM6YW1wLXJlbW92ZS1yb2xlc3xzZWM6YW1wLWdldC1yb2xlc3xzZWM6YW1wLWRvYy1wZXJtaXNzaW9uc3xzZWM6YW1wLWRvYy1jb2xsZWN0aW9uc3xzZWM6YW1wLWFkZC1yb2xlc3xzZWFyY2g6dW5wYXJzZXxzZWFyY2g6c3VnZ2VzdHxzZWFyY2g6c25pcHBldHxzZWFyY2g6c2VhcmNofHNlYXJjaDpyZXNvbHZlLW5vZGVzfHNlYXJjaDpyZXNvbHZlfHNlYXJjaDpyZW1vdmUtY29uc3RyYWludHxzZWFyY2g6cGFyc2V8c2VhcmNoOmdldC1kZWZhdWx0LW9wdGlvbnN8c2VhcmNoOmVzdGltYXRlfHNlYXJjaDpjaGVjay1vcHRpb25zfHByb2Y6dmFsdWV8cHJvZjpyZXNldHxwcm9mOnJlcG9ydHxwcm9mOmludm9rZXxwcm9mOmV2YWx8cHJvZjplbmFibGV8cHJvZjpkaXNhYmxlfHByb2Y6YWxsb3dlZHxwcHQ6Y2xlYW58cGtpOnRlbXBsYXRlLXNldC1yZXF1ZXN0fHBraTp0ZW1wbGF0ZS1zZXQtbmFtZXxwa2k6dGVtcGxhdGUtc2V0LWtleS10eXBlfHBraTp0ZW1wbGF0ZS1zZXQta2V5LW9wdGlvbnN8cGtpOnRlbXBsYXRlLXNldC1kZXNjcmlwdGlvbnxwa2k6dGVtcGxhdGUtaW4tdXNlfHBraTp0ZW1wbGF0ZS1nZXQtdmVyc2lvbnxwa2k6dGVtcGxhdGUtZ2V0LXJlcXVlc3R8cGtpOnRlbXBsYXRlLWdldC1uYW1lfHBraTp0ZW1wbGF0ZS1nZXQta2V5LXR5cGV8cGtpOnRlbXBsYXRlLWdldC1rZXktb3B0aW9uc3xwa2k6dGVtcGxhdGUtZ2V0LWlkfHBraTp0ZW1wbGF0ZS1nZXQtZGVzY3JpcHRpb258cGtpOm5lZWQtY2VydGlmaWNhdGV8cGtpOmlzLXRlbXBvcmFyeXxwa2k6aW5zZXJ0LXRydXN0ZWQtY2VydGlmaWNhdGVzfHBraTppbnNlcnQtdGVtcGxhdGV8cGtpOmluc2VydC1zaWduZWQtY2VydGlmaWNhdGVzfHBraTppbnNlcnQtY2VydGlmaWNhdGUtcmV2b2NhdGlvbi1saXN0fHBraTpnZXQtdHJ1c3RlZC1jZXJ0aWZpY2F0ZS1pZHN8cGtpOmdldC10ZW1wbGF0ZS1pZHN8cGtpOmdldC10ZW1wbGF0ZS1jZXJ0aWZpY2F0ZS1hdXRob3JpdHl8cGtpOmdldC10ZW1wbGF0ZS1ieS1uYW1lfHBraTpnZXQtdGVtcGxhdGV8cGtpOmdldC1wZW5kaW5nLWNlcnRpZmljYXRlLXJlcXVlc3RzLXhtbHxwa2k6Z2V0LXBlbmRpbmctY2VydGlmaWNhdGUtcmVxdWVzdHMtcGVtfHBraTpnZXQtcGVuZGluZy1jZXJ0aWZpY2F0ZS1yZXF1ZXN0fHBraTpnZXQtY2VydGlmaWNhdGVzLWZvci10ZW1wbGF0ZS14bWx8cGtpOmdldC1jZXJ0aWZpY2F0ZXMtZm9yLXRlbXBsYXRlfHBraTpnZXQtY2VydGlmaWNhdGVzfHBraTpnZXQtY2VydGlmaWNhdGUteG1sfHBraTpnZXQtY2VydGlmaWNhdGUtcGVtfHBraTpnZXQtY2VydGlmaWNhdGV8cGtpOmdlbmVyYXRlLXRlbXBvcmFyeS1jZXJ0aWZpY2F0ZS1pZi1uZWNlc3Nhcnl8cGtpOmdlbmVyYXRlLXRlbXBvcmFyeS1jZXJ0aWZpY2F0ZXxwa2k6Z2VuZXJhdGUtdGVtcGxhdGUtY2VydGlmaWNhdGUtYXV0aG9yaXR5fHBraTpnZW5lcmF0ZS1jZXJ0aWZpY2F0ZS1yZXF1ZXN0fHBraTpkZWxldGUtdGVtcGxhdGV8cGtpOmRlbGV0ZS1jZXJ0aWZpY2F0ZXxwa2k6Y3JlYXRlLXRlbXBsYXRlfHBkZjptYWtlLXRvY3xwZGY6aW5zZXJ0LXRvYy1oZWFkZXJzfHBkZjpnZXQtdG9jfHBkZjpjbGVhbnxwOnN0YXR1cy10cmFuc2l0aW9ufHA6c3RhdGUtdHJhbnNpdGlvbnxwOnJlbW92ZXxwOnBpcGVsaW5lc3xwOmluc2VydHxwOmdldC1ieS1pZHxwOmdldHxwOmV4ZWN1dGV8cDpjcmVhdGV8cDpjb25kaXRpb258cDpjb2xsZWN0aW9ufHA6YWN0aW9ufG9veG1sOnJ1bnMtbWVyZ2V8b294bWw6cGFja2FnZS11cmlzfG9veG1sOnBhY2thZ2UtcGFydHMtaW5zZXJ0fG9veG1sOnBhY2thZ2UtcGFydHN8bXN3b3JkOmNsZWFufG1jZ206cG9seWdvbnxtY2dtOnBvaW50fG1jZ206Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfG1jZ206Z2Vvc3BhdGlhbC1xdWVyeXxtY2dtOmNpcmNsZXxtYXRoOnRhbmh8bWF0aDp0YW58bWF0aDpzcXJ0fG1hdGg6c2luaHxtYXRoOnNpbnxtYXRoOnBvd3xtYXRoOm1vZGZ8bWF0aDpsb2cxMHxtYXRoOmxvZ3xtYXRoOmxkZXhwfG1hdGg6ZnJleHB8bWF0aDpmbW9kfG1hdGg6Zmxvb3J8bWF0aDpmYWJzfG1hdGg6ZXhwfG1hdGg6Y29zaHxtYXRoOmNvc3xtYXRoOmNlaWx8bWF0aDphdGFuMnxtYXRoOmF0YW58bWF0aDphc2lufG1hdGg6YWNvc3xtYXA6cHV0fG1hcDptYXB8bWFwOmtleXN8bWFwOmdldHxtYXA6ZGVsZXRlfG1hcDpjb3VudHxtYXA6Y2xlYXJ8bG5rOnRvfGxuazpyZW1vdmV8bG5rOmluc2VydHxsbms6Z2V0fGxuazpmcm9tfGxuazpjcmVhdGV8a21sOnBvbHlnb258a21sOnBvaW50fGttbDppbnRlcmlvci1wb2x5Z29ufGttbDpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8a21sOmdlb3NwYXRpYWwtcXVlcnl8a21sOmNpcmNsZXxrbWw6Ym94fGdtbDpwb2x5Z29ufGdtbDpwb2ludHxnbWw6aW50ZXJpb3ItcG9seWdvbnxnbWw6Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfGdtbDpnZW9zcGF0aWFsLXF1ZXJ5fGdtbDpjaXJjbGV8Z21sOmJveHxnZW9yc3M6cG9pbnR8Z2VvcnNzOmdlb3NwYXRpYWwtcXVlcnl8Z2VvcnNzOmNpcmNsZXxnZW86cG9seWdvbnxnZW86cG9pbnR8Z2VvOmludGVyaW9yLXBvbHlnb258Z2VvOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xnZW86Z2Vvc3BhdGlhbC1xdWVyeXxnZW86Y2lyY2xlfGdlbzpib3h8Zm46emVyby1vci1vbmV8Zm46eWVhcnMtZnJvbS1kdXJhdGlvbnxmbjp5ZWFyLWZyb20tZGF0ZVRpbWV8Zm46eWVhci1mcm9tLWRhdGV8Zm46dXBwZXItY2FzZXxmbjp1bm9yZGVyZWR8Zm46dHJ1ZXxmbjp0cmFuc2xhdGV8Zm46dHJhY2V8Zm46dG9rZW5pemV8Zm46dGltZXpvbmUtZnJvbS10aW1lfGZuOnRpbWV6b25lLWZyb20tZGF0ZVRpbWV8Zm46dGltZXpvbmUtZnJvbS1kYXRlfGZuOnN1bXxmbjpzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmcteWVhck1vbnRoRHVyYXRpb258Zm46c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLWRheVRpbWVEdXJhdGlvbnxmbjpzdWJzdHJpbmctYmVmb3JlfGZuOnN1YnN0cmluZy1hZnRlcnxmbjpzdWJzdHJpbmd8Zm46c3Vic2VxdWVuY2V8Zm46c3RyaW5nLXRvLWNvZGVwb2ludHN8Zm46c3RyaW5nLXBhZHxmbjpzdHJpbmctbGVuZ3RofGZuOnN0cmluZy1qb2lufGZuOnN0cmluZ3xmbjpzdGF0aWMtYmFzZS11cml8Zm46c3RhcnRzLXdpdGh8Zm46c2Vjb25kcy1mcm9tLXRpbWV8Zm46c2Vjb25kcy1mcm9tLWR1cmF0aW9ufGZuOnNlY29uZHMtZnJvbS1kYXRlVGltZXxmbjpyb3VuZC1oYWxmLXRvLWV2ZW58Zm46cm91bmR8Zm46cm9vdHxmbjpyZXZlcnNlfGZuOnJlc29sdmUtdXJpfGZuOnJlc29sdmUtUU5hbWV8Zm46cmVwbGFjZXxmbjpyZW1vdmV8Zm46UU5hbWV8Zm46cHJlZml4LWZyb20tUU5hbWV8Zm46cG9zaXRpb258Zm46b25lLW9yLW1vcmV8Zm46bnVtYmVyfGZuOm5vdHxmbjpub3JtYWxpemUtdW5pY29kZXxmbjpub3JtYWxpemUtc3BhY2V8Zm46bm9kZS1uYW1lfGZuOm5vZGUta2luZHxmbjpuaWxsZWR8Zm46bmFtZXNwYWNlLXVyaS1mcm9tLVFOYW1lfGZuOm5hbWVzcGFjZS11cmktZm9yLXByZWZpeHxmbjpuYW1lc3BhY2UtdXJpfGZuOm5hbWV8Zm46bW9udGhzLWZyb20tZHVyYXRpb258Zm46bW9udGgtZnJvbS1kYXRlVGltZXxmbjptb250aC1mcm9tLWRhdGV8Zm46bWludXRlcy1mcm9tLXRpbWV8Zm46bWludXRlcy1mcm9tLWR1cmF0aW9ufGZuOm1pbnV0ZXMtZnJvbS1kYXRlVGltZXxmbjptaW58Zm46bWF4fGZuOm1hdGNoZXN8Zm46bG93ZXItY2FzZXxmbjpsb2NhbC1uYW1lLWZyb20tUU5hbWV8Zm46bG9jYWwtbmFtZXxmbjpsYXN0fGZuOmxhbmd8Zm46aXJpLXRvLXVyaXxmbjppbnNlcnQtYmVmb3JlfGZuOmluZGV4LW9mfGZuOmluLXNjb3BlLXByZWZpeGVzfGZuOmltcGxpY2l0LXRpbWV6b25lfGZuOmlkcmVmfGZuOmlkfGZuOmhvdXJzLWZyb20tdGltZXxmbjpob3Vycy1mcm9tLWR1cmF0aW9ufGZuOmhvdXJzLWZyb20tZGF0ZVRpbWV8Zm46Zmxvb3J8Zm46ZmFsc2V8Zm46ZXhwYW5kZWQtUU5hbWV8Zm46ZXhpc3RzfGZuOmV4YWN0bHktb25lfGZuOmVzY2FwZS11cml8Zm46ZXNjYXBlLWh0bWwtdXJpfGZuOmVycm9yfGZuOmVuZHMtd2l0aHxmbjplbmNvZGUtZm9yLXVyaXxmbjplbXB0eXxmbjpkb2N1bWVudC11cml8Zm46ZG9jLWF2YWlsYWJsZXxmbjpkb2N8Zm46ZGlzdGluY3QtdmFsdWVzfGZuOmRpc3RpbmN0LW5vZGVzfGZuOmRlZmF1bHQtY29sbGF0aW9ufGZuOmRlZXAtZXF1YWx8Zm46ZGF5cy1mcm9tLWR1cmF0aW9ufGZuOmRheS1mcm9tLWRhdGVUaW1lfGZuOmRheS1mcm9tLWRhdGV8Zm46ZGF0YXxmbjpjdXJyZW50LXRpbWV8Zm46Y3VycmVudC1kYXRlVGltZXxmbjpjdXJyZW50LWRhdGV8Zm46Y291bnR8Zm46Y29udGFpbnN8Zm46Y29uY2F0fGZuOmNvbXBhcmV8Zm46Y29sbGVjdGlvbnxmbjpjb2RlcG9pbnRzLXRvLXN0cmluZ3xmbjpjb2RlcG9pbnQtZXF1YWx8Zm46Y2VpbGluZ3xmbjpib29sZWFufGZuOmJhc2UtdXJpfGZuOmF2Z3xmbjphZGp1c3QtdGltZS10by10aW1lem9uZXxmbjphZGp1c3QtZGF0ZVRpbWUtdG8tdGltZXpvbmV8Zm46YWRqdXN0LWRhdGUtdG8tdGltZXpvbmV8Zm46YWJzfGZlZWQ6dW5zdWJzY3JpYmV8ZmVlZDpzdWJzY3JpcHRpb258ZmVlZDpzdWJzY3JpYmV8ZmVlZDpyZXF1ZXN0fGZlZWQ6aXRlbXxmZWVkOmRlc2NyaXB0aW9ufGV4Y2VsOmNsZWFufGVudGl0eTplbnJpY2h8ZG9tOnNldC1waXBlbGluZXN8ZG9tOnNldC1wZXJtaXNzaW9uc3xkb206c2V0LW5hbWV8ZG9tOnNldC1ldmFsdWF0aW9uLWNvbnRleHR8ZG9tOnNldC1kb21haW4tc2NvcGV8ZG9tOnNldC1kZXNjcmlwdGlvbnxkb206cmVtb3ZlLXBpcGVsaW5lfGRvbTpyZW1vdmUtcGVybWlzc2lvbnN8ZG9tOnJlbW92ZXxkb206Z2V0fGRvbTpldmFsdWF0aW9uLWNvbnRleHR8ZG9tOmRvbWFpbnN8ZG9tOmRvbWFpbi1zY29wZXxkb206Y3JlYXRlfGRvbTpjb25maWd1cmF0aW9uLXNldC1yZXN0YXJ0LXVzZXJ8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LXBlcm1pc3Npb25zfGRvbTpjb25maWd1cmF0aW9uLXNldC1ldmFsdWF0aW9uLWNvbnRleHR8ZG9tOmNvbmZpZ3VyYXRpb24tc2V0LWRlZmF1bHQtZG9tYWlufGRvbTpjb25maWd1cmF0aW9uLWdldHxkb206Y29uZmlndXJhdGlvbi1jcmVhdGV8ZG9tOmNvbGxlY3Rpb258ZG9tOmFkZC1waXBlbGluZXxkb206YWRkLXBlcm1pc3Npb25zfGRsczpyZXRlbnRpb24tcnVsZXN8ZGxzOnJldGVudGlvbi1ydWxlLXJlbW92ZXxkbHM6cmV0ZW50aW9uLXJ1bGUtaW5zZXJ0fGRsczpyZXRlbnRpb24tcnVsZXxkbHM6cHVyZ2V8ZGxzOm5vZGUtZXhwYW5kfGRsczpsaW5rLXJlZmVyZW5jZXN8ZGxzOmxpbmstZXhwYW5kfGRsczpkb2N1bWVudHMtcXVlcnl8ZGxzOmRvY3VtZW50LXZlcnNpb25zLXF1ZXJ5fGRsczpkb2N1bWVudC12ZXJzaW9uLXVyaXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi1xdWVyeXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi1kZWxldGV8ZGxzOmRvY3VtZW50LXZlcnNpb24tYXMtb2Z8ZGxzOmRvY3VtZW50LXZlcnNpb258ZGxzOmRvY3VtZW50LXVwZGF0ZXxkbHM6ZG9jdW1lbnQtdW5tYW5hZ2V8ZGxzOmRvY3VtZW50LXNldC1xdWFsaXR5fGRsczpkb2N1bWVudC1zZXQtcHJvcGVydHl8ZGxzOmRvY3VtZW50LXNldC1wcm9wZXJ0aWVzfGRsczpkb2N1bWVudC1zZXQtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LXNldC1jb2xsZWN0aW9uc3xkbHM6ZG9jdW1lbnQtcmV0ZW50aW9uLXJ1bGVzfGRsczpkb2N1bWVudC1yZW1vdmUtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1yZW1vdmUtY29sbGVjdGlvbnN8ZGxzOmRvY3VtZW50LXB1cmdlfGRsczpkb2N1bWVudC1tYW5hZ2V8ZGxzOmRvY3VtZW50LWlzLW1hbmFnZWR8ZGxzOmRvY3VtZW50LWluc2VydC1hbmQtbWFuYWdlfGRsczpkb2N1bWVudC1pbmNsdWRlLXF1ZXJ5fGRsczpkb2N1bWVudC1oaXN0b3J5fGRsczpkb2N1bWVudC1nZXQtcGVybWlzc2lvbnN8ZGxzOmRvY3VtZW50LWV4dHJhY3QtcGFydHxkbHM6ZG9jdW1lbnQtZGVsZXRlfGRsczpkb2N1bWVudC1jaGVja291dC1zdGF0dXN8ZGxzOmRvY3VtZW50LWNoZWNrb3V0fGRsczpkb2N1bWVudC1jaGVja2lufGRsczpkb2N1bWVudC1hZGQtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtYWRkLXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1hZGQtY29sbGVjdGlvbnN8ZGxzOmJyZWFrLWNoZWNrb3V0fGRsczphdXRob3ItcXVlcnl8ZGxzOmFzLW9mLXF1ZXJ5fGRiazpjb252ZXJ0fGRiZzp3YWl0fGRiZzp2YWx1ZXxkYmc6c3RvcHBlZHxkYmc6c3RvcHxkYmc6c3RlcHxkYmc6c3RhdHVzfGRiZzpzdGFja3xkYmc6b3V0fGRiZzpuZXh0fGRiZzpsaW5lfGRiZzppbnZva2V8ZGJnOmZ1bmN0aW9ufGRiZzpmaW5pc2h8ZGJnOmV4cHJ8ZGJnOmV2YWx8ZGJnOmRpc2Nvbm5lY3R8ZGJnOmRldGFjaHxkYmc6Y29udGludWV8ZGJnOmNvbm5lY3R8ZGJnOmNsZWFyfGRiZzpicmVha3BvaW50c3xkYmc6YnJlYWt8ZGJnOmF0dGFjaGVkfGRiZzphdHRhY2h8Y3Z0OnNhdmUtY29udmVydGVkLWRvY3VtZW50c3xjdnQ6cGFydC11cml8Y3Z0OmRlc3RpbmF0aW9uLXVyaXxjdnQ6YmFzZXBhdGh8Y3Z0OmJhc2VuYW1lfGN0czp3b3Jkc3xjdHM6d29yZC1xdWVyeS13ZWlnaHR8Y3RzOndvcmQtcXVlcnktdGV4dHxjdHM6d29yZC1xdWVyeS1vcHRpb25zfGN0czp3b3JkLXF1ZXJ5fGN0czp3b3JkLW1hdGNofGN0czp3YWxrfGN0czp1cmlzfGN0czp1cmktbWF0Y2h8Y3RzOnRyYWlufGN0czp0b2tlbml6ZXxjdHM6dGhyZXNob2xkc3xjdHM6c3RlbXxjdHM6c2ltaWxhci1xdWVyeS13ZWlnaHR8Y3RzOnNpbWlsYXItcXVlcnktbm9kZXN8Y3RzOnNpbWlsYXItcXVlcnl8Y3RzOnNob3J0ZXN0LWRpc3RhbmNlfGN0czpzZWFyY2h8Y3RzOnNjb3JlfGN0czpyZXZlcnNlLXF1ZXJ5LXdlaWdodHxjdHM6cmV2ZXJzZS1xdWVyeS1ub2Rlc3xjdHM6cmV2ZXJzZS1xdWVyeXxjdHM6cmVtYWluZGVyfGN0czpyZWdpc3RlcmVkLXF1ZXJ5LXdlaWdodHxjdHM6cmVnaXN0ZXJlZC1xdWVyeS1vcHRpb25zfGN0czpyZWdpc3RlcmVkLXF1ZXJ5LWlkc3xjdHM6cmVnaXN0ZXJlZC1xdWVyeXxjdHM6cmVnaXN0ZXJ8Y3RzOnF1ZXJ5fGN0czpxdWFsaXR5fGN0czpwcm9wZXJ0aWVzLXF1ZXJ5LXF1ZXJ5fGN0czpwcm9wZXJ0aWVzLXF1ZXJ5fGN0czpwb2x5Z29uLXZlcnRpY2VzfGN0czpwb2x5Z29ufGN0czpwb2ludC1sb25naXR1ZGV8Y3RzOnBvaW50LWxhdGl0dWRlfGN0czpwb2ludHxjdHM6b3ItcXVlcnktcXVlcmllc3xjdHM6b3ItcXVlcnl8Y3RzOm5vdC1xdWVyeS13ZWlnaHR8Y3RzOm5vdC1xdWVyeS1xdWVyeXxjdHM6bm90LXF1ZXJ5fGN0czpuZWFyLXF1ZXJ5LXdlaWdodHxjdHM6bmVhci1xdWVyeS1xdWVyaWVzfGN0czpuZWFyLXF1ZXJ5LW9wdGlvbnN8Y3RzOm5lYXItcXVlcnktZGlzdGFuY2V8Y3RzOm5lYXItcXVlcnl8Y3RzOmhpZ2hsaWdodHxjdHM6Z2Vvc3BhdGlhbC1jby1vY2N1cnJlbmNlc3xjdHM6ZnJlcXVlbmN5fGN0czpmaXRuZXNzfGN0czpmaWVsZC13b3Jkc3xjdHM6ZmllbGQtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmZpZWxkLXdvcmQtcXVlcnktdGV4dHxjdHM6ZmllbGQtd29yZC1xdWVyeS1vcHRpb25zfGN0czpmaWVsZC13b3JkLXF1ZXJ5LWZpZWxkLW5hbWV8Y3RzOmZpZWxkLXdvcmQtcXVlcnl8Y3RzOmZpZWxkLXdvcmQtbWF0Y2h8Y3RzOmVudGl0eS1oaWdobGlnaHR8Y3RzOmVsZW1lbnQtd29yZHN8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS10ZXh0fGN0czplbGVtZW50LXdvcmQtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5fGN0czplbGVtZW50LXdvcmQtbWF0Y2h8Y3RzOmVsZW1lbnQtdmFsdWVzfGN0czplbGVtZW50LXZhbHVlLXJhbmdlc3xjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeXxjdHM6ZWxlbWVudC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC12YWx1ZS1nZW9zcGF0aWFsLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LXZhbHVlLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS12YWx1ZXxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LW9wZXJhdG9yfGN0czplbGVtZW50LXJhbmdlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeXxjdHM6ZWxlbWVudC1xdWVyeS1xdWVyeXxjdHM6ZWxlbWVudC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtcXVlcnl8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sb25naXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbGF0aXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktY2hpbGQtbmFtZXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5fGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtYm94ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmRzfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS10ZXh0fGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LWF0dHJpYnV0ZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLW1hdGNofGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXJhbmdlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS10ZXh0fGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LWF0dHJpYnV0ZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLWdlb3NwYXRpYWwtY28tb2NjdXJyZW5jZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LXZhbHVlfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1vcGVyYXRvcnxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC12YWx1ZS1tYXRjaHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sb25naXR1ZGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxhdGl0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcGFpci1nZW9zcGF0aWFsLWJveGVzfGN0czpkb2N1bWVudC1xdWVyeS11cmlzfGN0czpkb2N1bWVudC1xdWVyeXxjdHM6ZGlzdGFuY2V8Y3RzOmRpcmVjdG9yeS1xdWVyeS11cmlzfGN0czpkaXJlY3RvcnktcXVlcnktZGVwdGh8Y3RzOmRpcmVjdG9yeS1xdWVyeXxjdHM6ZGVzdGluYXRpb258Y3RzOmRlcmVnaXN0ZXJ8Y3RzOmNvbnRhaW5zfGN0czpjb25maWRlbmNlfGN0czpjb2xsZWN0aW9uc3xjdHM6Y29sbGVjdGlvbi1xdWVyeS11cmlzfGN0czpjb2xsZWN0aW9uLXF1ZXJ5fGN0czpjb2xsZWN0aW9uLW1hdGNofGN0czpjbGFzc2lmeXxjdHM6Y2lyY2xlLXJhZGl1c3xjdHM6Y2lyY2xlLWNlbnRlcnxjdHM6Y2lyY2xlfGN0czpib3gtd2VzdHxjdHM6Ym94LXNvdXRofGN0czpib3gtbm9ydGh8Y3RzOmJveC1lYXN0fGN0czpib3h8Y3RzOmJlYXJpbmd8Y3RzOmFyYy1pbnRlcnNlY3Rpb258Y3RzOmFuZC1xdWVyeS1xdWVyaWVzfGN0czphbmQtcXVlcnktb3B0aW9uc3xjdHM6YW5kLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5LXBvc2l0aXZlLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5LW5lZ2F0aXZlLXF1ZXJ5fGN0czphbmQtbm90LXF1ZXJ5fGNzczpnZXR8Y3NzOmNvbnZlcnR8Y3BmOnN1Y2Nlc3N8Y3BmOmZhaWx1cmV8Y3BmOmRvY3VtZW50LXNldC1zdGF0ZXxjcGY6ZG9jdW1lbnQtc2V0LXByb2Nlc3Npbmctc3RhdHVzfGNwZjpkb2N1bWVudC1zZXQtbGFzdC11cGRhdGVkfGNwZjpkb2N1bWVudC1zZXQtZXJyb3J8Y3BmOmRvY3VtZW50LWdldC1zdGF0ZXxjcGY6ZG9jdW1lbnQtZ2V0LXByb2Nlc3Npbmctc3RhdHVzfGNwZjpkb2N1bWVudC1nZXQtbGFzdC11cGRhdGVkfGNwZjpkb2N1bWVudC1nZXQtZXJyb3J8Y3BmOmNoZWNrLXRyYW5zaXRpb258YWxlcnQ6c3Bhd24tbWF0Y2hpbmctYWN0aW9uc3xhbGVydDpydWxlLXVzZXItaWQtcXVlcnl8YWxlcnQ6cnVsZS1zZXQtdXNlci1pZHxhbGVydDpydWxlLXNldC1xdWVyeXxhbGVydDpydWxlLXNldC1vcHRpb25zfGFsZXJ0OnJ1bGUtc2V0LW5hbWV8YWxlcnQ6cnVsZS1zZXQtZGVzY3JpcHRpb258YWxlcnQ6cnVsZS1zZXQtYWN0aW9ufGFsZXJ0OnJ1bGUtcmVtb3ZlfGFsZXJ0OnJ1bGUtbmFtZS1xdWVyeXxhbGVydDpydWxlLWluc2VydHxhbGVydDpydWxlLWlkLXF1ZXJ5fGFsZXJ0OnJ1bGUtZ2V0LXVzZXItaWR8YWxlcnQ6cnVsZS1nZXQtcXVlcnl8YWxlcnQ6cnVsZS1nZXQtb3B0aW9uc3xhbGVydDpydWxlLWdldC1uYW1lfGFsZXJ0OnJ1bGUtZ2V0LWlkfGFsZXJ0OnJ1bGUtZ2V0LWRlc2NyaXB0aW9ufGFsZXJ0OnJ1bGUtZ2V0LWFjdGlvbnxhbGVydDpydWxlLWFjdGlvbi1xdWVyeXxhbGVydDpyZW1vdmUtdHJpZ2dlcnN8YWxlcnQ6bWFrZS1ydWxlfGFsZXJ0Om1ha2UtbG9nLWFjdGlvbnxhbGVydDptYWtlLWNvbmZpZ3xhbGVydDptYWtlLWFjdGlvbnxhbGVydDppbnZva2UtbWF0Y2hpbmctYWN0aW9uc3xhbGVydDpnZXQtbXktcnVsZXN8YWxlcnQ6Z2V0LWFsbC1ydWxlc3xhbGVydDpnZXQtYWN0aW9uc3xhbGVydDpmaW5kLW1hdGNoaW5nLXJ1bGVzfGFsZXJ0OmNyZWF0ZS10cmlnZ2Vyc3xhbGVydDpjb25maWctc2V0LXVyaXxhbGVydDpjb25maWctc2V0LXRyaWdnZXItaWRzfGFsZXJ0OmNvbmZpZy1zZXQtb3B0aW9uc3xhbGVydDpjb25maWctc2V0LW5hbWV8YWxlcnQ6Y29uZmlnLXNldC1kZXNjcmlwdGlvbnxhbGVydDpjb25maWctc2V0LWNwZi1kb21haW4tbmFtZXN8YWxlcnQ6Y29uZmlnLXNldC1jcGYtZG9tYWluLWlkc3xhbGVydDpjb25maWctaW5zZXJ0fGFsZXJ0OmNvbmZpZy1nZXQtdXJpfGFsZXJ0OmNvbmZpZy1nZXQtdHJpZ2dlci1pZHN8YWxlcnQ6Y29uZmlnLWdldC1vcHRpb25zfGFsZXJ0OmNvbmZpZy1nZXQtbmFtZXxhbGVydDpjb25maWctZ2V0LWlkfGFsZXJ0OmNvbmZpZy1nZXQtZGVzY3JpcHRpb258YWxlcnQ6Y29uZmlnLWdldC1jcGYtZG9tYWluLW5hbWVzfGFsZXJ0OmNvbmZpZy1nZXQtY3BmLWRvbWFpbi1pZHN8YWxlcnQ6Y29uZmlnLWdldHxhbGVydDpjb25maWctZGVsZXRlfGFsZXJ0OmFjdGlvbi1zZXQtb3B0aW9uc3xhbGVydDphY3Rpb24tc2V0LW5hbWV8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGUtcm9vdHxhbGVydDphY3Rpb24tc2V0LW1vZHVsZS1kYnxhbGVydDphY3Rpb24tc2V0LW1vZHVsZXxhbGVydDphY3Rpb24tc2V0LWRlc2NyaXB0aW9ufGFsZXJ0OmFjdGlvbi1yZW1vdmV8YWxlcnQ6YWN0aW9uLWluc2VydHxhbGVydDphY3Rpb24tZ2V0LW9wdGlvbnN8YWxlcnQ6YWN0aW9uLWdldC1uYW1lfGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlLXJvb3R8YWxlcnQ6YWN0aW9uLWdldC1tb2R1bGUtZGJ8YWxlcnQ6YWN0aW9uLWdldC1tb2R1bGV8YWxlcnQ6YWN0aW9uLWdldC1kZXNjcmlwdGlvbnx6ZXJvLW9yLW9uZXx5ZWFycy1mcm9tLWR1cmF0aW9ufHllYXItZnJvbS1kYXRlVGltZXx5ZWFyLWZyb20tZGF0ZXx1cHBlci1jYXNlfHVub3JkZXJlZHx0cnVlfHRyYW5zbGF0ZXx0cmFjZXx0b2tlbml6ZXx0aW1lem9uZS1mcm9tLXRpbWV8dGltZXpvbmUtZnJvbS1kYXRlVGltZXx0aW1lem9uZS1mcm9tLWRhdGV8c3VtfHN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy15ZWFyTW9udGhEdXJhdGlvbnxzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmctZGF5VGltZUR1cmF0aW9ufHN1YnN0cmluZy1iZWZvcmV8c3Vic3RyaW5nLWFmdGVyfHN1YnN0cmluZ3xzdWJzZXF1ZW5jZXxzdHJpbmctdG8tY29kZXBvaW50c3xzdHJpbmctcGFkfHN0cmluZy1sZW5ndGh8c3RyaW5nLWpvaW58c3RyaW5nfHN0YXRpYy1iYXNlLXVyaXxzdGFydHMtd2l0aHxzZWNvbmRzLWZyb20tdGltZXxzZWNvbmRzLWZyb20tZHVyYXRpb258c2Vjb25kcy1mcm9tLWRhdGVUaW1lfHJvdW5kLWhhbGYtdG8tZXZlbnxyb3VuZHxyb290fHJldmVyc2V8cmVzb2x2ZS11cml8cmVzb2x2ZS1RTmFtZXxyZXBsYWNlfHJlbW92ZXxRTmFtZXxwcmVmaXgtZnJvbS1RTmFtZXxwb3NpdGlvbnxvbmUtb3ItbW9yZXxudW1iZXJ8bm90fG5vcm1hbGl6ZS11bmljb2RlfG5vcm1hbGl6ZS1zcGFjZXxub2RlLW5hbWV8bm9kZS1raW5kfG5pbGxlZHxuYW1lc3BhY2UtdXJpLWZyb20tUU5hbWV8bmFtZXNwYWNlLXVyaS1mb3ItcHJlZml4fG5hbWVzcGFjZS11cml8bmFtZXxtb250aHMtZnJvbS1kdXJhdGlvbnxtb250aC1mcm9tLWRhdGVUaW1lfG1vbnRoLWZyb20tZGF0ZXxtaW51dGVzLWZyb20tdGltZXxtaW51dGVzLWZyb20tZHVyYXRpb258bWludXRlcy1mcm9tLWRhdGVUaW1lfG1pbnxtYXh8bWF0Y2hlc3xsb3dlci1jYXNlfGxvY2FsLW5hbWUtZnJvbS1RTmFtZXxsb2NhbC1uYW1lfGxhc3R8bGFuZ3xpcmktdG8tdXJpfGluc2VydC1iZWZvcmV8aW5kZXgtb2Z8aW4tc2NvcGUtcHJlZml4ZXN8aW1wbGljaXQtdGltZXpvbmV8aWRyZWZ8aWR8aG91cnMtZnJvbS10aW1lfGhvdXJzLWZyb20tZHVyYXRpb258aG91cnMtZnJvbS1kYXRlVGltZXxmbG9vcnxmYWxzZXxleHBhbmRlZC1RTmFtZXxleGlzdHN8ZXhhY3RseS1vbmV8ZXNjYXBlLXVyaXxlc2NhcGUtaHRtbC11cml8ZXJyb3J8ZW5kcy13aXRofGVuY29kZS1mb3ItdXJpfGVtcHR5fGRvY3VtZW50LXVyaXxkb2MtYXZhaWxhYmxlfGRvY3xkaXN0aW5jdC12YWx1ZXN8ZGlzdGluY3Qtbm9kZXN8ZGVmYXVsdC1jb2xsYXRpb258ZGVlcC1lcXVhbHxkYXlzLWZyb20tZHVyYXRpb258ZGF5LWZyb20tZGF0ZVRpbWV8ZGF5LWZyb20tZGF0ZXxkYXRhfGN1cnJlbnQtdGltZXxjdXJyZW50LWRhdGVUaW1lfGN1cnJlbnQtZGF0ZXxjb3VudHxjb250YWluc3xjb25jYXR8Y29tcGFyZXxjb2xsZWN0aW9ufGNvZGVwb2ludHMtdG8tc3RyaW5nfGNvZGVwb2ludC1lcXVhbHxjZWlsaW5nfGJvb2xlYW58YmFzZS11cml8YXZnfGFkanVzdC10aW1lLXRvLXRpbWV6b25lfGFkanVzdC1kYXRlVGltZS10by10aW1lem9uZXxhZGp1c3QtZGF0ZS10by10aW1lem9uZXxhYnMpXGIvXSwKK1sicGxuIiwvXltcdzotXSsvXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy9dXSksWyJ4cSIsInhxdWVyeSJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmcteWFtbC5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmcteWFtbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg3MjliCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy15YW1sLmpzCkBAIC0wLDAgKzEsMiBAQAordmFyIGE9bnVsbDsKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicHVuIiwvXls6Pj98XSsvLGEsIjp8Pj8iXSxbImRlYyIsL14lKD86WUFNTHxUQUcpW15cblxyI10rLyxhLCIlIl0sWyJ0eXAiLC9eJlxTKy8sYSwiJiJdLFsidHlwIiwvXiFcUyovLGEsIiEiXSxbInN0ciIsL14iKD86W14iXFxdfFxcLikqKD86InwkKS8sYSwnIiddLFsic3RyIiwvXicoPzpbXiddfCcnKSooPzonfCQpLyxhLCInIl0sWyJjb20iLC9eI1teXG5ccl0qLyxhLCIjIl0sWyJwbG4iLC9eXHMrLyxhLCIgXHRcclxuIl1dLFtbImRlYyIsL14oPzotLS18XC5cLlwuKSg/OltcblxyXXwkKS9dLFsicHVuIiwvXi0vXSxbImt3ZCIsL15cdys6W1xuXHIgXS9dLFsicGxuIiwvXlx3Ky9dXSksWyJ5YW1sIiwieW1sIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvcHJldHRpZnkuY3NzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvcHJldHRpZnkuY3NzCmluZGV4IDI2ZTNlMjYuLjRiZmRhOGUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmNzcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5jc3MKQEAgLTEsNDAgKzEsNTMgQEAKIC8qIFByZXR0eSBwcmludGluZyBzdHlsZXMuIFVzZWQgd2l0aCBwcmV0dGlmeS5qcy4gKi8KK0BleHRlcm5hbCAuKjsKIAotQGV4dGVybmFsIC5zdHI7Ci1AZXh0ZXJuYWwgLmt3ZDsKLUBleHRlcm5hbCAuY29tOwotQGV4dGVybmFsIC50eXA7Ci1AZXh0ZXJuYWwgLmxpdDsKLUBleHRlcm5hbCAucHVuOwotQGV4dGVybmFsIC5wbG47Ci1AZXh0ZXJuYWwgLnRhZzsKLUBleHRlcm5hbCAuYXRuOwotQGV4dGVybmFsIC5hdHY7Ci1AZXh0ZXJuYWwgLmRlYzsKLUBleHRlcm5hbCAucHJldHR5cHJpbnQ7CisvKiBTUEFOIGVsZW1lbnRzIHdpdGggdGhlIGNsYXNzZXMgYmVsb3cgYXJlIGFkZGVkIGJ5IHByZXR0eXByaW50LiAqLworLnBsbiB7IGNvbG9yOiAjMDAwIH0gIC8qIHBsYWluIHRleHQgKi8KIAotLnN0ciB7IGNvbG9yOiAjMDgwOyB9Ci0ua3dkIHsgY29sb3I6ICMwMDg7IH0KLS5jb20geyBjb2xvcjogIzgwMDsgfQotLnR5cCB7IGNvbG9yOiAjNjA2OyB9Ci0ubGl0IHsgY29sb3I6ICMwNjY7IH0KLS5wdW4geyBjb2xvcjogIzY2MDsgfQotLnBsbiB7IGNvbG9yOiAjMDAwOyB9Ci0udGFnIHsgY29sb3I6ICMwMDg7IH0KLS5hdG4geyBjb2xvcjogIzYwNjsgfQotLmF0diB7IGNvbG9yOiAjMDgwOyB9Ci0uZGVjIHsgY29sb3I6ICM2MDY7IH0KLXByZS5wcmV0dHlwcmludCB7IHBhZGRpbmc6IDJweDsgYm9yZGVyOiAxcHggc29saWQgIzg4ODsgfQotCi1AbWVkaWEgcHJpbnQgewotICAuc3RyIHsgY29sb3I6ICMwNjA7IH0KLSAgLmt3ZCB7IGNvbG9yOiAjMDA2OyBmb250LXdlaWdodDogYm9sZDsgfQotICAuY29tIHsgY29sb3I6ICM2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotICAudHlwIHsgY29sb3I6ICM0MDQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5saXQgeyBjb2xvcjogIzA0NDsgfQotICAucHVuIHsgY29sb3I6ICM0NDA7IH0KLSAgLnBsbiB7IGNvbG9yOiAjMDAwOyB9Ci0gIC50YWcgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmF0biB7IGNvbG9yOiAjNDA0OyB9Ci0gIC5hdHYgeyBjb2xvcjogIzA2MDsgfQorQG1lZGlhIHNjcmVlbiB7CisgIC5zdHIgeyBjb2xvcjogIzA4MCB9ICAvKiBzdHJpbmcgY29udGVudCAqLworICAua3dkIHsgY29sb3I6ICMwMDggfSAgLyogYSBrZXl3b3JkICovCisgIC5jb20geyBjb2xvcjogIzgwMCB9ICAvKiBhIGNvbW1lbnQgKi8KKyAgLnR5cCB7IGNvbG9yOiAjNjA2IH0gIC8qIGEgdHlwZSBuYW1lICovCisgIC5saXQgeyBjb2xvcjogIzA2NiB9ICAvKiBhIGxpdGVyYWwgdmFsdWUgKi8KKyAgLyogcHVuY3R1YXRpb24sIGxpc3Agb3BlbiBicmFja2V0LCBsaXNwIGNsb3NlIGJyYWNrZXQgKi8KKyAgLnB1biwgLm9wbiwgLmNsbyB7IGNvbG9yOiAjNjYwIH0KKyAgLnRhZyB7IGNvbG9yOiAjMDA4IH0gIC8qIGEgbWFya3VwIHRhZyBuYW1lICovCisgIC5hdG4geyBjb2xvcjogIzYwNiB9ICAvKiBhIG1hcmt1cCBhdHRyaWJ1dGUgbmFtZSAqLworICAuYXR2IHsgY29sb3I6ICMwODAgfSAgLyogYSBtYXJrdXAgYXR0cmlidXRlIHZhbHVlICovCisgIC5kZWMsIC52YXIgeyBjb2xvcjogIzYwNiB9ICAvKiBhIGRlY2xhcmF0aW9uOyBhIHZhcmlhYmxlIG5hbWUgKi8KKyAgLmZ1biB7IGNvbG9yOiByZWQgfSAgLyogYSBmdW5jdGlvbiBuYW1lICovCiB9CisKKy8qIFVzZSBoaWdoZXIgY29udHJhc3QgYW5kIHRleHQtd2VpZ2h0IGZvciBwcmludGFibGUgZm9ybS4gKi8KK0BtZWRpYSBwcmludCwgcHJvamVjdGlvbiB7CisgIC5zdHIgeyBjb2xvcjogIzA2MCB9CisgIC5rd2QgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQgfQorICAuY29tIHsgY29sb3I6ICM2MDA7IGZvbnQtc3R5bGU6IGl0YWxpYyB9CisgIC50eXAgeyBjb2xvcjogIzQwNDsgZm9udC13ZWlnaHQ6IGJvbGQgfQorICAubGl0IHsgY29sb3I6ICMwNDQgfQorICAucHVuLCAub3BuLCAuY2xvIHsgY29sb3I6ICM0NDAgfQorICAudGFnIHsgY29sb3I6ICMwMDY7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKyAgLmF0biB7IGNvbG9yOiAjNDA0IH0KKyAgLmF0diB7IGNvbG9yOiAjMDYwIH0KK30KKworLyogUHV0IGEgYm9yZGVyIGFyb3VuZCBwcmV0dHlwcmludGVkIGNvZGUgc25pcHBldHMuICovCitwcmUucHJldHR5cHJpbnQgeyBwYWRkaW5nOiAycHg7IGJvcmRlcjogMXB4IHNvbGlkICM4ODggfQorCisvKiBTcGVjaWZ5IGNsYXNzPWxpbmVudW1zIG9uIGEgcHJlIHRvIGdldCBsaW5lIG51bWJlcmluZyAqLworb2wubGluZW51bXMgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAwIH0gLyogSUUgaW5kZW50cyB2aWEgbWFyZ2luLWxlZnQgKi8KK2xpLkwwLAorbGkuTDEsCitsaS5MMiwKK2xpLkwzLAorbGkuTDUsCitsaS5MNiwKK2xpLkw3LAorbGkuTDggeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQorLyogQWx0ZXJuYXRlIHNoYWRpbmcgZm9yIGxpbmVzICovCitsaS5MMSwKK2xpLkwzLAorbGkuTDUsCitsaS5MNywKK2xpLkw5IHsgYmFja2dyb3VuZDogI2VlZSB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmpzCmluZGV4IDI5YjVlNzMuLjQ4MjdiYzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmpzCkBAIC0xLDQ2ICsxLDI4IEBACi13aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT049dHJ1ZSx3aW5kb3cuUFJfVEFCX1dJRFRIPTgsd2luZG93LlBSX25vcm1hbGl6ZWRIdG1sPXdpbmRvdy5QUj13aW5kb3cucHJldHR5UHJpbnRPbmU9d2luZG93LnByZXR0eVByaW50PXZvaWQKLTAsd2luZG93Ll9wcl9pc0lFNj1mdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvciYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvXGJNU0lFIChbNjc4XSlcLi8pO3JldHVybiBhPWE/K2FbMV06ZmFsc2Usd2luZG93Ll9wcl9pc0lFNj1mdW5jdGlvbigpe3JldHVybiBhfSxhfSwoZnVuY3Rpb24oKXt2YXIKLWE9dHJ1ZSxiPW51bGwsYz0nYnJlYWsgY29udGludWUgZG8gZWxzZSBmb3IgaWYgcmV0dXJuIHdoaWxlIGF1dG8gY2FzZSBjaGFyIGNvbnN0IGRlZmF1bHQgZG91YmxlIGVudW0gZXh0ZXJuIGZsb2F0IGdvdG8gaW50IGxvbmcgcmVnaXN0ZXIgc2hvcnQgc2lnbmVkIHNpemVvZiBzdGF0aWMgc3RydWN0IHN3aXRjaCB0eXBlZGVmIHVuaW9uIHVuc2lnbmVkIHZvaWQgdm9sYXRpbGUgY2F0Y2ggY2xhc3MgZGVsZXRlIGZhbHNlIGltcG9ydCBuZXcgb3BlcmF0b3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHRoaXMgdGhyb3cgdHJ1ZSB0cnkgdHlwZW9mICcsZD1jKydhbGlnbm9mIGFsaWduX3VuaW9uIGFzbSBheGlvbSBib29sICcrJ2NvbmNlcHQgY29uY2VwdF9tYXAgY29uc3RfY2FzdCBjb25zdGV4cHIgZGVjbHR5cGUgJysnZHluYW1pY19jYXN0IGV4cGxpY2l0IGV4cG9ydCBmcmllbmQgaW5saW5lIGxhdGVfY2hlY2sgJysnbXV0YWJsZSBuYW1lc3BhY2UgbnVsbHB0ciByZWludGVycHJldF9jYXN0IHN0YXRpY19hc3NlcnQgc3RhdGljX2Nhc3QgJysndGVtcGxhdGUgdHlwZWlkIHR5cGVuYW1lIHVzaW5nIHZpcnR1YWwgd2NoYXJfdCB3aGVyZSAnLGU9YysnYWJzdHJhY3QgYm9vbGVhbiBieXRlIGV4dGVuZHMgZmluYWwgZmluYWxseSBpbXBsZW1lbnRzIGltcG9ydCAnKydpbnN0YW5jZW9mIG51bGwgbmF0aXZlIHBhY2thZ2Ugc3RyaWN0ZnAgc3VwZXIgc3luY2hyb25pemVkIHRocm93cyAnKyd0cmFuc2llbnQgJyxmPWUrJ2FzIGJhc2UgYnkgY2hlY2tlZCBkZWNpbWFsIGRlbGVnYXRlIGRlc2NlbmRpbmcgZXZlbnQgJysnZml4ZWQgZm9yZWFjaCBmcm9tIGdyb3VwIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpbnRvIGlzIGxvY2sgJysnb2JqZWN0IG91dCBvdmVycmlkZSBvcmRlcmJ5IHBhcmFtcyBwYXJ0aWFsIHJlYWRvbmx5IHJlZiBzYnl0ZSBzZWFsZWQgJysnc3RhY2thbGxvYyBzdHJpbmcgc2VsZWN0IHVpbnQgdWxvbmcgdW5jaGVja2VkIHVuc2FmZSB1c2hvcnQgdmFyICcsZz1jKydkZWJ1Z2dlciBldmFsIGV4cG9ydCBmdW5jdGlvbiBnZXQgbnVsbCBzZXQgdW5kZWZpbmVkIHZhciB3aXRoICcrJ0luZmluaXR5IE5hTiAnLGg9J2NhbGxlciBkZWxldGUgZGllIGRvIGR1bXAgZWxzaWYgZXZhbCBleGl0IGZvcmVhY2ggZm9yIGdvdG8gaWYgaW1wb3J0IGxhc3QgbG9jYWwgbXkgbmV4dCBubyBvdXIgcHJpbnQgcGFja2FnZSByZWRvIHJlcXVpcmUgc3ViIHVuZGVmIHVubGVzcyB1bnRpbCB1c2Ugd2FudGFycmF5IHdoaWxlIEJFR0lOIEVORCAnLGk9J2JyZWFrIGNvbnRpbnVlIGRvIGVsc2UgZm9yIGlmIHJldHVybiB3aGlsZSBhbmQgYXMgYXNzZXJ0IGNsYXNzIGRlZiBkZWwgZWxpZiBleGNlcHQgZXhlYyBmaW5hbGx5IGZyb20gZ2xvYmFsIGltcG9ydCBpbiBpcyBsYW1iZGEgbm9ubG9jYWwgbm90IG9yIHBhc3MgcHJpbnQgcmFpc2UgdHJ5IHdpdGggeWllbGQgRmFsc2UgVHJ1ZSBOb25lICcsaj0nYnJlYWsgY29udGludWUgZG8gZWxzZSBmb3IgaWYgcmV0dXJuIHdoaWxlIGFsaWFzIGFuZCBiZWdpbiBjYXNlIGNsYXNzIGRlZiBkZWZpbmVkIGVsc2lmIGVuZCBlbnN1cmUgZmFsc2UgaW4gbW9kdWxlIG5leHQgbmlsIG5vdCBvciByZWRvIHJlc2N1ZSByZXRyeSBzZWxmIHN1cGVyIHRoZW4gdHJ1ZSB1bmRlZiB1bmxlc3MgdW50aWwgd2hlbiB5aWVsZCBCRUdJTiBFTkQgJyxrPSdicmVhayBjb250aW51ZSBkbyBlbHNlIGZvciBpZiByZXR1cm4gd2hpbGUgY2FzZSBkb25lIGVsaWYgZXNhYyBldmFsIGZpIGZ1bmN0aW9uIGluIGxvY2FsIHNldCB0aGVuIHVudGlsICcsbD1kK2YrZytoK2kraitrLG09KGZ1bmN0aW9uKCl7dmFyCi1hPVsnIScsJyE9JywnIT09JywnIycsJyUnLCclPScsJyYnLCcmJicsJyYmPScsJyY9JywnKCcsJyonLCcqPScsJys9JywnLCcsJy09JywnLT4nLCcvJywnLz0nLCc6JywnOjonLCc7JywnPCcsJzw8JywnPDw9JywnPD0nLCc9JywnPT0nLCc9PT0nLCc+JywnPj0nLCc+PicsJz4+PScsJz4+PicsJz4+Pj0nLCc/JywnQCcsJ1snLCdeJywnXj0nLCdeXicsJ15ePScsJ3snLCd8JywnfD0nLCd8fCcsJ3x8PScsJ34nLCdicmVhaycsJ2Nhc2UnLCdjb250aW51ZScsJ2RlbGV0ZScsJ2RvJywnZWxzZScsJ2ZpbmFsbHknLCdpbnN0YW5jZW9mJywncmV0dXJuJywndGhyb3cnLCd0cnknLCd0eXBlb2YnXSxiPScoPzpeXnxbKy1dJyxjO2ZvcihjPTA7YzxhLmxlbmd0aDsrK2MpYis9J3wnK2FbY10ucmVwbGFjZSgvKFtePTw+OiZhLXpdKS9nLCdcXCQxJyk7cmV0dXJuIGIrPScpXFxzKicsYn0pKCksbj0vJi9nLG89LzwvZyxwPS8+L2cscT0vXCIvZyxyLHMsdCx1LHYsdyx4LHkseixBLEIsQyxELEUsRjtmdW5jdGlvbgotRyhhKXtyZXR1cm4gYS5yZXBsYWNlKG4sJyZhbXA7JykucmVwbGFjZShvLCcmbHQ7JykucmVwbGFjZShwLCcmZ3Q7JykucmVwbGFjZShxLCcmcXVvdDsnKX1mdW5jdGlvbgotSChhKXtyZXR1cm4gYS5yZXBsYWNlKG4sJyZhbXA7JykucmVwbGFjZShvLCcmbHQ7JykucmVwbGFjZShwLCcmZ3Q7Jyl9Qz0vJmx0Oy9nLEI9LyZndDsvZyx3PS8mYXBvczsvZyxFPS8mcXVvdDsvZyx2PS8mYW1wOy9nLEQ9LyZuYnNwOy9nO2Z1bmN0aW9uCi1JKGEpe3ZhciBiPWEuaW5kZXhPZignJicpLGMsZCxlLGY7aWYoYjwwKXJldHVybiBhO2ZvcigtLWI7KGI9YS5pbmRleE9mKCcmIycsYisxKSk+PTA7KWQ9YS5pbmRleE9mKCc7JyxiKSxkPj0wJiYoZT1hLnN1YnN0cmluZyhiKzMsZCksZj0xMCxlJiZlLmNoYXJBdCgwKT09PSd4JyYmKGU9ZS5zdWJzdHJpbmcoMSksZj0xNiksYz1wYXJzZUludChlLGYpLGlzTmFOKGMpfHwoYT1hLnN1YnN0cmluZygwLGIpK1N0cmluZy5mcm9tQ2hhckNvZGUoYykrYS5zdWJzdHJpbmcoZCsxKSkpO3JldHVybiBhLnJlcGxhY2UoQywnPCcpLnJlcGxhY2UoQiwnPicpLnJlcGxhY2UodywnXCcnKS5yZXBsYWNlKEUsJ1wiJykucmVwbGFjZShELCcgJykucmVwbGFjZSh2LCcmJyl9ZnVuY3Rpb24KLUooYSl7cmV0dXJuJ1hNUCc9PT1hLnRhZ05hbWV9dT0vW1xyXG5dL2c7ZnVuY3Rpb24gSyhjLGQpe3ZhciBlO3JldHVybidQUkUnPT09Yy50YWdOYW1lP2E6dS50ZXN0KGQpPyhlPScnLGMuY3VycmVudFN0eWxlPyhlPWMuY3VycmVudFN0eWxlLndoaXRlU3BhY2UpOndpbmRvdy5nZXRDb21wdXRlZFN0eWxlJiYoZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjLGIpLndoaXRlU3BhY2UpLCFlfHxlPT09J3ByZScpOmF9ZnVuY3Rpb24KLUwoYSxiKXt2YXIgYyxkLGUsZjtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmY9YS50YWdOYW1lLnRvTG93ZXJDYXNlKCksYi5wdXNoKCc8JyxmKTtmb3IoZT0wO2U8YS5hdHRyaWJ1dGVzLmxlbmd0aDsrK2Upe2M9YS5hdHRyaWJ1dGVzW2VdO2lmKCFjLnNwZWNpZmllZCljb250aW51ZTtiLnB1c2goJyAnKSxMKGMsYil9Yi5wdXNoKCc+Jyk7Zm9yKGQ9YS5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKUwoZCxiKTsoYS5maXJzdENoaWxkfHwhL14oPzpicnxsaW5rfGltZykkLy50ZXN0KGYpKSYmYi5wdXNoKCc8LycsZiwnPicpO2JyZWFrO2Nhc2UKLTI6Yi5wdXNoKGEubmFtZS50b0xvd2VyQ2FzZSgpLCc9XCInLEcoYS52YWx1ZSksJ1wiJyk7YnJlYWs7Y2FzZSAzOmNhc2UgNDpiLnB1c2goSChhLm5vZGVWYWx1ZSkpfX1mdW5jdGlvbgotTShiKXt2YXIgYz0wLGQ9ZmFsc2UsZT1mYWxzZSxmLGcsaCxpO2ZvcihmPTAsZz1iLmxlbmd0aDtmPGc7KytmKXtoPWJbZl07aWYoaC5pZ25vcmVDYXNlKWU9YTtlbHNlCi1pZigvW2Etel0vaS50ZXN0KGguc291cmNlLnJlcGxhY2UoL1xcdVswLTlhLWZdezR9fFxceFswLTlhLWZdezJ9fFxcW151eF0vZ2ksJycpKSl7ZD1hLGU9ZmFsc2U7YnJlYWt9fWZ1bmN0aW9uCi1qKGEpe2lmKGEuY2hhckF0KDApIT09J1xcJylyZXR1cm4gYS5jaGFyQ29kZUF0KDApO3N3aXRjaChhLmNoYXJBdCgxKSl7Y2FzZSdiJzpyZXR1cm4gODtjYXNlJ3QnOnJldHVybiA5O2Nhc2Unbic6cmV0dXJuIDEwO2Nhc2Undic6cmV0dXJuIDExO2Nhc2UnZic6cmV0dXJuIDEyO2Nhc2Uncic6cmV0dXJuIDEzO2Nhc2UndSc6Y2FzZSd4JzpyZXR1cm4gcGFyc2VJbnQoYS5zdWJzdHJpbmcoMiksMTYpfHxhLmNoYXJDb2RlQXQoMSk7Y2FzZScwJzpjYXNlJzEnOmNhc2UnMic6Y2FzZSczJzpjYXNlJzQnOmNhc2UnNSc6Y2FzZSc2JzpjYXNlJzcnOnJldHVybiBwYXJzZUludChhLnN1YnN0cmluZygxKSw4KTtkZWZhdWx0OnJldHVybiBhLmNoYXJDb2RlQXQoMSl9fWZ1bmN0aW9uCi1rKGEpe3ZhciBiO3JldHVybiBhPDMyPyhhPDE2PydcXHgwJzonXFx4JykrYS50b1N0cmluZygxNik6KGI9U3RyaW5nLmZyb21DaGFyQ29kZShhKSwoYj09PSdcXCd8fGI9PT0nLSd8fGI9PT0nWyd8fGI9PT0nXScpJiYoYj0nXFwnK2IpLGIpfWZ1bmN0aW9uCi1sKGEpe3ZhciBiPWEuc3Vic3RyaW5nKDEsYS5sZW5ndGgtMSkubWF0Y2gobmV3IFJlZ0V4cCgnXFxcXHVbMC05QS1GYS1mXXs0fXxcXFxceFswLTlBLUZhLWZdezJ9fFxcXFxbMC0zXVswLTddezAsMn18XFxcXFswLTddezEsMn18XFxcXFtcXHNcXFNdfC18W14tXFxcXF0nLCdnJykpLGM9W10sZD1bXSxlPWJbMF09PT0nXicsZixnLGgsaSxtLG4sbyxwLHE7Zm9yKGg9ZT8xOjAsbT1iLmxlbmd0aDtoPG07KytoKXtvPWJbaF07c3dpdGNoKG8pe2Nhc2UnXFxCJzpjYXNlJ1xcYic6Y2FzZSdcXEQnOmNhc2UnXFxkJzpjYXNlJ1xcUyc6Y2FzZSdcXHMnOmNhc2UnXFxXJzpjYXNlJ1xcdyc6Yy5wdXNoKG8pO2NvbnRpbnVlfXE9aihvKSxoKzI8bSYmJy0nPT09YltoKzFdPyhnPWooYltoKzJdKSxoKz0yKTooZz1xKSxkLnB1c2goW3EsZ10pLGc8NjV8fHE+MTIyfHwoZzw2NXx8cT45MHx8ZC5wdXNoKFtNYXRoLm1heCg2NSxxKXwzMixNYXRoLm1pbihnLDkwKXwzMl0pLGc8OTd8fHE+MTIyfHxkLnB1c2goW01hdGgubWF4KDk3LHEpJi0zMyxNYXRoLm1pbihnLDEyMikmLTMzXSkpfWQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhWzBdLWJbMF18fGJbMV0tYVsxXX0pLGY9W10saT1bTmFOLE5hTl07Zm9yKGg9MDtoPGQubGVuZ3RoOysraClwPWRbaF0scFswXTw9aVsxXSsxPyhpWzFdPU1hdGgubWF4KGlbMV0scFsxXSkpOmYucHVzaChpPXApO249WydbJ10sZSYmbi5wdXNoKCdeJyksbi5wdXNoLmFwcGx5KG4sYyk7Zm9yKGg9MDtoPGYubGVuZ3RoOysraClwPWZbaF0sbi5wdXNoKGsocFswXSkpLHBbMV0KLT5wWzBdJiYocFsxXSsxPnBbMF0mJm4ucHVzaCgnLScpLG4ucHVzaChrKHBbMV0pKSk7cmV0dXJuIG4ucHVzaCgnXScpLG4uam9pbignJyl9ZnVuY3Rpb24KLW0oYSl7dmFyIGI9YS5zb3VyY2UubWF0Y2gobmV3IFJlZ0V4cCgnKD86XFxbKD86W15cXHg1Q1xceDVEXXxcXFxcW1xcc1xcU10pKlxcXXxcXFxcdVtBLUZhLWYwLTldezR9fFxcXFx4W0EtRmEtZjAtOV17Mn18XFxcXFswLTldK3xcXFxcW151eDAtOV18XFwoXFw/WzohPV18W1xcKFxcKVxcXl18W15cXHg1QlxceDVDXFwoXFwpXFxeXSspJywnZycpKSxlPWIubGVuZ3RoLGY9W10sZyxoLGksaixrO2ZvcihqPTAsaT0wO2o8ZTsrK2opaz1iW2pdLGs9PT0nKCc/KytpOidcXCc9PT1rLmNoYXJBdCgwKSYmKGg9K2suc3Vic3RyaW5nKDEpLGgmJmg8PWkmJihmW2hdPS0xKSk7Zm9yKGo9MTtqPGYubGVuZ3RoOysraiktMT09PWZbal0mJihmW2pdPSsrYyk7Zm9yKGo9MCxpPTA7ajxlOysrailrPWJbal0saz09PScoJz8oKytpLGZbaV09PT12b2lkCi0wJiYoYltqXT0nKD86JykpOidcXCc9PT1rLmNoYXJBdCgwKSYmKGg9K2suc3Vic3RyaW5nKDEpLGgmJmg8PWkmJihiW2pdPSdcXCcrZltpXSkpO2ZvcihqPTAsaT0wO2o8ZTsrK2opJ14nPT09YltqXSYmJ14nIT09YltqKzFdJiYoYltqXT0nJyk7aWYoYS5pZ25vcmVDYXNlJiZkKWZvcihqPTA7ajxlOysrailrPWJbal0sZz1rLmNoYXJBdCgwKSxrLmxlbmd0aD49MiYmZz09PSdbJz8oYltqXT1sKGspKTpnIT09J1xcJyYmKGJbal09ay5yZXBsYWNlKC9bYS16QS1aXS9nLGZ1bmN0aW9uKGEpe3ZhcgotYj1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuJ1snK1N0cmluZy5mcm9tQ2hhckNvZGUoYiYtMzMsYnwzMikrJ10nfSkpO3JldHVybiBiLmpvaW4oJycpfWk9W107Zm9yKGY9MCxnPWIubGVuZ3RoO2Y8ZzsrK2Ype2g9YltmXTtpZihoLmdsb2JhbHx8aC5tdWx0aWxpbmUpdGhyb3cgbmV3Ci1FcnJvcignJytoKTtpLnB1c2goJyg/OicrbShoKSsnKScpfXJldHVybiBuZXcgUmVnRXhwKGkuam9pbignfCcpLGU/J2dpJzonZycpfXI9YjtmdW5jdGlvbgotTihhKXt2YXIgYyxkLGUsZjtiPT09ciYmKGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnUFJFJyksZi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnPCFET0NUWVBFIGZvbyBQVUJMSUMgXCJmb28gYmFyXCI+XG48Zm9vIC8+JykpLHI9IS88Ly50ZXN0KGYuaW5uZXJIVE1MKSk7aWYocilyZXR1cm4gZD1hLmlubmVySFRNTCxKKGEpPyhkPUgoZCkpOksoYSxkKXx8KGQ9ZC5yZXBsYWNlKC8oPGJyXHMqXC8/PilbXHJcbl0rL2csJyQxJykucmVwbGFjZSgvKD86W1xyXG5dK1sgXHRdKikrL2csJyAnKSksZDtlPVtdO2ZvcihjPWEuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZylMKGMsZSk7cmV0dXJuIGUuam9pbignJyl9ZnVuY3Rpb24KLU8oYSl7dmFyIGM9MDtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9YixmPTAsZyxoLGksajtmb3IoaD0wLGk9ZC5sZW5ndGg7aDxpOysraCl7Zz1kLmNoYXJBdChoKTtzd2l0Y2goZyl7Y2FzZScJJzplfHwoZT1bXSksZS5wdXNoKGQuc3Vic3RyaW5nKGYsaCkpLGo9YS1jJWEsYys9ajtmb3IoO2o+PTA7ai09JyAgICAgICAgICAgICAgICAnLmxlbmd0aCllLnB1c2goJyAgICAgICAgICAgICAgICAnLnN1YnN0cmluZygwLGopKTtmPWgrMTticmVhaztjYXNlJ1xuJzpjPTA7YnJlYWs7ZGVmYXVsdDorK2N9fXJldHVybiBlPyhlLnB1c2goZC5zdWJzdHJpbmcoZikpLGUuam9pbignJykpOmR9fXo9bmV3Ci1SZWdFeHAoJ1tePF0rfDwhLS1bXFxzXFxTXSo/LS0+fDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPnw8Lz9bYS16QS1aXSg/OltePlwiXCddfFwnW15cJ10qXCd8XCJbXlwiXSpcIikqPnw8JywnZycpLEE9L148XCEtLS8seT0vXjwhXFtDREFUQVxbLyx4PS9ePGJyXGIvaSxGPS9ePChcLz8pKFthLXpBLVpdW2EtekEtWjAtOV0qKS87ZnVuY3Rpb24KLVAoYSl7dmFyIGI9YS5tYXRjaCh6KSxjPVtdLGQ9MCxlPVtdLGYsZyxoLGksaixrLGwsbTtpZihiKWZvcihnPTAsaz1iLmxlbmd0aDtnPGs7KytnKXtqPWJbZ107aWYoai5sZW5ndGg+MSYmai5jaGFyQXQoMCk9PT0nPCcpe2lmKEEudGVzdChqKSljb250aW51ZTtpZih5LnRlc3QoaikpYy5wdXNoKGouc3Vic3RyaW5nKDksai5sZW5ndGgtMykpLGQrPWoubGVuZ3RoLTEyO2Vsc2UKLWlmKHgudGVzdChqKSljLnB1c2goJ1xuJyksKytkO2Vsc2UgaWYoai5pbmRleE9mKCdub2NvZGUnKT49MCYmUShqKSl7bD0oai5tYXRjaChGKSlbMl0sZj0xO2ZvcihoPWcrMTtoPGs7KytoKXttPWJbaF0ubWF0Y2goRik7aWYobSYmbVsyXT09PWwpaWYobVsxXT09PScvJyl7aWYoLS1mPT09MClicmVha31lbHNlKytmfWg8az8oZS5wdXNoKGQsYi5zbGljZShnLGgrMSkuam9pbignJykpLGc9aCk6ZS5wdXNoKGQsail9ZWxzZQotZS5wdXNoKGQsail9ZWxzZSBpPUkoaiksYy5wdXNoKGkpLGQrPWkubGVuZ3RofXJldHVybntzb3VyY2U6Yy5qb2luKCcnKSx0YWdzOmV9fWZ1bmN0aW9uCi1RKGEpe3JldHVybiEhYS5yZXBsYWNlKC9ccyhcdyspXHMqPVxzKig/OlwiKFteXCJdKilcInwnKFteXCddKiknfChcUyspKS9nLCcgJDE9XCIkMiQzJDRcIicpLm1hdGNoKC9bY0NdW2xMXVthQV1bc1NdW3NTXT1cIlteXCJdKlxibm9jb2RlXGIvKX1mdW5jdGlvbgotUihhLGIsYyxkKXt2YXIgZTtpZighYilyZXR1cm47ZT17c291cmNlOmIsYmFzZVBvczphfSxjKGUpLGQucHVzaC5hcHBseShkLGUuZGVjb3JhdGlvbnMpfWZ1bmN0aW9uCi1TKGEsYyl7dmFyIGQ9e30sZSxmLGcsaDtyZXR1cm4oZnVuY3Rpb24oKXt2YXIgZT1hLmNvbmNhdChjKSxmPVtdLGc9e30saSxqLGssbCxtLG4sbztmb3Ioaj0wLGw9ZS5sZW5ndGg7ajxsOysrail7bT1lW2pdLG89bVszXTtpZihvKWZvcihpPW8ubGVuZ3RoOy0taT49MDspZFtvLmNoYXJBdChpKV09bTtuPW1bMV0saz0nJytuLGcuaGFzT3duUHJvcGVydHkoayl8fChmLnB1c2gobiksZ1trXT1iKX1mLnB1c2goL1tcMC1cdWZmZmZdLyksaD1NKGYpfSkoKSxmPWMubGVuZ3RoLGc9L1xTLyxlPWZ1bmN0aW9uKGEpe3ZhcgotYj1hLnNvdXJjZSxnPWEuYmFzZVBvcyxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHk7aT1bZywncGxuJ10scz0wLHk9Yi5tYXRjaChoKXx8W10sdT17fTtmb3Iodj0wLHE9eS5sZW5ndGg7djxxOysrdil7dz15W3ZdLHQ9dVt3XSxwPXZvaWQKLTA7aWYodHlwZW9mIHQ9PT0nc3RyaW5nJyluPWZhbHNlO2Vsc2V7cj1kW3cuY2hhckF0KDApXTtpZihyKXA9dy5tYXRjaChyWzFdKSx0PXJbMF07ZWxzZXtmb3IobT0wO208ZjsrK20pe3I9Y1ttXSxwPXcubWF0Y2goclsxXSk7aWYocCl7dD1yWzBdO2JyZWFrfX1wfHwodD0ncGxuJyl9bj10Lmxlbmd0aD49NSYmJ2xhbmctJz09PXQuc3Vic3RyaW5nKDAsNSksbiYmIShwJiZ0eXBlb2YKLXBbMV09PT0nc3RyaW5nJykmJihuPWZhbHNlLHQ9J3NyYycpLG58fCh1W3ddPXQpfXg9cyxzKz13Lmxlbmd0aCxuPyhqPXBbMV0sbD13LmluZGV4T2Yoaiksaz1sK2oubGVuZ3RoLHBbMl0mJihrPXcubGVuZ3RoLXBbMl0ubGVuZ3RoLGw9ay1qLmxlbmd0aCksbz10LnN1YnN0cmluZyg1KSxSKGcreCx3LnN1YnN0cmluZygwLGwpLGUsaSksUihnK3grbCxqLFcobyxqKSxpKSxSKGcreCtrLHcuc3Vic3RyaW5nKGspLGUsaSkpOmkucHVzaChnK3gsdCl9YS5kZWNvcmF0aW9ucz1pfSxlfWZ1bmN0aW9uCi1UKGEpe3ZhciBjPVtdLGQ9W10sZSxmO3JldHVybiBhLnRyaXBsZVF1b3RlZFN0cmluZ3M/Yy5wdXNoKFsnc3RyJywvXig/OlwnXCdcJyg/OlteXCdcXF18XFxbXHNcU118XCd7MSwyfSg/PVteXCddKSkqKD86XCdcJ1wnfCQpfFwiXCJcIig/OlteXCJcXF18XFxbXHNcU118XCJ7MSwyfSg/PVteXCJdKSkqKD86XCJcIlwifCQpfFwnKD86W15cXFwnXXxcXFtcc1xTXSkqKD86XCd8JCl8XCIoPzpbXlxcXCJdfFxcW1xzXFNdKSooPzpcInwkKSkvLGIsJ1wnXCInXSk6YS5tdWx0aUxpbmVTdHJpbmdzP2MucHVzaChbJ3N0cicsL14oPzpcJyg/OlteXFxcJ118XFxbXHNcU10pKig/OlwnfCQpfFwiKD86W15cXFwiXXxcXFtcc1xTXSkqKD86XCJ8JCl8XGAoPzpbXlxcXGBdfFxcW1xzXFNdKSooPzpcYHwkKSkvLGIsJ1wnXCJgJ10pOmMucHVzaChbJ3N0cicsL14oPzpcJyg/OlteXFxcJ1xyXG5dfFxcLikqKD86XCd8JCl8XCIoPzpbXlxcXCJcclxuXXxcXC4pKig/OlwifCQpKS8sYiwnXCJcJyddKSxhLnZlcmJhdGltU3RyaW5ncyYmZC5wdXNoKFsnc3RyJywvXkBcIig/OlteXCJdfFwiXCIpKig/OlwifCQpLyxiXSksYS5oYXNoQ29tbWVudHMmJihhLmNTdHlsZUNvbW1lbnRzPyhjLnB1c2goWydjb20nLC9eIyg/Oig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZXJyb3J8aWZkZWZ8aW5jbHVkZXxpZm5kZWZ8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxyXG5dKikvLGIsJyMnXSksZC5wdXNoKFsnc3RyJywvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLGJdKSk6Yy5wdXNoKFsnY29tJywvXiNbXlxyXG5dKi8sYiwnIyddKSksYS5jU3R5bGVDb21tZW50cyYmKGQucHVzaChbJ2NvbScsL15cL1wvW15cclxuXSovLGJdKSxkLnB1c2goWydjb20nLC9eXC9cKltcc1xTXSo/KD86XCpcL3wkKS8sYl0pKSxhLnJlZ2V4TGl0ZXJhbHMmJihlPScvKD89W14vKl0pKD86W14vXFx4NUJcXHg1Q118XFx4NUNbXFxzXFxTXXxcXHg1Qig/OlteXFx4NUNcXHg1RF18XFx4NUNbXFxzXFxTXSkqKD86XFx4NUR8JCkpKy8nLGQucHVzaChbJ2xhbmctcmVnZXgnLG5ldwotUmVnRXhwKCdeJyttKycoJytlKycpJyldKSksZj1hLmtleXdvcmRzLnJlcGxhY2UoL15ccyt8XHMrJC9nLCcnKSxmLmxlbmd0aCYmZC5wdXNoKFsna3dkJyxuZXcKLVJlZ0V4cCgnXig/OicrZi5yZXBsYWNlKC9ccysvZywnfCcpKycpXFxiJyksYl0pLGMucHVzaChbJ3BsbicsL15ccysvLGIsJyBcclxuCVx4YTAnXSksZC5wdXNoKFsnbGl0JywvXkBbYS16XyRdW2Etel8kQDAtOV0qL2ksYl0sWyd0eXAnLC9eQD9bQS1aXStbYS16XVtBLVphLXpfJEAwLTldKi8sYl0sWydwbG4nLC9eW2Etel8kXVthLXpfJEAwLTldKi9pLGJdLFsnbGl0JyxuZXcKLVJlZ0V4cCgnXig/OjB4W2EtZjAtOV0rfCg/OlxcZCg/Ol9cXGQrKSpcXGQqKD86XFwuXFxkKik/fFxcLlxcZFxcKykoPzplWytcXC1dP1xcZCspPylbYS16XSonLCdpJyksYiwnMDEyMzQ1Njc4OSddLFsncHVuJywvXi5bXlxzXHdcLiRAXCdcIlxgXC9cI10qLyxiXSksUyhjLGQpfXM9VCh7a2V5d29yZHM6bCxoYXNoQ29tbWVudHM6YSxjU3R5bGVDb21tZW50czphLG11bHRpTGluZVN0cmluZ3M6YSxyZWdleExpdGVyYWxzOmF9KTtmdW5jdGlvbgotVShjKXt2YXIgZD1jLnNvdXJjZSxlPWMuZXh0cmFjdGVkVGFncyxmPWMuZGVjb3JhdGlvbnMsZz1bXSxoPTAsaT1iLGo9YixrPTAsbD0wLG09Tyh3aW5kb3cuUFJfVEFCX1dJRFRIKSxuPS8oW1xyXG4gXSkgL2csbz0vKF58ICkgL2dtLHA9L1xyXG4/fFxuL2cscT0vWyBcclxuXSQvLHI9YSxzO2Z1bmN0aW9uCi10KGEpe3ZhciBjLGU7YT5oJiYoaSYmaSE9PWomJihnLnB1c2goJzwvc3Bhbj4nKSxpPWIpLCFpJiZqJiYoaT1qLGcucHVzaCgnPHNwYW4gY2xhc3M9XCInLGksJ1wiPicpKSxjPUgobShkLnN1YnN0cmluZyhoLGEpKSkucmVwbGFjZShyP286biwnJDEmbmJzcDsnKSxyPXEudGVzdChjKSxlPXdpbmRvdy5fcHJfaXNJRTYoKT8nJm5ic3A7PGJyIC8+JzonPGJyIC8+JyxnLnB1c2goYy5yZXBsYWNlKHAsZSkpLGg9YSl9d2hpbGUoYSl7azxlLmxlbmd0aD9sPGYubGVuZ3RoPyhzPWVba108PWZbbF0pOihzPWEpOihzPWZhbHNlKTtpZihzKXQoZVtrXSksaSYmKGcucHVzaCgnPC9zcGFuPicpLGk9YiksZy5wdXNoKGVbaysxXSksays9MjtlbHNlCi1pZihsPGYubGVuZ3RoKXQoZltsXSksaj1mW2wrMV0sbCs9MjtlbHNlIGJyZWFrfXQoZC5sZW5ndGgpLGkmJmcucHVzaCgnPC9zcGFuPicpLGMucHJldHR5UHJpbnRlZEh0bWw9Zy5qb2luKCcnKX10PXt9O2Z1bmN0aW9uCi1WKGEsYil7dmFyIGMsZDtmb3IoZD1iLmxlbmd0aDstLWQ+PTA7KWM9YltkXSx0Lmhhc093blByb3BlcnR5KGMpPydjb25zb2xlJ2luIHdpbmRvdyYmY29uc29sZS53YXJuKCdjYW5ub3Qgb3ZlcnJpZGUgbGFuZ3VhZ2UgaGFuZGxlciAlcycsYyk6KHRbY109YSl9ZnVuY3Rpb24KLVcoYSxiKXtyZXR1cm4gYSYmdC5oYXNPd25Qcm9wZXJ0eShhKXx8KGE9L15ccyo8Ly50ZXN0KGIpPydkZWZhdWx0LW1hcmt1cCc6J2RlZmF1bHQtY29kZScpLHRbYV19VihzLFsnZGVmYXVsdC1jb2RlJ10pLFYoUyhbXSxbWydwbG4nLC9eW148P10rL10sWydkZWMnLC9ePCFcd1tePl0qKD86PnwkKS9dLFsnY29tJywvXjxcIS0tW1xzXFNdKj8oPzotXC0+fCQpL10sWydsYW5nLScsL148XD8oW1xzXFNdKz8pKD86XD8+fCQpL10sWydsYW5nLScsL148JShbXHNcU10rPykoPzolPnwkKS9dLFsncHVuJywvXig/OjxbJT9dfFslP10+KS9dLFsnbGFuZy0nLC9ePHhtcFxiW14+XSo+KFtcc1xTXSs/KTxcL3htcFxiW14+XSo+L2ldLFsnbGFuZy1qcycsL148c2NyaXB0XGJbXj5dKj4oW1xzXFNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSxbJ2xhbmctY3NzJywvXjxzdHlsZVxiW14+XSo+KFtcc1xTXSo/KSg8XC9zdHlsZVxiW14+XSo+KS9pXSxbJ2xhbmctaW4udGFnJywvXig8XC8/W2Etel1bXjw+XSo+KS9pXV0pLFsnZGVmYXVsdC1tYXJrdXAnLCdodG0nLCdodG1sJywnbXhtbCcsJ3hodG1sJywneG1sJywneHNsJ10pLFYoUyhbWydwbG4nLC9eW1xzXSsvLGIsJyAJXHJcbiddLFsnYXR2JywvXig/OlwiW15cIl0qXCI/fFwnW15cJ10qXCc/KS8sYiwnXCJcJyddXSxbWyd0YWcnLC9eXjxcLz9bYS16XSg/Oltcdy46LV0qXHcpP3xcLz8+JC9pXSxbJ2F0bicsL14oPyFzdHlsZVtccz1dfG9uKVthLXpdKD86W1x3Oi1dKlx3KT8vaV0sWydsYW5nLXVxLnZhbCcsL149XHMqKFtePlwnXCJcc10qKD86W14+XCdcIlxzXC9dfFwvKD89XHMpKSkvXSxbJ3B1bicsL15bPTw+XC9dKy9dLFsnbGFuZy1qcycsL15vblx3K1xzKj1ccypcIihbXlwiXSspXCIvaV0sWydsYW5nLWpzJywvXm9uXHcrXHMqPVxzKlwnKFteXCddKylcJy9pXSxbJ2xhbmctanMnLC9eb25cdytccyo9XHMqKFteXCJcJz5cc10rKS9pXSxbJ2xhbmctY3NzJywvXnN0eWxlXHMqPVxzKlwiKFteXCJdKylcIi9pXSxbJ2xhbmctY3NzJywvXnN0eWxlXHMqPVxzKlwnKFteXCddKylcJy9pXSxbJ2xhbmctY3NzJywvXnN0eWxlXHMqPVxzKihbXlwiXCc+XHNdKykvaV1dKSxbJ2luLnRhZyddKSxWKFMoW10sW1snYXR2JywvXltcc1xTXSsvXV0pLFsndXEudmFsJ10pLFYoVCh7a2V5d29yZHM6ZCxoYXNoQ29tbWVudHM6YSxjU3R5bGVDb21tZW50czphfSksWydjJywnY2MnLCdjcHAnLCdjeHgnLCdjeWMnLCdtJ10pLFYoVCh7a2V5d29yZHM6J251bGwgdHJ1ZSBmYWxzZSd9KSxbJ2pzb24nXSksVihUKHtrZXl3b3JkczpmLGhhc2hDb21tZW50czphLGNTdHlsZUNvbW1lbnRzOmEsdmVyYmF0aW1TdHJpbmdzOmF9KSxbJ2NzJ10pLFYoVCh7a2V5d29yZHM6ZSxjU3R5bGVDb21tZW50czphfSksWydqYXZhJ10pLFYoVCh7a2V5d29yZHM6ayxoYXNoQ29tbWVudHM6YSxtdWx0aUxpbmVTdHJpbmdzOmF9KSxbJ2JzaCcsJ2NzaCcsJ3NoJ10pLFYoVCh7a2V5d29yZHM6aSxoYXNoQ29tbWVudHM6YSxtdWx0aUxpbmVTdHJpbmdzOmEsdHJpcGxlUXVvdGVkU3RyaW5nczphfSksWydjdicsJ3B5J10pLFYoVCh7a2V5d29yZHM6aCxoYXNoQ29tbWVudHM6YSxtdWx0aUxpbmVTdHJpbmdzOmEscmVnZXhMaXRlcmFsczphfSksWydwZXJsJywncGwnLCdwbSddKSxWKFQoe2tleXdvcmRzOmosaGFzaENvbW1lbnRzOmEsbXVsdGlMaW5lU3RyaW5nczphLHJlZ2V4TGl0ZXJhbHM6YX0pLFsncmInXSksVihUKHtrZXl3b3JkczpnLGNTdHlsZUNvbW1lbnRzOmEscmVnZXhMaXRlcmFsczphfSksWydqcyddKSxWKFMoW10sW1snc3RyJywvXltcc1xTXSsvXV0pLFsncmVnZXgnXSk7ZnVuY3Rpb24KLVgoYSl7dmFyIGI9YS5zb3VyY2VDb2RlSHRtbCxjPWEubGFuZ0V4dGVuc2lvbixkLGU7YS5wcmV0dHlQcmludGVkSHRtbD1iO3RyeXtlPVAoYiksZD1lLnNvdXJjZSxhLnNvdXJjZT1kLGEuYmFzZVBvcz0wLGEuZXh0cmFjdGVkVGFncz1lLnRhZ3MsVyhjLGQpKGEpLFUoYSl9Y2F0Y2goZil7J2NvbnNvbGUnaW4KLXdpbmRvdyYmKGNvbnNvbGUubG9nKGYpLGNvbnNvbGUudHJhY2UoKSl9fWZ1bmN0aW9uIFkoYSxiKXt2YXIgYz17c291cmNlQ29kZUh0bWw6YSxsYW5nRXh0ZW5zaW9uOmJ9O3JldHVybiBYKGMpLGMucHJldHR5UHJpbnRlZEh0bWx9ZnVuY3Rpb24KLVooYyl7dmFyIGQ9d2luZG93Ll9wcl9pc0lFNigpLGU9ZD09PTY/J1xyXG4nOidccicsZj1bZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ByZScpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdjb2RlJyksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3htcCcpXSxnPVtdLGgsaSxqLGssbCxtO2ZvcihpPTA7aTxmLmxlbmd0aDsrK2kpZm9yKGo9MCxsPWZbaV0ubGVuZ3RoO2o8bDsrK2opZy5wdXNoKGZbaV1bal0pO2Y9YixoPURhdGUsaC5ub3d8fChoPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3Ci1EYXRlKS5nZXRUaW1lKCl9fSksaz0wO2Z1bmN0aW9uIG4oKXt2YXIgYj13aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT04/aC5ub3coKSsyNTA6SW5maW5pdHksZCxlLGYsaSxqO2Zvcig7azxnLmxlbmd0aCYmaC5ub3coKTxiOysrayl7ZT1nW2tdO2lmKGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZS5pbmRleE9mKCdwcmV0dHlwcmludCcpPj0wKXtmPWUuY2xhc3NOYW1lLm1hdGNoKC9cYmxhbmctKFx3KylcYi8pLGYmJihmPWZbMV0pLGk9ZmFsc2U7Zm9yKGo9ZS5wYXJlbnROb2RlO2o7aj1qLnBhcmVudE5vZGUpaWYoKGoudGFnTmFtZT09PSdwcmUnfHxqLnRhZ05hbWU9PT0nY29kZSd8fGoudGFnTmFtZT09PSd4bXAnKSYmai5jbGFzc05hbWUmJmouY2xhc3NOYW1lLmluZGV4T2YoJ3ByZXR0eXByaW50Jyk+PTApe2k9YTticmVha31pfHwoZD1OKGUpLGQ9ZC5yZXBsYWNlKC8oPzpcclxuP3xcbikkLywnJyksbT17c291cmNlQ29kZUh0bWw6ZCxsYW5nRXh0ZW5zaW9uOmYsc291cmNlTm9kZTplfSxYKG0pLG8oKSl9fWs8Zy5sZW5ndGg/c2V0VGltZW91dChuLDI1MCk6YyYmYygpfWZ1bmN0aW9uCi1vKCl7dmFyIGE9bS5wcmV0dHlQcmludGVkSHRtbCxiLGMsZixnLGgsaSxqLGs7aWYoIWEpcmV0dXJuO2Y9bS5zb3VyY2VOb2RlO2lmKCFKKGYpKWYuaW5uZXJIVE1MPWE7ZWxzZXtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1BSRScpO2ZvcihnPTA7ZzxmLmF0dHJpYnV0ZXMubGVuZ3RoOysrZyliPWYuYXR0cmlidXRlc1tnXSxiLnNwZWNpZmllZCYmKGM9Yi5uYW1lLnRvTG93ZXJDYXNlKCksYz09PSdjbGFzcyc/KGsuY2xhc3NOYW1lPWIudmFsdWUpOmsuc2V0QXR0cmlidXRlKGIubmFtZSxiLnZhbHVlKSk7ay5pbm5lckhUTUw9YSxmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGssZiksZj1rfWlmKGQmJmYudGFnTmFtZT09PSdQUkUnKXtqPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JyJyk7Zm9yKGg9ai5sZW5ndGg7LS1oPj0wOylpPWpbaF0saS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSxpKX19bigpfXdpbmRvdy5QUl9ub3JtYWxpemVkSHRtbD1MLHdpbmRvdy5wcmV0dHlQcmludE9uZT1ZLHdpbmRvdy5wcmV0dHlQcmludD1aLHdpbmRvdy5QUj17Y29tYmluZVByZWZpeFBhdHRlcm5zOk0sY3JlYXRlU2ltcGxlTGV4ZXI6UyxyZWdpc3RlckxhbmdIYW5kbGVyOlYsc291cmNlRGVjb3JhdG9yOlQsUFJfQVRUUklCX05BTUU6J2F0bicsUFJfQVRUUklCX1ZBTFVFOidhdHYnLFBSX0NPTU1FTlQ6J2NvbScsUFJfREVDTEFSQVRJT046J2RlYycsUFJfS0VZV09SRDona3dkJyxQUl9MSVRFUkFMOidsaXQnLFBSX05PQ09ERTonbm9jb2RlJyxQUl9QTEFJTjoncGxuJyxQUl9QVU5DVFVBVElPTjoncHVuJyxQUl9TT1VSQ0U6J3NyYycsUFJfU1RSSU5HOidzdHInLFBSX1RBRzondGFnJyxQUl9UWVBFOid0eXAnfX0pKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit2YXIgcj1udWxsO3dpbmRvdy5QUl9TSE9VTERfVVNFX0NPTlRJTlVBVElPTj0hMDsKKyhmdW5jdGlvbigpe2Z1bmN0aW9uIE8oYSl7ZnVuY3Rpb24gaShkKXt2YXIgYT1kLmNoYXJDb2RlQXQoMCk7aWYoYSE9PTkyKXJldHVybiBhO3ZhciBmPWQuY2hhckF0KDEpO3JldHVybihhPXNbZl0pP2E6IjAiPD1mJiZmPD0iNyI/cGFyc2VJbnQoZC5zdWJzdHJpbmcoMSksOCk6Zj09PSJ1Inx8Zj09PSJ4Ij9wYXJzZUludChkLnN1YnN0cmluZygyKSwxNik6ZC5jaGFyQ29kZUF0KDEpfWZ1bmN0aW9uIGcoZCl7aWYoZDwzMilyZXR1cm4oZDwxNj8iXFx4MCI6IlxceCIpK2QudG9TdHJpbmcoMTYpO2Q9U3RyaW5nLmZyb21DaGFyQ29kZShkKTtyZXR1cm4gZD09PSJcXCJ8fGQ9PT0iLSJ8fGQ9PT0iXSJ8fGQ9PT0iXiI/IlxcIitkOmR9ZnVuY3Rpb24gaihkKXt2YXIgYT1kLnN1YnN0cmluZygxLGQubGVuZ3RoLTEpLm1hdGNoKC9cXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxbMC0zXVswLTddezAsMn18XFxbMC03XXsxLDJ9fFxcW1xTXHNdfFteXFxdL2cpLGQ9W10sZj0KK2FbMF09PT0iXiIsYj1bIlsiXTtmJiZiLnB1c2goIl4iKTtmb3IodmFyIGY9Zj8xOjAsYz1hLmxlbmd0aDtmPGM7KytmKXt2YXIgaD1hW2ZdO2lmKC9cXFtiZHN3XS9pLnRlc3QoaCkpYi5wdXNoKGgpO2Vsc2V7dmFyIGg9aShoKSxlO2YrMjxjJiYiLSI9PT1hW2YrMV0/KGU9aShhW2YrMl0pLGYrPTIpOmU9aDtkLnB1c2goW2gsZV0pO2U8NjV8fGg+MTIyfHwoZTw2NXx8aD45MHx8ZC5wdXNoKFtNYXRoLm1heCg2NSxoKXwzMixNYXRoLm1pbihlLDkwKXwzMl0pLGU8OTd8fGg+MTIyfHxkLnB1c2goW01hdGgubWF4KDk3LGgpJi0zMyxNYXRoLm1pbihlLDEyMikmLTMzXSkpfX1kLnNvcnQoZnVuY3Rpb24oZCxhKXtyZXR1cm4gZFswXS1hWzBdfHxhWzFdLWRbMV19KTthPVtdO2M9W107Zm9yKGY9MDtmPGQubGVuZ3RoOysrZiloPWRbZl0saFswXTw9Y1sxXSsxP2NbMV09TWF0aC5tYXgoY1sxXSxoWzFdKTphLnB1c2goYz1oKTtmb3IoZj0wO2Y8YS5sZW5ndGg7KytmKWg9YVtmXSxiLnB1c2goZyhoWzBdKSksCitoWzFdPmhbMF0mJihoWzFdKzE+aFswXSYmYi5wdXNoKCItIiksYi5wdXNoKGcoaFsxXSkpKTtiLnB1c2goIl0iKTtyZXR1cm4gYi5qb2luKCIiKX1mdW5jdGlvbiB0KGQpe2Zvcih2YXIgYT1kLnNvdXJjZS5tYXRjaCgvXFsoPzpbXlxcXF1dfFxcW1xTXHNdKSpdfFxcdVtcZEEtRmEtZl17NH18XFx4W1xkQS1GYS1mXXsyfXxcXFxkK3xcXFteXGR1eF18XChcP1shOj1dfFsoKV5dfFteKClbXFxeXSsvZyksYj1hLmxlbmd0aCxpPVtdLGM9MCxoPTA7YzxiOysrYyl7dmFyIGU9YVtjXTtlPT09IigiPysraDoiXFwiPT09ZS5jaGFyQXQoMCkmJihlPStlLnN1YnN0cmluZygxKSkmJihlPD1oP2lbZV09LTE6YVtjXT1nKGUpKX1mb3IoYz0xO2M8aS5sZW5ndGg7KytjKS0xPT09aVtjXSYmKGlbY109Kyt6KTtmb3IoaD1jPTA7YzxiOysrYyllPWFbY10sZT09PSIoIj8oKytoLGlbaF18fChhW2NdPSIoPzoiKSk6IlxcIj09PWUuY2hhckF0KDApJiYoZT0rZS5zdWJzdHJpbmcoMSkpJiZlPD1oJiYKKyhhW2NdPSJcXCIraVtlXSk7Zm9yKGM9MDtjPGI7KytjKSJeIj09PWFbY10mJiJeIiE9PWFbYysxXSYmKGFbY109IiIpO2lmKGQuaWdub3JlQ2FzZSYmdylmb3IoYz0wO2M8YjsrK2MpZT1hW2NdLGQ9ZS5jaGFyQXQoMCksZS5sZW5ndGg+PTImJmQ9PT0iWyI/YVtjXT1qKGUpOmQhPT0iXFwiJiYoYVtjXT1lLnJlcGxhY2UoL1tBLVphLXpdL2csZnVuY3Rpb24oZCl7ZD1kLmNoYXJDb2RlQXQoMCk7cmV0dXJuIlsiK1N0cmluZy5mcm9tQ2hhckNvZGUoZCYtMzMsZHwzMikrIl0ifSkpO3JldHVybiBhLmpvaW4oIiIpfWZvcih2YXIgej0wLHc9ITEsaz0hMSxtPTAsYj1hLmxlbmd0aDttPGI7KyttKXt2YXIgbz1hW21dO2lmKG8uaWdub3JlQ2FzZSlrPSEwO2Vsc2UgaWYoL1thLXpdL2kudGVzdChvLnNvdXJjZS5yZXBsYWNlKC9cXHVbXGRhLWZdezR9fFxceFtcZGEtZl17Mn18XFxbXlVYdXhdL2dpLCIiKSkpe3c9ITA7az0hMTticmVha319Zm9yKHZhciBzPXtiOjgsdDo5LG46MTAsdjoxMSwKK2Y6MTIscjoxM30scT1bXSxtPTAsYj1hLmxlbmd0aDttPGI7KyttKXtvPWFbbV07aWYoby5nbG9iYWx8fG8ubXVsdGlsaW5lKXRocm93IEVycm9yKCIiK28pO3EucHVzaCgiKD86Iit0KG8pKyIpIil9cmV0dXJuIFJlZ0V4cChxLmpvaW4oInwiKSxrPyJnaSI6ImciKX1mdW5jdGlvbiBQKGEsaSl7ZnVuY3Rpb24gZyhhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmlmKGoudGVzdChhLmNsYXNzTmFtZSkpYnJlYWs7Zm9yKHZhciBiPWEuZmlyc3RDaGlsZDtiO2I9Yi5uZXh0U2libGluZylnKGIpO2I9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCJiciI9PT1ifHwibGkiPT09Yil0W2tdPSJcbiIsd1trPDwxXT16Kyssd1trKys8PDF8MV09YTticmVhaztjYXNlIDM6Y2FzZSA0OmI9YS5ub2RlVmFsdWUsYi5sZW5ndGgmJihiPWk/Yi5yZXBsYWNlKC9cclxuPy9nLCJcbiIpOmIucmVwbGFjZSgvW1x0XG5cciBdKy9nLCIgIiksdFtrXT1iLHdbazw8MV09eix6Kz1iLmxlbmd0aCx3W2srKzw8CisxfDFdPWEpfX12YXIgaj0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8sdD1bXSx6PTAsdz1bXSxrPTA7ZyhhKTtyZXR1cm57YTp0LmpvaW4oIiIpLnJlcGxhY2UoL1xuJC8sIiIpLGQ6d319ZnVuY3Rpb24gRShhLGksZyxqKXtpJiYoYT17YTppLGU6YX0sZyhhKSxqLnB1c2guYXBwbHkoaixhLmcpKX1mdW5jdGlvbiB4KGEsaSl7ZnVuY3Rpb24gZyhhKXtmb3IodmFyIGs9YS5lLG09W2ssInBsbiJdLGI9MCxvPWEuYS5tYXRjaCh0KXx8W10scz17fSxxPTAsZD1vLmxlbmd0aDtxPGQ7KytxKXt2YXIgdj1vW3FdLGY9c1t2XSx1PXZvaWQgMCxjO2lmKHR5cGVvZiBmPT09InN0cmluZyIpYz0hMTtlbHNle3ZhciBoPWpbdi5jaGFyQXQoMCldO2lmKGgpdT12Lm1hdGNoKGhbMV0pLGY9aFswXTtlbHNle2ZvcihjPTA7Yzx6OysrYylpZihoPWlbY10sdT12Lm1hdGNoKGhbMV0pKXtmPWhbMF07YnJlYWt9dXx8KGY9InBsbiIpfWlmKChjPWYubGVuZ3RoPj01JiYibGFuZy0iPT09Zi5zdWJzdHJpbmcoMCwKKzUpKSYmISh1JiZ0eXBlb2YgdVsxXT09PSJzdHJpbmciKSljPSExLGY9InNyYyI7Y3x8KHNbdl09Zil9aD1iO2IrPXYubGVuZ3RoO2lmKGMpe2M9dVsxXTt2YXIgZT12LmluZGV4T2YoYykscD1lK2MubGVuZ3RoO3VbMl0mJihwPXYubGVuZ3RoLXVbMl0ubGVuZ3RoLGU9cC1jLmxlbmd0aCk7Zj1mLnN1YnN0cmluZyg1KTtFKGsraCx2LnN1YnN0cmluZygwLGUpLGcsbSk7RShrK2grZSxjLEYoZixjKSxtKTtFKGsraCtwLHYuc3Vic3RyaW5nKHApLGcsbSl9ZWxzZSBtLnB1c2goaytoLGYpfWEuZz1tfXZhciBqPXt9LHQ7KGZ1bmN0aW9uKCl7Zm9yKHZhciBnPWEuY29uY2F0KGkpLGs9W10sbT17fSxiPTAsbz1nLmxlbmd0aDtiPG87KytiKXt2YXIgcz1nW2JdLHE9c1szXTtpZihxKWZvcih2YXIgZD1xLmxlbmd0aDstLWQ+PTA7KWpbcS5jaGFyQXQoZCldPXM7cz1zWzFdO3E9IiIrczttLmhhc093blByb3BlcnR5KHEpfHwoay5wdXNoKHMpLG1bcV09cil9ay5wdXNoKC9bXFNcc10vKTt0PQorTyhrKX0pKCk7dmFyIHo9aS5sZW5ndGg7cmV0dXJuIGd9ZnVuY3Rpb24gbChhKXt2YXIgaT1bXSxnPVtdO2EudHJpcGxlUXVvdGVkU3RyaW5ncz9pLnB1c2goWyJzdHIiLC9eKD86JycnKD86W14nXFxdfFxcW1xTXHNdfCcnPyg/PVteJ10pKSooPzonJyd8JCl8IiIiKD86W14iXFxdfFxcW1xTXHNdfCIiPyg/PVteIl0pKSooPzoiIiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpKS8sciwiJ1wiIl0pOmEubXVsdGlMaW5lU3RyaW5ncz9pLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKXwiKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpfGAoPzpbXlxcYF18XFxbXFNcc10pKig/OmB8JCkpLyxyLCInXCJgIl0pOmkucHVzaChbInN0ciIsL14oPzonKD86W15cblxyJ1xcXXxcXC4pKig/Oid8JCl8Iig/OlteXG5cciJcXF18XFwuKSooPzoifCQpKS8sciwiXCInIl0pO2EudmVyYmF0aW1TdHJpbmdzJiYKK2cucHVzaChbInN0ciIsL15AIig/OlteIl18IiIpKig/OiJ8JCkvLHJdKTt2YXIgaj1hLmhhc2hDb21tZW50cztqJiYoYS5jU3R5bGVDb21tZW50cz8oaj4xP2kucHVzaChbImNvbSIsL14jKD86IyMoPzpbXiNdfCMoPyEjIykpKig/OiMjI3wkKXwuKikvLHIsIiMiXSk6aS5wdXNoKFsiY29tIiwvXiMoPzooPzpkZWZpbmV8ZSg/Omx8bmQpaWZ8ZWxzZXxlcnJvcnxpZm4/ZGVmfGluY2x1ZGV8bGluZXxwcmFnbWF8dW5kZWZ8d2FybmluZylcYnxbXlxuXHJdKikvLHIsIiMiXSksZy5wdXNoKFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5oKD86aHxwcHxcK1wrKT98W2Etel1cdyopPi8scl0pKTppLnB1c2goWyJjb20iLC9eI1teXG5ccl0qLyxyLCIjIl0pKTthLmNTdHlsZUNvbW1lbnRzJiYoZy5wdXNoKFsiY29tIiwvXlwvXC9bXlxuXHJdKi8scl0pLGcucHVzaChbImNvbSIsL15cL1wqW1xTXHNdKj8oPzpcKlwvfCQpLywKK3JdKSk7YS5yZWdleExpdGVyYWxzJiZnLnB1c2goWyJsYW5nLXJlZ2V4IiwvXig/Ol5eXC4/fFsrLV18WyE9XT17MCwyfXwjfCU9P3wmJj89P3xcKHxcKj0/fFsrLV09fC0+fFwvPT98Ojo/fDw8Pz0/fD57MSwzfT0/fFssOz9AW3t+XXxcXlxePz0/fFx8XHw/PT98YnJlYWt8Y2FzZXxjb250aW51ZXxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2YpXHMqKFwvKD89W14qL10pKD86W14vW1xcXXxcXFtcU1xzXXxcWyg/OlteXFxcXV18XFxbXFNcc10pKig/Ol18JCkpK1wvKS9dKTsoaj1hLnR5cGVzKSYmZy5wdXNoKFsidHlwIixqXSk7YT0oIiIrYS5rZXl3b3JkcykucmVwbGFjZSgvXiB8ICQvZywiIik7YS5sZW5ndGgmJmcucHVzaChbImt3ZCIsUmVnRXhwKCJeKD86IithLnJlcGxhY2UoL1tccyxdKy9nLCJ8IikrIilcXGIiKSxyXSk7aS5wdXNoKFsicGxuIiwvXlxzKy8sciwiIFxyXG5cdFx1MDBhMCJdKTtnLnB1c2goWyJsaXQiLAorL15AWyRfYS16XVtcdyRAXSovaSxyXSxbInR5cCIsL14oPzpbQF9dP1tBLVpdK1thLXpdW1x3JEBdKnxcdytfdFxiKS8scl0sWyJwbG4iLC9eWyRfYS16XVtcdyRAXSovaSxyXSxbImxpdCIsL14oPzoweFtcZGEtZl0rfCg/OlxkKD86X1xkKykqXGQqKD86XC5cZCopP3xcLlxkXCspKD86ZVsrLV0/XGQrKT8pW2Etel0qL2ksciwiMDEyMzQ1Njc4OSJdLFsicGxuIiwvXlxcW1xTXHNdPy8scl0sWyJwdW4iLC9eLlteXHNcdyIkJy4vQFxcYF0qLyxyXSk7cmV0dXJuIHgoaSxnKX1mdW5jdGlvbiBHKGEsaSxnKXtmdW5jdGlvbiBqKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIDE6aWYoei50ZXN0KGEuY2xhc3NOYW1lKSlicmVhaztpZigiYnIiPT09YS5ub2RlTmFtZSl0KGEpLGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpO2Vsc2UgZm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWooYSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDppZihnKXt2YXIgYj0KK2Eubm9kZVZhbHVlLGY9Yi5tYXRjaChuKTtpZihmKXt2YXIgaT1iLnN1YnN0cmluZygwLGYuaW5kZXgpO2Eubm9kZVZhbHVlPWk7KGI9Yi5zdWJzdHJpbmcoZi5pbmRleCtmWzBdLmxlbmd0aCkpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGsuY3JlYXRlVGV4dE5vZGUoYiksYS5uZXh0U2libGluZyk7dChhKTtpfHxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9fX19ZnVuY3Rpb24gdChhKXtmdW5jdGlvbiBpKGEsYil7dmFyIGQ9Yj9hLmNsb25lTm9kZSghMSk6YSxlPWEucGFyZW50Tm9kZTtpZihlKXt2YXIgZT1pKGUsMSksZj1hLm5leHRTaWJsaW5nO2UuYXBwZW5kQ2hpbGQoZCk7Zm9yKHZhciBnPWY7ZztnPWYpZj1nLm5leHRTaWJsaW5nLGUuYXBwZW5kQ2hpbGQoZyl9cmV0dXJuIGR9Zm9yKDshYS5uZXh0U2libGluZzspaWYoYT1hLnBhcmVudE5vZGUsIWEpcmV0dXJuO2Zvcih2YXIgYT1pKGEubmV4dFNpYmxpbmcsMCksZjsoZj1hLnBhcmVudE5vZGUpJiZmLm5vZGVUeXBlPT09CisxOylhPWY7Yi5wdXNoKGEpfWZvcih2YXIgej0vKD86Xnxccylub2NvZGUoPzpcc3wkKS8sbj0vXHJcbj98XG4vLGs9YS5vd25lckRvY3VtZW50LG09ay5jcmVhdGVFbGVtZW50KCJsaSIpO2EuZmlyc3RDaGlsZDspbS5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYj1bbV0sbz0wO288Yi5sZW5ndGg7KytvKWooYltvXSk7aT09PShpfDApJiZiWzBdLnNldEF0dHJpYnV0ZSgidmFsdWUiLGkpO3ZhciBzPWsuY3JlYXRlRWxlbWVudCgib2wiKTtzLmNsYXNzTmFtZT0ibGluZW51bXMiO2Zvcih2YXIgaT1NYXRoLm1heCgwLGktMXwwKXx8MCxvPTAscT1iLmxlbmd0aDtvPHE7KytvKW09YltvXSxtLmNsYXNzTmFtZT0iTCIrKG8raSklMTAsbS5maXJzdENoaWxkfHxtLmFwcGVuZENoaWxkKGsuY3JlYXRlVGV4dE5vZGUoIlx1MDBhMCIpKSxzLmFwcGVuZENoaWxkKG0pO2EuYXBwZW5kQ2hpbGQocyl9ZnVuY3Rpb24gbihhLGkpe2Zvcih2YXIgZz1pLmxlbmd0aDstLWc+PTA7KXt2YXIgaj0KK2lbZ107QS5oYXNPd25Qcm9wZXJ0eShqKT9DLmNvbnNvbGUmJmNvbnNvbGUud2FybigiY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXMiLGopOkFbal09YX19ZnVuY3Rpb24gRihhLGkpe2lmKCFhfHwhQS5oYXNPd25Qcm9wZXJ0eShhKSlhPS9eXHMqPC8udGVzdChpKT8iZGVmYXVsdC1tYXJrdXAiOiJkZWZhdWx0LWNvZGUiO3JldHVybiBBW2FdfWZ1bmN0aW9uIEgoYSl7dmFyIGk9YS5oO3RyeXt2YXIgZz1QKGEuYyxhLmkpLGo9Zy5hO2EuYT1qO2EuZD1nLmQ7YS5lPTA7RihpLGopKGEpO3ZhciB0PS9cYk1TSUVccyhcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpLHQ9dCYmK3RbMV08PTgsaT0vXG4vZyxuPWEuYSx3PW4ubGVuZ3RoLGc9MCxrPWEuZCxtPWsubGVuZ3RoLGo9MCxiPWEuZyxvPWIubGVuZ3RoLHM9MDtiW29dPXc7dmFyIHEsZDtmb3IoZD1xPTA7ZDxvOyliW2RdIT09YltkKzJdPyhiW3ErK109YltkKytdLGJbcSsrXT1iW2QrK10pOmQrPTI7bz1xOworZm9yKGQ9cT0wO2Q8bzspe2Zvcih2YXIgdj1iW2RdLGY9YltkKzFdLHU9ZCsyO3UrMjw9byYmYlt1KzFdPT09ZjspdSs9MjtiW3ErK109djtiW3ErK109ZjtkPXV9Yi5sZW5ndGg9cTt2YXIgYz1hLmMsaDtpZihjKWg9Yy5zdHlsZS5kaXNwbGF5LGMuc3R5bGUuZGlzcGxheT0ibm9uZSI7dHJ5e2Zvcig7ajxtOyl7dmFyIGU9a1tqKzJdfHx3LHA9YltzKzJdfHx3LHU9TWF0aC5taW4oZSxwKSxsPWtbaisxXSxEO2lmKGwubm9kZVR5cGUhPT0xJiYoRD1uLnN1YnN0cmluZyhnLHUpKSl7dCYmKEQ9RC5yZXBsYWNlKGksIlxyIikpO2wubm9kZVZhbHVlPUQ7dmFyIHk9bC5vd25lckRvY3VtZW50LHg9eS5jcmVhdGVFbGVtZW50KCJzcGFuIik7eC5jbGFzc05hbWU9YltzKzFdO3ZhciBCPWwucGFyZW50Tm9kZTtCLnJlcGxhY2VDaGlsZCh4LGwpO3guYXBwZW5kQ2hpbGQobCk7ZzxlJiYoa1tqKzFdPWw9eS5jcmVhdGVUZXh0Tm9kZShuLnN1YnN0cmluZyh1LGUpKSxCLmluc2VydEJlZm9yZShsLAoreC5uZXh0U2libGluZykpfWc9dTtnPj1lJiYoais9Mik7Zz49cCYmKHMrPTIpfX1maW5hbGx5e2lmKGMpYy5zdHlsZS5kaXNwbGF5PWh9fWNhdGNoKEEpe0MuY29uc29sZSYmY29uc29sZS5sb2coQSYmQS5zdGFjaz9BLnN0YWNrOkEpfX12YXIgQz13aW5kb3cseT1bImJyZWFrLGNvbnRpbnVlLGRvLGVsc2UsZm9yLGlmLHJldHVybix3aGlsZSJdLEI9W1t5LCJhdXRvLGNhc2UsY2hhcixjb25zdCxkZWZhdWx0LGRvdWJsZSxlbnVtLGV4dGVybixmbG9hdCxnb3RvLGludCxsb25nLHJlZ2lzdGVyLHNob3J0LHNpZ25lZCxzaXplb2Ysc3RhdGljLHN0cnVjdCxzd2l0Y2gsdHlwZWRlZix1bmlvbix1bnNpZ25lZCx2b2lkLHZvbGF0aWxlIl0sImNhdGNoLGNsYXNzLGRlbGV0ZSxmYWxzZSxpbXBvcnQsbmV3LG9wZXJhdG9yLHByaXZhdGUscHJvdGVjdGVkLHB1YmxpYyx0aGlzLHRocm93LHRydWUsdHJ5LHR5cGVvZiJdLEk9W0IsImFsaWdub2YsYWxpZ25fdW5pb24sYXNtLGF4aW9tLGJvb2wsY29uY2VwdCxjb25jZXB0X21hcCxjb25zdF9jYXN0LGNvbnN0ZXhwcixkZWNsdHlwZSxkeW5hbWljX2Nhc3QsZXhwbGljaXQsZXhwb3J0LGZyaWVuZCxpbmxpbmUsbGF0ZV9jaGVjayxtdXRhYmxlLG5hbWVzcGFjZSxudWxscHRyLHJlaW50ZXJwcmV0X2Nhc3Qsc3RhdGljX2Fzc2VydCxzdGF0aWNfY2FzdCx0ZW1wbGF0ZSx0eXBlaWQsdHlwZW5hbWUsdXNpbmcsdmlydHVhbCx3aGVyZSJdLAorSj1bQiwiYWJzdHJhY3QsYm9vbGVhbixieXRlLGV4dGVuZHMsZmluYWwsZmluYWxseSxpbXBsZW1lbnRzLGltcG9ydCxpbnN0YW5jZW9mLG51bGwsbmF0aXZlLHBhY2thZ2Usc3RyaWN0ZnAsc3VwZXIsc3luY2hyb25pemVkLHRocm93cyx0cmFuc2llbnQiXSxLPVtKLCJhcyxiYXNlLGJ5LGNoZWNrZWQsZGVjaW1hbCxkZWxlZ2F0ZSxkZXNjZW5kaW5nLGR5bmFtaWMsZXZlbnQsZml4ZWQsZm9yZWFjaCxmcm9tLGdyb3VwLGltcGxpY2l0LGluLGludGVyZmFjZSxpbnRlcm5hbCxpbnRvLGlzLGxldCxsb2NrLG9iamVjdCxvdXQsb3ZlcnJpZGUsb3JkZXJieSxwYXJhbXMscGFydGlhbCxyZWFkb25seSxyZWYsc2J5dGUsc2VhbGVkLHN0YWNrYWxsb2Msc3RyaW5nLHNlbGVjdCx1aW50LHVsb25nLHVuY2hlY2tlZCx1bnNhZmUsdXNob3J0LHZhcix2aXJ0dWFsLHdoZXJlIl0sQj1bQiwiZGVidWdnZXIsZXZhbCxleHBvcnQsZnVuY3Rpb24sZ2V0LG51bGwsc2V0LHVuZGVmaW5lZCx2YXIsd2l0aCxJbmZpbml0eSxOYU4iXSwKK0w9W3ksImFuZCxhcyxhc3NlcnQsY2xhc3MsZGVmLGRlbCxlbGlmLGV4Y2VwdCxleGVjLGZpbmFsbHksZnJvbSxnbG9iYWwsaW1wb3J0LGluLGlzLGxhbWJkYSxub25sb2NhbCxub3Qsb3IscGFzcyxwcmludCxyYWlzZSx0cnksd2l0aCx5aWVsZCxGYWxzZSxUcnVlLE5vbmUiXSxNPVt5LCJhbGlhcyxhbmQsYmVnaW4sY2FzZSxjbGFzcyxkZWYsZGVmaW5lZCxlbHNpZixlbmQsZW5zdXJlLGZhbHNlLGluLG1vZHVsZSxuZXh0LG5pbCxub3Qsb3IscmVkbyxyZXNjdWUscmV0cnksc2VsZixzdXBlcix0aGVuLHRydWUsdW5kZWYsdW5sZXNzLHVudGlsLHdoZW4seWllbGQsQkVHSU4sRU5EIl0seT1beSwiY2FzZSxkb25lLGVsaWYsZXNhYyxldmFsLGZpLGZ1bmN0aW9uLGluLGxvY2FsLHNldCx0aGVuLHVudGlsIl0sTj0vXihESVJ8RklMRXx2ZWN0b3J8KGRlfHByaW9yaXR5Xyk/cXVldWV8bGlzdHxzdGFja3woY29uc3RfKT9pdGVyYXRvcnwobXVsdGkpPyhzZXR8bWFwKXxiaXRzZXR8dT8oaW50fGZsb2F0KVxkKilcYi8sCitRPS9cUy8sUj1sKHtrZXl3b3JkczpbSSxLLEIsImNhbGxlcixkZWxldGUsZGllLGRvLGR1bXAsZWxzaWYsZXZhbCxleGl0LGZvcmVhY2gsZm9yLGdvdG8saWYsaW1wb3J0LGxhc3QsbG9jYWwsbXksbmV4dCxubyxvdXIscHJpbnQscGFja2FnZSxyZWRvLHJlcXVpcmUsc3ViLHVuZGVmLHVubGVzcyx1bnRpbCx1c2Usd2FudGFycmF5LHdoaWxlLEJFR0lOLEVORCIrTCxNLHldLGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxBPXt9O24oUixbImRlZmF1bHQtY29kZSJdKTtuKHgoW10sW1sicGxuIiwvXltePD9dKy9dLFsiZGVjIiwvXjwhXHdbXj5dKig/Oj58JCkvXSxbImNvbSIsL148XCEtLVtcU1xzXSo/KD86LS1cPnwkKS9dLFsibGFuZy0iLC9ePFw/KFtcU1xzXSs/KSg/Olw/PnwkKS9dLFsibGFuZy0iLC9ePCUoW1xTXHNdKz8pKD86JT58JCkvXSxbInB1biIsL14oPzo8WyU/XXxbJT9dPikvXSxbImxhbmctIiwKKy9ePHhtcFxiW14+XSo+KFtcU1xzXSs/KTxcL3htcFxiW14+XSo+L2ldLFsibGFuZy1qcyIsL148c2NyaXB0XGJbXj5dKj4oW1xTXHNdKj8pKDxcL3NjcmlwdFxiW14+XSo+KS9pXSxbImxhbmctY3NzIiwvXjxzdHlsZVxiW14+XSo+KFtcU1xzXSo/KSg8XC9zdHlsZVxiW14+XSo+KS9pXSxbImxhbmctaW4udGFnIiwvXig8XC8/W2Etel1bXjw+XSo+KS9pXV0pLFsiZGVmYXVsdC1tYXJrdXAiLCJodG0iLCJodG1sIiwibXhtbCIsInhodG1sIiwieG1sIiwieHNsIl0pO24oeChbWyJwbG4iLC9eXHMrLyxyLCIgXHRcclxuIl0sWyJhdHYiLC9eKD86IlteIl0qIj98J1teJ10qJz8pLyxyLCJcIiciXV0sW1sidGFnIiwvXl48XC8/W2Etel0oPzpbXHctLjpdKlx3KT98XC8/PiQvaV0sWyJhdG4iLC9eKD8hc3R5bGVbXHM9XXxvbilbYS16XSg/OltcdzotXSpcdyk/L2ldLFsibGFuZy11cS52YWwiLC9ePVxzKihbXlxzIic+XSooPzpbXlxzIicvPl18XC8oPz1ccykpKS9dLFsicHVuIiwvXlsvPC0+XSsvXSwKK1sibGFuZy1qcyIsL15vblx3K1xzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKicoW14nXSspJy9pXSxbImxhbmctanMiLC9eb25cdytccyo9XHMqKFteXHMiJz5dKykvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyoiKFteIl0rKSIvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyonKFteJ10rKScvaV0sWyJsYW5nLWNzcyIsL15zdHlsZVxzKj1ccyooW15ccyInPl0rKS9pXV0pLFsiaW4udGFnIl0pO24oeChbXSxbWyJhdHYiLC9eW1xTXHNdKy9dXSksWyJ1cS52YWwiXSk7bihsKHtrZXl3b3JkczpJLGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCx0eXBlczpOfSksWyJjIiwiY2MiLCJjcHAiLCJjeHgiLCJjeWMiLCJtIl0pO24obCh7a2V5d29yZHM6Im51bGwsdHJ1ZSxmYWxzZSJ9KSxbImpzb24iXSk7bihsKHtrZXl3b3JkczpLLGhhc2hDb21tZW50czohMCxjU3R5bGVDb21tZW50czohMCx2ZXJiYXRpbVN0cmluZ3M6ITAsdHlwZXM6Tn0pLAorWyJjcyJdKTtuKGwoe2tleXdvcmRzOkosY1N0eWxlQ29tbWVudHM6ITB9KSxbImphdmEiXSk7bihsKHtrZXl3b3Jkczp5LGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwfSksWyJic2giLCJjc2giLCJzaCJdKTtuKGwoe2tleXdvcmRzOkwsaGFzaENvbW1lbnRzOiEwLG11bHRpTGluZVN0cmluZ3M6ITAsdHJpcGxlUXVvdGVkU3RyaW5nczohMH0pLFsiY3YiLCJweSJdKTtuKGwoe2tleXdvcmRzOiJjYWxsZXIsZGVsZXRlLGRpZSxkbyxkdW1wLGVsc2lmLGV2YWwsZXhpdCxmb3JlYWNoLGZvcixnb3RvLGlmLGltcG9ydCxsYXN0LGxvY2FsLG15LG5leHQsbm8sb3VyLHByaW50LHBhY2thZ2UscmVkbyxyZXF1aXJlLHN1Yix1bmRlZix1bmxlc3MsdW50aWwsdXNlLHdhbnRhcnJheSx3aGlsZSxCRUdJTixFTkQiLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbInBlcmwiLCJwbCIsInBtIl0pO24obCh7a2V5d29yZHM6TSxoYXNoQ29tbWVudHM6ITAsCittdWx0aUxpbmVTdHJpbmdzOiEwLHJlZ2V4TGl0ZXJhbHM6ITB9KSxbInJiIl0pO24obCh7a2V5d29yZHM6QixjU3R5bGVDb21tZW50czohMCxyZWdleExpdGVyYWxzOiEwfSksWyJqcyJdKTtuKGwoe2tleXdvcmRzOiJhbGwsYW5kLGJ5LGNhdGNoLGNsYXNzLGVsc2UsZXh0ZW5kcyxmYWxzZSxmaW5hbGx5LGZvcixpZixpbixpcyxpc250LGxvb3AsbmV3LG5vLG5vdCxudWxsLG9mLG9mZixvbixvcixyZXR1cm4sc3VwZXIsdGhlbix0aHJvdyx0cnVlLHRyeSx1bmxlc3MsdW50aWwsd2hlbix3aGlsZSx5ZXMiLGhhc2hDb21tZW50czozLGNTdHlsZUNvbW1lbnRzOiEwLG11bHRpbGluZVN0cmluZ3M6ITAsdHJpcGxlUXVvdGVkU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJjb2ZmZWUiXSk7bih4KFtdLFtbInN0ciIsL15bXFNcc10rL11dKSxbInJlZ2V4Il0pO3ZhciBTPUMuUFI9e2NyZWF0ZVNpbXBsZUxleGVyOngscmVnaXN0ZXJMYW5nSGFuZGxlcjpuLHNvdXJjZURlY29yYXRvcjpsLAorUFJfQVRUUklCX05BTUU6ImF0biIsUFJfQVRUUklCX1ZBTFVFOiJhdHYiLFBSX0NPTU1FTlQ6ImNvbSIsUFJfREVDTEFSQVRJT046ImRlYyIsUFJfS0VZV09SRDoia3dkIixQUl9MSVRFUkFMOiJsaXQiLFBSX05PQ09ERToibm9jb2RlIixQUl9QTEFJTjoicGxuIixQUl9QVU5DVFVBVElPTjoicHVuIixQUl9TT1VSQ0U6InNyYyIsUFJfU1RSSU5HOiJzdHIiLFBSX1RBRzoidGFnIixQUl9UWVBFOiJ0eXAiLHByZXR0eVByaW50T25lOkMucHJldHR5UHJpbnRPbmU9ZnVuY3Rpb24oYSxpLGcpe3ZhciBqPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInByZSIpO2ouaW5uZXJIVE1MPWE7ZyYmRyhqLGcsITApO0goe2g6aSxqOmcsYzpqLGk6MX0pO3JldHVybiBqLmlubmVySFRNTH0scHJldHR5UHJpbnQ6Qy5wcmV0dHlQcmludD1mdW5jdGlvbihhKXtmdW5jdGlvbiBpKCl7dmFyIHU7Zm9yKHZhciBnPUMuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT04/ay5ub3coKSsyNTA6SW5maW5pdHk7bTxqLmxlbmd0aCYmCitrLm5vdygpPGc7bSsrKXt2YXIgYz1qW21dLGg9Yy5jbGFzc05hbWU7aWYocy50ZXN0KGgpJiYhcS50ZXN0KGgpKXtmb3IodmFyIGU9ITEscD1jLnBhcmVudE5vZGU7cDtwPXAucGFyZW50Tm9kZSlpZihmLnRlc3QocC50YWdOYW1lKSYmcC5jbGFzc05hbWUmJnMudGVzdChwLmNsYXNzTmFtZSkpe2U9ITA7YnJlYWt9aWYoIWUpe2MuY2xhc3NOYW1lKz0iIHByZXR0eXByaW50ZWQiO3ZhciBoPWgubWF0Y2gobyksbjtpZihlPSFoKXtmb3IodmFyIGU9YyxwPXZvaWQgMCxsPWUuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyl2YXIgdD1sLm5vZGVUeXBlLHA9dD09PTE/cD9lOmw6dD09PTM/US50ZXN0KGwubm9kZVZhbHVlKT9lOnA6cDtlPShuPXA9PT1lP3ZvaWQgMDpwKSYmdi50ZXN0KG4udGFnTmFtZSl9ZSYmKGg9bi5jbGFzc05hbWUubWF0Y2gobykpO2gmJihoPWhbMV0pO3U9ZC50ZXN0KGMudGFnTmFtZSk/MTooZT0oZT1jLmN1cnJlbnRTdHlsZSk/ZS53aGl0ZVNwYWNlOmRvY3VtZW50LmRlZmF1bHRWaWV3JiYKK2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGU/ZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjLHIpLmdldFByb3BlcnR5VmFsdWUoIndoaXRlLXNwYWNlIik6MCkmJiJwcmUiPT09ZS5zdWJzdHJpbmcoMCwzKSxlPXU7KHA9KHA9Yy5jbGFzc05hbWUubWF0Y2goL1xibGluZW51bXNcYig/OjooXGQrKSk/LykpP3BbMV0mJnBbMV0ubGVuZ3RoPytwWzFdOiEwOiExKSYmRyhjLHAsZSk7Yj17aDpoLGM6YyxqOnAsaTplfTtIKGIpfX19bTxqLmxlbmd0aD9zZXRUaW1lb3V0KGksMjUwKTphJiZhKCl9Zm9yKHZhciBnPVtkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvZGUiKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgieG1wIildLGo9W10sbj0wO248Zy5sZW5ndGg7KytuKWZvcih2YXIgbD0wLHc9Z1tuXS5sZW5ndGg7bDx3OysrbClqLnB1c2goZ1tuXVtsXSk7dmFyIGc9CityLGs9RGF0ZTtrLm5vd3x8KGs9e25vdzpmdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX19KTt2YXIgbT0wLGIsbz0vXGJsYW5nKD86dWFnZSk/LShbXHcuXSspKD8hXFMpLyxzPS9cYnByZXR0eXByaW50XGIvLHE9L1xicHJldHR5cHJpbnRlZFxiLyxkPS9wcmV8eG1wL2ksdj0vXmNvZGUkL2ksZj0vXig/OnByZXxjb2RlfHhtcCkkL2k7aSgpfX07dHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZSgiZ29vZ2xlLWNvZGUtcHJldHRpZnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIFN9KX0pKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9zZXJ2ZXItZW52LmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvc2VydmVyLWVudi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkNDljMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9zZXJ2ZXItZW52LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0vLyBNb3ppbGxhIFJoaW5vIGlzIG5vdCBJRSA2LgotLy8KLXdpbmRvdy5fcHJfaXNJRTYgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmYWxzZTsgfTsKLQotLy8gRXhwb3NlIHRoZSBmdW5jdGlvbiBhdCB0aGUgdG9wIGxldmVsIHRvIHNpbXBsaWZ5IGNhbGxzLgotLy8KLXByZXR0eVByaW50T25lID0gd2luZG93LnByZXR0eVByaW50T25lOwotUFIgPSB3aW5kb3cuUFI7CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvcG9tLnhtbCBiL2dlcnJpdC1yZXZpZXdkYi9wb20ueG1sCmluZGV4IGY5ZmI0OWUuLjk2NTk5YjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9wb20ueG1sCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcmV2aWV3ZGI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnQuamF2YQppbmRleCBiMjNhYTg2Li45NGIzN2UxIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50LmphdmEKQEAgLTE2OSw3ICsxNjksMTEgQEAKIAogICAvKiogU2V0IHRoZSBmdWxsIG5hbWUgb2YgdGhlIHVzZXIgKCJHaXZlbi1uYW1lIFN1cm5hbWUiIHN0eWxlKS4gKi8KICAgcHVibGljIHZvaWQgc2V0RnVsbE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICBmdWxsTmFtZSA9IG5hbWU7CisgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmFtZS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICBmdWxsTmFtZSA9IG5hbWUudHJpbSgpOworICAgIH0gZWxzZSB7CisgICAgICBmdWxsTmFtZSA9IG51bGw7CisgICAgfQogICB9CiAKICAgLyoqIEVtYWlsIGFkZHJlc3MgdGhlIHVzZXIgcHJlZmVycyB0byBiZSBjb250YWN0ZWQgdGhyb3VnaC4gKi8KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXAuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXAuamF2YQppbmRleCAwNjFlZjNlLi5lYTljNTJkIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cC5qYXZhCkBAIC04NSw2ICs4NSwxMSBAQAogICAgICAgICB8fCB1dWlkLmdldCgpLm1hdGNoZXMoIl5bMC05YS1mXXs0MH0kIik7CiAgIH0KIAorICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSBVVUlEIGlzIGZvciBhIHN5c3RlbSBncm91cCBtYW5hZ2VkIHdpdGhpbiBHZXJyaXQuICovCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbUdyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICByZXR1cm4gdXVpZC5nZXQoKS5zdGFydHNXaXRoKCJnbG9iYWw6Iik7CisgIH0KKwogICAvKiogU3ludGhldGljIGtleSB0byBsaW5rIHRvIHdpdGhpbiB0aGUgZGF0YWJhc2UgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBJZCBleHRlbmRzIEludEtleTxjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+PiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZS5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1ODY4OS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db2x1bW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbXBvdW5kS2V5OwotCi0vKiogTWVtYmVyc2hpcCBvZiBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfSBpbiBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfS4gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY2NvdW50R3JvdXBJbmNsdWRlIHsKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXkgZXh0ZW5kcyBDb21wb3VuZEtleTxBY2NvdW50R3JvdXAuSWQ+IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIEBDb2x1bW4oaWQgPSAxKQotICAgIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZDsKLQotICAgIEBDb2x1bW4oaWQgPSAyKQotICAgIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuSWQgaW5jbHVkZUlkOwotCi0gICAgcHJvdGVjdGVkIEtleSgpIHsKLSAgICAgIGdyb3VwSWQgPSBuZXcgQWNjb3VudEdyb3VwLklkKCk7Ci0gICAgICBpbmNsdWRlSWQgPSBuZXcgQWNjb3VudEdyb3VwLklkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEtleShmaW5hbCBBY2NvdW50R3JvdXAuSWQgZywgZmluYWwgQWNjb3VudEdyb3VwLklkIGkpIHsKLSAgICAgIGdyb3VwSWQgPSBnOwotICAgICAgaW5jbHVkZUlkID0gaTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldFBhcmVudEtleSgpIHsKLSAgICAgIHJldHVybiBncm91cElkOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0R3JvdXBJZCgpIHsKLSAgICAgIHJldHVybiBncm91cElkOwotICAgIH0KLQotICAgIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0SW5jbHVkZUlkKCkgewotICAgICAgcmV0dXJuIGluY2x1ZGVJZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/PltdIG1lbWJlcnMoKSB7Ci0gICAgICByZXR1cm4gbmV3IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSB7aW5jbHVkZUlkfTsKLSAgICB9Ci0gIH0KLQotICBAQ29sdW1uKGlkID0gMSwgbmFtZSA9IENvbHVtbi5OT05FKQotICBwcm90ZWN0ZWQgS2V5IGtleTsKLQotICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwSW5jbHVkZSgpIHsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGspIHsKLSAgICBrZXkgPSBrOwotICB9Ci0KLSAgcHVibGljIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGdldEtleSgpIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRHcm91cElkKCkgewotICAgIHJldHVybiBrZXkuZ3JvdXBJZDsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0SW5jbHVkZUlkKCkgewotICAgIHJldHVybiBrZXkuaW5jbHVkZUlkOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0LmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWMzYzMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVBdWRpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db21wb3VuZEtleTsKLQotaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKLQotLyoqIEluY2x1c2lvbiBvZiBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfSBpbiBhbm90aGVyIHtAbGluayBBY2NvdW50R3JvdXB9LiAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCB7Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5IGV4dGVuZHMgQ29tcG91bmRLZXk8QWNjb3VudEdyb3VwLklkPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAQ29sdW1uKGlkID0gMSkKLSAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQ7Ci0KLSAgICBAQ29sdW1uKGlkID0gMikKLSAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGluY2x1ZGVJZDsKLQotICAgIEBDb2x1bW4oaWQgPSAzKQotICAgIHByb3RlY3RlZCBUaW1lc3RhbXAgYWRkZWRPbjsKLQotICAgIHByb3RlY3RlZCBLZXkoKSB7Ci0gICAgICBncm91cElkID0gbmV3IEFjY291bnRHcm91cC5JZCgpOwotICAgICAgaW5jbHVkZUlkID0gbmV3IEFjY291bnRHcm91cC5JZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBLZXkoZmluYWwgQWNjb3VudEdyb3VwLklkIGcsIGZpbmFsIEFjY291bnRHcm91cC5JZCBpLCBmaW5hbCBUaW1lc3RhbXAgdCkgewotICAgICAgZ3JvdXBJZCA9IGc7Ci0gICAgICBpbmNsdWRlSWQgPSBpOwotICAgICAgYWRkZWRPbiA9IHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRQYXJlbnRLZXkoKSB7Ci0gICAgICByZXR1cm4gZ3JvdXBJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldEluY2x1ZGVkSWQoKSB7Ci0gICAgICByZXR1cm4gaW5jbHVkZUlkOwotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lc3RhbXAgZ2V0QWRkZWRPbigpIHsKLSAgICAgIHJldHVybiBhZGRlZE9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+W10gbWVtYmVycygpIHsKLSAgICAgIHJldHVybiBuZXcgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/PltdIHtpbmNsdWRlSWR9OwotICAgIH0KLSAgfQotCi0gIEBDb2x1bW4oaWQgPSAxLCBuYW1lID0gQ29sdW1uLk5PTkUpCi0gIHByb3RlY3RlZCBLZXkga2V5OwotCi0gIEBDb2x1bW4oaWQgPSAyKQotICBwcm90ZWN0ZWQgQWNjb3VudC5JZCBhZGRlZEJ5OwotCi0gIEBDb2x1bW4oaWQgPSAzLCBub3ROdWxsID0gZmFsc2UpCi0gIHByb3RlY3RlZCBBY2NvdW50LklkIHJlbW92ZWRCeTsKLQotICBAQ29sdW1uKGlkID0gNCwgbm90TnVsbCA9IGZhbHNlKQotICBwcm90ZWN0ZWQgVGltZXN0YW1wIHJlbW92ZWRPbjsKLQotICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0KCkgewotICB9Ci0KLSAgcHVibGljIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIG0sCi0gICAgICBmaW5hbCBBY2NvdW50LklkIGFkZGVyKSB7Ci0gICAgZmluYWwgQWNjb3VudEdyb3VwLklkIGdyb3VwID0gbS5nZXRHcm91cElkKCk7Ci0gICAgZmluYWwgQWNjb3VudEdyb3VwLklkIGluY2x1ZGUgPSBtLmdldEluY2x1ZGVJZCgpOwotICAgIGtleSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQuS2V5KGdyb3VwLCBpbmNsdWRlLCBub3coKSk7Ci0gICAgYWRkZWRCeSA9IGFkZGVyOwotICB9Ci0KLSAgcHVibGljIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdC5LZXkgZ2V0S2V5KCkgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLSAgICByZXR1cm4gcmVtb3ZlZE9uID09IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW1vdmVkKGZpbmFsIEFjY291bnQuSWQgZGVsZXRlcikgewotICAgIHJlbW92ZWRCeSA9IGRlbGV0ZXI7Ci0gICAgcmVtb3ZlZE9uID0gbm93KCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBUaW1lc3RhbXAgbm93KCkgewotICAgIHJldHVybiBuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YjM1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db21wb3VuZEtleTsKKworLyoqIE1lbWJlcnNoaXAgb2YgYW4ge0BsaW5rIEFjY291bnRHcm91cH0gaW4gYW4ge0BsaW5rIEFjY291bnRHcm91cH0uICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5IGV4dGVuZHMgQ29tcG91bmRLZXk8QWNjb3VudEdyb3VwLklkPiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBAQ29sdW1uKGlkID0gMSkKKyAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQ7CisKKyAgICBAQ29sdW1uKGlkID0gMikKKyAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLlVVSUQgaW5jbHVkZVVVSUQ7CisKKyAgICBwcm90ZWN0ZWQgS2V5KCkgeworICAgICAgZ3JvdXBJZCA9IG5ldyBBY2NvdW50R3JvdXAuSWQoKTsKKyAgICAgIGluY2x1ZGVVVUlEID0gbmV3IEFjY291bnRHcm91cC5VVUlEKCk7CisgICAgfQorCisgICAgcHVibGljIEtleShmaW5hbCBBY2NvdW50R3JvdXAuSWQgZywgZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdSkgeworICAgICAgZ3JvdXBJZCA9IGc7CisgICAgICBpbmNsdWRlVVVJRCA9IHU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRQYXJlbnRLZXkoKSB7CisgICAgICByZXR1cm4gZ3JvdXBJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldEdyb3VwSWQoKSB7CisgICAgICByZXR1cm4gZ3JvdXBJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjb3VudEdyb3VwLlVVSUQgZ2V0SW5jbHVkZVVVSUQoKSB7CisgICAgICByZXR1cm4gaW5jbHVkZVVVSUQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSBtZW1iZXJzKCkgeworICAgICAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+W10ge2luY2x1ZGVVVUlEfTsKKyAgICB9CisgIH0KKworICBAQ29sdW1uKGlkID0gMSwgbmFtZSA9IENvbHVtbi5OT05FKQorICBwcm90ZWN0ZWQgS2V5IGtleTsKKworICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCgpIHsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5IGspIHsKKyAgICBrZXkgPSBrOworICB9CisKKyAgcHVibGljIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5IGdldEtleSgpIHsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRHcm91cElkKCkgeworICAgIHJldHVybiBrZXkuZ3JvdXBJZDsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXAuVVVJRCBnZXRJbmNsdWRlVVVJRCgpIHsKKyAgICByZXR1cm4ga2V5LmluY2x1ZGVVVUlEOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyNTE5NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db2x1bW47CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbXBvdW5kS2V5OworCitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworCisvKiogSW5jbHVzaW9uIG9mIGFuIHtAbGluayBBY2NvdW50R3JvdXB9IGluIGFub3RoZXIge0BsaW5rIEFjY291bnRHcm91cH0uICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0IHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXkgZXh0ZW5kcyBDb21wb3VuZEtleTxBY2NvdW50R3JvdXAuSWQ+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgIEBDb2x1bW4oaWQgPSAxKQorICAgIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZDsKKworICAgIEBDb2x1bW4oaWQgPSAyKQorICAgIHByb3RlY3RlZCBBY2NvdW50R3JvdXAuVVVJRCBpbmNsdWRlVVVJRDsKKworICAgIEBDb2x1bW4oaWQgPSAzKQorICAgIHByb3RlY3RlZCBUaW1lc3RhbXAgYWRkZWRPbjsKKworICAgIHByb3RlY3RlZCBLZXkoKSB7CisgICAgICBncm91cElkID0gbmV3IEFjY291bnRHcm91cC5JZCgpOworICAgICAgaW5jbHVkZVVVSUQgPSBuZXcgQWNjb3VudEdyb3VwLlVVSUQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgS2V5KGZpbmFsIEFjY291bnRHcm91cC5JZCBnLCBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCB1LCBmaW5hbCBUaW1lc3RhbXAgdCkgeworICAgICAgZ3JvdXBJZCA9IGc7CisgICAgICBpbmNsdWRlVVVJRCA9IHU7CisgICAgICBhZGRlZE9uID0gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldFBhcmVudEtleSgpIHsKKyAgICAgIHJldHVybiBncm91cElkOworICAgIH0KKworICAgIHB1YmxpYyBBY2NvdW50R3JvdXAuVVVJRCBnZXRJbmNsdWRlVVVJRCgpIHsKKyAgICAgIHJldHVybiBpbmNsdWRlVVVJRDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGltZXN0YW1wIGdldEFkZGVkT24oKSB7CisgICAgICByZXR1cm4gYWRkZWRPbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/PltdIG1lbWJlcnMoKSB7CisgICAgICByZXR1cm4gbmV3IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSB7aW5jbHVkZVVVSUR9OworICAgIH0KKyAgfQorCisgIEBDb2x1bW4oaWQgPSAxLCBuYW1lID0gQ29sdW1uLk5PTkUpCisgIHByb3RlY3RlZCBLZXkga2V5OworCisgIEBDb2x1bW4oaWQgPSAyKQorICBwcm90ZWN0ZWQgQWNjb3VudC5JZCBhZGRlZEJ5OworCisgIEBDb2x1bW4oaWQgPSAzLCBub3ROdWxsID0gZmFsc2UpCisgIHByb3RlY3RlZCBBY2NvdW50LklkIHJlbW92ZWRCeTsKKworICBAQ29sdW1uKGlkID0gNCwgbm90TnVsbCA9IGZhbHNlKQorICBwcm90ZWN0ZWQgVGltZXN0YW1wIHJlbW92ZWRPbjsKKworICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0KCkgeworICB9CisKKyAgcHVibGljIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIG0sCisgICAgICBmaW5hbCBBY2NvdW50LklkIGFkZGVyLCBmaW5hbCBUaW1lc3RhbXAgd2hlbikgeworICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cCA9IG0uZ2V0R3JvdXBJZCgpOworICAgIGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGluY2x1ZGUgPSBtLmdldEluY2x1ZGVVVUlEKCk7CisgICAga2V5ID0gbmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdC5LZXkoZ3JvdXAsIGluY2x1ZGUsIHdoZW4pOworICAgIGFkZGVkQnkgPSBhZGRlcjsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBtLAorICAgICAgZmluYWwgQWNjb3VudC5JZCBhZGRlcikgeworICAgIHRoaXMobSwgYWRkZXIsIG5vdygpKTsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQuS2V5IGdldEtleSgpIHsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgcmV0dXJuIHJlbW92ZWRPbiA9PSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlZChmaW5hbCBBY2NvdW50LklkIGRlbGV0ZXIpIHsKKyAgICByZW1vdmVkQnkgPSBkZWxldGVyOworICAgIHJlbW92ZWRPbiA9IG5vdygpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVtb3ZlZChmaW5hbCBBY2NvdW50LklkIGRlbGV0ZXIsIGZpbmFsIFRpbWVzdGFtcCB3aGVuKSB7CisgICAgcmVtb3ZlZEJ5ID0gZGVsZXRlcjsKKyAgICByZW1vdmVkT24gPSB3aGVuOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgVGltZXN0YW1wIG5vdygpIHsKKyAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50UHJvamVjdFdhdGNoLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudFByb2plY3RXYXRjaC5qYXZhCmluZGV4IGU1OTIxMDEuLmM3ZjUyYjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50UHJvamVjdFdhdGNoLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRQcm9qZWN0V2F0Y2guamF2YQpAQCAtMjIsNyArMjIsOCBAQAogcHVibGljIGZpbmFsIGNsYXNzIEFjY291bnRQcm9qZWN0V2F0Y2ggewogCiAgIHB1YmxpYyBlbnVtIE5vdGlmeVR5cGUgewotICAgIE5FV19DSEFOR0VTLCBBTExfQ09NTUVOVFMsIFNVQk1JVFRFRF9DSEFOR0VTLCBBTEwKKyAgICBORVdfQ0hBTkdFUywgTkVXX1BBVENIU0VUUywgQUxMX0NPTU1FTlRTLCBTVUJNSVRURURfQ0hBTkdFUywKKyAgICBBQkFORE9ORURfQ0hBTkdFUywgQUxMCiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQUxMID0gIioiOwpAQCAtMTA5LDYgKzExMCwxMiBAQAogICBAQ29sdW1uKGlkID0gNCkKICAgcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5U3VibWl0dGVkQ2hhbmdlczsKIAorICBAQ29sdW1uKGlkID0gNSkKKyAgcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5TmV3UGF0Y2hTZXRzOworCisgIEBDb2x1bW4oaWQgPSA2KQorICBwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlBYmFuZG9uZWRDaGFuZ2VzOworCiAgIHByb3RlY3RlZCBBY2NvdW50UHJvamVjdFdhdGNoKCkgewogICB9CiAKQEAgLTEzNywxMSArMTQ0LDIwIEBACiAgICAgICBjYXNlIE5FV19DSEFOR0VTOgogICAgICAgICByZXR1cm4gbm90aWZ5TmV3Q2hhbmdlczsKIAorICAgICAgY2FzZSBORVdfUEFUQ0hTRVRTOgorICAgICAgICByZXR1cm4gbm90aWZ5TmV3UGF0Y2hTZXRzOworCiAgICAgICBjYXNlIEFMTF9DT01NRU5UUzoKICAgICAgICAgcmV0dXJuIG5vdGlmeUFsbENvbW1lbnRzOwogCiAgICAgICBjYXNlIFNVQk1JVFRFRF9DSEFOR0VTOgogICAgICAgICByZXR1cm4gbm90aWZ5U3VibWl0dGVkQ2hhbmdlczsKKworICAgICAgY2FzZSBBQkFORE9ORURfQ0hBTkdFUzoKKyAgICAgICAgcmV0dXJuIG5vdGlmeUFiYW5kb25lZENoYW5nZXM7CisKKyAgICAgIGNhc2UgQUxMOgorICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0xNTIsNiArMTY4LDEwIEBACiAgICAgICAgIG5vdGlmeU5ld0NoYW5nZXMgPSB2OwogICAgICAgICBicmVhazsKIAorICAgICAgY2FzZSBORVdfUEFUQ0hTRVRTOgorICAgICAgICBub3RpZnlOZXdQYXRjaFNldHMgPSB2OworICAgICAgICBicmVhazsKKwogICAgICAgY2FzZSBBTExfQ09NTUVOVFM6CiAgICAgICAgIG5vdGlmeUFsbENvbW1lbnRzID0gdjsKICAgICAgICAgYnJlYWs7CkBAIC0xNjAsMTAgKzE4MCwxNiBAQAogICAgICAgICBub3RpZnlTdWJtaXR0ZWRDaGFuZ2VzID0gdjsKICAgICAgICAgYnJlYWs7CiAKKyAgICAgIGNhc2UgQUJBTkRPTkVEX0NIQU5HRVM6CisgICAgICAgIG5vdGlmeUFiYW5kb25lZENoYW5nZXMgPSB2OworICAgICAgICBicmVhazsKKwogICAgICAgY2FzZSBBTEw6CiAgICAgICAgIG5vdGlmeU5ld0NoYW5nZXMgPSB2OworICAgICAgICBub3RpZnlOZXdQYXRjaFNldHMgPSB2OwogICAgICAgICBub3RpZnlBbGxDb21tZW50cyA9IHY7CiAgICAgICAgIG5vdGlmeVN1Ym1pdHRlZENoYW5nZXMgPSB2OworICAgICAgICBub3RpZnlBYmFuZG9uZWRDaGFuZ2VzID0gdjsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQXBwcm92YWxDYXRlZ29yeS5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FwcHJvdmFsQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2MTk3NS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQXBwcm92YWxDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LlN0cmluZ0tleTsKLQotLyoqIFR5cGVzIG9mIGFwcHJvdmFscyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgQ2hhbmdlfS4gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHByb3ZhbENhdGVnb3J5IHsKLSAgLyoqIElkIG9mIHRoZSBzcGVjaWFsICJTdWJtaXQiIGFjdGlvbiAoYW5kIGNhdGVnb3J5KS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIFNVQk1JVCA9Ci0gICAgICBuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgiU1VCTSIpOwotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWQgZXh0ZW5kcyBTdHJpbmdLZXk8S2V5PD8+PiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAQ29sdW1uKGlkID0gMSwgbGVuZ3RoID0gNCkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCi0gICAgcHJvdGVjdGVkIElkKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBJZChmaW5hbCBTdHJpbmcgYSkgewotICAgICAgaWQgPSBhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgewotICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgbmV3VmFsdWUpIHsKLSAgICAgIGlkID0gbmV3VmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEludGVybmFsIHNob3J0IHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGNhdGVnb3J5LiAqLwotICBAQ29sdW1uKGlkID0gMSkKLSAgcHJvdGVjdGVkIElkIGNhdGVnb3J5SWQ7Ci0KLSAgLyoqIFVuaXF1ZSBuYW1lIGZvciB0aGlzIGNhdGVnb3J5LCBzaG93biBpbiB0aGUgd2ViIGludGVyZmFjZSB0byB1c2Vycy4gKi8KLSAgQENvbHVtbihpZCA9IDIsIGxlbmd0aCA9IDIwKQotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgLyoqIEFiYnJldmlhdGVkIGZvcm0gb2Yge0BsaW5rICNuYW1lfSBmb3IgZGlzcGxheSBpbiB2ZXJ5IHdpZGUgdGFibGVzLiAqLwotICBAQ29sdW1uKGlkID0gMywgbGVuZ3RoID0gNCwgbm90TnVsbCA9IGZhbHNlKQotICBwcm90ZWN0ZWQgU3RyaW5nIGFiYnJldmlhdGVkTmFtZTsKLQotICAvKiogT3JkZXIgb2YgdGhpcyBjYXRlZ29yeSB3aXRoaW4gdGhlIEFwcHJvdmFscyB0YWJsZSB3aGVuIHByZXNlbnRlZC4gKi8KLSAgQENvbHVtbihpZCA9IDQpCi0gIHByb3RlY3RlZCBzaG9ydCBwb3NpdGlvbjsKLQotICAvKiogSWRlbnRpdHkgb2YgdGhlIGZ1bmN0aW9uIHVzZWQgdG8gYWdncmVnYXRlIHRoZSBjYXRlZ29yeSdzIHZhbHVlLiAqLwotICBAQ29sdW1uKGlkID0gNSkKLSAgcHJvdGVjdGVkIFN0cmluZyBmdW5jdGlvbk5hbWU7Ci0KLSAgLyoqIElmIHNldCwgdGhlIG1pbmltdW0gc2NvcmUgaXMgY29waWVkIGR1cmluZyBwYXRjaCBzZXQgcmVwbGFjZW1lbnQuICovCi0gIEBDb2x1bW4oaWQgPSA2KQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjb3B5TWluU2NvcmU7Ci0KLSAgLyoqIENvbXB1dGVkIG5hbWUgZGVyaXZlZCBmcm9tIHtAbGluayAjbmFtZX0uICovCi0gIHByb3RlY3RlZCBTdHJpbmcgbGFiZWxOYW1lOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbENhdGVnb3J5KCkgewotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnkoZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBpZCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICB0aGlzLmNhdGVnb3J5SWQgPSBpZDsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gIk1heFdpdGhCbG9jayI7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRJZCgpIHsKLSAgICByZXR1cm4gY2F0ZWdvcnlJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG4pIHsKLSAgICBuYW1lID0gbjsKLSAgICBsYWJlbE5hbWUgPSBudWxsOwotICB9Ci0KLSAgLyoqIENsZWFuIHZlcnNpb24gb2Yge0BsaW5rICNnZXROYW1lKCl9LCBlLmcuICJDb2RlIFJldmlldyIgaXMgIkNvZGUtUmV2aWV3Ii4gKi8KLSAgcHVibGljIFN0cmluZyBnZXRMYWJlbE5hbWUoKSB7Ci0gICAgaWYgKGxhYmVsTmFtZSA9PSBudWxsKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7Ci0gICAgICAgIGlmICgoJzAnIDw9IGMgJiYgYyA8PSAnOScpIC8vCi0gICAgICAgICAgICB8fCAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIC8vCi0gICAgICAgICAgICB8fCAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIC8vCi0gICAgICAgICAgICB8fCAoYyA9PSAnLScpKSB7Ci0gICAgICAgICAgci5hcHBlbmQoYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnICcpIHsKLSAgICAgICAgICByLmFwcGVuZCgnLScpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsYWJlbE5hbWUgPSByLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBsYWJlbE5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEFiYnJldmlhdGVkTmFtZSgpIHsKLSAgICByZXR1cm4gYWJicmV2aWF0ZWROYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWJicmV2aWF0ZWROYW1lKGZpbmFsIFN0cmluZyBuKSB7Ci0gICAgYWJicmV2aWF0ZWROYW1lID0gbjsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBnZXRQb3NpdGlvbigpIHsKLSAgICByZXR1cm4gcG9zaXRpb247Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihmaW5hbCBzaG9ydCBwKSB7Ci0gICAgcG9zaXRpb24gPSBwOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoKSB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZ1bmN0aW9uTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgIGZ1bmN0aW9uTmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvcHlNaW5TY29yZSgpIHsKLSAgICByZXR1cm4gY29weU1pblNjb3JlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29weU1pblNjb3JlKGZpbmFsIGJvb2xlYW4gY29weSkgewotICAgIGNvcHlNaW5TY29yZSA9IGNvcHk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BcHByb3ZhbENhdGVnb3J5VmFsdWUuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BcHByb3ZhbENhdGVnb3J5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3NjFjNS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQXBwcm92YWxDYXRlZ29yeVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db2x1bW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LlNob3J0S2V5OwotCi0vKiogVmFsaWQgdmFsdWUgZm9yIGEge0BsaW5rIEFwcHJvdmFsQ2F0ZWdvcnl9LiAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB7Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWQgZXh0ZW5kcyBTaG9ydEtleTxBcHByb3ZhbENhdGVnb3J5LklkPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAQ29sdW1uKGlkID0gMSkKLSAgICBwcm90ZWN0ZWQgQXBwcm92YWxDYXRlZ29yeS5JZCBjYXRlZ29yeUlkOwotCi0gICAgQENvbHVtbihpZCA9IDIpCi0gICAgcHJvdGVjdGVkIHNob3J0IHZhbHVlOwotCi0gICAgcHJvdGVjdGVkIElkKCkgewotICAgICAgY2F0ZWdvcnlJZCA9IG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElkKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0LCBmaW5hbCBzaG9ydCB2KSB7Ci0gICAgICBjYXRlZ29yeUlkID0gY2F0OwotICAgICAgdmFsdWUgPSB2OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5LklkIGdldFBhcmVudEtleSgpIHsKLSAgICAgIHJldHVybiBjYXRlZ29yeUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzaG9ydCBnZXQoKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0KHNob3J0IG5ld1ZhbHVlKSB7Ci0gICAgICB2YWx1ZSA9IG5ld1ZhbHVlOwotICAgIH0KLSAgfQotCi0gIEBDb2x1bW4oaWQgPSAxLCBuYW1lID0gQ29sdW1uLk5PTkUpCi0gIHByb3RlY3RlZCBJZCBrZXk7Ci0KLSAgQENvbHVtbihpZCA9IDIsIGxlbmd0aCA9IDUwKQotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLSAgcHJvdGVjdGVkIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSgpIHsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUoZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkIGlkLAotICAgICAgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICB0aGlzLmtleSA9IGlkOwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkIGdldElkKCkgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRDYXRlZ29yeUlkKCkgewotICAgIHJldHVybiBrZXkuY2F0ZWdvcnlJZDsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBnZXRWYWx1ZSgpIHsKLSAgICByZXR1cm4ga2V5LnZhbHVlOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbikgewotICAgIG5hbWUgPSBuOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBmb3JtYXRWYWx1ZSgpIHsKLSAgICBpZiAoZ2V0VmFsdWUoKSA8IDApIHsKLSAgICAgIHJldHVybiBTaG9ydC50b1N0cmluZyhnZXRWYWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKGdldFZhbHVlKCkgPT0gMCkgewotICAgICAgcmV0dXJuICIgMCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiKyIgKyBTaG9ydC50b1N0cmluZyhnZXRWYWx1ZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGZvcm1hdCgpIHsKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIG0uYXBwZW5kKGZvcm1hdFZhbHVlKCkpOwotICAgIG0uYXBwZW5kKCcgJyk7Ci0gICAgbS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICByZXR1cm4gbS50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQ2hhbmdlLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQ2hhbmdlLmphdmEKaW5kZXggYmZiYWNjMC4uMmE1MTg3MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0NoYW5nZS5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9DaGFuZ2UuamF2YQpAQCAtMTkzLDYgKzE5Myw5IEBACiAgIC8qKiBEYXRhYmFzZSBjb25zdGFudCBmb3Ige0BsaW5rIFN0YXR1cyNNRVJHRUR9LiAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU1RBVFVTX01FUkdFRCA9ICdNJzsKIAorICAvKiogSUQgbnVtYmVyIG9mIHRoZSBmaXJzdCBwYXRjaCBzZXQgaW4gYSBjaGFuZ2UuICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfUEFUQ0hfU0VUX0lEID0gMTsKKwogICAvKioKICAgICogQ3VycmVudCBzdGF0ZSB3aXRoaW4gdGhlIGJhc2ljIHdvcmtmbG93IG9mIHRoZSBjaGFuZ2UuCiAgICAqCkBAIC0zNTksMTAgKzM2Miw2IEBACiAgIEBDb2x1bW4oaWQgPSAxMCkKICAgcHJvdGVjdGVkIGNoYXIgc3RhdHVzOwogCi0gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIHtAbGluayBQYXRjaFNldH0gY2hpbGRyZW4gaW4gdGhpcyBDaGFuZ2UuICovCi0gIEBDb2x1bW4oaWQgPSAxMSkKLSAgcHJvdGVjdGVkIGludCBuYnJQYXRjaFNldHM7Ci0KICAgLyoqIFRoZSBjdXJyZW50IHBhdGNoIHNldC4gKi8KICAgQENvbHVtbihpZCA9IDEyKQogICBwcm90ZWN0ZWQgaW50IGN1cnJlbnRQYXRjaFNldElkOwpAQCAtNDI4LDEyICs0MjcsMTIgQEAKICAgICByZXR1cm4gbGFzdFVwZGF0ZWRPbjsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlc2V0TGFzdFVwZGF0ZWRPbigpIHsKLSAgICBsYXN0VXBkYXRlZE9uID0gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgIHB1YmxpYyB2b2lkIHNldExhc3RVcGRhdGVkT24oVGltZXN0YW1wIG5vdykgeworICAgIGxhc3RVcGRhdGVkT24gPSBub3c7CiAgIH0KIAotICBwdWJsaWMgaW50IGdldE51bWJlck9mUGF0Y2hTZXRzKCkgewotICAgIHJldHVybiBuYnJQYXRjaFNldHM7CisgIHB1YmxpYyB2b2lkIHJlc2V0TGFzdFVwZGF0ZWRPbigpIHsKKyAgICBsYXN0VXBkYXRlZE9uID0gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldFNvcnRLZXkoKSB7CkBAIC00NzMsMzIgKzQ3Miw2IEBACiAgICAgc3ViamVjdCA9IHBzLmdldFN1YmplY3QoKTsKICAgfQogCi0gIC8qKgotICAgKiBBbGxvY2F0ZSBhIG5ldyBQYXRjaFNldCBpZCB3aXRoaW4gdGhpcyBjaGFuZ2UuCi0gICAqIDxwPgotICAgKiA8Yj5Ob3RlOiBUaGlzIG1ha2VzIHRoZSBjaGFuZ2UgZGlydHkuIENhbGwgdXBkYXRlKCkgYWZ0ZXIuPC9iPgotICAgKi8KLSAgcHVibGljIHZvaWQgbmV4dFBhdGNoU2V0SWQoKSB7Ci0gICAgKytuYnJQYXRjaFNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV2ZXJ0cyB0byBhbiBvbGRlciBQYXRjaFNldCBpZCB3aXRoaW4gdGhpcyBjaGFuZ2UuCi0gICAqIDxwPgotICAgKiA8Yj5Ob3RlOiBUaGlzIG1ha2VzIHRoZSBjaGFuZ2UgZGlydHkuIENhbGwgdXBkYXRlKCkgYWZ0ZXIuPC9iPgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGFzdFBhdGNoU2V0SWQoKSB7Ci0gICAgLS1uYnJQYXRjaFNldHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1cGRhdGVOdW1iZXJPZlBhdGNoU2V0cyhpbnQgbWF4KSB7Ci0gICAgbmJyUGF0Y2hTZXRzID0gTWF0aC5tYXgobmJyUGF0Y2hTZXRzLCBtYXgpOwotICB9Ci0KLSAgcHVibGljIFBhdGNoU2V0LklkIGN1cnJQYXRjaFNldElkKCkgewotICAgIHJldHVybiBuZXcgUGF0Y2hTZXQuSWQoY2hhbmdlSWQsIG5iclBhdGNoU2V0cyk7Ci0gIH0KLQogICBwdWJsaWMgU3RhdHVzIGdldFN0YXR1cygpIHsKICAgICByZXR1cm4gU3RhdHVzLmZvckNvZGUoc3RhdHVzKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0luaGVyaXRlZEJvb2xlYW4uamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9Jbmhlcml0ZWRCb29sZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0YjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9Jbmhlcml0ZWRCb29sZWFuLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKKworcHVibGljIGNsYXNzIEluaGVyaXRlZEJvb2xlYW4geworCisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gdmFsdWU7CisgIHB1YmxpYyBib29sZWFuIGluaGVyaXRlZFZhbHVlOworCisgIHB1YmxpYyBJbmhlcml0ZWRCb29sZWFuKCkgeworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgSW5oZXJpdGFibGVCb29sZWFuIHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SW5oZXJpdGVkVmFsdWUoZmluYWwgYm9vbGVhbiBpbmhlcml0ZWRWYWx1ZSkgeworICAgIHRoaXMuaW5oZXJpdGVkVmFsdWUgPSBpbmhlcml0ZWRWYWx1ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2guamF2YQppbmRleCAwMGUyODJiLi42ZGRkNmQyIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2guamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2guamF2YQpAQCAtODQsNyArODQsNyBAQAogICAgIC8qKiBQYXRoIHdhcyBjb3BpZWQgZnJvbSB7QGxpbmsgUGF0Y2gjZ2V0U291cmNlRmlsZU5hbWUoKX0uICovCiAgICAgQ09QSUVEKCdDJyksCiAKLSAgICAvKiogU3VmZmljaWVudCBhbW91bnQgb2YgY29udGVudCBjaGFuZ2VkIHRvIGNsYWltIHRoZSBmaWxlIHdhcyB3cml0dGVuLiAqLworICAgIC8qKiBTdWZmaWNpZW50IGFtb3VudCBvZiBjb250ZW50IGNoYW5nZWQgdG8gY2xhaW0gdGhlIGZpbGUgd2FzIHJld3JpdHRlbi4gKi8KICAgICBSRVdSSVRFKCdXJyk7CiAKICAgICBwcml2YXRlIGZpbmFsIGNoYXIgY29kZTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaExpbmVDb21tZW50LmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hMaW5lQ29tbWVudC5qYXZhCmluZGV4IGM4YTk3MGQuLmFmMzVlNTJmIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hMaW5lQ29tbWVudC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaExpbmVDb21tZW50LmphdmEKQEAgLTEzOCw2ICsxMzgsMTAgQEAKICAgICByZXR1cm4gbGluZU5icjsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldExpbmUoaW50IGxpbmUpIHsKKyAgICBsaW5lTmJyID0gbGluZTsKKyAgfQorCiAgIHB1YmxpYyBBY2NvdW50LklkIGdldEF1dGhvcigpIHsKICAgICByZXR1cm4gYXV0aG9yOwogICB9CkBAIC0xNzQsNyArMTc4LDE1IEBACiAgICAgd3JpdHRlbk9uID0gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRXcml0dGVuT24oVGltZXN0YW1wIHRzKSB7CisgICAgd3JpdHRlbk9uID0gdHM7CisgIH0KKwogICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudFV1aWQoKSB7CiAgICAgcmV0dXJuIHBhcmVudFV1aWQ7CiAgIH0KKworICBwdWJsaWMgdm9pZCBzZXRQYXJlbnRVdWlkKFN0cmluZyBpblJlcGx5VG8pIHsKKyAgICBwYXJlbnRVdWlkID0gaW5SZXBseVRvOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXQuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldC5qYXZhCmluZGV4IDgzY2U4MjguLjU0YzU1NmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldC5qYXZhCkBAIC0yNSw3ICsyNSwyNyBAQAogCiAgIC8qKiBJcyB0aGUgcmVmZXJlbmNlIG5hbWUgYSBjaGFuZ2UgcmVmZXJlbmNlPyAqLwogICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gbmFtZS5tYXRjaGVzKCJecmVmcy9jaGFuZ2VzLy4qL1sxLTldWzAtOV0qL1sxLTldWzAtOV0qJCIpOworICAgIGlmIChuYW1lID09IG51bGwgfHwgIW5hbWUuc3RhcnRzV2l0aChSRUZTX0NIQU5HRVMpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICBpbnQgbnVtc0ZvdW5kID0gMDsKKyAgICBmb3IgKGludCBpID0gbmFtZS5sZW5ndGgoKSAtIDE7IGkgPj0gUkVGU19DSEFOR0VTLmxlbmd0aCgpIC0gMTsgaS0tKSB7CisgICAgICBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKKyAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICBhY2NlcHRlZCA9IChjICE9ICcwJyk7CisgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nKSB7CisgICAgICAgIGlmIChhY2NlcHRlZCkgeworICAgICAgICAgIGlmICgrK251bXNGb3VuZCA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIElkIGV4dGVuZHMgSW50S2V5PENoYW5nZS5JZD4gewpAQCAtNjEsNiArODEsMjIgQEAKICAgICAgIHBhdGNoU2V0SWQgPSBuZXdWYWx1ZTsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIHRvUmVmTmFtZSgpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICByLmFwcGVuZChSRUZTX0NIQU5HRVMpOworICAgICAgaW50IGNoYW5nZSA9IGNoYW5nZUlkLmdldCgpOworICAgICAgaW50IG0gPSBjaGFuZ2UgJSAxMDA7CisgICAgICBpZiAobSA8IDEwKSB7CisgICAgICAgIHIuYXBwZW5kKCcwJyk7CisgICAgICB9CisgICAgICByLmFwcGVuZChtKTsKKyAgICAgIHIuYXBwZW5kKCcvJyk7CisgICAgICByLmFwcGVuZChjaGFuZ2UpOworICAgICAgci5hcHBlbmQoJy8nKTsKKyAgICAgIHIuYXBwZW5kKHBhdGNoU2V0SWQpOworICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICB9CisKICAgICAvKiogUGFyc2UgYSBQYXRjaFNldC5JZCBvdXQgb2YgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uICovCiAgICAgcHVibGljIHN0YXRpYyBJZCBwYXJzZShmaW5hbCBTdHJpbmcgc3RyKSB7CiAgICAgICBmaW5hbCBJZCByID0gbmV3IElkKCk7CkBAIC0xNDgsMTkgKzE4NCw3IEBACiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldFJlZk5hbWUoKSB7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICByLmFwcGVuZChSRUZTX0NIQU5HRVMpOwotICAgIGZpbmFsIGludCBjaGFuZ2VJZCA9IGlkLmdldFBhcmVudEtleSgpLmdldCgpOwotICAgIGZpbmFsIGludCBtID0gY2hhbmdlSWQgJSAxMDA7Ci0gICAgaWYgKG0gPCAxMCkgewotICAgICAgci5hcHBlbmQoJzAnKTsKLSAgICB9Ci0gICAgci5hcHBlbmQobSk7Ci0gICAgci5hcHBlbmQoJy8nKTsKLSAgICByLmFwcGVuZChjaGFuZ2VJZCk7Ci0gICAgci5hcHBlbmQoJy8nKTsKLSAgICByLmFwcGVuZChpZC5nZXQoKSk7Ci0gICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gaWQudG9SZWZOYW1lKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldEFwcHJvdmFsLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXRBcHByb3ZhbC5qYXZhCmluZGV4IDA0YjJiNmYuLjhkNzlkNjYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldEFwcHJvdmFsLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoU2V0QXBwcm92YWwuamF2YQpAQCAtMTYsMTEgKzE2LDUyIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db21wb3VuZEtleTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuU3RyaW5nS2V5OwogCiBpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogCiAvKiogQW4gYXBwcm92YWwgKG9yIG5lZ2F0aXZlIGFwcHJvdmFsKSBvbiBhIHBhdGNoIHNldC4gKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBQYXRjaFNldEFwcHJvdmFsIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBMYWJlbElkIGV4dGVuZHMKKyAgICAgIFN0cmluZ0tleTxjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+PiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExhYmVsSWQgU1VCTUlUID0gbmV3IExhYmVsSWQoIlNVQk0iKTsKKworICAgIEBDb2x1bW4oaWQgPSAxKQorICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisKKyAgICBwcm90ZWN0ZWQgTGFiZWxJZCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFiZWxJZChmaW5hbCBTdHJpbmcgbikgeworICAgICAgaWQgPSBuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgbmV3VmFsdWUpIHsKKyAgICAgIGlkID0gbmV3VmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIHJldHVybiBnZXQoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYikgeworICAgICAgaWYgKGIgaW5zdGFuY2VvZiBMYWJlbElkKSB7CisgICAgICAgIHJldHVybiBnZXQoKS5lcXVhbHMoKChMYWJlbElkKSBiKS5nZXQoKSk7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXkgZXh0ZW5kcyBDb21wb3VuZEtleTxQYXRjaFNldC5JZD4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCkBAIC0zMSwxNiArNzIsMTYgQEAKICAgICBwcm90ZWN0ZWQgQWNjb3VudC5JZCBhY2NvdW50SWQ7CiAKICAgICBAQ29sdW1uKGlkID0gMykKLSAgICBwcm90ZWN0ZWQgQXBwcm92YWxDYXRlZ29yeS5JZCBjYXRlZ29yeUlkOworICAgIHByb3RlY3RlZCBMYWJlbElkIGNhdGVnb3J5SWQ7CiAKICAgICBwcm90ZWN0ZWQgS2V5KCkgewogICAgICAgcGF0Y2hTZXRJZCA9IG5ldyBQYXRjaFNldC5JZCgpOwogICAgICAgYWNjb3VudElkID0gbmV3IEFjY291bnQuSWQoKTsKLSAgICAgIGNhdGVnb3J5SWQgPSBuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgpOworICAgICAgY2F0ZWdvcnlJZCA9IG5ldyBMYWJlbElkKCk7CiAgICAgfQogCiAgICAgcHVibGljIEtleShmaW5hbCBQYXRjaFNldC5JZCBwcywgZmluYWwgQWNjb3VudC5JZCBhLAotICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIGMpIHsKKyAgICAgICAgZmluYWwgTGFiZWxJZCBjKSB7CiAgICAgICB0aGlzLnBhdGNoU2V0SWQgPSBwczsKICAgICAgIHRoaXMuYWNjb3VudElkID0gYTsKICAgICAgIHRoaXMuY2F0ZWdvcnlJZCA9IGM7CkBAIC01NSw3ICs5Niw3IEBACiAgICAgICByZXR1cm4gYWNjb3VudElkOwogICAgIH0KIAotICAgIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5LklkIGdldENhdGVnb3J5SWQoKSB7CisgICAgcHVibGljIExhYmVsSWQgZ2V0TGFiZWxJZCgpIHsKICAgICAgIHJldHVybiBjYXRlZ29yeUlkOwogICAgIH0KIApAQCAtMTA4LDcgKzE0OSw3IEBACiAKICAgcHVibGljIFBhdGNoU2V0QXBwcm92YWwoZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCwgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzcmMpIHsKICAgICBrZXkgPQotICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkocHNJZCwgc3JjLmdldEFjY291bnRJZCgpLCBzcmMuZ2V0Q2F0ZWdvcnlJZCgpKTsKKyAgICAgICAgbmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KHBzSWQsIHNyYy5nZXRBY2NvdW50SWQoKSwgc3JjLmdldExhYmVsSWQoKSk7CiAgICAgY2hhbmdlT3BlbiA9IHRydWU7CiAgICAgdmFsdWUgPSBzcmMuZ2V0VmFsdWUoKTsKICAgICBncmFudGVkID0gc3JjLmdyYW50ZWQ7CkBAIC0xMjYsNyArMTY3LDcgQEAKICAgICByZXR1cm4ga2V5LmFjY291bnRJZDsKICAgfQogCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5LklkIGdldENhdGVnb3J5SWQoKSB7CisgIHB1YmxpYyBMYWJlbElkIGdldExhYmVsSWQoKSB7CiAgICAgcmV0dXJuIGtleS5jYXRlZ29yeUlkOwogICB9CiAKQEAgLTE0Niw4ICsxODcsMjYgQEAKICAgICBncmFudGVkID0gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRHcmFudGVkKFRpbWVzdGFtcCB0cykgeworICAgIGdyYW50ZWQgPSB0czsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIGNhY2hlKGZpbmFsIENoYW5nZSBjKSB7CiAgICAgY2hhbmdlT3BlbiA9IGMub3BlbjsKICAgICBjaGFuZ2VTb3J0S2V5ID0gYy5zb3J0S2V5OwogICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICByZXR1cm4gZ2V0TGFiZWxJZCgpLmdldCgpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNTdWJtaXQoKSB7CisgICAgcmV0dXJuIExhYmVsSWQuU1VCTUlULmdldCgpLmVxdWFscyhnZXRMYWJlbCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZCgnWycpLmFwcGVuZChrZXkpLmFwcGVuZCgiOiAiKQorICAgICAgICAuYXBwZW5kKHZhbHVlKS5hcHBlbmQoJ10nKS50b1N0cmluZygpOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUHJvamVjdC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1Byb2plY3QuamF2YQppbmRleCBhMmZjNDZmLi5jMDcwZTNlIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUHJvamVjdC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9Qcm9qZWN0LmphdmEKQEAgLTcwLDYgKzcwLDggQEAKIAogICAgIE1FUkdFX0lGX05FQ0VTU0FSWSwKIAorICAgIFJFQkFTRV9JRl9ORUNFU1NBUlksCisKICAgICBNRVJHRV9BTFdBWVMsCiAKICAgICBDSEVSUllfUElDSzsKQEAgLTgzLDEzICs4NSwxOSBAQAogICAgIEhJRERFTjsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgZW51bSBJbmhlcml0YWJsZUJvb2xlYW4geworICAgIFRSVUUsCisgICAgRkFMU0UsCisgICAgSU5IRVJJVDsKKyAgfQorCiAgIHByb3RlY3RlZCBOYW1lS2V5IG5hbWU7CiAKICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250cmlidXRvckFncmVlbWVudHM7CisgIHByb3RlY3RlZCBJbmhlcml0YWJsZUJvb2xlYW4gdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzOwogCi0gIHByb3RlY3RlZCBib29sZWFuIHVzZVNpZ25lZE9mZkJ5OworICBwcm90ZWN0ZWQgSW5oZXJpdGFibGVCb29sZWFuIHVzZVNpZ25lZE9mZkJ5OwogCiAgIHByb3RlY3RlZCBTdWJtaXRUeXBlIHN1Ym1pdFR5cGU7CiAKQEAgLTk3LDkgKzEwNSwxMyBAQAogCiAgIHByb3RlY3RlZCBOYW1lS2V5IHBhcmVudDsKIAotICBwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQ7CisgIHByb3RlY3RlZCBJbmhlcml0YWJsZUJvb2xlYW4gcmVxdWlyZUNoYW5nZUlEOwogCi0gIHByb3RlY3RlZCBib29sZWFuIHVzZUNvbnRlbnRNZXJnZTsKKyAgcHJvdGVjdGVkIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VDb250ZW50TWVyZ2U7CisKKyAgcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0RGFzaGJvYXJkSWQ7CisKKyAgcHJvdGVjdGVkIFN0cmluZyBsb2NhbERlZmF1bHREYXNoYm9hcmRJZDsKIAogICBwcm90ZWN0ZWQgUHJvamVjdCgpIHsKICAgfQpAQCAtMTA4LDYgKzEyMCwxMCBAQAogICAgIG5hbWUgPSBuYW1lS2V5OwogICAgIHN1Ym1pdFR5cGUgPSBTdWJtaXRUeXBlLk1FUkdFX0lGX05FQ0VTU0FSWTsKICAgICBzdGF0ZSA9IFN0YXRlLkFDVElWRTsKKyAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICB1c2VTaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIHJlcXVpcmVDaGFuZ2VJRCA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIHVzZUNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOwogICB9CiAKICAgcHVibGljIFByb2plY3QuTmFtZUtleSBnZXROYW1lS2V5KCkgewpAQCAtMTI2LDM1ICsxNDIsMzUgQEAKICAgICBkZXNjcmlwdGlvbiA9IGQ7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBpc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpIHsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoKSB7CiAgICAgcmV0dXJuIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50czsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhmaW5hbCBib29sZWFuIHUpIHsKLSAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSB1OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNVc2VTaWduZWRPZmZCeSgpIHsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRVc2VTaWduZWRPZmZCeSgpIHsKICAgICByZXR1cm4gdXNlU2lnbmVkT2ZmQnk7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBpc1VzZUNvbnRlbnRNZXJnZSgpIHsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRVc2VDb250ZW50TWVyZ2UoKSB7CiAgICAgcmV0dXJuIHVzZUNvbnRlbnRNZXJnZTsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZUNoYW5nZUlEKCkgeworICBwdWJsaWMgSW5oZXJpdGFibGVCb29sZWFuIGdldFJlcXVpcmVDaGFuZ2VJRCgpIHsKICAgICByZXR1cm4gcmVxdWlyZUNoYW5nZUlEOwogICB9CiAKLSAgcHVibGljIHZvaWQgc2V0VXNlU2lnbmVkT2ZmQnkoZmluYWwgYm9vbGVhbiBzYm8pIHsKKyAgcHVibGljIHZvaWQgc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGZpbmFsIEluaGVyaXRhYmxlQm9vbGVhbiB1KSB7CisgICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzID0gdTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFVzZVNpZ25lZE9mZkJ5KGZpbmFsIEluaGVyaXRhYmxlQm9vbGVhbiBzYm8pIHsKICAgICB1c2VTaWduZWRPZmZCeSA9IHNibzsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldFVzZUNvbnRlbnRNZXJnZShmaW5hbCBib29sZWFuIGNtKSB7CisgIHB1YmxpYyB2b2lkIHNldFVzZUNvbnRlbnRNZXJnZShmaW5hbCBJbmhlcml0YWJsZUJvb2xlYW4gY20pIHsKICAgICB1c2VDb250ZW50TWVyZ2UgPSBjbTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVDaGFuZ2VJRChmaW5hbCBib29sZWFuIGNpZCkgeworICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlQ2hhbmdlSUQoZmluYWwgSW5oZXJpdGFibGVCb29sZWFuIGNpZCkgewogICAgIHJlcXVpcmVDaGFuZ2VJRCA9IGNpZDsKICAgfQogCkBAIC0xNzQsNiArMTkwLDIyIEBACiAgICAgc3RhdGUgPSBuZXdTdGF0ZTsKICAgfQogCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERhc2hib2FyZCgpIHsKKyAgICByZXR1cm4gZGVmYXVsdERhc2hib2FyZElkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RGVmYXVsdERhc2hib2FyZChmaW5hbCBTdHJpbmcgZGVmYXVsdERhc2hib2FyZElkKSB7CisgICAgdGhpcy5kZWZhdWx0RGFzaGJvYXJkSWQgPSBkZWZhdWx0RGFzaGJvYXJkSWQ7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldExvY2FsRGVmYXVsdERhc2hib2FyZCgpIHsKKyAgICByZXR1cm4gbG9jYWxEZWZhdWx0RGFzaGJvYXJkSWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRMb2NhbERlZmF1bHREYXNoYm9hcmQoZmluYWwgU3RyaW5nIGxvY2FsRGVmYXVsdERhc2hib2FyZElkKSB7CisgICAgdGhpcy5sb2NhbERlZmF1bHREYXNoYm9hcmRJZCA9IGxvY2FsRGVmYXVsdERhc2hib2FyZElkOworICB9CisKICAgcHVibGljIHZvaWQgY29weVNldHRpbmdzRnJvbShmaW5hbCBQcm9qZWN0IHVwZGF0ZSkgewogICAgIGRlc2NyaXB0aW9uID0gdXBkYXRlLmRlc2NyaXB0aW9uOwogICAgIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IHVwZGF0ZS51c2VDb250cmlidXRvckFncmVlbWVudHM7CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUFjY2Vzcy5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNGJhMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkFjY2VzczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5QcmltYXJ5S2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5RdWVyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFjY291bnRHcm91cEluY2x1ZGVBY2Nlc3MgZXh0ZW5kcwotICAgIEFjY2VzczxBY2NvdW50R3JvdXBJbmNsdWRlLCBBY2NvdW50R3JvdXBJbmNsdWRlLktleT4gewotICBAUHJpbWFyeUtleSgia2V5IikKLSAgQWNjb3VudEdyb3VwSW5jbHVkZSBnZXQoQWNjb3VudEdyb3VwSW5jbHVkZS5LZXkga2V5KSB0aHJvd3MgT3JtRXhjZXB0aW9uOwotCi0gIEBRdWVyeSgiV0hFUkUga2V5LmluY2x1ZGVJZCA9ID8iKQotICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZT4gYnlJbmNsdWRlKEFjY291bnRHcm91cC5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLQotICBAUXVlcnkoIldIRVJFIGtleS5ncm91cElkID0gPyIpCi0gIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlPiBieUdyb3VwKEFjY291bnRHcm91cC5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQXVkaXRBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQXVkaXRBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmNGY4OC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0QWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BY2Nlc3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUHJpbWFyeUtleTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUXVlcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlJlc3VsdFNldDsKLQotcHVibGljIGludGVyZmFjZSBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXRBY2Nlc3MgZXh0ZW5kcwotICAgIEFjY2VzczxBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQsIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdC5LZXk+IHsKLSAgQFByaW1hcnlLZXkoImtleSIpCi0gIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBnZXQoQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0LktleSBrZXkpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOwotCi0gIEBRdWVyeSgiV0hFUkUga2V5Lmdyb3VwSWQgPSA/IEFORCBrZXkuaW5jbHVkZUlkID0gPyIpCi0gIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQ+IGJ5R3JvdXBJbmNsdWRlKEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgQWNjb3VudEdyb3VwLklkIGluY0dyb3VwSWQpIHRocm93cyBPcm1FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEFjY2Vzcy5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGUyM2ViCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlByaW1hcnlLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlF1ZXJ5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEFjY2VzcyBleHRlbmRzCisgICAgQWNjZXNzPEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5PiB7CisgIEBQcmltYXJ5S2V5KCJrZXkiKQorICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGdldChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleSBrZXkpIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgQFF1ZXJ5KCJXSEVSRSBrZXkuaW5jbHVkZVVVSUQgPSA/IikKKyAgUmVzdWx0U2V0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGJ5SW5jbHVkZVVVSUQoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKworICBAUXVlcnkoIldIRVJFIGtleS5ncm91cElkID0gPyIpCisgIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBieUdyb3VwKEFjY291bnRHcm91cC5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKworICBAUXVlcnkoIiIpCisgIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdEFjY2Vzcy5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdEFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTVmNzUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0QWNjZXNzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlByaW1hcnlLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlF1ZXJ5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CisKK3B1YmxpYyBpbnRlcmZhY2UgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0QWNjZXNzIGV4dGVuZHMKKyAgICBBY2Nlc3M8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQuS2V5PiB7CisgIEBQcmltYXJ5S2V5KCJrZXkiKQorICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQgZ2V0KEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdC5LZXkga2V5KQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKworICBAUXVlcnkoIldIRVJFIGtleS5ncm91cElkID0gPyBBTkQga2V5LmluY2x1ZGVVVUlEID0gPyIpCisgIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ+IGJ5R3JvdXBJbmNsdWRlKEFjY291bnRHcm91cC5JZCBncm91cElkLAorICAgICAgQWNjb3VudEdyb3VwLlVVSUQgaW5jR3JvdXBVVUlEKSB0aHJvd3MgT3JtRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FwcHJvdmFsQ2F0ZWdvcnlBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BcHByb3ZhbENhdGVnb3J5QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTg4NmUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FwcHJvdmFsQ2F0ZWdvcnlBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlByaW1hcnlLZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlF1ZXJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXBwcm92YWxDYXRlZ29yeUFjY2VzcyBleHRlbmRzCi0gICAgQWNjZXNzPEFwcHJvdmFsQ2F0ZWdvcnksIEFwcHJvdmFsQ2F0ZWdvcnkuSWQ+IHsKLSAgQFByaW1hcnlLZXkoImNhdGVnb3J5SWQiKQotICBBcHByb3ZhbENhdGVnb3J5IGdldChBcHByb3ZhbENhdGVnb3J5LklkIGlkKSB0aHJvd3MgT3JtRXhjZXB0aW9uOwotCi0gIEBRdWVyeSgiT1JERVIgQlkgcG9zaXRpb24sIG5hbWUiKQotICBSZXN1bHRTZXQ8QXBwcm92YWxDYXRlZ29yeT4gYWxsKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BcHByb3ZhbENhdGVnb3J5VmFsdWVBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BcHByb3ZhbENhdGVnb3J5VmFsdWVBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjOTk4MS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQXBwcm92YWxDYXRlZ29yeVZhbHVlQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlByaW1hcnlLZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlF1ZXJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQXBwcm92YWxDYXRlZ29yeVZhbHVlQWNjZXNzIGV4dGVuZHMKLSAgICBBY2Nlc3M8QXBwcm92YWxDYXRlZ29yeVZhbHVlLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IHsKLSAgQFByaW1hcnlLZXkoImtleSIpCi0gIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBnZXQoQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkIGtleSkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLQotICBAUXVlcnkoIldIRVJFIGtleS5jYXRlZ29yeUlkID0gPyBPUkRFUiBCWSBrZXkudmFsdWUiKQotICBSZXN1bHRTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlPiBieUNhdGVnb3J5KEFwcHJvdmFsQ2F0ZWdvcnkuSWQgaWQpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1Jldmlld0RiLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvUmV2aWV3RGIuamF2YQppbmRleCAxNDk2MjZiLi5mMWFiNzUyIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvUmV2aWV3RGIuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvUmV2aWV3RGIuamF2YQpAQCAtNDMsMTEgKzQzLDkgQEAKICAgQFJlbGF0aW9uKGlkID0gMikKICAgU3lzdGVtQ29uZmlnQWNjZXNzIHN5c3RlbUNvbmZpZygpOwogCi0gIEBSZWxhdGlvbihpZCA9IDMpCi0gIEFwcHJvdmFsQ2F0ZWdvcnlBY2Nlc3MgYXBwcm92YWxDYXRlZ29yaWVzKCk7CisgIC8vIERlbGV0ZWQgQFJlbGF0aW9uKGlkID0gMykKIAotICBAUmVsYXRpb24oaWQgPSA0KQotICBBcHByb3ZhbENhdGVnb3J5VmFsdWVBY2Nlc3MgYXBwcm92YWxDYXRlZ29yeVZhbHVlcygpOworICAvLyBEZWxldGVkIEBSZWxhdGlvbihpZCA9IDQpCiAKICAgQFJlbGF0aW9uKGlkID0gNikKICAgQWNjb3VudEFjY2VzcyBhY2NvdW50cygpOwpAQCAtNzAsMTIgKzY4LDYgQEAKICAgQFJlbGF0aW9uKGlkID0gMTMpCiAgIEFjY291bnRHcm91cE1lbWJlckF1ZGl0QWNjZXNzIGFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpOwogCi0gIEBSZWxhdGlvbihpZCA9IDE0KQotICBBY2NvdW50R3JvdXBJbmNsdWRlQWNjZXNzIGFjY291bnRHcm91cEluY2x1ZGVzKCk7Ci0KLSAgQFJlbGF0aW9uKGlkID0gMTUpCi0gIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdEFjY2VzcyBhY2NvdW50R3JvdXBJbmNsdWRlc0F1ZGl0KCk7Ci0KICAgQFJlbGF0aW9uKGlkID0gMTcpCiAgIEFjY291bnREaWZmUHJlZmVyZW5jZUFjY2VzcyBhY2NvdW50RGlmZlByZWZlcmVuY2VzKCk7CiAKQEAgLTExMiw2ICsxMDQsMTIgQEAKICAgQFJlbGF0aW9uKGlkID0gMjgpCiAgIFN1Ym1vZHVsZVN1YnNjcmlwdGlvbkFjY2VzcyBzdWJtb2R1bGVTdWJzY3JpcHRpb25zKCk7CiAKKyAgQFJlbGF0aW9uKGlkID0gMjkpCisgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MgYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKTsKKworICBAUmVsYXRpb24oaWQgPSAzMCkKKyAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0QWNjZXNzIGFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkQXVkaXQoKTsKKwogICAvKiogQ3JlYXRlIHRoZSBuZXh0IHVuaXF1ZSBpZCBmb3IgYW4ge0BsaW5rIEFjY291bnR9LiAqLwogICBAU2VxdWVuY2Uoc3RhcnRXaXRoID0gMTAwMDAwMCkKICAgaW50IG5leHRBY2NvdW50SWQoKSB0aHJvd3MgT3JtRXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1N1Ym1vZHVsZVN1YnNjcmlwdGlvbkFjY2Vzcy5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1N1Ym1vZHVsZVN1YnNjcmlwdGlvbkFjY2Vzcy5qYXZhCmluZGV4IDAwOTBkZjguLmMwZTFlYjYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9TdWJtb2R1bGVTdWJzY3JpcHRpb25BY2Nlc3MuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvU3VibW9kdWxlU3Vic2NyaXB0aW9uQWNjZXNzLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuU3VibW9kdWxlU3Vic2NyaXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BY2Nlc3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTMxLDcgKzMyLDM5IEBACiAgIFJlc3VsdFNldDxTdWJtb2R1bGVTdWJzY3JpcHRpb24+IGJ5U3VwZXJQcm9qZWN0KEJyYW5jaC5OYW1lS2V5IHN1cGVyUHJvamVjdCkKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb247CiAKKyAgLyoqCisgICAqIEZldGNoZXMgYWxsIDxjb2RlPlN1Ym1vZHVsZVN1YnNjcmlwdGlvbjwvY29kZT5zIGluIHdoaWNoIHNvbWUgYnJhbmNoIG9mCisgICAqIDxjb2RlPnN1cGVyUHJvamVjdDwvY29kZT4gc3Vic2NyaWJlcyBhIGJyYW5jaC4KKyAgICoKKyAgICogVXNlIHtAbGluayAjYnlTdXBlcnByb2plY3QoQnJhbmNoLk5hbWVLZXkpfSB0byBmZXRjaCBmb3IgYSBicmFuY2ggaW5zdGVhZAorICAgKiBvZiBhIHByb2plY3QuCisgICAqCisgICAqIEBwYXJhbSBzdXBlclByb2plY3QgdGhlIHByb2plY3QgdG8gZmV0Y2ggc3Vic2NyaXB0aW9ucyBmb3IKKyAgICogQHJldHVybiA8Y29kZT5TdWJtb2R1bGVTdWJzY3JpcHRpb248L2NvZGU+cyB0aGF0IGFyZSBzdWJzY3JpYmVkIGJ5IHNvbWUKKyAgICogYnJhbmNoIG9mIDxjb2RlPnN1cGVyUHJvamVjdDwvY29kZT4uCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCisgICAqLworICBAUXVlcnkoIldIRVJFIGtleS5zdXBlclByb2plY3QucHJvamVjdE5hbWUgPSA/IikKKyAgUmVzdWx0U2V0PFN1Ym1vZHVsZVN1YnNjcmlwdGlvbj4gYnlTdXBlclByb2plY3RQcm9qZWN0KFByb2plY3QuTmFtZUtleSBzdXBlclByb2plY3QpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOworCiAgIEBRdWVyeSgiV0hFUkUgc3VibW9kdWxlID0gPyIpCiAgIFJlc3VsdFNldDxTdWJtb2R1bGVTdWJzY3JpcHRpb24+IGJ5U3VibW9kdWxlKEJyYW5jaC5OYW1lS2V5IHN1Ym1vZHVsZSkKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgLyoqCisgICAqIEZldGNoZXMgYWxsIDxjb2RlPlN1Ym1vZHVsZVN1YnNjcmlwdGlvbjwvY29kZT5zIGluIHdoaWNoIHNvbWUgYnJhbmNoIG9mCisgICAqIDxjb2RlPnN1Ym1vZHVsZTwvY29kZT4gaXMgc3Vic2NyaWJlZC4KKyAgICoKKyAgICogVXNlIHtAbGluayAjYnlTdWJtb2R1bGUoQnJhbmNoLk5hbWVLZXkpfSB0byBmZXRjaCBmb3IgYSBicmFuY2ggaW5zdGVhZCBvZgorICAgKiBhIHByb2plY3QuCisgICAqCisgICAqIEBwYXJhbSBzdWJtb2R1bGUgdGhlIHByb2plY3QgdG8gZmV0Y2ggc3Vic2NyaXB0aW9ucyBmb3IuCisgICAqIEByZXR1cm4gPGNvZGU+U3VibW9kdWxlU3Vic2NyaXB0aW9uPC9jb2RlPnMgdGhhdCBzdWJzY3JpYmUgc29tZSBicmFuY2ggb2YKKyAgICogPGNvZGU+c3VibW9kdWxlPC9jb2RlPi4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24KKyAgICovCisgIEBRdWVyeSgiV0hFUkUgc3VibW9kdWxlLnByb2plY3ROYW1lID0gPyIpCisgIFJlc3VsdFNldDxTdWJtb2R1bGVTdWJzY3JpcHRpb24+IGJ5U3VibW9kdWxlUHJvamVjdChQcm9qZWN0Lk5hbWVLZXkgc3VibW9kdWxlKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X2dlbmVyaWMuc3FsIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvaW5kZXhfZ2VuZXJpYy5zcWwKaW5kZXggOWQ0NTNmYy4uZDY2MDllNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvaW5kZXhfZ2VuZXJpYy5zcWwKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvaW5kZXhfZ2VuZXJpYy5zcWwKQEAgLTM0LDEwICszNCwxMCBAQAogCiAKIC0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLS0gQWNjb3VudEdyb3VwSW5jbHVkZUFjY2VzcworLS0gQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEFjY2VzcwogLS0gICAgQFByaW1hcnlLZXkgY292ZXJzOiBieUdyb3VwCi1DUkVBVEUgSU5ERVggYWNjb3VudF9ncm91cF9pbmNsdWRlc19ieUluY2x1ZGUKLU9OIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMgKGluY2x1ZGVfaWQpOworQ1JFQVRFIElOREVYIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYnlfdXVpZF9ieUluY2x1ZGUKK09OIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYnlfdXVpZCAoaW5jbHVkZV91dWlkKTsKIAogCiAtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X3Bvc3RncmVzLnNxbCBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X3Bvc3RncmVzLnNxbAppbmRleCAyYzkxZGI0Li4zYjYyZTg0IDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9pbmRleF9wb3N0Z3Jlcy5zcWwKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvaW5kZXhfcG9zdGdyZXMuc3FsCkBAIC00NywzMCArNDcsNiBAQAogCiBEUk9QIEZVTkNUSU9OIG1ha2VfcGxwZ3NxbCgpOwogCi0tLSBEZWZpbmUgb3VyIHNjaGVtYSB1cGdyYWRlIHN1cHBvcnQgZnVuY3Rpb24uCi0tLQotCi1kZWxpbWl0ZXIgLy8KLQotQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04KLWNoZWNrX3NjaGVtYV92ZXJzaW9uIChleHAgSU5UKQotUkVUVVJOUyBWQVJDSEFSKDI1NSkKLUFTICQkCi1ERUNMQVJFCi0gIGxfYWN0IElOVDsKLUJFR0lOCi0gIFNFTEVDVCB2ZXJzaW9uX25iciBJTlRPIGxfYWN0Ci0gIEZST00gc2NoZW1hX3ZlcnNpb247Ci0KLSAgSUYgbF9hY3QgPD4gZXhwCi0gIFRIRU4KLSAgICBSQUlTRSBFWENFUFRJT04gJ2V4cGVjdGVkIHNjaGVtYSAlLCBmb3VuZCAlJywgZXhwLCBsX2FjdDsKLSAgRU5EIElGOwotICBSRVRVUk4gJ09LJzsKLUVORDsKLSQkIExBTkdVQUdFIHBscGdzcWw7Ci0vLwotCiBkZWxpbWl0ZXIgOwogCiAtLSBJbmRleGVzIHRvIHN1cHBvcnQgQFF1ZXJ5CkBAIC0xMDYsMTAgKzgyLDEwIEBACiAKIAogLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0tLSBBY2NvdW50R3JvdXBJbmNsdWRlQWNjZXNzCistLSBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQWNjZXNzCiAtLSAgICBAUHJpbWFyeUtleSBjb3ZlcnM6IGJ5R3JvdXAKLUNSRUFURSBJTkRFWCBhY2NvdW50X2dyb3VwX2luY2x1ZGVzX2J5SW5jbHVkZQotT04gYWNjb3VudF9ncm91cF9pbmNsdWRlcyAoaW5jbHVkZV9pZCk7CitDUkVBVEUgSU5ERVggYWNjb3VudF9ncm91cF9pbmNsdWRlc19ieV91dWlkX2J5SW5jbHVkZQorT04gYWNjb3VudF9ncm91cF9pbmNsdWRlc19ieV91dWlkIChpbmNsdWRlX3V1aWQpOwogCiAKIC0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvbXlzcWxfbmV4dHZhbC5zcWwgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9teXNxbF9uZXh0dmFsLnNxbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3OTAxMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9teXNxbF9uZXh0dmFsLnNxbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS0tIEdlcnJpdCAyIDogTXlTUUwKLS0tCi1kZWxpbWl0ZXIgLy8KLQotQ1JFQVRFIEZVTkNUSU9OIG5leHR2YWxfYWNjb3VudF9pZCAoKQotICBSRVRVUk5TIEJJR0lOVAotICBMQU5HVUFHRSBTUUwKLSAgTk9UIERFVEVSTUlOSVNUSUMKLSAgTU9ESUZJRVMgU1FMIERBVEEKLUJFR0lOCi0gIElOU0VSVCBJTlRPIGFjY291bnRfaWQgKHMpIFZBTFVFUyAoTlVMTCk7Ci0gIFJFVFVSTiBMQVNUX0lOU0VSVF9JRCgpOwotRU5EOwotLy8KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvcG9tLnhtbCBiL2dlcnJpdC1zZXJ2ZXIvcG9tLnhtbAppbmRleCBhZjE4MTczLi4wYjEzZmJkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3BvbS54bWwKKysrIGIvZ2Vycml0LXNlcnZlci9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtc2VydmVyPC9hcnRpZmFjdElkPgpAQCAtODAsNyArODAsNiBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Ym91bmN5Y2FzdGxlPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YmNwZy1qZGsxNTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCkBAIC0xNjIsNyArMTYxLDcgQEAKICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuanVuaXZlcnNhbGNoYXJkZXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdmVyc2FsY2hhcmRldDwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9BdWRpdEV2ZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvQXVkaXRFdmVudC5qYXZhCmluZGV4IDM2NGRmODAuLjE3M2NlZDYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9BdWRpdEV2ZW50LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L0F1ZGl0RXZlbnQuamF2YQpAQCAtMTQsMjIgKzE0LDIyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSGFzaE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBwdWJsaWMgY2xhc3MgQXVkaXRFdmVudCB7CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9TRVNTSU9OX0lEID0gIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBVTktOT1dOX1JFU1VMVCA9ICJOL0EiOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE11bHRpbWFwPFN0cmluZywgPz4gRU1QVFlfUEFSQU1TID0gSGFzaE11bHRpbWFwLmNyZWF0ZSgpOwogCiAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkOwogICBwdWJsaWMgZmluYWwgQ3VycmVudFVzZXIgd2hvOwogICBwdWJsaWMgZmluYWwgbG9uZyB3aGVuOwogICBwdWJsaWMgZmluYWwgU3RyaW5nIHdoYXQ7Ci0gIHB1YmxpYyBmaW5hbCBMaXN0PD8+IHBhcmFtczsKKyAgcHVibGljIGZpbmFsIE11bHRpbWFwPFN0cmluZywgPz4gcGFyYW1zOwogICBwdWJsaWMgZmluYWwgT2JqZWN0IHJlc3VsdDsKICAgcHVibGljIGZpbmFsIGxvbmcgdGltZUF0U3RhcnQ7CiAgIHB1YmxpYyBmaW5hbCBsb25nIGVsYXBzZWQ7CkBAIC03MywxOSArNzMsNiBAQAogICB9CiAKICAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgYXVkaXQgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbiBpZCB0aGUgZXZlbnQgYmVsb25ncyB0bwotICAgKiBAcGFyYW0gd2hvIHByaW5jaXBhbCB0aGF0IGhhcyBnZW5lcmF0ZWQgdGhlIGV2ZW50Ci0gICAqIEBwYXJhbSB3aGF0IG9iamVjdCBvZiB0aGUgZXZlbnQKLSAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIG9mIHRoZSBldmVudAotICAgKi8KLSAgcHVibGljIEF1ZGl0RXZlbnQoU3RyaW5nIHNlc3Npb25JZCwgQ3VycmVudFVzZXIgd2hvLCBTdHJpbmcgd2hhdCwgTGlzdDw/PiBwYXJhbXMpIHsKLSAgICB0aGlzKHNlc3Npb25JZCwgd2hvLCB3aGF0LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgcGFyYW1zLAotICAgICAgICBVTktOT1dOX1JFU1VMVCk7Ci0gIH0KLQotICAvKioKICAgICogQ3JlYXRlcyBhIG5ldyBhdWRpdCBldmVudCB3aXRoIHJlc3VsdHMKICAgICoKICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uIGlkIHRoZSBldmVudCBiZWxvbmdzIHRvCkBAIC05NiwyOCArODMsMjAgQEAKICAgICogQHBhcmFtIHJlc3VsdCByZXN1bHQgb2YgdGhlIGV2ZW50CiAgICAqLwogICBwdWJsaWMgQXVkaXRFdmVudChTdHJpbmcgc2Vzc2lvbklkLCBDdXJyZW50VXNlciB3aG8sIFN0cmluZyB3aGF0LCBsb25nIHdoZW4sCi0gICAgICBMaXN0PD8+IHBhcmFtcywgT2JqZWN0IHJlc3VsdCkgeworICAgICAgTXVsdGltYXA8U3RyaW5nLCA/PiBwYXJhbXMsIE9iamVjdCByZXN1bHQpIHsKICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbCh3aGF0LCAid2hhdCBpcyBhIG1hbmRhdG9yeSBub3QgbnVsbCBwYXJhbSAhIik7CiAKLSAgICB0aGlzLnNlc3Npb25JZCA9IGdldFZhbHVlV2l0aERlZmF1bHQoc2Vzc2lvbklkLCBVTktOT1dOX1NFU1NJT05fSUQpOworICAgIHRoaXMuc2Vzc2lvbklkID0gT2JqZWN0cy5maXJzdE5vbk51bGwoc2Vzc2lvbklkLCBVTktOT1dOX1NFU1NJT05fSUQpOwogICAgIHRoaXMud2hvID0gd2hvOwogICAgIHRoaXMud2hhdCA9IHdoYXQ7CiAgICAgdGhpcy53aGVuID0gd2hlbjsKICAgICB0aGlzLnRpbWVBdFN0YXJ0ID0gdGhpcy53aGVuOwotICAgIHRoaXMucGFyYW1zID0gZ2V0VmFsdWVXaXRoRGVmYXVsdChwYXJhbXMsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICB0aGlzLnBhcmFtcyA9IE9iamVjdHMuZmlyc3ROb25OdWxsKHBhcmFtcywgRU1QVFlfUEFSQU1TKTsKICAgICB0aGlzLnV1aWQgPSBuZXcgVVVJRCgpOwogICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0OwogICAgIHRoaXMuZWxhcHNlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZUF0U3RhcnQ7CiAgIH0KIAotICBwcml2YXRlIDxUPiBUIGdldFZhbHVlV2l0aERlZmF1bHQoVCB2YWx1ZSwgVCBkZWZhdWx0VmFsdWVJZk51bGwpIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZUlmTnVsbDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgfQotCiAgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgIHJldHVybiB1dWlkLmhhc2hDb2RlKCk7CkBAIC0xMzUsMzggKzExNCw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKHV1aWQudG9TdHJpbmcoKSk7Ci0gICAgc2IuYXBwZW5kKCJ8Iik7Ci0gICAgc2IuYXBwZW5kKHNlc3Npb25JZCk7Ci0gICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgc2IuYXBwZW5kKHdobyk7Ci0gICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgc2IuYXBwZW5kKHdoZW4pOwotICAgIHNiLmFwcGVuZCgnfCcpOwotICAgIHNiLmFwcGVuZCh3aGF0KTsKLSAgICBzYi5hcHBlbmQoJ3wnKTsKLSAgICBzYi5hcHBlbmQoZWxhcHNlZCk7Ci0gICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7Ci0gICAgICBzYi5hcHBlbmQoJ1snKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCcsJyk7Ci0KLSAgICAgICAgT2JqZWN0IHBhcmFtID0gcGFyYW1zLmdldChpKTsKLSAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzYi5hcHBlbmQocGFyYW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICBzYi5hcHBlbmQocmVzdWx0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQXVkaXRFdmVudCBVVUlEOiVzLCBTSUQ6JXMsIFRTOiVkLCB3aG86JXMsIHdoYXQ6JXMiLAorICAgICAgICB1dWlkLmdldCgpLCBzZXNzaW9uSWQsIHdoZW4sIHdobywgd2hhdCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9IdHRwQXVkaXRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L0h0dHBBdWRpdEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmOTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9IdHRwQXVkaXRFdmVudC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKKworcHVibGljIGNsYXNzIEh0dHBBdWRpdEV2ZW50IGV4dGVuZHMgQXVkaXRFdmVudCB7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZDsKKyAgcHVibGljIGZpbmFsIGludCBodHRwU3RhdHVzOworICBwdWJsaWMgZmluYWwgT2JqZWN0IGlucHV0OworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGl0IGV2ZW50IHdpdGggcmVzdWx0cworICAgKgorICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb24gaWQgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KKyAgICogQHBhcmFtIHdobyBwcmluY2lwYWwgdGhhdCBoYXMgZ2VuZXJhdGVkIHRoZSBldmVudAorICAgKiBAcGFyYW0gd2hhdCBvYmplY3Qgb2YgdGhlIGV2ZW50CisgICAqIEBwYXJhbSB3aGVuIHRpbWUtc3RhbXAgb2Ygd2hlbiB0aGUgZXZlbnQgc3RhcnRlZAorICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgb2YgdGhlIGV2ZW50CisgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0IG9mIHRoZSBldmVudAorICAgKi8KKyAgcHVibGljIEh0dHBBdWRpdEV2ZW50KFN0cmluZyBzZXNzaW9uSWQsIEN1cnJlbnRVc2VyIHdobywgU3RyaW5nIHdoYXQsIGxvbmcgd2hlbiwKKyAgICAgIE11bHRpbWFwPFN0cmluZywgPz4gcGFyYW1zLCBTdHJpbmcgaHR0cE1ldGhvZCwgT2JqZWN0IGlucHV0LCBpbnQgc3RhdHVzLCBPYmplY3QgcmVzdWx0KSB7CisgICAgc3VwZXIoc2Vzc2lvbklkLCB3aG8sIHdoYXQsIHdoZW4sIHBhcmFtcywgcmVzdWx0KTsKKyAgICB0aGlzLmh0dHBNZXRob2QgPSBodHRwTWV0aG9kOworICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICB0aGlzLmh0dHBTdGF0dXMgPSBzdGF0dXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9ScGNBdWRpdEV2ZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvUnBjQXVkaXRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWFiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvUnBjQXVkaXRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKKworcHVibGljIGNsYXNzIFJwY0F1ZGl0RXZlbnQgZXh0ZW5kcyBIdHRwQXVkaXRFdmVudCB7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgYXVkaXQgZXZlbnQgd2l0aCByZXN1bHRzCisgICAqCisgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbiBpZCB0aGUgZXZlbnQgYmVsb25ncyB0bworICAgKiBAcGFyYW0gd2hvIHByaW5jaXBhbCB0aGF0IGhhcyBnZW5lcmF0ZWQgdGhlIGV2ZW50CisgICAqIEBwYXJhbSB3aGF0IG9iamVjdCBvZiB0aGUgZXZlbnQKKyAgICogQHBhcmFtIHdoZW4gdGltZS1zdGFtcCBvZiB3aGVuIHRoZSBldmVudCBzdGFydGVkCisgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnQKKyAgICogQHBhcmFtIHJlc3VsdCByZXN1bHQgb2YgdGhlIGV2ZW50CisgICAqLworICBwdWJsaWMgUnBjQXVkaXRFdmVudChTdHJpbmcgc2Vzc2lvbklkLCBDdXJyZW50VXNlciB3aG8sIFN0cmluZyB3aGF0LAorICAgICAgbG9uZyB3aGVuLCBNdWx0aW1hcDxTdHJpbmcsID8+IHBhcmFtcywgU3RyaW5nIGh0dHBNZXRob2QsIE9iamVjdCBpbnB1dCwKKyAgICAgIGludCBzdGF0dXMsIE9iamVjdCByZXN1bHQpIHsKKyAgICBzdXBlcihzZXNzaW9uSWQsIHdobywgd2hhdCwgd2hlbiwgcGFyYW1zLCBodHRwTWV0aG9kLCBpbnB1dCwgc3RhdHVzLCByZXN1bHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvU3NoQXVkaXRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L1NzaEF1ZGl0RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg2NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L1NzaEF1ZGl0RXZlbnQuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CisKK3B1YmxpYyBjbGFzcyBTc2hBdWRpdEV2ZW50IGV4dGVuZHMgQXVkaXRFdmVudCB7CisKKyAgcHVibGljIFNzaEF1ZGl0RXZlbnQoU3RyaW5nIHNlc3Npb25JZCwgQ3VycmVudFVzZXIgd2hvLCBTdHJpbmcgd2hhdCwKKyAgICAgIGxvbmcgd2hlbiwgTXVsdGltYXA8U3RyaW5nLCA/PiBwYXJhbXMsIE9iamVjdCByZXN1bHQpIHsKKyAgICBzdXBlcihzZXNzaW9uSWQsIHdobywgd2hhdCwgd2hlbiwgcGFyYW1zLCByZXN1bHQpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tSdW5uZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va1J1bm5lci5qYXZhCmluZGV4IDM3YmUyOTMuLjQxMTY2MzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va1J1bm5lci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va1J1bm5lci5qYXZhCkBAIC0xNCwxMiArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb247CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db250cmlidXRvckFncmVlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmxpZmVjeWNsZS5MaWZlY3ljbGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwpAQCAtMzksMTUgKzQwLDE2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5Db21tZW50QWRkZWRFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkRyYWZ0UHVibGlzaGVkRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5FdmVudEZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5NZXJnZUZhaWxlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuUGF0Y2hTZXRDcmVhdGVkRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5SZWZVcGRhdGVkRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5SZXZpZXdlckFkZGVkRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtNjEsMjQgKzYzLDM0IEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiAKIC8qKiBTcGF3bnMgbG9jYWwgZXhlY3V0YWJsZXMgd2hlbiBhIGhvb2sgYWN0aW9uIG9jY3Vycy4gKi8KIEBTaW5nbGV0b24KLXB1YmxpYyBjbGFzcyBDaGFuZ2VIb29rUnVubmVyIGltcGxlbWVudHMgQ2hhbmdlSG9va3MgeworcHVibGljIGNsYXNzIENoYW5nZUhvb2tSdW5uZXIgaW1wbGVtZW50cyBDaGFuZ2VIb29rcywgTGlmZWN5Y2xlTGlzdGVuZXIgewogICAgIC8qKiBBIGxvZ2dlciBmb3IgdGhpcyBjbGFzcy4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2hhbmdlSG9va1J1bm5lci5jbGFzcyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIExpZmVjeWNsZU1vZHVsZSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICAgICAgYmluZChDaGFuZ2VIb29rUnVubmVyLmNsYXNzKTsKICAgICAgICAgYmluZChDaGFuZ2VIb29rcy5jbGFzcykudG8oQ2hhbmdlSG9va1J1bm5lci5jbGFzcyk7CisgICAgICAgIGxpc3RlbmVyKCkudG8oQ2hhbmdlSG9va1J1bm5lci5jbGFzcyk7CiAgICAgICB9CiAgICAgfQogCkBAIC05MiwxMCArMTA0LDYxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiogTGlzdGVuZXJzIHRvIHJlY2VpdmUgY2hhbmdlcyBhcyB0aGV5IGhhcHBlbi4gKi8KKyAgICAvKiogQ29udGFpbmVyIGNsYXNzIHVzZWQgdG8gaG9sZCB0aGUgcmV0dXJuIGNvZGUgYW5kIG91dHB1dCBvZiBzY3JpcHQgaG9vayBleGVjdXRpb24gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhvb2tSZXN1bHQgeworICAgICAgcHJpdmF0ZSBpbnQgZXhpdFZhbHVlID0gLTE7CisgICAgICBwcml2YXRlIFN0cmluZyBvdXRwdXQ7CisgICAgICBwcml2YXRlIFN0cmluZyBleGVjdXRpb25FcnJvcjsKKworICAgICAgcHJpdmF0ZSBIb29rUmVzdWx0KGludCBleGl0VmFsdWUsIFN0cmluZyBvdXRwdXQpIHsKKyAgICAgICAgdGhpcy5leGl0VmFsdWUgPSBleGl0VmFsdWU7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgICAgfQorCisgICAgICBwcml2YXRlIEhvb2tSZXN1bHQoU3RyaW5nIG91dHB1dCwgU3RyaW5nIGV4ZWN1dGlvbkVycm9yKSB7CisgICAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OworICAgICAgICB0aGlzLmV4ZWN1dGlvbkVycm9yID0gZXhlY3V0aW9uRXJyb3I7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBpbnQgZ2V0RXhpdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZXhpdFZhbHVlOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBzZXRFeGl0VmFsdWUoaW50IGV4aXRWYWx1ZSkgeworICAgICAgICB0aGlzLmV4aXRWYWx1ZSA9IGV4aXRWYWx1ZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCAmJiBvdXRwdXQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgIHNiLmFwcGVuZChvdXRwdXQpOworCisgICAgICAgICAgaWYgKGV4ZWN1dGlvbkVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIC0gIik7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4ZWN1dGlvbkVycm9yICE9IG51bGwgKSB7CisgICAgICAgICAgc2IuYXBwZW5kKGV4ZWN1dGlvbkVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgfQorICAgIH0KKworICAgIC8qKiBMaXN0ZW5lcnMgdG8gcmVjZWl2ZSBjaGFuZ2VzIGFzIHRoZXkgaGFwcGVuIChsaW1pdGVkIGJ5IHZpc2liaWxpdHkKKyAgICAgKiAgb2YgaG9sZGVyJ3MgdXNlcikuICovCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhbmdlTGlzdGVuZXIsIENoYW5nZUxpc3RlbmVySG9sZGVyPiBsaXN0ZW5lcnMgPQogICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPENoYW5nZUxpc3RlbmVyLCBDaGFuZ2VMaXN0ZW5lckhvbGRlcj4oKTsKIAorICAgIC8qKiBMaXN0ZW5lcnMgdG8gcmVjZWl2ZSBhbGwgY2hhbmdlcyBhcyB0aGV5IGhhcHBlbi4gKi8KKyAgICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8Q2hhbmdlTGlzdGVuZXI+IHVucmVzdHJpY3RlZExpc3RlbmVyczsKKwogICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgbmV3IHBhdGNoc2V0IGhvb2suICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHBhdGNoc2V0Q3JlYXRlZEhvb2s7CiAKQEAgLTEwOCw2ICsxNzEsOSBAQAogICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgY2hhbmdlIG1lcmdlZCBob29rLiAqLwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBjaGFuZ2VNZXJnZWRIb29rOwogCisgICAgLyoqIEZpbGVuYW1lIG9mIHRoZSBtZXJnZSBmYWlsZWQgaG9vay4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgbWVyZ2VGYWlsZWRIb29rOworCiAgICAgLyoqIEZpbGVuYW1lIG9mIHRoZSBjaGFuZ2UgYWJhbmRvbmVkIGhvb2suICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGNoYW5nZUFiYW5kb25lZEhvb2s7CiAKQEAgLTExNyw5ICsxODMsMTUgQEAKICAgICAvKiogRmlsZW5hbWUgb2YgdGhlIHJlZiB1cGRhdGVkIGhvb2suICovCiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHJlZlVwZGF0ZWRIb29rOwogCisgICAgLyoqIEZpbGVuYW1lIG9mIHRoZSByZXZpZXdlciBhZGRlZCBob29rLiAqLworICAgIHByaXZhdGUgZmluYWwgRmlsZSByZXZpZXdlckFkZGVkSG9vazsKKwogICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgY2xhIHNpZ25lZCBob29rLiAqLwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBjbGFTaWduZWRIb29rOwogCisgICAgLyoqIEZpbGVuYW1lIG9mIHRoZSB1cGRhdGUgaG9vay4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgcmVmVXBkYXRlSG9vazsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWU7CiAKICAgICAvKiogUmVwb3NpdG9yeSBNYW5hZ2VyLiAqLwpAQCAtMTMyLDEyICsyMDQsMTYgQEAKIAogICAgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKIAotICAgIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudEZhY3RvcnkgZXZlbnRGYWN0b3J5OwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGhzOwogCisgICAgLyoqIFRocmVhZCBwb29sIHVzZWQgdG8gbW9uaXRvciBzeW5jIGhvb2tzICovCisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2Ugc3luY0hvb2tUaHJlYWRQb29sID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKworICAgIC8qKiBUaW1lb3V0IHZhbHVlIGZvciBzeW5jaHJvbm91cyBob29rcyAqLworICAgIHByaXZhdGUgZmluYWwgaW50IHN5bmNIb29rVGltZW91dDsKKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBDaGFuZ2VIb29rUnVubmVyLgogICAgICAqCkBAIC0xNTIsMTcgKzIyOCwyMCBAQAogICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsCiAgICAgICBmaW5hbCBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjb25maWcsCiAgICAgICBmaW5hbCBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIGZpbmFsIFNpdGVQYXRocyBzaXRlUGF0aCwgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZSwKLSAgICAgIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKLSAgICAgIGZpbmFsIEV2ZW50RmFjdG9yeSBldmVudEZhY3RvcnksIGZpbmFsIFNpdGVQYXRocyBzaXRlUGF0aHMpIHsKKyAgICAgIGZpbmFsIFNpdGVQYXRocyBzaXRlUGF0aCwKKyAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCisgICAgICBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAorICAgICAgZmluYWwgRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeSwKKyAgICAgIGZpbmFsIFNpdGVQYXRocyBzaXRlUGF0aHMsCisgICAgICBmaW5hbCBEeW5hbWljU2V0PENoYW5nZUxpc3RlbmVyPiB1bnJlc3RyaWN0ZWRMaXN0ZW5lcnMpIHsKICAgICAgICAgdGhpcy5hbm9ueW1vdXNDb3dhcmROYW1lID0gYW5vbnltb3VzQ293YXJkTmFtZTsKICAgICAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwogICAgICAgICB0aGlzLmhvb2tRdWV1ZSA9IHF1ZXVlLmNyZWF0ZVF1ZXVlKDEsICJob29rIik7CiAgICAgICAgIHRoaXMucHJvamVjdENhY2hlID0gcHJvamVjdENhY2hlOwogICAgICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKLSAgICAgICAgdGhpcy5hcHByb3ZhbFR5cGVzID0gYXBwcm92YWxUeXBlczsKICAgICAgICAgdGhpcy5ldmVudEZhY3RvcnkgPSBldmVudEZhY3Rvcnk7CiAgICAgICAgIHRoaXMuc2l0ZVBhdGhzID0gc2l0ZVBhdGg7CisgICAgICAgIHRoaXMudW5yZXN0cmljdGVkTGlzdGVuZXJzID0gdW5yZXN0cmljdGVkTGlzdGVuZXJzOwogCiAgICAgICAgIGZpbmFsIEZpbGUgaG9va3NQYXRoID0gc2l0ZVBhdGgucmVzb2x2ZShnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJwYXRoIiwgc2l0ZVBhdGguaG9va3NfZGlyLmdldEFic29sdXRlUGF0aCgpKSk7CiAKQEAgLTE3MCwxMCArMjQ5LDE0IEBACiAgICAgICAgIGRyYWZ0UHVibGlzaGVkSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJkcmFmdFB1Ymxpc2hlZEhvb2siLCAiZHJhZnQtcHVibGlzaGVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIGNvbW1lbnRBZGRlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAiY29tbWVudEFkZGVkSG9vayIsICJjb21tZW50LWFkZGVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIGNoYW5nZU1lcmdlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAiY2hhbmdlTWVyZ2VkSG9vayIsICJjaGFuZ2UtbWVyZ2VkIikpLmdldFBhdGgoKSk7CisgICAgICAgIG1lcmdlRmFpbGVkSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJtZXJnZUZhaWxlZCIsICJtZXJnZS1mYWlsZWQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgY2hhbmdlQWJhbmRvbmVkSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJjaGFuZ2VBYmFuZG9uZWRIb29rIiwgImNoYW5nZS1hYmFuZG9uZWQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgY2hhbmdlUmVzdG9yZWRIb29rID0gc2l0ZVBhdGgucmVzb2x2ZShuZXcgRmlsZShob29rc1BhdGgsIGdldFZhbHVlKGNvbmZpZywgImhvb2tzIiwgImNoYW5nZVJlc3RvcmVkSG9vayIsICJjaGFuZ2UtcmVzdG9yZWQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgcmVmVXBkYXRlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAicmVmVXBkYXRlZEhvb2siLCAicmVmLXVwZGF0ZWQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgcmV2aWV3ZXJBZGRlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAicmV2aWV3ZXJBZGRlZEhvb2siLCAicmV2aWV3ZXItYWRkZWQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgY2xhU2lnbmVkSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJjbGFTaWduZWRIb29rIiwgImNsYS1zaWduZWQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgcmVmVXBkYXRlSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJyZWZVcGRhdGVIb29rIiwgInJlZi11cGRhdGUiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgc3luY0hvb2tUaW1lb3V0ID0gY29uZmlnLmdldEludCgiaG9va3MiLCAic3luY0hvb2tUaW1lb3V0IiwgMzApOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyLCBJZGVudGlmaWVkVXNlciB1c2VyKSB7CkBAIC0yMjAsNiArMzAzLDM4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBGaXJlIHRoZSB1cGRhdGUgaG9vaworICAgICAqCisgICAgICovCisgICAgcHVibGljIEhvb2tSZXN1bHQgZG9SZWZVcGRhdGVIb29rKGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgU3RyaW5nIHJlZm5hbWUsCisgICAgICAgIGZpbmFsIEFjY291bnQgdXBsb2FkZXIsIGZpbmFsIE9iamVjdElkIG9sZElkLCBmaW5hbCBPYmplY3RJZCBuZXdJZCkgeworCisgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgYWRkQXJnKGFyZ3MsICItLXByb2plY3QiLCBwcm9qZWN0LmdldE5hbWUoKSk7CisgICAgICBhZGRBcmcoYXJncywgIi0tcmVmbmFtZSIsIHJlZm5hbWUpOworICAgICAgYWRkQXJnKGFyZ3MsICItLXVwbG9hZGVyIiwgZ2V0RGlzcGxheU5hbWUodXBsb2FkZXIpKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1vbGRyZXYiLCBvbGRJZC5nZXROYW1lKCkpOworICAgICAgYWRkQXJnKGFyZ3MsICItLW5ld3JldiIsIG5ld0lkLmdldE5hbWUoKSk7CisKKyAgICAgIEhvb2tSZXN1bHQgaG9va1Jlc3VsdDsKKworICAgICAgdHJ5IHsKKyAgICAgICAgaG9va1Jlc3VsdCA9IHJ1blN5bmNIb29rKHByb2plY3QuZ2V0TmFtZUtleSgpLCByZWZVcGRhdGVIb29rLCBhcmdzKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICBob29rUmVzdWx0ID0gbmV3IEhvb2tSZXN1bHQoLTEsICJTeW5jaHJvbm91cyBob29rIHRpbWVkIG91dCIpOworICAgICAgfQorCisgICAgICByZXR1cm4gaG9va1Jlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXJlIHRoZSBQYXRjaHNldCBDcmVhdGVkIEhvb2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhbmdlIFRoZSBjaGFuZ2UgaXRzZWxmLgorICAgICAqIEBwYXJhbSBwYXRjaFNldCBUaGUgUGF0Y2hzZXQgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRvUGF0Y2hzZXRDcmVhdGVkSG9vayhmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCwKICAgICAgICAgICBmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFBhdGNoU2V0Q3JlYXRlZEV2ZW50IGV2ZW50ID0gbmV3IFBhdGNoU2V0Q3JlYXRlZEV2ZW50KCk7CkBAIC0yNjgsOCArMzgzLDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBkb0NvbW1lbnRBZGRlZEhvb2soZmluYWwgQ2hhbmdlIGNoYW5nZSwgZmluYWwgQWNjb3VudCBhY2NvdW50LAotICAgICAgICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoU2V0LCBmaW5hbCBTdHJpbmcgY29tbWVudCwgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsCi0gICAgICAgICAgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbHMsIGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCwgZmluYWwgU3RyaW5nIGNvbW1lbnQsIGZpbmFsIE1hcDxTdHJpbmcsIFNob3J0PiBhcHByb3ZhbHMsCisgICAgICAgICAgZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDb21tZW50QWRkZWRFdmVudCBldmVudCA9IG5ldyBDb21tZW50QWRkZWRFdmVudCgpOwogCiAgICAgICAgIGV2ZW50LmNoYW5nZSA9IGV2ZW50RmFjdG9yeS5hc0NoYW5nZUF0dHJpYnV0ZShjaGFuZ2UpOwpAQCAtMjc3LDExICszOTIsMTIgQEAKICAgICAgICAgZXZlbnQucGF0Y2hTZXQgPSBldmVudEZhY3RvcnkuYXNQYXRjaFNldEF0dHJpYnV0ZShwYXRjaFNldCk7CiAgICAgICAgIGV2ZW50LmNvbW1lbnQgPSBjb21tZW50OwogCisgICAgICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IHByb2plY3RDYWNoZS5nZXQoY2hhbmdlLmdldFByb2plY3QoKSkuZ2V0TGFiZWxUeXBlcygpOwogICAgICAgICBpZiAoYXBwcm92YWxzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGV2ZW50LmFwcHJvdmFscyA9IG5ldyBBcHByb3ZhbEF0dHJpYnV0ZVthcHByb3ZhbHMuc2l6ZSgpXTsKICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWwgOiBhcHByb3ZhbHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIGV2ZW50LmFwcHJvdmFsc1tpKytdID0gZ2V0QXBwcm92YWxBdHRyaWJ1dGUoYXBwcm92YWwpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTaG9ydD4gYXBwcm92YWwgOiBhcHByb3ZhbHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGV2ZW50LmFwcHJvdmFsc1tpKytdID0gZ2V0QXBwcm92YWxBdHRyaWJ1dGUobGFiZWxUeXBlcywgYXBwcm92YWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4OSw2ICs0MDUsNyBAQAogCiAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jaGFuZ2UiLCBldmVudC5jaGFuZ2UuaWQpOworICAgICAgICBhZGRBcmcoYXJncywgIi0taXMtZHJhZnQiLCBwYXRjaFNldC5pc0RyYWZ0KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNoYW5nZS11cmwiLCBldmVudC5jaGFuZ2UudXJsKTsKICAgICAgICAgYWRkQXJnKGFyZ3MsICItLXByb2plY3QiLCBldmVudC5jaGFuZ2UucHJvamVjdCk7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1icmFuY2giLCBldmVudC5jaGFuZ2UuYnJhbmNoKTsKQEAgLTI5Niw4ICs0MTMsMTEgQEAKICAgICAgICAgYWRkQXJnKGFyZ3MsICItLWF1dGhvciIsIGdldERpc3BsYXlOYW1lKGFjY291bnQpKTsKICAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNvbW1pdCIsIGV2ZW50LnBhdGNoU2V0LnJldmlzaW9uKTsKICAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNvbW1lbnQiLCBjb21tZW50ID09IG51bGwgPyAiIiA6IGNvbW1lbnQpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFsIDogYXBwcm92YWxzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS0iICsgYXBwcm92YWwuZ2V0S2V5KCkuZ2V0KCksIFNob3J0LnRvU3RyaW5nKGFwcHJvdmFsLmdldFZhbHVlKCkuZ2V0KCkpKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTaG9ydD4gYXBwcm92YWwgOiBhcHByb3ZhbHMuZW50cnlTZXQoKSkgeworICAgICAgICAgIExhYmVsVHlwZSBsdCA9IGxhYmVsVHlwZXMuYnlMYWJlbChhcHByb3ZhbC5nZXRLZXkoKSk7CisgICAgICAgICAgaWYgKGx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS0iICsgbHQuZ2V0TmFtZSgpLCBTaG9ydC50b1N0cmluZyhhcHByb3ZhbC5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcnVuSG9vayhjaGFuZ2UuZ2V0UHJvamVjdCgpLCBjb21tZW50QWRkZWRIb29rLCBhcmdzKTsKQEAgLTMyNCw2ICs0NDQsMzAgQEAKICAgICAgICAgcnVuSG9vayhjaGFuZ2UuZ2V0UHJvamVjdCgpLCBjaGFuZ2VNZXJnZWRIb29rLCBhcmdzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkb01lcmdlRmFpbGVkSG9vayhmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQsIGZpbmFsIFN0cmluZyByZWFzb24sCisgICAgICAgICAgZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZXJnZUZhaWxlZEV2ZW50IGV2ZW50ID0gbmV3IE1lcmdlRmFpbGVkRXZlbnQoKTsKKworICAgICAgICBldmVudC5jaGFuZ2UgPSBldmVudEZhY3RvcnkuYXNDaGFuZ2VBdHRyaWJ1dGUoY2hhbmdlKTsKKyAgICAgICAgZXZlbnQuc3VibWl0dGVyID0gZXZlbnRGYWN0b3J5LmFzQWNjb3VudEF0dHJpYnV0ZShhY2NvdW50KTsKKyAgICAgICAgZXZlbnQucGF0Y2hTZXQgPSBldmVudEZhY3RvcnkuYXNQYXRjaFNldEF0dHJpYnV0ZShwYXRjaFNldCk7CisgICAgICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgZmlyZUV2ZW50KGNoYW5nZSwgZXZlbnQsIGRiKTsKKworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBhZGRBcmcoYXJncywgIi0tY2hhbmdlIiwgZXZlbnQuY2hhbmdlLmlkKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNoYW5nZS11cmwiLCBldmVudC5jaGFuZ2UudXJsKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLXByb2plY3QiLCBldmVudC5jaGFuZ2UucHJvamVjdCk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1icmFuY2giLCBldmVudC5jaGFuZ2UuYnJhbmNoKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLXRvcGljIiwgZXZlbnQuY2hhbmdlLnRvcGljKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLXN1Ym1pdHRlciIsIGdldERpc3BsYXlOYW1lKGFjY291bnQpKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNvbW1pdCIsIGV2ZW50LnBhdGNoU2V0LnJldmlzaW9uKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLXJlYXNvbiIsICByZWFzb24gPT0gbnVsbCA/ICIiIDogcmVhc29uKTsKKworICAgICAgICBydW5Ib29rKGNoYW5nZS5nZXRQcm9qZWN0KCksIG1lcmdlRmFpbGVkSG9vaywgYXJncyk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZG9DaGFuZ2VBYmFuZG9uZWRIb29rKGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIENoYW5nZUFiYW5kb25lZEV2ZW50IGV2ZW50ID0gbmV3IENoYW5nZUFiYW5kb25lZEV2ZW50KCk7CkBAIC0zOTEsNiArNTM1LDI1IEBACiAgICAgICBydW5Ib29rKHJlZk5hbWUuZ2V0UGFyZW50S2V5KCksIHJlZlVwZGF0ZWRIb29rLCBhcmdzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkb1Jldmlld2VyQWRkZWRIb29rKGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKKyAgICAgICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQsIGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFJldmlld2VyQWRkZWRFdmVudCBldmVudCA9IG5ldyBSZXZpZXdlckFkZGVkRXZlbnQoKTsKKworICAgICAgZXZlbnQuY2hhbmdlID0gZXZlbnRGYWN0b3J5LmFzQ2hhbmdlQXR0cmlidXRlKGNoYW5nZSk7CisgICAgICBldmVudC5wYXRjaFNldCA9IGV2ZW50RmFjdG9yeS5hc1BhdGNoU2V0QXR0cmlidXRlKHBhdGNoU2V0KTsKKyAgICAgIGV2ZW50LnJldmlld2VyID0gZXZlbnRGYWN0b3J5LmFzQWNjb3VudEF0dHJpYnV0ZShhY2NvdW50KTsKKyAgICAgIGZpcmVFdmVudChjaGFuZ2UsIGV2ZW50LCBkYik7CisKKyAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICBhZGRBcmcoYXJncywgIi0tY2hhbmdlIiwgZXZlbnQuY2hhbmdlLmlkKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1jaGFuZ2UtdXJsIiwgZXZlbnQuY2hhbmdlLnVybCk7CisgICAgICBhZGRBcmcoYXJncywgIi0tcHJvamVjdCIsIGV2ZW50LmNoYW5nZS5wcm9qZWN0KTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1icmFuY2giLCBldmVudC5jaGFuZ2UuYnJhbmNoKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1yZXZpZXdlciIsIGdldERpc3BsYXlOYW1lKGFjY291bnQpKTsKKworICAgICAgcnVuSG9vayhjaGFuZ2UuZ2V0UHJvamVjdCgpLCByZXZpZXdlckFkZGVkSG9vaywgYXJncyk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZG9DbGFTaWdudXBIb29rKEFjY291bnQgYWNjb3VudCwgQ29udHJpYnV0b3JBZ3JlZW1lbnQgY2xhKSB7CiAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsKSB7CiAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CkBAIC00MDIsMTIgKzU2NSwyMCBAQAogICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBmaXJlRXZlbnRGb3JVbnJlc3RyaWN0ZWRMaXN0ZW5lcnMoZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgIGZvciAoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiB1bnJlc3RyaWN0ZWRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICBsaXN0ZW5lci5vbkNoYW5nZUV2ZW50KGV2ZW50KTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgZmlyZUV2ZW50KGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50LCBmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgICBmb3IgKENoYW5nZUxpc3RlbmVySG9sZGVyIGhvbGRlciA6IGxpc3RlbmVycy52YWx1ZXMoKSkgewogICAgICAgICAgIGlmIChpc1Zpc2libGVUbyhjaGFuZ2UsIGhvbGRlci51c2VyLCBkYikpIHsKICAgICAgICAgICAgICAgaG9sZGVyLmxpc3RlbmVyLm9uQ2hhbmdlRXZlbnQoZXZlbnQpOwogICAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgZmlyZUV2ZW50Rm9yVW5yZXN0cmljdGVkTGlzdGVuZXJzKCBldmVudCApOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBmaXJlRXZlbnQoQnJhbmNoLk5hbWVLZXkgYnJhbmNoTmFtZSwgZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKQEAgLTQxNiw2ICs1ODcsOCBAQAogICAgICAgICAgICAgICBob2xkZXIubGlzdGVuZXIub25DaGFuZ2VFdmVudChldmVudCk7CiAgICAgICAgICAgfQogICAgICAgfQorCisgICAgICBmaXJlRXZlbnRGb3JVbnJlc3RyaWN0ZWRMaXN0ZW5lcnMoIGV2ZW50ICk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZVRvKENoYW5nZSBjaGFuZ2UsIElkZW50aWZpZWRVc2VyIHVzZXIsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKQEAgLTQ0MSwxNSArNjE0LDE1IEBACiAgICAgICogQHBhcmFtIGFwcHJvdmFsCiAgICAgICogQHJldHVybiBvYmplY3Qgc3VpdGFibGUgZm9yIHNlcmlhbGl6YXRpb24gdG8gSlNPTgogICAgICAqLwotICAgIHByaXZhdGUgQXBwcm92YWxBdHRyaWJ1dGUgZ2V0QXBwcm92YWxBdHRyaWJ1dGUoCi0gICAgICAgICAgICBFbnRyeTxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFsKSB7CisgICAgcHJpdmF0ZSBBcHByb3ZhbEF0dHJpYnV0ZSBnZXRBcHByb3ZhbEF0dHJpYnV0ZShMYWJlbFR5cGVzIGxhYmVsVHlwZXMsCisgICAgICAgICAgICBFbnRyeTxTdHJpbmcsIFNob3J0PiBhcHByb3ZhbCkgewogICAgICAgICBBcHByb3ZhbEF0dHJpYnV0ZSBhID0gbmV3IEFwcHJvdmFsQXR0cmlidXRlKCk7Ci0gICAgICAgIGEudHlwZSA9IGFwcHJvdmFsLmdldEtleSgpLmdldCgpOwotICAgICAgICBBcHByb3ZhbFR5cGUgYXQgPSBhcHByb3ZhbFR5cGVzLmJ5SWQoYXBwcm92YWwuZ2V0S2V5KCkpOwotICAgICAgICBpZiAoYXQgIT0gbnVsbCkgewotICAgICAgICAgIGEuZGVzY3JpcHRpb24gPSBhdC5nZXRDYXRlZ29yeSgpLmdldE5hbWUoKTsKKyAgICAgICAgYS50eXBlID0gYXBwcm92YWwuZ2V0S2V5KCk7CisgICAgICAgIExhYmVsVHlwZSBsdCA9IGxhYmVsVHlwZXMuYnlMYWJlbChhcHByb3ZhbC5nZXRLZXkoKSk7CisgICAgICAgIGlmIChsdCAhPSBudWxsKSB7CisgICAgICAgICAgYS5kZXNjcmlwdGlvbiA9IGx0LmdldE5hbWUoKTsKICAgICAgICAgfQotICAgICAgICBhLnZhbHVlID0gU2hvcnQudG9TdHJpbmcoYXBwcm92YWwuZ2V0VmFsdWUoKS5nZXQoKSk7CisgICAgICAgIGEudmFsdWUgPSBTaG9ydC50b1N0cmluZyhhcHByb3ZhbC5nZXRWYWx1ZSgpKTsKICAgICAgICAgcmV0dXJuIGE7CiAgICAgfQogCkBAIC00ODEsMzEgKzY1NCw4NCBAQAogICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJ1bkhvb2soUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEZpbGUgaG9vaywKICAgICAgIExpc3Q8U3RyaW5nPiBhcmdzKSB7CiAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBob29rLmV4aXN0cygpKSB7Ci0gICAgICBob29rUXVldWUuZXhlY3V0ZShuZXcgSG9va1Rhc2socHJvamVjdCwgaG9vaywgYXJncykpOworICAgICAgaG9va1F1ZXVlLmV4ZWN1dGUobmV3IEFzeW5jSG9va1Rhc2socHJvamVjdCwgaG9vaywgYXJncykpOwogICAgIH0KICAgfQogCiAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcnVuSG9vayhGaWxlIGhvb2ssIExpc3Q8U3RyaW5nPiBhcmdzKSB7CiAgICAgaWYgKGhvb2suZXhpc3RzKCkpIHsKLSAgICAgIGhvb2tRdWV1ZS5leGVjdXRlKG5ldyBIb29rVGFzayhudWxsLCBob29rLCBhcmdzKSk7CisgICAgICBob29rUXVldWUuZXhlY3V0ZShuZXcgQXN5bmNIb29rVGFzayhudWxsLCBob29rLCBhcmdzKSk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBIb29rVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgcHJpdmF0ZSBIb29rUmVzdWx0IHJ1blN5bmNIb29rKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LAorICAgICAgRmlsZSBob29rLCBMaXN0PFN0cmluZz4gYXJncykgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworCisgICAgaWYgKCFob29rLmV4aXN0cygpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBTeW5jSG9va1Rhc2sgc3luY0hvb2sgPSBuZXcgU3luY0hvb2tUYXNrKHByb2plY3QsIGhvb2ssIGFyZ3MpOworICAgIEZ1dHVyZVRhc2s8SG9va1Jlc3VsdD4gdGFzayA9IG5ldyBGdXR1cmVUYXNrPEhvb2tSZXN1bHQ+KHN5bmNIb29rKTsKKworICAgIHN5bmNIb29rVGhyZWFkUG9vbC5leGVjdXRlKHRhc2spOworCisgICAgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHRhc2suZ2V0KHN5bmNIb29rVGltZW91dCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICBtZXNzYWdlID0gIlN5bmNocm9ub3VzIGhvb2sgdGltZWQgb3V0ICIgICsgaG9vay5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgIGxvZy5lcnJvcihtZXNzYWdlKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbWVzc2FnZSA9ICJFcnJvciBydW5uaW5nIGhvb2sgIiArIGhvb2suZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICBsb2cuZXJyb3IobWVzc2FnZSwgZSk7CisgICAgfQorCisgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgc3luY0hvb2suY2FuY2VsKCk7CisgICAgcmV0dXJuICBuZXcgSG9va1Jlc3VsdChzeW5jSG9vay5nZXRPdXRwdXQoKSwgbWVzc2FnZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICBzeW5jSG9va1RocmVhZFBvb2wuc2h1dGRvd24oKTsKKyAgICBib29sZWFuIGlzVGVybWluYXRlZDsKKyAgICBkbyB7CisgICAgICB0cnkgeworICAgICAgICBpc1Rlcm1pbmF0ZWQgPSBzeW5jSG9va1RocmVhZFBvb2wuYXdhaXRUZXJtaW5hdGlvbigxMCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICBpc1Rlcm1pbmF0ZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IHdoaWxlICghaXNUZXJtaW5hdGVkKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgSG9va1Rhc2sgewogICAgIHByaXZhdGUgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGhvb2s7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gYXJnczsKKyAgICBwcml2YXRlIFN0cmluZ1dyaXRlciBvdXRwdXQ7CisgICAgcHJpdmF0ZSBQcm9jZXNzIHBzOwogCi0gICAgcHJpdmF0ZSBIb29rVGFzayhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgRmlsZSBob29rLCBMaXN0PFN0cmluZz4gYXJncykgeworICAgIHByb3RlY3RlZCBIb29rVGFzayhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgRmlsZSBob29rLCBMaXN0PFN0cmluZz4gYXJncykgewogICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgIHRoaXMuaG9vayA9IGhvb2s7CiAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dCgpIHsKKyAgICAgIHJldHVybiBvdXRwdXQgIT0gbnVsbCA/IG91dHB1dC50b1N0cmluZygpIDogbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSG9va1Jlc3VsdCBydW5Ib29rKCkgewogICAgICAgUmVwb3NpdG9yeSByZXBvID0gbnVsbDsKKyAgICAgIEhvb2tSZXN1bHQgcmVzdWx0ID0gbnVsbDsKICAgICAgIHRyeSB7CisKICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3YgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSArIGFyZ3Muc2l6ZSgpKTsKICAgICAgICAgYXJndi5hZGQoaG9vay5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIGFyZ3YuYWRkQWxsKGFyZ3MpOwpAQCAtNTI2LDIzICs3NTIsMjIgQEAKICAgICAgICAgICBlbnYucHV0KCJHSVRfRElSIiwgcmVwby5nZXREaXJlY3RvcnkoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBQcm9jZXNzIHBzID0gcGIuc3RhcnQoKTsKKyAgICAgICAgcHMgPSBwYi5zdGFydCgpOwogICAgICAgICBwcy5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOwotCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHMuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHBzLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZy5pbmZvKCJob29rWyIgKyBob29rLmdldE5hbWUoKSArICJdIG91dHB1dDogIiArIGxpbmUpOwotICAgICAgICAgIH0KKyAgICAgICAgICBvdXRwdXQgPSByZWFkT3V0cHV0KGlzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFcnIpIHsKICAgICAgICAgICB9CiAgICAgICAgICAgcHMud2FpdEZvcigpOworICAgICAgICAgIHJlc3VsdCA9IG5ldyBIb29rUmVzdWx0KHBzLmV4aXRWYWx1ZSgpLCBvdXRwdXQpOwogICAgICAgICB9CisgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZXgpIHsKKyAgICAgICAgLy8gSW50ZXJydXB0ZWRFeGVjZXB0aW9uIC0gdGltZW91dCBvciBjYW5jZWwKICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlcnIpIHsKICAgICAgICAgbG9nLmVycm9yKCJFcnJvciBydW5uaW5nIGhvb2sgIiArIGhvb2suZ2V0QWJzb2x1dGVQYXRoKCksIGVycik7CiAgICAgICB9IGZpbmFsbHkgewpAQCAtNTUwLDExICs3NzUsNzkgQEAKICAgICAgICAgICByZXBvLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgZmluYWwgaW50IGV4aXRWYWx1ZSA9IHJlc3VsdC5nZXRFeGl0VmFsdWUoKTsKKyAgICAgIGlmIChleGl0VmFsdWUgPT0gMCkgeworICAgICAgICBsb2cuZGVidWcoImhvb2tbIiArIGdldE5hbWUoKSArICJdIGV4aXRWYWx1ZToiICsgZXhpdFZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxvZy5pbmZvKCJob29rWyIgKyBnZXROYW1lKCkgKyAiXSBleGl0VmFsdWU6IiArIGV4aXRWYWx1ZSk7CisgICAgICB9CisKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0KKyAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihyZXN1bHQuZ2V0T3V0cHV0KCkpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgbG9nLmluZm8oImhvb2tbIiArIGdldE5hbWUoKSArICJdIG91dHB1dDogIiArIGxpbmUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjYXRjaChJT0V4Y2VwdGlvbiAgaW94KSB7CisgICAgICAgIGxvZy5lcnJvcigiRXJyb3Igd3JpdGluZyBob29rIG91dHB1dCIsIGlveCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZE91dHB1dChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIG91dHB1dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlucHV0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKKyAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcls0MDk2XTsKKyAgICAgIGludCBuID0gMDsKKyAgICAgIHdoaWxlICgobiA9IGlucHV0LnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgbik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICByZXR1cm4gaG9vay5nZXROYW1lKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgIHJldHVybiAiaG9vayAiICsgaG9vay5nZXROYW1lKCk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgcHMuZGVzdHJveSgpOworICAgIH0KKyAgfQorCisgIC8qKiBDYWxsYWJsZSB0eXBlIHVzZWQgdG8gcnVuIHN5bmNocm9ub3VzIGhvb2tzICovCisgIHByaXZhdGUgZmluYWwgY2xhc3MgU3luY0hvb2tUYXNrIGV4dGVuZHMgSG9va1Rhc2sKKyAgICAgIGltcGxlbWVudHMgQ2FsbGFibGU8SG9va1Jlc3VsdD4geworCisgICAgcHJpdmF0ZSBTeW5jSG9va1Rhc2soUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEZpbGUgaG9vaywgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIGhvb2ssIGFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBIb29rUmVzdWx0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiBzdXBlci5ydW5Ib29rKCk7CisgICAgfQorICB9CisKKyAgLyoqIFJ1bmFibGUgdHlwZSB1c2VkIHRvIHJ1biBhc3luYyBob29rcyAqLworICBwcml2YXRlIGZpbmFsIGNsYXNzIEFzeW5jSG9va1Rhc2sgZXh0ZW5kcyBIb29rVGFzayBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgIHByaXZhdGUgQXN5bmNIb29rVGFzayhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgRmlsZSBob29rLCBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgc3VwZXIocHJvamVjdCwgaG9vaywgYXJncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgc3VwZXIucnVuSG9vaygpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9DaGFuZ2VIb29rcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9DaGFuZ2VIb29rcy5qYXZhCmluZGV4IDEzNDA1N2QuLjQ4YTUyYTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va3MuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tzLmphdmEKQEAgLTE0LDEzICsxNCwxMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rUnVubmVyLkhvb2tSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ29udHJpYnV0b3JBZ3JlZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICogRmlyZSB0aGUgRHJhZnQgUHVibGlzaGVkIEhvb2suCiAgICAqCiAgICAqIEBwYXJhbSBjaGFuZ2UgVGhlIGNoYW5nZSBpdHNlbGYuCi0gICAqIEBwYXJhbSBwYXRjaFNldCBUaGUgUGF0Y2hzZXQgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICogQHBhcmFtIHBhdGNoU2V0IFRoZSBQYXRjaHNldCB0aGF0IHdhcyBwdWJsaXNoZWQuCiAgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBkb0RyYWZ0UHVibGlzaGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBQYXRjaFNldCBwYXRjaFNldCwKQEAgLTYzLDEyICs2MywxMiBAQAogICAgKiBAcGFyYW0gcGF0Y2hTZXQgVGhlIHBhdGNoc2V0IHRoaXMgY29tbWVudCBpcyByZWxhdGVkIHRvLgogICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgZ2Vycml0IHVzZXIgd2hvIGFkZGVkIHRoZSBjb21tZW50LgogICAgKiBAcGFyYW0gY29tbWVudCBUaGUgY29tbWVudCBnaXZlbi4KLSAgICogQHBhcmFtIGFwcHJvdmFscyBNYXAgb2YgQXBwcm92YWwgQ2F0ZWdvcmllcyBhbmQgU2NvcmVzCisgICAqIEBwYXJhbSBhcHByb3ZhbHMgTWFwIG9mIGxhYmVsIElEcyB0byBzY29yZXMKICAgICogQHRocm93cyBPcm1FeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyB2b2lkIGRvQ29tbWVudEFkZGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCiAgICAgICBQYXRjaFNldCBwYXRjaFNldCwgU3RyaW5nIGNvbW1lbnQsCi0gICAgICBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbHMsIFJldmlld0RiIGRiKQorICAgICAgTWFwPFN0cmluZywgU2hvcnQ+IGFwcHJvdmFscywgUmV2aWV3RGIgZGIpCiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOwogCiAgIC8qKgpAQCAtODMsNiArODMsMTggQEAKICAgICAgIFBhdGNoU2V0IHBhdGNoU2V0LCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKIAogICAvKioKKyAgICogRmlyZSB0aGUgTWVyZ2UgRmFpbGVkIEhvb2suCisgICAqCisgICAqIEBwYXJhbSBjaGFuZ2UgVGhlIGNoYW5nZSBpdHNlbGYuCisgICAqIEBwYXJhbSBhY2NvdW50IFRoZSBnZXJyaXQgdXNlciB3aG8gYXR0ZW1wdGVkIHRvIHN1Ym1pdCB0aGUgY2hhbmdlLgorICAgKiBAcGFyYW0gcGF0Y2hTZXQgVGhlIHBhdGNoc2V0IHRoYXQgZmFpbGVkIHRvIG1lcmdlLgorICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gdGhhdCB0aGUgY2hhbmdlIGZhaWxlZCB0byBtZXJnZS4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIGRvTWVyZ2VGYWlsZWRIb29rKENoYW5nZSBjaGFuZ2UsIEFjY291bnQgYWNjb3VudCwKKyAgICAgIFBhdGNoU2V0IHBhdGNoU2V0LCBTdHJpbmcgcmVhc29uLCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKworICAvKioKICAgICogRmlyZSB0aGUgQ2hhbmdlIEFiYW5kb25lZCBIb29rLgogICAgKgogICAgKiBAcGFyYW0gY2hhbmdlIFRoZSBjaGFuZ2UgaXRzZWxmLgpAQCAtMTI1LDUgKzEzNywyOCBAQAogICBwdWJsaWMgdm9pZCBkb1JlZlVwZGF0ZWRIb29rKEJyYW5jaC5OYW1lS2V5IHJlZk5hbWUsIE9iamVjdElkIG9sZElkLAogICAgICAgT2JqZWN0SWQgbmV3SWQsIEFjY291bnQgYWNjb3VudCk7CiAKKyAgLyoqCisgICAqIEZpcmUgdGhlIFJldmlld2VyIEFkZGVkIEhvb2sKKyAgICoKKyAgICogQHBhcmFtIGNoYW5nZSBUaGUgY2hhbmdlIGl0c2VsZi4KKyAgICogQHBhcmFtIHBhdGNoU2V0IFRoZSBwYXRjaHNldCB0aGF0IHRoZSByZXZpZXdlciB3YXMgYWRkZWQgb24uCisgICAqIEBwYXJhbSBhY2NvdW50IFRoZSBnZXJyaXQgdXNlciB3aG8gd2FzIGFkZGVkIGFzIHJldmlld2VyLgorICAgKi8KKyAgcHVibGljIHZvaWQgZG9SZXZpZXdlckFkZGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCisgICAgICBQYXRjaFNldCBwYXRjaFNldCwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb247CisKICAgcHVibGljIHZvaWQgZG9DbGFTaWdudXBIb29rKEFjY291bnQgYWNjb3VudCwgQ29udHJpYnV0b3JBZ3JlZW1lbnQgY2xhKTsKKworICAvKioKKyAgICogRmlyZSB0aGUgUmVmIHVwZGF0ZSBIb29rCisgICAqCisgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSB0YXJnZXQgcHJvamVjdAorICAgKiBAcGFyYW0gcmVmTmFtZSBUaGUgQnJhbmNoLk5hbWVLZXkgb2YgdGhlIHJlZiBwcm92aWRlZCBieSBjbGllbnQKKyAgICogQHBhcmFtIHVwbG9hZGVyIFRoZSBnZXJyaXQgdXNlciBydW5uaW5nIHRoZSBjb21tYW5kCisgICAqIEBwYXJhbSBvbGRJZCBUaGUgcmVmJ3Mgb2xkIGlkCisgICAqIEBwYXJhbSBuZXdJZCBUaGUgcmVmJ3MgbmV3IGlkCisgICAqIEBwYXJhbSBhY2NvdW50IFRoZSBnZXJyaXQgdXNlciB3aG8gbW92ZWQgdGhlIHJlZgorICAgKi8KKyAgcHVibGljIEhvb2tSZXN1bHQgZG9SZWZVcGRhdGVIb29rKFByb2plY3QgcHJvamVjdCwgIFN0cmluZyByZWZOYW1lLAorICAgICAgIEFjY291bnQgdXBsb2FkZXIsIE9iamVjdElkIG9sZElkLCBPYmplY3RJZCBuZXdJZCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0Rpc2FibGVkQ2hhbmdlSG9va3MuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vRGlzYWJsZWRDaGFuZ2VIb29rcy5qYXZhCmluZGV4IGYzMGY1ZWEuLjYwMTFhYjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vRGlzYWJsZWRDaGFuZ2VIb29rcy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vRGlzYWJsZWRDaGFuZ2VIb29rcy5qYXZhCkBAIC0xNCwxMyArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb247CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lci5Ib29rUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbnRyaWJ1dG9yQWdyZWVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaC5OYW1lS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2guTmFtZUtleTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogCkBAIC00Niw2ICs0NiwxMSBAQAogICB9CiAKICAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvTWVyZ2VGYWlsZWRIb29rKENoYW5nZSBjaGFuZ2UsIEFjY291bnQgYWNjb3VudCwKKyAgICAgIFBhdGNoU2V0IHBhdGNoU2V0LCBTdHJpbmcgcmVhc29uLCBSZXZpZXdEYiBkYikgeworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGRvQ2hhbmdlUmVzdG9yZWRIb29rKENoYW5nZSBjaGFuZ2UsIEFjY291bnQgYWNjb3VudCwKICAgICAgIFN0cmluZyByZWFzb24sIFJldmlld0RiIGRiKSB7CiAgIH0KQEAgLTU3LDcgKzYyLDcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGRvQ29tbWVudEFkZGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCiAgICAgICBQYXRjaFNldCBwYXRjaFNldCwgU3RyaW5nIGNvbW1lbnQsCi0gICAgICBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbHMsIFJldmlld0RiIGRiKSB7CisgICAgICBNYXA8U3RyaW5nLCBTaG9ydD4gYXBwcm92YWxzLCBSZXZpZXdEYiBkYikgewogICB9CiAKICAgQE92ZXJyaWRlCkBAIC04MSw2ICs4NiwxNyBAQAogICB9CiAKICAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGRvUmV2aWV3ZXJBZGRlZEhvb2soQ2hhbmdlIGNoYW5nZSwgQWNjb3VudCBhY2NvdW50LCBQYXRjaFNldCBwYXRjaFNldCwKKyAgICAgIFJldmlld0RiIGRiKSB7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgSG9va1Jlc3VsdCBkb1JlZlVwZGF0ZUhvb2soUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcmVmTmFtZSwKKyAgICAgIEFjY291bnQgdXBsb2FkZXIsIE9iamVjdElkIG9sZElkLCBPYmplY3RJZCBuZXdJZCkgeworICAgIHJldHVybiBudWxsOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJlZGljYXRlQ2xhc3NMb2FkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9QcmVkaWNhdGVDbGFzc0xvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMmQyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJlZGljYXRlQ2xhc3NMb2FkZXIuamF2YQpAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRIYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogTG9hZHMgdGhlIGNsYXNzZXMgZm9yIFByb2xvZyBwcmVkaWNhdGVzLgorICovCitwdWJsaWMgY2xhc3MgUHJlZGljYXRlQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxTdHJpbmcsIENsYXNzTG9hZGVyPiBwYWNrYWdlQ2xhc3NMb2FkZXJNYXAgPQorICAgICAgTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworCisgIHB1YmxpYyBQcmVkaWNhdGVDbGFzc0xvYWRlcigKKyAgICAgIGZpbmFsIER5bmFtaWNTZXQ8UHJlZGljYXRlUHJvdmlkZXI+IHByZWRpY2F0ZVByb3ZpZGVycywKKyAgICAgIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgIHN1cGVyKHBhcmVudCk7CisKKyAgICBmb3IgKFByZWRpY2F0ZVByb3ZpZGVyIHByZWRpY2F0ZVByb3ZpZGVyIDogcHJlZGljYXRlUHJvdmlkZXJzKSB7CisgICAgICBmb3IgKFN0cmluZyBwa2cgOiBwcmVkaWNhdGVQcm92aWRlci5nZXRQYWNrYWdlcygpKSB7CisgICAgICAgIHBhY2thZ2VDbGFzc0xvYWRlck1hcC5wdXQocGtnLCBwcmVkaWNhdGVQcm92aWRlci5nZXRDbGFzcygpCisgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBDbGFzczw/PiBmaW5kQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkKKyAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb2xsZWN0aW9uPENsYXNzTG9hZGVyPiBjbGFzc0xvYWRlcnMgPQorICAgICAgICBwYWNrYWdlQ2xhc3NMb2FkZXJNYXAuZ2V0KGdldFBhY2thZ2VOYW1lKGNsYXNzTmFtZSkpOworICAgIGZvciAoZmluYWwgQ2xhc3NMb2FkZXIgY2wgOiBjbGFzc0xvYWRlcnMpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgY2wpOworICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIGlnbm9yZQorICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbihjbGFzc05hbWUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICBmaW5hbCBpbnQgcG9zID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7CisgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1ByZWRpY2F0ZVByb3ZpZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJlZGljYXRlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ5NDIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1ByZWRpY2F0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXh0ZW5zaW9uUG9pbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByZWRpY2F0ZTsKKworLyoqCisgKiBQcm92aWRlcyBhZGRpdGlvbmFsIHBhY2thZ2VzIHRoYXQgY29udGFpbiBQcm9sb2cgcHJlZGljYXRlcyB0aGF0IHNob3VsZCBiZQorICogbWFkZSBhdmFpbGFibGUgaW4gdGhlIFByb2xvZyBlbnZpcm9ubWVudC4gVGhlIHByZWRpY2F0ZXMgY2FuIGUuZy4gYmUgdXNlZCBpbgorICogdGhlIHByb2plY3Qgc3VibWl0IHJ1bGVzLgorICoKKyAqIEVhY2ggSmF2YSBjbGFzcyBkZWZpbmluZyBhIFByb2xvZyBwcmVkaWNhdGUgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHByb3ZpZGVkCisgKiBwYWNrYWdlcyBhbmQgaXRzIG5hbWUgbXVzdCBhcHBseSB0byB0aGUgJ1BSRURfW2Z1bmN0b3JdX1thcml0eV0nIGZvcm1hdC4gSW4KKyAqIGFkZGl0aW9uIGl0IG11c3QgZXh0ZW5kIHtAbGluayBQcmVkaWNhdGV9LgorICovCitARXh0ZW5zaW9uUG9pbnQKK3B1YmxpYyBpbnRlcmZhY2UgUHJlZGljYXRlUHJvdmlkZXIgeworICAvKiogUmV0dXJuIHNldCBvZiBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gUHJvbG9nIHByZWRpY2F0ZXMgKi8KKyAgcHVibGljIEltbXV0YWJsZVNldDxTdHJpbmc+IGdldFBhY2thZ2VzKCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJvbG9nTW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJvbG9nTW9kdWxlLmphdmEKaW5kZXggZDM2MTc5MC4uOTJiOGIxYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ01vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dNb2R1bGUuamF2YQpAQCAtMTQsMTEgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucnVsZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuRmFjdG9yeU1vZHVsZTsKIAogcHVibGljIGNsYXNzIFByb2xvZ01vZHVsZSBleHRlbmRzIEZhY3RvcnlNb2R1bGUgewogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIER5bmFtaWNTZXQuc2V0T2YoYmluZGVyKCksIFByZWRpY2F0ZVByb3ZpZGVyLmNsYXNzKTsKICAgICBmYWN0b3J5KFByb2xvZ0Vudmlyb25tZW50LkZhY3RvcnkuY2xhc3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUnVsZXNDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1J1bGVzQ2FjaGUuamF2YQppbmRleCBmYmVlMTQ1Li5kYWQ1M2I5IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUnVsZXNDYWNoZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9SdWxlc0NhY2hlLmphdmEKQEAgLTE2LDYgKzE2LDkgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ01hY2hpbmVDb3B5LnNhdmU7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwpAQCAtNDIsNyArNDUsMTAgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CkBAIC01Miw2ICs1OCw3IEBACiBpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CiBpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCkBAIC02OSwxMCArNzYsOCBAQAogICAvKiogRGVmYXVsdCBzaXplIG9mIHRoZSBpbnRlcm5hbCBQcm9sb2cgZGF0YWJhc2Ugd2l0aGluIGVhY2ggaW50ZXJwcmV0ZXIuICovCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQl9NQVggPSAyNTY7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFDS0FHRV9MSVNUID0gewotICAgICAgUHJvbG9nLkJVSUxUSU4sCi0gICAgICAiZ2Vycml0IiwKLSAgICB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gUEFDS0FHRV9MSVNUID0gSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgIFByb2xvZy5CVUlMVElOLCAiZ2Vycml0Iik7CiAKICAgcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0SWQsIE1hY2hpbmVSZWY+IG1hY2hpbmVDYWNoZSA9CiAgICAgICBuZXcgSGFzaE1hcDxPYmplY3RJZCwgTWFjaGluZVJlZj4oKTsKQEAgLTk0LDIxICs5OSwyNyBAQAogICBwcml2YXRlIGZpbmFsIEZpbGUgY2FjaGVEaXI7CiAgIHByaXZhdGUgZmluYWwgRmlsZSBydWxlc0RpcjsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNZ3I7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY1NldDxQcmVkaWNhdGVQcm92aWRlcj4gcHJlZGljYXRlUHJvdmlkZXJzOwogICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIHN5c3RlbUxvYWRlcjsKICAgcHJpdmF0ZSBmaW5hbCBQcm9sb2dNYWNoaW5lQ29weSBkZWZhdWx0TWFjaGluZTsKIAogICBASW5qZWN0CiAgIHByb3RlY3RlZCBSdWxlc0NhY2hlKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNvbmZpZywgU2l0ZVBhdGhzIHNpdGUsCi0gICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBnbSkgeworICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ20sIER5bmFtaWNTZXQ8UHJlZGljYXRlUHJvdmlkZXI+IHByZWRpY2F0ZVByb3ZpZGVycykgewogICAgIGVuYWJsZVByb2plY3RSdWxlcyA9IGNvbmZpZy5nZXRCb29sZWFuKCJydWxlcyIsIG51bGwsICJlbmFibGUiLCB0cnVlKTsKICAgICBjYWNoZURpciA9IHNpdGUucmVzb2x2ZShjb25maWcuZ2V0U3RyaW5nKCJjYWNoZSIsIG51bGwsICJkaXJlY3RvcnkiKSk7CiAgICAgcnVsZXNEaXIgPSBjYWNoZURpciAhPSBudWxsID8gbmV3IEZpbGUoY2FjaGVEaXIsICJydWxlcyIpIDogbnVsbDsKICAgICBnaXRNZ3IgPSBnbTsKKyAgICB0aGlzLnByZWRpY2F0ZVByb3ZpZGVycyA9IHByZWRpY2F0ZVByb3ZpZGVyczsKIAogICAgIHN5c3RlbUxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKICAgICBkZWZhdWx0TWFjaGluZSA9IHNhdmUobmV3RW1wdHlNYWNoaW5lKHN5c3RlbUxvYWRlcikpOwogICB9CiAKKyAgcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0UnVsZXNFbmFibGVkKCkgeworICAgIHJldHVybiBlbmFibGVQcm9qZWN0UnVsZXM7CisgIH0KKwogICAvKioKICAgICogTG9jYXRlIGEgY2FjaGVkIFByb2xvZyBtYWNoaW5lIHN0YXRlLCBvciBjcmVhdGUgb25lIGlmIG5vdCBhdmFpbGFibGUuCiAgICAqCkBAIC0xNDIsNiArMTUzLDE1IEBACiAgICAgcmV0dXJuIHBjbTsKICAgfQogCisgIHB1YmxpYyBQcm9sb2dNYWNoaW5lQ29weSBsb2FkTWFjaGluZShTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW4pCisgICAgICB0aHJvd3MgQ29tcGlsZUV4Y2VwdGlvbiB7CisgICAgUHJvbG9nTWFjaGluZUNvcHkgcG1jID0gY29uc3VsdFJ1bGVzKG5hbWUsIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOworICAgIGlmIChwbWMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IENvbXBpbGVFeGNlcHRpb24oIkNhbm5vdCBjb25zdWx0IHJ1bGVzIGZyb20gdGhlIHN0cmVhbSAiICsgbmFtZSk7CisgICAgfQorICAgIHJldHVybiBwbWM7CisgIH0KKwogICBwcml2YXRlIHZvaWQgZ2MoKSB7CiAgICAgUmVmZXJlbmNlPD8+IHJlZjsKICAgICB3aGlsZSAoKHJlZiA9IGRlYWQucG9sbCgpKSAhPSBudWxsKSB7CkBAIC0xNjgsMTYgKzE4OCwyMSBAQAogICAgIC8vIER5bmFtaWNhbGx5IGNvbnN1bHQgdGhlIHJ1bGVzIGludG8gdGhlIG1hY2hpbmUncyBpbnRlcm5hbCBkYXRhYmFzZS4KICAgICAvLwogICAgIFN0cmluZyBydWxlcyA9IHJlYWQocHJvamVjdCwgcnVsZXNJZCk7Ci0gICAgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCBjdGwgPSBuZXdFbXB0eU1hY2hpbmUoc3lzdGVtTG9hZGVyKTsKLSAgICBQdXNoYmFja1JlYWRlciBpbiA9IG5ldyBQdXNoYmFja1JlYWRlcigKLSAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihydWxlcyksCi0gICAgICAgIFByb2xvZy5QVVNIQkFDS19TSVpFKTsKKyAgICBQcm9sb2dNYWNoaW5lQ29weSBwbWMgPSBjb25zdWx0UnVsZXMoInJ1bGVzLnBsIiwgbmV3IFN0cmluZ1JlYWRlcihydWxlcykpOworICAgIGlmIChwbWMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IENvbXBpbGVFeGNlcHRpb24oIkNhbm5vdCBjb25zdWx0IHJ1bGVzIG9mICIgKyBwcm9qZWN0KTsKKyAgICB9CisgICAgcmV0dXJuIHBtYzsKKyAgfQogCisgIHByaXZhdGUgUHJvbG9nTWFjaGluZUNvcHkgY29uc3VsdFJ1bGVzKFN0cmluZyBuYW1lLCBSZWFkZXIgcnVsZXMpIHsKKyAgICBCdWZmZXJpbmdQcm9sb2dDb250cm9sIGN0bCA9IG5ld0VtcHR5TWFjaGluZShzeXN0ZW1Mb2FkZXIpOworICAgIFB1c2hiYWNrUmVhZGVyIGluID0gbmV3IFB1c2hiYWNrUmVhZGVyKHJ1bGVzLCBQcm9sb2cuUFVTSEJBQ0tfU0laRSk7CiAgICAgaWYgKCFjdGwuZXhlY3V0ZSgKICAgICAgICAgUHJvbG9nLkJVSUxUSU4sICJjb25zdWx0X3N0cmVhbSIsCi0gICAgICAgIFN5bWJvbFRlcm0uaW50ZXJuKCJydWxlcy5wbCIpLAorICAgICAgICBTeW1ib2xUZXJtLmludGVybihuYW1lKSwKICAgICAgICAgbmV3IEphdmFPYmplY3RUZXJtKGluKSkpIHsKLSAgICAgIHRocm93IG5ldyBDb21waWxlRXhjZXB0aW9uKCJDYW5ub3QgY29uc3VsdCBydWxlcyBvZiAiICsgcHJvamVjdCk7CisgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcmV0dXJuIHNhdmUoY3RsKTsKICAgfQpAQCAtMjA3LDE1ICsyMzIsMjIgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBCdWZmZXJpbmdQcm9sb2dDb250cm9sIG5ld0VtcHR5TWFjaGluZShDbGFzc0xvYWRlciBjbCkgeworICBwcml2YXRlIEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2wgbmV3RW1wdHlNYWNoaW5lKENsYXNzTG9hZGVyIGNsKSB7CiAgICAgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCBjdGwgPSBuZXcgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCgpOwogICAgIGN0bC5zZXRNYXhBcml0eShQcm9sb2dFbnZpcm9ubWVudC5NQVhfQVJJVFkpOwogICAgIGN0bC5zZXRNYXhEYXRhYmFzZVNpemUoREJfTUFYKTsKLSAgICBjdGwuc2V0UHJvbG9nQ2xhc3NMb2FkZXIobmV3IFByb2xvZ0NsYXNzTG9hZGVyKGNsKSk7CisgICAgY3RsLnNldFByb2xvZ0NsYXNzTG9hZGVyKG5ldyBQcm9sb2dDbGFzc0xvYWRlcihuZXcgUHJlZGljYXRlQ2xhc3NMb2FkZXIoCisgICAgICAgIHByZWRpY2F0ZVByb3ZpZGVycywgY2wpKSk7CiAgICAgY3RsLnNldEVuYWJsZWQoRW51bVNldC5hbGxPZihQcm9sb2cuRmVhdHVyZS5jbGFzcyksIGZhbHNlKTsKIAorICAgIExpc3Q8U3RyaW5nPiBwYWNrYWdlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIHBhY2thZ2VzLmFkZEFsbChQQUNLQUdFX0xJU1QpOworICAgIGZvciAoUHJlZGljYXRlUHJvdmlkZXIgcHJlZGljYXRlUHJvdmlkZXIgOiBwcmVkaWNhdGVQcm92aWRlcnMpIHsKKyAgICAgIHBhY2thZ2VzLmFkZEFsbChwcmVkaWNhdGVQcm92aWRlci5nZXRQYWNrYWdlcygpKTsKKyAgICB9CisKICAgICAvLyBCb290c3RyYXAgdGhlIGludGVycHJldGVyIGFuZCBlbnN1cmUgdGhlcmUgaXMgY2xlYW4gc3RhdGUuCi0gICAgY3RsLmluaXRpYWxpemUoUEFDS0FHRV9MSVNUKTsKKyAgICBjdGwuaW5pdGlhbGl6ZShwYWNrYWdlcy50b0FycmF5KG5ldyBTdHJpbmdbcGFja2FnZXMuc2l6ZSgpXSkpOwogICAgIHJldHVybiBjdGw7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9BY2Nlc3NQYXRoLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FjY2Vzc1BhdGguamF2YQppbmRleCBhZTc2YTZlLi4zMWRmODc1IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FjY2Vzc1BhdGguamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FjY2Vzc1BhdGguamF2YQpAQCAtMTksOCArMTksMTQgQEAKICAgLyoqIEFuIHVua25vd24gYWNjZXNzIHBhdGgsIHByb2JhYmx5IHNob3VsZCBub3QgYmUgc3BlY2lhbC4gKi8KICAgVU5LTk9XTiwKIAotICAvKiogQWNjZXNzIHRocm91Z2ggdGhlIHdlYiBVSS4gKi8KLSAgV0VCX1VJLAorICAvKiogQWNjZXNzIHRocm91Z2ggdGhlIFJFU1QgQVBJLiAqLworICBSRVNUX0FQSSwKKworICAvKiogQWNjZXNzIHRocm91Z2ggdGhlIG9sZCBKU09OLVJQQyBpbnRlcmZhY2UuICovCisgIEpTT05fUlBDLAorCisgIC8qKiBBY2Nlc3MgYnkgYSB3ZWIgY29va2llLiBUaGlzIHBhdGggaXMgbm90IHByb3RlY3RlZCBsaWtlIFJFU1RfQVBJLiAqLworICBXRUJfQlJPV1NFUiwKIAogICAvKiogQWNjZXNzIHRocm91Z2ggYW4gU1NIIGNvbW1hbmQgdGhhdCBpcyBub3QgaW52b2tlZCBieSBHaXQuICovCiAgIFNTSF9DT01NQU5ELApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9Bbm9ueW1vdXNVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0Fub255bW91c1VzZXIuamF2YQppbmRleCA1ZDM2YjMzLi5mMWZlNzJkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0Fub255bW91c1VzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0Fub255bW91c1VzZXIuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogcHVibGljIGNsYXNzIEFub255bW91c1VzZXIgZXh0ZW5kcyBDdXJyZW50VXNlciB7CiAgIEBJbmplY3QKICAgQW5vbnltb3VzVXNlcihDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSkgewotICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgQWNjZXNzUGF0aC5VTktOT1dOKTsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FwcHJvdmFsc1V0aWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQXBwcm92YWxzVXRpbC5qYXZhCmluZGV4IGEyOTVjNDkuLjBjZTY4OTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQXBwcm92YWxzVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQXBwcm92YWxzVXRpbC5qYXZhCkBAIC0xNCwyMiArMTQsMjIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXI7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudC5JZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbC5MYWJlbElkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTQ2LDIwICs0NiwxNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQXBwcm92YWxzVXRpbCB7CiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwogCiAgIEBJbmplY3QKLSAgQXBwcm92YWxzVXRpbChSZXZpZXdEYiBkYiwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzKSB7CisgIHB1YmxpYyBBcHByb3ZhbHNVdGlsKFJldmlld0RiIGRiKSB7CiAgICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAgIH0KIAogICAvKioKICAgICogUmVzeW5jIHRoZSBjaGFuZ2VPcGVuIHN0YXR1cyB3aGljaCBpcyBjYWNoZWQgaW4gdGhlIGFwcHJvdmFscyB0YWJsZSBmb3IKICAgICogcGVyZm9ybWFuY2UgcmVhc29ucwogICAgKi8KLSAgcHVibGljIHZvaWQgc3luY0NoYW5nZVN0YXR1cyhmaW5hbCBDaGFuZ2UgY2hhbmdlKQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIHN5bmNDaGFuZ2VTdGF0dXMoZmluYWwgQ2hhbmdlIGNoYW5nZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPQogICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGNoYW5nZS5nZXRJZCgpKS50b0xpc3QoKTsKICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFscykgewpAQCAtNjksNTMgKzY2LDQxIEBACiAgIH0KIAogICAvKioKLSAgICogTW92ZXMgdGhlIFBhdGNoU2V0QXBwcm92YWxzIHRvIHRoZSBsYXN0IFBhdGNoU2V0IG9uIHRoZSBjaGFuZ2Ugd2hpbGUKLSAgICoga2VlcGluZyB0aGUgdmV0b3MuCisgICAqIE1vdmVzIHRoZSBQYXRjaFNldEFwcHJvdmFscyB0byB0aGUgc3BlY2lmaWVkIFBhdGNoU2V0IG9uIHRoZSBjaGFuZ2UgZnJvbQorICAgKiB0aGUgcHJpb3IgUGF0Y2hTZXQsIHdoaWxlIGtlZXBpbmcgdGhlIHZldG9zLgogICAgKgotICAgKiBAcGFyYW0gY2hhbmdlIENoYW5nZSB0byB1cGRhdGUKKyAgICogQHBhcmFtIGRiIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIGZvciB1cGRhdGVzLgorICAgKiBAcGFyYW0gZGVzdCBQYXRjaFNldCB0byBjb3B5IHRvCiAgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICogQHJldHVybiBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IFRoZSBwcmV2aW91cyBhcHByb3ZhbHMKICAgICovCi0gIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGNvcHlWZXRvc1RvTGF0ZXN0UGF0Y2hTZXQoQ2hhbmdlIGNoYW5nZSkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gY29weVZldG9zVG9QYXRjaFNldChSZXZpZXdEYiBkYiwKKyAgICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcywgUGF0Y2hTZXQuSWQgZGVzdCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgUGF0Y2hTZXQuSWQgc291cmNlOwotICAgIGlmIChjaGFuZ2UuZ2V0TnVtYmVyT2ZQYXRjaFNldHMoKSA+IDEpIHsKLSAgICAgIHNvdXJjZSA9IG5ldyBQYXRjaFNldC5JZChjaGFuZ2UuZ2V0SWQoKSwgY2hhbmdlLmdldE51bWJlck9mUGF0Y2hTZXRzKCkgLSAxKTsKKyAgICBpZiAoZGVzdC5nZXQoKSA+IDEpIHsKKyAgICAgIHNvdXJjZSA9IG5ldyBQYXRjaFNldC5JZChkZXN0LmdldFBhcmVudEtleSgpLCBkZXN0LmdldCgpIC0gMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUHJldmlvdXMgcGF0Y2ggc2V0IGNvdWxkIG5vdCBiZSBmb3VuZCIpOworICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbigiUHJldmlvdXMgcGF0Y2ggc2V0IGNvdWxkIG5vdCBiZSBmb3VuZCIpOwogICAgIH0KIAotICAgIFBhdGNoU2V0LklkIGRlc3QgPSBjaGFuZ2UuY3VyclBhdGNoU2V0SWQoKTsKLSAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHBhdGNoU2V0QXBwcm92YWxzID0gZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2UuZ2V0SWQoKSkudG9MaXN0KCk7CisgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBwYXRjaFNldEFwcHJvdmFscyA9CisgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UoZGVzdC5nZXRQYXJlbnRLZXkoKSkudG9MaXN0KCk7CiAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBwYXRjaFNldEFwcHJvdmFscykgewotICAgICAgLy8gQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQgaXMgc3RpbGwgaW4gZGIgYnV0IG5vdCByZWxldmFudCBpbiBnaXQtc3RvcmUKLSAgICAgIGlmICghQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKSkgewotICAgICAgICBmaW5hbCBBcHByb3ZhbFR5cGUgdHlwZSA9IGFwcHJvdmFsVHlwZXMuYnlJZChhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgIGlmIChhLmdldFBhdGNoU2V0SWQoKS5lcXVhbHMoc291cmNlKSAmJgotICAgICAgICAgICAgdHlwZS5nZXRDYXRlZ29yeSgpLmlzQ29weU1pblNjb3JlKCkgJiYKLSAgICAgICAgICAgIHR5cGUuaXNNYXhOZWdhdGl2ZShhKSkgewotICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KAotICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IFBhdGNoU2V0QXBwcm92YWwoZGVzdCwgYSkpKTsKLSAgICAgICAgfQorICAgICAgTGFiZWxUeXBlIHR5cGUgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoYS5nZXRMYWJlbElkKCkpOworICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiBhLmdldFBhdGNoU2V0SWQoKS5lcXVhbHMoc291cmNlKSAmJgorICAgICAgICAgIHR5cGUuaXNDb3B5TWluU2NvcmUoKSAmJgorICAgICAgICAgIHR5cGUuaXNNYXhOZWdhdGl2ZShhKSkgeworICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydCgKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgUGF0Y2hTZXRBcHByb3ZhbChkZXN0LCBhKSkpOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcGF0Y2hTZXRBcHByb3ZhbHM7CiAgIH0KIAotCi0gIC8qKiBBdHRhY2ggcmV2aWV3ZXJzIHRvIGEgY2hhbmdlLiAqLwotICBwdWJsaWMgdm9pZCBhZGRSZXZpZXdlcnMoQ2hhbmdlIGNoYW5nZSwgUGF0Y2hTZXQgcHMsIFBhdGNoU2V0SW5mbyBpbmZvLAotICAgICAgU2V0PEFjY291bnQuSWQ+IHdhbnRSZXZpZXdlcnMpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIFNldDxJZD4gZXhpc3RpbmcgPSBTZXRzLjxBY2NvdW50LklkPiBuZXdIYXNoU2V0KCk7Ci0gICAgYWRkUmV2aWV3ZXJzKGNoYW5nZSwgcHMsIGluZm8sIHdhbnRSZXZpZXdlcnMsIGV4aXN0aW5nKTsKLSAgfQotCi0gIC8qKiBBdHRhY2ggcmV2aWV3ZXJzIHRvIGEgY2hhbmdlLiAqLwotICBwdWJsaWMgdm9pZCBhZGRSZXZpZXdlcnMoQ2hhbmdlIGNoYW5nZSwgUGF0Y2hTZXQgcHMsIFBhdGNoU2V0SW5mbyBpbmZvLAotICAgICAgU2V0PEFjY291bnQuSWQ+IHdhbnRSZXZpZXdlcnMsIFNldDxBY2NvdW50LklkPiBleGlzdGluZ1Jldmlld2VycykKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIExpc3Q8QXBwcm92YWxUeXBlPiBhbGxUeXBlcyA9IGFwcHJvdmFsVHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpOworICBwdWJsaWMgdm9pZCBhZGRSZXZpZXdlcnMoUmV2aWV3RGIgZGIsIExhYmVsVHlwZXMgbGFiZWxUeXBlcywgQ2hhbmdlIGNoYW5nZSwKKyAgICAgIFBhdGNoU2V0IHBzLCBQYXRjaFNldEluZm8gaW5mbywgU2V0PElkPiB3YW50UmV2aWV3ZXJzLAorICAgICAgU2V0PEFjY291bnQuSWQ+IGV4aXN0aW5nUmV2aWV3ZXJzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBMaXN0PExhYmVsVHlwZT4gYWxsVHlwZXMgPSBsYWJlbFR5cGVzLmdldExhYmVsVHlwZXMoKTsKICAgICBpZiAoYWxsVHlwZXMuaXNFbXB0eSgpKSB7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTM4LDEwICsxMjMsMTAgQEAKICAgICBuZWVkLnJlbW92ZUFsbChleGlzdGluZ1Jldmlld2Vycyk7CiAKICAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGNlbGxzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KG5lZWQuc2l6ZSgpKTsKLSAgICBBcHByb3ZhbENhdGVnb3J5LklkIGNhdElkID0gYWxsVHlwZXMuZ2V0KGFsbFR5cGVzLnNpemUoKSAtIDEpLmdldENhdGVnb3J5KCkuZ2V0SWQoKTsKKyAgICBMYWJlbElkIGxhYmVsSWQgPSBJdGVyYWJsZXMuZ2V0TGFzdChhbGxUeXBlcykuZ2V0TGFiZWxJZCgpOwogICAgIGZvciAoQWNjb3VudC5JZCBhY2NvdW50IDogbmVlZCkgewogICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBwc2EgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbCgKLSAgICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkocHMuZ2V0SWQoKSwgYWNjb3VudCwgY2F0SWQpLAorICAgICAgICAgIG5ldyBQYXRjaFNldEFwcHJvdmFsLktleShwcy5nZXRJZCgpLCBhY2NvdW50LCBsYWJlbElkKSwKICAgICAgICAgICAoc2hvcnQpIDApOwogICAgICAgcHNhLmNhY2hlKGNoYW5nZSk7CiAgICAgICBjZWxscy5hZGQocHNhKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ2hhbmdlVXRpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DaGFuZ2VVdGlsLmphdmEKaW5kZXggNTM1YWQ4ZS4uNDFhOTdkMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DaGFuZ2VVdGlsLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DaGFuZ2VVdGlsLmphdmEKQEAgLTE0LDQxICsxNCw0MSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZS5TdGF0dXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFuY2VzdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5UcmFja2luZ0lkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZU1lc3NhZ2VzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuVHJhY2tpbmdGb290ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5UcmFja2luZ0Zvb3RlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5Db21taXRSZWNlaXZlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZU9wOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlYmFzZWRQYXRjaFNldFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVwbHlUb0NoYW5nZVNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Db21taXRNZXNzYWdlRWRpdGVkU2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJldmVydGVkU2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlJlZkNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuSWRHZW5lcmF0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtQ29uY3VycmVuY3lFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKQEAgLTU2LDMxICs1NiwyNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLk1lcmdlU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5UaHJlZVdheU1lcmdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyTGluZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkNoYW5nZUlkVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuTkI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogCiBwdWJsaWMgY2xhc3MgQ2hhbmdlVXRpbCB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENoYW5nZVV0aWwuY2xhc3MpOwotCiAgIHByaXZhdGUgc3RhdGljIGludCB1dWlkUHJlZml4OwogICBwcml2YXRlIHN0YXRpYyBpbnQgdXVpZFNlcTsKIApAQCAtOTUsNyArOTEsMTIgQEAKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZVVVSUQoZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIGZpbmFsIGJ5dGVbXSByYXcgPSBuZXcgYnl0ZVs4XTsKICAgICBmaWxsKHJhdywgZGIpOwotICAgIHJldHVybiBCYXNlNjQuZW5jb2RlQnl0ZXMocmF3KTsKKworICAgIC8vIE1ha2UgdGhlIHJlc3VsdGluZyBiYXNlNjQgc3RyaW5nIG1vcmUgVVJMIGZyaWVuZGx5LgorICAgIHJldHVybiBDaGFyTWF0Y2hlci5pcygnQScpLnRyaW1MZWFkaW5nRnJvbSgKKyAgICAgICAgICAgQ2hhck1hdGNoZXIuaXMoJz0nKS50cmltVHJhaWxpbmdGcm9tKEJhc2U2NC5lbmNvZGVCeXRlcyhyYXcpKSkKKyAgICAgICAgLnJlcGxhY2UoJysnLCAnLicpCisgICAgICAgIC5yZXBsYWNlKCcvJywgJy0nKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZpbGwoYnl0ZVtdIHJhdywgUmV2aWV3RGIgZGIpCkBAIC0xMDUsNyArMTA2LDcgQEAKICAgICAgIHV1aWRTZXEgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICB9CiAgICAgTkIuZW5jb2RlSW50MzIocmF3LCAwLCB1dWlkUHJlZml4KTsKLSAgICBOQi5lbmNvZGVJbnQzMihyYXcsIDQsIHV1aWRTZXEtLSk7CisgICAgTkIuZW5jb2RlSW50MzIocmF3LCA0LCBJZEdlbmVyYXRvci5taXgodXVpZFByZWZpeCwgdXVpZFNlcS0tKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgdG91Y2goZmluYWwgQ2hhbmdlIGNoYW5nZSwgUmV2aWV3RGIgZGIpCkBAIC0xNzYsNyArMTc3LDggQEAKICAgICBkYi50cmFja2luZ0lkcygpLmRlbGV0ZSh0b0RlbGV0ZSk7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE1lcmdlKE1lcmdlT3AuRmFjdG9yeSBvcEZhY3RvcnksIENoYW5nZSBjaGFuZ2UpIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RNZXJnZShNZXJnZU9wLkZhY3Rvcnkgb3BGYWN0b3J5LCBDaGFuZ2UgY2hhbmdlKQorICAgICAgdGhyb3dzIE5vU3VjaFByb2plY3RFeGNlcHRpb24gewogICAgIG9wRmFjdG9yeS5jcmVhdGUoY2hhbmdlLmdldERlc3QoKSkudmVyaWZ5TWVyZ2VhYmlsaXR5KGNoYW5nZSk7CiAgIH0KIApAQCAtMTkzLDI5MCArMTk1LDIxIEBACiAgICAgZGIucGF0Y2hTZXRBbmNlc3RvcnMoKS5pbnNlcnQodG9JbnNlcnQpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlYmFzZXMgYSBjb21taXQKLSAgICoKLSAgICogQHBhcmFtIGdpdCBSZXBvc2l0b3J5IHRvIGZpbmQgY29tbWl0cyBpbgotICAgKiBAcGFyYW0gaW5zZXJ0ZXIgaW5zZXJ0ZXIgdG8gaGFuZGxlIG5ldyB0cmVlcyBhbmQgYmxvYnMuCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgY29tbWl0IHRvIHJlYmFzZQotICAgKiBAcGFyYW0gYmFzZSBCYXNlIHRvIHJlYmFzZSBhZ2FpbnN0Ci0gICAqIEByZXR1cm4gQ29tbWl0QnVpbGRlciB0aGUgbmV3bHkgcmViYXNlZCBjb21taXQKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBNZXJnZWQgZmFpbGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvbW1pdEJ1aWxkZXIgcmViYXNlQ29tbWl0KFJlcG9zaXRvcnkgZ2l0LAotICAgICAgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIFJldkNvbW1pdCBvcmlnaW5hbCwgUmV2Q29tbWl0IGJhc2UsCi0gICAgICBQZXJzb25JZGVudCBjb21taXR0ZXJJZGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgIGlmIChvcmlnaW5hbC5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAiQ29tbWl0cyB3aXRoIG5vIHBhcmVudHMgY2Fubm90IGJlIHJlYmFzZWQgKGlzIHRoaXMgdGhlIGluaXRpYWwgY29tbWl0PykuIik7Ci0gICAgfQotCi0gICAgaWYgKG9yaWdpbmFsLmdldFBhcmVudENvdW50KCkgPiAxKSB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgIlBhdGNoIHNldHMgd2l0aCBtdWx0aXBsZSBwYXJlbnRzIGNhbm5vdCBiZSByZWJhc2VkIChtZXJnZSBjb21taXRzKS4iCi0gICAgICAgICAgICAgICsgIiBQYXJlbnRzOiAiICsgQXJyYXlzLnRvU3RyaW5nKG9yaWdpbmFsLmdldFBhcmVudHMoKSkpOwotICAgIH0KLQotICAgIGZpbmFsIFJldkNvbW1pdCBwYXJlbnRDb21taXQgPSBvcmlnaW5hbC5nZXRQYXJlbnQoMCk7Ci0KLSAgICBpZiAoYmFzZS5lcXVhbHMocGFyZW50Q29tbWl0KSkgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDaGFuZ2UgaXMgYWxyZWFkeSB1cCB0byBkYXRlLiIpOwotICAgIH0KLQotICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG1lcmdlciA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRS5uZXdNZXJnZXIoZ2l0LCB0cnVlKTsKLSAgICBtZXJnZXIuc2V0T2JqZWN0SW5zZXJ0ZXIobmV3IE9iamVjdEluc2VydGVyLkZpbHRlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIE9iamVjdEluc2VydGVyIGRlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gaW5zZXJ0ZXI7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBtZXJnZXIuc2V0QmFzZShwYXJlbnRDb21taXQpOwotICAgIG1lcmdlci5tZXJnZShvcmlnaW5hbCwgYmFzZSk7Ci0KLSAgICBpZiAobWVyZ2VyLmdldFJlc3VsdFRyZWVJZCgpID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAiVGhlIHJlYmFzZSBmYWlsZWQgc2luY2UgY29uZmxpY3RzIG9jY3VyZWQgZHVyaW5nIHRoZSBtZXJnZS4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBDb21taXRCdWlsZGVyIHJlYmFzZWRDb21taXRCdWlsZGVyID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLQotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldFRyZWVJZChtZXJnZXIuZ2V0UmVzdWx0VHJlZUlkKCkpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldFBhcmVudElkKGJhc2UpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldEF1dGhvcihvcmlnaW5hbC5nZXRBdXRob3JJZGVudCgpKTsKLSAgICByZWJhc2VkQ29tbWl0QnVpbGRlci5zZXRNZXNzYWdlKG9yaWdpbmFsLmdldEZ1bGxNZXNzYWdlKCkpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldENvbW1pdHRlcihjb21taXR0ZXJJZGVudCk7Ci0KLSAgICByZXR1cm4gcmViYXNlZENvbW1pdEJ1aWxkZXI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmViYXNlQ2hhbmdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBSZXZpZXdEYiBkYiwKLSAgICAgIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VIb29rUnVubmVyIGhvb2tzLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgUGVyc29uSWRlbnQgbXlJZGVudCwKLSAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCi0gICAgICBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24gewotCi0gICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2wgPQotICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7Ci0KLSAgICBpZiAoIWNoYW5nZUNvbnRyb2wuY2FuUmViYXNlKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJDYW5ub3QgcmViYXNlOiBOZXcgcGF0Y2ggc2V0cyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgYWRkZWQgdG8gY2hhbmdlOiAiCi0gICAgICAgICAgICAgICsgY2hhbmdlSWQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQ2hhbmdlIGNoYW5nZSA9IGNoYW5nZUNvbnRyb2wuZ2V0Q2hhbmdlKCk7Ci0gICAgZmluYWwgUmVwb3NpdG9yeSBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOwotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhnaXQpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXQgb3JpZ2luYWxQYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICAgICAgUmV2Q29tbWl0IGJyYW5jaFRpcENvbW1pdCA9IG51bGw7Ci0KLSAgICAgICAgTGlzdDxQYXRjaFNldEFuY2VzdG9yPiBwYXRjaFNldEFuY2VzdG9ycyA9Ci0gICAgICAgICAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmFuY2VzdG9yc09mKHBhdGNoU2V0SWQpLnRvTGlzdCgpOwotICAgICAgICBpZiAocGF0Y2hTZXRBbmNlc3RvcnMuc2l6ZSgpID4gMSkgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBwYXRjaCBzZXQgeW91IGFyZSB0cnlpbmcgdG8gcmViYXNlIGlzIGRlcGVuZGVudCBvbiBzZXZlcmFsIG90aGVyIHBhdGNoIHNldHM6ICIKLSAgICAgICAgICAgICAgICAgICsgcGF0Y2hTZXRBbmNlc3RvcnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdGNoU2V0QW5jZXN0b3JzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgTGlzdDxQYXRjaFNldD4gZGVwUGF0Y2hTZXRMaXN0ID0gZGIucGF0Y2hTZXRzKCkKLSAgICAgICAgICAgICAgICAgIC5ieVJldmlzaW9uKHBhdGNoU2V0QW5jZXN0b3JzLmdldCgwKS5nZXRBbmNlc3RvclJldmlzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAudG9MaXN0KCk7Ci0gICAgICAgICAgaWYgKCFkZXBQYXRjaFNldExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBQYXRjaFNldCBkZXBQYXRjaFNldCA9IGRlcFBhdGNoU2V0TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgICAgIENoYW5nZS5JZCBkZXBDaGFuZ2VJZCA9IGRlcFBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCk7Ci0gICAgICAgICAgICBDaGFuZ2UgZGVwQ2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChkZXBDaGFuZ2VJZCk7Ci0KLSAgICAgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLkFCQU5ET05FRCkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgYWdhaW5zdCBhbiBhYmFuZG9uZWQgY2hhbmdlOiAiCi0gICAgICAgICAgICAgICAgICArIGRlcENoYW5nZS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgUGF0Y2hTZXQgbGF0ZXN0RGVwUGF0Y2hTZXQgPQotICAgICAgICAgICAgICAgICAgZGIucGF0Y2hTZXRzKCkuZ2V0KGRlcENoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgICAgICAgaWYgKCFkZXBQYXRjaFNldC5nZXRJZCgpLmVxdWFscyhkZXBDaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBicmFuY2hUaXBDb21taXQgPQotICAgICAgICAgICAgICAgICAgICByZXZXYWxrLnBhcnNlQ29tbWl0KE9iamVjdElkCi0gICAgICAgICAgICAgICAgICAgICAgICAuZnJvbVN0cmluZyhsYXRlc3REZXBQYXRjaFNldC5nZXRSZXZpc2lvbigpLmdldCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlIGlzIGFscmVhZHkgYmFzZWQgb24gdGhlIGxhdGVzdCBwYXRjaCBzZXQgb2YgdGhlIGRlcGVuZGVudCBjaGFuZ2UuIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnJhbmNoVGlwQ29tbWl0ID09IG51bGwpIHsKLSAgICAgICAgICAvLyBXZSBhcmUgZGVwZW5kZW50IG9uIGEgbWVyZ2VkIFBhdGNoU2V0IG9yIGhhdmUgbm8gUGF0Y2hTZXQKLSAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXQgYWxsLgotICAgICAgICAgIFJlZiBkZXN0UmVmID0gZ2l0LmdldFJlZihjaGFuZ2UuZ2V0RGVzdCgpLmdldCgpKTsKLSAgICAgICAgICBpZiAoZGVzdFJlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBkZXN0aW5hdGlvbiBicmFuY2ggZG9lcyBub3QgZXhpc3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBjaGFuZ2UuZ2V0RGVzdCgpLmdldCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJhbmNoVGlwQ29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChkZXN0UmVmLmdldE9iamVjdElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgUmV2Q29tbWl0IHJlYmFzZWRDb21taXQ7Ci0gICAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIG9pID0gZ2l0Lm5ld09iamVjdEluc2VydGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgT2JqZWN0SWQgb2xkSWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKG9yaWdpbmFsUGF0Y2hTZXQuZ2V0UmV2aXNpb24oKS5nZXQoKSk7Ci0gICAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBvaS5pbnNlcnQocmViYXNlQ29tbWl0KAotICAgICAgICAgICAgICBnaXQsIG9pLCByZXZXYWxrLnBhcnNlQ29tbWl0KG9sZElkKSwgYnJhbmNoVGlwQ29tbWl0LCBteUlkZW50KSk7Ci0gICAgICAgICAgb2kuZmx1c2goKTsKLSAgICAgICAgICByZWJhc2VkQ29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChuZXdJZCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgb2kucmVsZWFzZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7Ci0gICAgICAgIGZpbmFsIFBhdGNoU2V0IG5ld1BhdGNoU2V0ID0gbmV3IFBhdGNoU2V0KGNoYW5nZS5jdXJyUGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgbmV3UGF0Y2hTZXQuc2V0Q3JlYXRlZE9uKG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLSAgICAgICAgbmV3UGF0Y2hTZXQuc2V0VXBsb2FkZXIodXNlci5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIG5ld1BhdGNoU2V0LnNldFJldmlzaW9uKG5ldyBSZXZJZChyZWJhc2VkQ29tbWl0Lm5hbWUoKSkpOwotICAgICAgICBuZXdQYXRjaFNldC5zZXREcmFmdChvcmlnaW5hbFBhdGNoU2V0LmlzRHJhZnQoKSk7Ci0KLSAgICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvIGluZm8gPQotICAgICAgICAgICAgcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQocmViYXNlZENvbW1pdCwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSk7Ci0KLSAgICAgICAgUmVmVXBkYXRlIHJ1ID0gZ2l0LnVwZGF0ZVJlZihuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgICBydS5zZXRFeHBlY3RlZE9sZE9iamVjdElkKE9iamVjdElkLnplcm9JZCgpKTsKLSAgICAgICAgcnUuc2V0TmV3T2JqZWN0SWQocmViYXNlZENvbW1pdCk7Ci0gICAgICAgIHJ1LmRpc2FibGVSZWZMb2coKTsKLSAgICAgICAgaWYgKHJ1LnVwZGF0ZShyZXZXYWxrKSAhPSBSZWZVcGRhdGUuUmVzdWx0Lk5FVykgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgJXMgaW4gJXM6ICVzIiwgbmV3UGF0Y2hTZXQuZ2V0UmVmTmFtZSgpLAotICAgICAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLCBydS5nZXRSZXN1bHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJlcGxpY2F0aW9uLmZpcmUoY2hhbmdlLmdldFByb2plY3QoKSwgcnUuZ2V0TmFtZSgpKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gb2xkUmV2aWV3ZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gICAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBvbGRDQyA9IFNldHMubmV3SGFzaFNldCgpOwotICAgICAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgQ2hhbmdlIHVwZGF0ZWRDaGFuZ2U7Ci0KLSAgICAgICAgICB1cGRhdGVkQ2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwKLSAgICAgICAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnVwZGF0ZU51bWJlck9mUGF0Y2hTZXRzKG5ld1BhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoYW5nZSA9IHVwZGF0ZWRDaGFuZ2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNoYW5nZSAlcyBpcyBjbG9zZWQiLCBjaGFuZ2UuZ2V0SWQoKSkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGluc2VydEFuY2VzdG9ycyhkYiwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSwgcmViYXNlZENvbW1pdCk7Ci0gICAgICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdQYXRjaFNldCkpOwotICAgICAgICAgIHVwZGF0ZWRDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZUlkLAotICAgICAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuRFJBRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk5FVyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChudWxsKTsKLSAgICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRDdXJyZW50UGF0Y2hTZXQoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICBpZiAodXBkYXRlZENoYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFuZ2UgPSB1cGRhdGVkQ2hhbmdlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDaGFuZ2UgJXMgd2FzIG1vZGlmaWVkIiwgY2hhbmdlLmdldElkKCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFsc1V0aWwuY29weVZldG9zVG9MYXRlc3RQYXRjaFNldChjaGFuZ2UpKSB7Ci0gICAgICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgb2xkUmV2aWV3ZXJzLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG9sZENDLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPQotICAgICAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlSWQsCi0gICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksIHVzZXIuZ2V0QWNjb3VudElkKCksIHBhdGNoU2V0SWQpOwotICAgICAgICAgIGNtc2cuc2V0TWVzc2FnZSgiUGF0Y2ggU2V0ICIgKyBwYXRjaFNldElkLmdldCgpICsgIjogUmViYXNlZCIpOwotICAgICAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbXNnKSk7Ci0gICAgICAgICAgZGIuY29tbWl0KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgZGIucm9sbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFJlcGxhY2VQYXRjaFNldFNlbmRlciBjbSA9Ci0gICAgICAgICAgICByZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOwotICAgICAgICBjbS5zZXRGcm9tKHVzZXIuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICBjbS5zZXRQYXRjaFNldChuZXdQYXRjaFNldCk7Ci0gICAgICAgIGNtLmFkZFJldmlld2VycyhvbGRSZXZpZXdlcnMpOwotICAgICAgICBjbS5hZGRFeHRyYUNDKG9sZENDKTsKLSAgICAgICAgY20uc2VuZCgpOwotCi0gICAgICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIG5ld1BhdGNoU2V0LCBkYik7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgZ2l0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDaGFuZ2UuSWQgcmV2ZXJ0KGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgUmV2aWV3RGIgZGIsCi0gICAgICBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgUGVyc29uSWRlbnQgbXlJZGVudCkKLSAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCi0gICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlLklkIHJldmVydChSZWZDb250cm9sIHJlZkNvbnRyb2wsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCisgICAgICBJZGVudGlmaWVkVXNlciB1c2VyLCBDb21taXRWYWxpZGF0b3JzIGNvbW1pdFZhbGlkYXRvcnMsIFN0cmluZyBtZXNzYWdlLAorICAgICAgUmV2aWV3RGIgZGIsIFJldmVydGVkU2VuZGVyLkZhY3RvcnkgcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5LAorICAgICAgQ2hhbmdlSG9va3MgaG9va3MsIFJlcG9zaXRvcnkgZ2l0LAorICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgRW1haWxFeGNlcHRpb24sCisgICAgICBPcm1FeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKICAgICBpZiAocGF0Y2ggPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7CiAgICAgfQotCi0gICAgZmluYWwgUmVwb3NpdG9yeSBnaXQ7Ci0gICAgdHJ5IHsKLSAgICAgIGdpdCA9IGdpdE1hbmFnZXIub3BlblJlcG9zaXRvcnkoZGIuY2hhbmdlcygpLmdldChjaGFuZ2VJZCkuZ2V0UHJvamVjdCgpKTsKLSAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCwgZSk7Ci0gICAgfQorICAgIGZpbmFsIENoYW5nZSBjaGFuZ2VUb1JldmVydCA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOwogCiAgICAgZmluYWwgUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsoZ2l0KTsKICAgICB0cnkgewpAQCAtNDk1LDYgKzIyOCwxMiBAQAogICAgICAgcmV2ZXJ0Q29tbWl0QnVpbGRlci5zZXRBdXRob3IoYXV0aG9ySWRlbnQpOwogICAgICAgcmV2ZXJ0Q29tbWl0QnVpbGRlci5zZXRDb21taXR0ZXIobXlJZGVudCk7CiAKKyAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgQ2hhbmdlTWVzc2FnZXMuZ2V0KCkucmV2ZXJ0Q2hhbmdlRGVmYXVsdE1lc3NhZ2UsCisgICAgICAgICAgICBjaGFuZ2VUb1JldmVydC5nZXRTdWJqZWN0KCksIHBhdGNoLmdldFJldmlzaW9uKCkuZ2V0KCkpOworICAgICAgfQorCiAgICAgICBmaW5hbCBPYmplY3RJZCBjb21wdXRlZENoYW5nZUlkID0KICAgICAgICAgICBDaGFuZ2VJZFV0aWwuY29tcHV0ZUNoYW5nZUlkKHBhcmVudFRvQ29tbWl0VG9SZXZlcnQuZ2V0VHJlZSgpLAogICAgICAgICAgICAgICBjb21taXRUb1JldmVydCwgYXV0aG9ySWRlbnQsIG15SWRlbnQsIG1lc3NhZ2UpOwpAQCAtNTE0LDE0ICsyNTMsMjggQEAKICAgICAgICAgICBuZXcgQ2hhbmdlLktleSgiSSIgKyBjb21wdXRlZENoYW5nZUlkLm5hbWUoKSksCiAgICAgICAgICAgbmV3IENoYW5nZS5JZChkYi5uZXh0Q2hhbmdlSWQoKSksCiAgICAgICAgICAgdXNlci5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZUlkKS5nZXREZXN0KCkpOwotICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7CisgICAgICAgICAgY2hhbmdlVG9SZXZlcnQuZ2V0RGVzdCgpKTsKKyAgICAgIGNoYW5nZS5zZXRUb3BpYyhjaGFuZ2VUb1JldmVydC5nZXRUb3BpYygpKTsKIAotICAgICAgZmluYWwgUGF0Y2hTZXQgcHMgPSBuZXcgUGF0Y2hTZXQoY2hhbmdlLmN1cnJQYXRjaFNldElkKCkpOworICAgICAgUGF0Y2hTZXQuSWQgaWQgPQorICAgICAgICAgIG5ldyBQYXRjaFNldC5JZChjaGFuZ2UuZ2V0SWQoKSwgQ2hhbmdlLklOSVRJQUxfUEFUQ0hfU0VUX0lEKTsKKyAgICAgIGZpbmFsIFBhdGNoU2V0IHBzID0gbmV3IFBhdGNoU2V0KGlkKTsKICAgICAgIHBzLnNldENyZWF0ZWRPbihjaGFuZ2UuZ2V0Q3JlYXRlZE9uKCkpOwogICAgICAgcHMuc2V0VXBsb2FkZXIoY2hhbmdlLmdldE93bmVyKCkpOwogICAgICAgcHMuc2V0UmV2aXNpb24obmV3IFJldklkKHJldmVydENvbW1pdC5uYW1lKCkpKTsKIAorICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCBjb21taXRSZWNlaXZlZEV2ZW50ID0KKyAgICAgICAgICBuZXcgQ29tbWl0UmVjZWl2ZWRFdmVudChuZXcgUmVjZWl2ZUNvbW1hbmQoT2JqZWN0SWQuemVyb0lkKCksCisgICAgICAgICAgICAgIHJldmVydENvbW1pdC5nZXRJZCgpLCBwcy5nZXRSZWZOYW1lKCkpLCByZWZDb250cm9sCisgICAgICAgICAgICAgIC5nZXRQcm9qZWN0Q29udHJvbCgpLmdldFByb2plY3QoKSwgcmVmQ29udHJvbC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgICAgIHJldmVydENvbW1pdCwgdXNlcik7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbW1pdFZhbGlkYXRvcnMudmFsaWRhdGVGb3JHZXJyaXRDb21taXRzKGNvbW1pdFJlY2VpdmVkRXZlbnQpOworICAgICAgfSBjYXRjaCAoQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKwogICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChyZXZlcnRDb21taXQsIHBzLmdldElkKCkpKTsKICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOwogCkBAIC01MzQsNyArMjg3LDcgQEAKICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLCBwcy5nZXRSZWZOYW1lKCksCiAgICAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLCBydS5nZXRSZXN1bHQoKSkpOwogICAgICAgfQotICAgICAgcmVwbGljYXRpb24uZmlyZShjaGFuZ2UuZ2V0UHJvamVjdCgpLCBydS5nZXROYW1lKCkpOworICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHJ1KTsKIAogICAgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOwogICAgICAgdHJ5IHsKQEAgLTU2NywxMyArMzIwLDE2NSBAQAogICAgICAgcmV0dXJuIGNoYW5nZS5nZXRJZCgpOwogICAgIH0gZmluYWxseSB7CiAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlLklkIGVkaXRDb21taXRNZXNzYWdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCisgICAgICBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2wsIENvbW1pdFZhbGlkYXRvcnMgY29tbWl0VmFsaWRhdG9ycywKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIGZpbmFsIENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuRmFjdG9yeSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBSZXBvc2l0b3J5IGdpdCwKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgUGVyc29uSWRlbnQgbXlJZGVudCwKKyAgICAgIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCwgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVycykKKyAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKKyAgICBmaW5hbCBQYXRjaFNldCBvcmlnaW5hbFBTID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBhdGNoU2V0SWQpOworICAgIGlmIChvcmlnaW5hbFBTID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOworICAgIH0KKworICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGNvbW1pdCBtZXNzYWdlIGNhbm5vdCBiZSBlbXB0eSIpOworICAgIH0KKworICAgIGZpbmFsIFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGdpdCk7CisgICAgdHJ5IHsKKyAgICAgIFJldkNvbW1pdCBjb21taXQgPQorICAgICAgICAgIHJldldhbGsucGFyc2VDb21taXQoT2JqZWN0SWQuZnJvbVN0cmluZyhvcmlnaW5hbFBTLmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICAgIGlmIChjb21taXQuZ2V0RnVsbE1lc3NhZ2UoKS5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oIk5ldyBjb21taXQgbWVzc2FnZSBjYW5ub3QgYmUgc2FtZSBhcyBleGlzdGluZyBjb21taXQgbWVzc2FnZSIpOworICAgICAgfQorCisgICAgICBEYXRlIG5vdyA9IG15SWRlbnQuZ2V0V2hlbigpOworICAgICAgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOworICAgICAgUGVyc29uSWRlbnQgYXV0aG9ySWRlbnQgPQorICAgICAgICAgIHVzZXIubmV3Q29tbWl0dGVySWRlbnQobm93LCBteUlkZW50LmdldFRpbWVab25lKCkpOworCisgICAgICBDb21taXRCdWlsZGVyIGNvbW1pdEJ1aWxkZXIgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworICAgICAgY29tbWl0QnVpbGRlci5zZXRUcmVlSWQoY29tbWl0LmdldFRyZWUoKSk7CisgICAgICBjb21taXRCdWlsZGVyLnNldFBhcmVudElkcyhjb21taXQuZ2V0UGFyZW50cygpKTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0QXV0aG9yKGNvbW1pdC5nZXRBdXRob3JJZGVudCgpKTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0Q29tbWl0dGVyKGF1dGhvcklkZW50KTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKKworICAgICAgUmV2Q29tbWl0IG5ld0NvbW1pdDsKKyAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIG9pID0gZ2l0Lm5ld09iamVjdEluc2VydGVyKCk7CisgICAgICB0cnkgeworICAgICAgICBPYmplY3RJZCBpZCA9IG9pLmluc2VydChjb21taXRCdWlsZGVyKTsKKyAgICAgICAgb2kuZmx1c2goKTsKKyAgICAgICAgbmV3Q29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChpZCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBvaS5yZWxlYXNlKCk7CisgICAgICB9CisKKyAgICAgIFBhdGNoU2V0LklkIGlkID0gbmV4dFBhdGNoU2V0SWQoZ2l0LCBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICBmaW5hbCBQYXRjaFNldCBuZXdQYXRjaFNldCA9IG5ldyBQYXRjaFNldChpZCk7CisgICAgICBuZXdQYXRjaFNldC5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChub3cuZ2V0VGltZSgpKSk7CisgICAgICBuZXdQYXRjaFNldC5zZXRVcGxvYWRlcih1c2VyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIG5ld1BhdGNoU2V0LnNldFJldmlzaW9uKG5ldyBSZXZJZChuZXdDb21taXQubmFtZSgpKSk7CisgICAgICBuZXdQYXRjaFNldC5zZXREcmFmdChvcmlnaW5hbFBTLmlzRHJhZnQoKSk7CisKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mbyBpbmZvID0KKyAgICAgICAgICBwYXRjaFNldEluZm9GYWN0b3J5LmdldChuZXdDb21taXQsIG5ld1BhdGNoU2V0LmdldElkKCkpOworCisgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IGNvbW1pdFJlY2VpdmVkRXZlbnQgPQorICAgICAgICAgIG5ldyBDb21taXRSZWNlaXZlZEV2ZW50KG5ldyBSZWNlaXZlQ29tbWFuZChPYmplY3RJZC56ZXJvSWQoKSwKKyAgICAgICAgICAgICAgbmV3Q29tbWl0LmdldElkKCksIG5ld1BhdGNoU2V0LmdldFJlZk5hbWUoKSksIHJlZkNvbnRyb2wKKyAgICAgICAgICAgICAgLmdldFByb2plY3RDb250cm9sKCkuZ2V0UHJvamVjdCgpLCByZWZDb250cm9sLmdldFJlZk5hbWUoKSwKKyAgICAgICAgICAgICAgbmV3Q29tbWl0LCB1c2VyKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgY29tbWl0VmFsaWRhdG9ycy52YWxpZGF0ZUZvclJlY2VpdmVDb21taXRzKGNvbW1pdFJlY2VpdmVkRXZlbnQpOworICAgICAgfSBjYXRjaCAoQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKworICAgICAgZmluYWwgUmVmVXBkYXRlIHJ1ID0gZ2l0LnVwZGF0ZVJlZihuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOworICAgICAgcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChPYmplY3RJZC56ZXJvSWQoKSk7CisgICAgICBydS5zZXROZXdPYmplY3RJZChuZXdDb21taXQpOworICAgICAgcnUuZGlzYWJsZVJlZkxvZygpOworICAgICAgaWYgKHJ1LnVwZGF0ZShyZXZXYWxrKSAhPSBSZWZVcGRhdGUuUmVzdWx0Lk5FVykgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLCBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLCBydS5nZXRSZXN1bHQoKSkpOworICAgICAgfQorICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHJ1KTsKKworICAgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgQ2hhbmdlIHVwZGF0ZWRDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZS5nZXRJZCgpKTsKKyAgICAgICAgaWYgKHVwZGF0ZWRDaGFuZ2UgIT0gbnVsbCAmJiB1cGRhdGVkQ2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICAgICAgY2hhbmdlID0gdXBkYXRlZENoYW5nZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiQ2hhbmdlICVzIGlzIGNsb3NlZCIsIGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBDaGFuZ2VVdGlsLmluc2VydEFuY2VzdG9ycyhkYiwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSwgY29tbWl0KTsKKyAgICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdQYXRjaFNldCkpOworICAgICAgICB1cGRhdGVkQ2hhbmdlID0KKyAgICAgICAgICAgIGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlLmdldElkKCksIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmVxdWFscyhwYXRjaFNldElkKSkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgIT0gQ2hhbmdlLlN0YXR1cy5EUkFGVCkgeworICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk5FVyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG51bGwpOworICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRDdXJyZW50UGF0Y2hTZXQoaW5mbyk7CisgICAgICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICBjaGFuZ2UgPSB1cGRhdGVkQ2hhbmdlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJDaGFuZ2UgJXMgd2FzIG1vZGlmaWVkIiwgY2hhbmdlLmdldElkKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFwcHJvdmFsc1V0aWwuY29weVZldG9zVG9QYXRjaFNldChkYiwKKyAgICAgICAgICAgIHJlZkNvbnRyb2wuZ2V0UHJvamVjdENvbnRyb2woKS5nZXRMYWJlbFR5cGVzKCksCisgICAgICAgICAgICBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJMaW5lcyA9IG5ld0NvbW1pdC5nZXRGb290ZXJMaW5lcygpOworICAgICAgICB1cGRhdGVUcmFja2luZ0lkcyhkYiwgY2hhbmdlLCB0cmFja2luZ0Zvb3RlcnMsIGZvb3RlckxpbmVzKTsKKworICAgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPQorICAgICAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UobmV3IENoYW5nZU1lc3NhZ2UuS2V5KGNoYW5nZUlkLAorICAgICAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGIpKSwgdXNlci5nZXRBY2NvdW50SWQoKSwgcGF0Y2hTZXRJZCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiUGF0Y2ggU2V0ICIgKyBuZXdQYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiOiBDb21taXQgbWVzc2FnZSB3YXMgdXBkYXRlZCI7CisgICAgICAgIGNtc2cuc2V0TWVzc2FnZShtc2cpOworICAgICAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oY21zZykpOworICAgICAgICBkYi5jb21taXQoKTsKKworICAgICAgICBmaW5hbCBDb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyIGNtID0gY29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CisgICAgICAgIGNtLnNldEZyb20odXNlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UoY21zZyk7CisgICAgICAgIGNtLnNlbmQoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgICB9CisKKyAgICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIG5ld1BhdGNoU2V0LCBkYik7CisKKyAgICAgIHJldHVybiBjaGFuZ2UuZ2V0SWQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmV2V2Fsay5yZWxlYXNlKCk7CiAgICAgfQogICB9CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURyYWZ0Q2hhbmdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCiAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgZmluYWwgUmV2aWV3RGIgZGIpCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsIGZpbmFsIFJldmlld0RiIGRiKQogICAgICAgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChjaGFuZ2VJZCk7CkBAIC01ODMsNyArNDg4LDcgQEAKIAogICAgIGZvciAoUGF0Y2hTZXQgcHMgOiBkYi5wYXRjaFNldHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkpIHsKICAgICAgIC8vIFRoZXNlIHNob3VsZCBhbGwgYmUgZHJhZnQgcGF0Y2ggc2V0cy4KLSAgICAgIGRlbGV0ZU9ubHlEcmFmdFBhdGNoU2V0KHBzLCBjaGFuZ2UsIGdpdE1hbmFnZXIsIHJlcGxpY2F0aW9uLCBkYik7CisgICAgICBkZWxldGVPbmx5RHJhZnRQYXRjaFNldChwcywgY2hhbmdlLCBnaXRNYW5hZ2VyLCBnaXRSZWZVcGRhdGVkLCBkYik7CiAgICAgfQogCiAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5kZWxldGUoZGIuY2hhbmdlTWVzc2FnZXMoKS5ieUNoYW5nZShjaGFuZ2VJZCkpOwpAQCAtNTk0LDcgKzQ5OSw3IEBACiAKICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZU9ubHlEcmFmdFBhdGNoU2V0KGZpbmFsIFBhdGNoU2V0IHBhdGNoLAogICAgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sIGZpbmFsIFJldmlld0RiIGRiKQorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLCBmaW5hbCBSZXZpZXdEYiBkYikKICAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQgPSBwYXRjaC5nZXRJZCgpOwogICAgIGlmIChwYXRjaCA9PSBudWxsIHx8ICFwYXRjaC5pc0RyYWZ0KCkpIHsKQEAgLTYxNyw3ICs1MjIsNyBAQAogICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHRvIGRlbGV0ZSByZWYgIiArIHBhdGNoLmdldFJlZk5hbWUoKSArCiAgICAgICAgICAgICAgICIgaW4gIiArIHJlcG8uZ2V0RGlyZWN0b3J5KCkgKyAiOiAiICsgdXBkYXRlLmdldFJlc3VsdCgpKTsKICAgICAgIH0KLSAgICAgIHJlcGxpY2F0aW9uLmZpcmUoY2hhbmdlLmdldFByb2plY3QoKSwgdXBkYXRlLmdldE5hbWUoKSk7CisgICAgICBnaXRSZWZVcGRhdGVkLmZpcmUoY2hhbmdlLmdldFByb2plY3QoKSwgdXBkYXRlKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgcmVwby5jbG9zZSgpOwogICAgIH0KQEAgLTYzMSwyNSArNTM2LDYgQEAKICAgICBkYi5wYXRjaFNldHMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhdGNoKSk7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgUmVwbHlUb0NoYW5nZVNlbmRlcj4gdm9pZCB1cGRhdGVkQ2hhbmdlKAotICAgICAgZmluYWwgUmV2aWV3RGIgZGIsIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIGZpbmFsIENoYW5nZSBjaGFuZ2UsCi0gICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2csIFJlcGx5VG9DaGFuZ2VTZW5kZXIuRmFjdG9yeTxUPiBzZW5kZXJGYWN0b3J5KQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNtc2cpKTsKLQotICAgIG5ldyBBcHByb3ZhbHNVdGlsKGRiLCBudWxsKS5zeW5jQ2hhbmdlU3RhdHVzKGNoYW5nZSk7Ci0KLSAgICAvLyBFbWFpbCB0aGUgcmV2aWV3ZXJzCi0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFJlcGx5VG9DaGFuZ2VTZW5kZXIgY20gPSBzZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOwotICAgICAgY20uc2V0RnJvbSh1c2VyLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UoY21zZyk7Ci0gICAgICBjbS5zZW5kKCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIHVwZGF0ZSBmb3IgY2hhbmdlICIgKyBjaGFuZ2UuZ2V0Q2hhbmdlSWQoKSwgZSk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc29ydEtleShsb25nIGxhc3RVcGRhdGVkLCBpbnQgaWQpewogICAgIC8vIFRoZSBlbmNvZGluZyB1c2VzIG1pbnV0ZXMgc2luY2UgV2VkIE9jdCAxIDAwOjAwOjAwIDIwMDggVVRDLgogICAgIC8vIFdlIG92ZXJydW4gYXBwcm94aW1hdGVseSA0LDA4NSB5ZWFycyBsYXRlciwgc28gfjYwOTMuCkBAIC02NjgsNiArNTU0LDIzIEBACiAgICAgYy5zZXRTb3J0S2V5KHNvcnRLZXkobGFzdFVwZGF0ZWQsIGlkKSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIFBhdGNoU2V0LklkIG5leHRQYXRjaFNldElkKE1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcywKKyAgICAgIFBhdGNoU2V0LklkIGlkKSB7CisgICAgUGF0Y2hTZXQuSWQgbmV4dCA9IG5leHRQYXRjaFNldElkKGlkKTsKKyAgICB3aGlsZSAoYWxsUmVmcy5jb250YWluc0tleShuZXh0LnRvUmVmTmFtZSgpKSkgeworICAgICAgbmV4dCA9IG5leHRQYXRjaFNldElkKG5leHQpOworICAgIH0KKyAgICByZXR1cm4gbmV4dDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUGF0Y2hTZXQuSWQgbmV4dFBhdGNoU2V0SWQoUmVwb3NpdG9yeSBnaXQsIFBhdGNoU2V0LklkIGlkKSB7CisgICAgcmV0dXJuIG5leHRQYXRjaFNldElkKGdpdC5nZXRBbGxSZWZzKCksIGlkKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFBhdGNoU2V0LklkIG5leHRQYXRjaFNldElkKFBhdGNoU2V0LklkIGlkKSB7CisgICAgcmV0dXJuIG5ldyBQYXRjaFNldC5JZChpZC5nZXRQYXJlbnRLZXkoKSwgaWQuZ2V0KCkgKyAxKTsKKyAgfQorCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhjaGFyID0KICAgICAgIHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsIC8vCiAgICAgICAgICAgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0N1cnJlbnRVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0N1cnJlbnRVc2VyLmphdmEKaW5kZXggZjA1N2MzYS4uODZhNmVmOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DdXJyZW50VXNlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ3VycmVudFVzZXIuamF2YQpAQCAtMzMsMTUgKzMzLDEyIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDdXJyZW50VXNlciB7CiAgIHByaXZhdGUgZmluYWwgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQWNjZXNzUGF0aCBhY2Nlc3NQYXRoOworICBwcml2YXRlIEFjY2Vzc1BhdGggYWNjZXNzUGF0aCA9IEFjY2Vzc1BhdGguVU5LTk9XTjsKIAogICBwcml2YXRlIENhcGFiaWxpdHlDb250cm9sIGNhcGFiaWxpdGllczsKIAotICBwcm90ZWN0ZWQgQ3VycmVudFVzZXIoCi0gICAgICBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKLSAgICAgIEFjY2Vzc1BhdGggYWNjZXNzUGF0aCkgeworICBwcm90ZWN0ZWQgQ3VycmVudFVzZXIoQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpIHsKICAgICB0aGlzLmNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSA9IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmFjY2Vzc1BhdGggPSBhY2Nlc3NQYXRoOwogICB9CiAKICAgLyoqIEhvdyB0aGlzIHVzZXIgaXMgYWNjZXNzaW5nIHRoZSBHZXJyaXQgQ29kZSBSZXZpZXcgYXBwbGljYXRpb24uICovCkBAIC00OSw2ICs0NiwxMCBAQAogICAgIHJldHVybiBhY2Nlc3NQYXRoOwogICB9CiAKKyAgcHVibGljIHZvaWQgc2V0QWNjZXNzUGF0aChBY2Nlc3NQYXRoIHBhdGgpIHsKKyAgICBhY2Nlc3NQYXRoID0gcGF0aDsKKyAgfQorCiAgIC8qKgogICAgKiBHZXQgdGhlIHNldCBvZiBncm91cHMgdGhlIHVzZXIgaXMgY3VycmVudGx5IGEgbWVtYmVyIG9mLgogICAgKiA8cD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSWRlbnRpZmllZFVzZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSWRlbnRpZmllZFVzZXIuamF2YQppbmRleCA4OWNiYWMxLi4zODI2MjkzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0lkZW50aWZpZWRVc2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9JZGVudGlmaWVkVXNlci5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuT3V0T2ZTY29wZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5Qcm92aWRlcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuU3lzdGVtUmVhZGVyOwpAQCAtOTAsMjAgKzkxLDE5IEBACiAgICAgfQogCiAgICAgcHVibGljIElkZW50aWZpZWRVc2VyIGNyZWF0ZShmaW5hbCBBY2NvdW50LklkIGlkKSB7Ci0gICAgICByZXR1cm4gY3JlYXRlKEFjY2Vzc1BhdGguVU5LTk9XTiwgbnVsbCwgaWQpOworICAgICAgcmV0dXJuIGNyZWF0ZSgoU29ja2V0QWRkcmVzcykgbnVsbCwgaWQpOwogICAgIH0KIAogICAgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBjcmVhdGUoUHJvdmlkZXI8UmV2aWV3RGI+IGRiLCBBY2NvdW50LklkIGlkKSB7Ci0gICAgICByZXR1cm4gbmV3IElkZW50aWZpZWRVc2VyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgQWNjZXNzUGF0aC5VTktOT1dOLAorICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVkVXNlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCiAgICAgICAgICAgYXV0aENvbmZpZywgYW5vbnltb3VzQ293YXJkTmFtZSwgY2Fub25pY2FsVXJsLCByZWFsbSwgYWNjb3VudENhY2hlLAogICAgICAgICAgIGdyb3VwQmFja2VuZCwgbnVsbCwgZGIsIGlkKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgY3JlYXRlKEFjY2Vzc1BhdGggYWNjZXNzUGF0aCwKLSAgICAgICAgUHJvdmlkZXI8U29ja2V0QWRkcmVzcz4gcmVtb3RlUGVlclByb3ZpZGVyLCBBY2NvdW50LklkIGlkKSB7Ci0gICAgICByZXR1cm4gbmV3IElkZW50aWZpZWRVc2VyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgYWNjZXNzUGF0aCwKKyAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgY3JlYXRlKFNvY2tldEFkZHJlc3MgcmVtb3RlUGVlciwgQWNjb3VudC5JZCBpZCkgeworICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVkVXNlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCiAgICAgICAgICAgYXV0aENvbmZpZywgYW5vbnltb3VzQ293YXJkTmFtZSwgY2Fub25pY2FsVXJsLCByZWFsbSwgYWNjb3VudENhY2hlLAotICAgICAgICAgIGdyb3VwQmFja2VuZCwgcmVtb3RlUGVlclByb3ZpZGVyLCBudWxsLCBpZCk7CisgICAgICAgICAgZ3JvdXBCYWNrZW5kLCBQcm92aWRlcnMub2YocmVtb3RlUGVlciksIG51bGwsIGlkKTsKICAgICB9CiAgIH0KIApAQCAtMTQ5LDkgKzE0OSw4IEBACiAgICAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOwogICAgIH0KIAotICAgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBjcmVhdGUoZmluYWwgQWNjZXNzUGF0aCBhY2Nlc3NQYXRoLAotICAgICAgICBmaW5hbCBBY2NvdW50LklkIGlkKSB7Ci0gICAgICByZXR1cm4gbmV3IElkZW50aWZpZWRVc2VyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgYWNjZXNzUGF0aCwKKyAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgY3JlYXRlKEFjY291bnQuSWQgaWQpIHsKKyAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllZFVzZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LAogICAgICAgICAgIGF1dGhDb25maWcsIGFub255bW91c0Nvd2FyZE5hbWUsIGNhbm9uaWNhbFVybCwgcmVhbG0sIGFjY291bnRDYWNoZSwKICAgICAgICAgICBncm91cEJhY2tlbmQsIHJlbW90ZVBlZXJQcm92aWRlciwgZGJQcm92aWRlciwgaWQpOwogICAgIH0KQEAgLTE4Nyw3ICsxODYsNiBAQAogCiAgIHByaXZhdGUgSWRlbnRpZmllZFVzZXIoCiAgICAgICBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEFjY2Vzc1BhdGggYWNjZXNzUGF0aCwKICAgICAgIGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZywKICAgICAgIGZpbmFsIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLAogICAgICAgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiBjYW5vbmljYWxVcmwsCkBAIC0xOTUsNyArMTkzLDcgQEAKICAgICAgIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCiAgICAgICBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U29ja2V0QWRkcmVzcz4gcmVtb3RlUGVlclByb3ZpZGVyLAogICAgICAgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLCBmaW5hbCBBY2NvdW50LklkIGlkKSB7Ci0gICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LCBhY2Nlc3NQYXRoKTsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICAgIHRoaXMuY2Fub25pY2FsVXJsID0gY2Fub25pY2FsVXJsOwogICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOwogICAgIHRoaXMuZ3JvdXBCYWNrZW5kID0gZ3JvdXBCYWNrZW5kOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9JbnRlcm5hbFVzZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSW50ZXJuYWxVc2VyLmphdmEKaW5kZXggZWJhNTljOC4uNmY1NjE4YiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9JbnRlcm5hbFVzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0ludGVybmFsVXNlci5qYXZhCkBAIC0zMSw2ICszMSw4IEBACiAgKiBhbnl0aGluZyBpdCB3YW50cywgYW55dGltZSBpdCB3YW50cywgZ2l2ZW4gdGhlIEpWTSdzIG93biBkaXJlY3QgYWNjZXNzIHRvCiAgKiBkYXRhLiBQbHVnaW5zIG1heSB1c2UgdGhpcyB3aGVuIHRoZXkgbmVlZCB0byBoYXZlIGEgQ3VycmVudFVzZXIgd2l0aCByZWFkCiAgKiBwZXJtaXNzaW9uIG9uIGFueXRoaW5nLgorICoKKyAqIEBzZWUgUGx1Z2luVXNlcgogICovCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxVc2VyIGV4dGVuZHMgQ3VycmVudFVzZXIgewogICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewpAQCAtMzksNyArNDEsNyBAQAogCiAgIEBJbmplY3QKICAgcHJvdGVjdGVkIEludGVybmFsVXNlcihDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSkgewotICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgQWNjZXNzUGF0aC5VTktOT1dOKTsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BlZXJEYWVtb25Vc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BlZXJEYWVtb25Vc2VyLmphdmEKaW5kZXggNzViYTBkNy4uNGQyNmYwMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9QZWVyRGFlbW9uVXNlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvUGVlckRhZW1vblVzZXIuamF2YQpAQCAtNDAsNyArNDAsNyBAQAogICBASW5qZWN0CiAgIHByb3RlY3RlZCBQZWVyRGFlbW9uVXNlcihDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKICAgICAgIEBBc3Npc3RlZCBTb2NrZXRBZGRyZXNzIHBlZXIpIHsKLSAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIEFjY2Vzc1BhdGguU1NIX0NPTU1BTkQpOworICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSk7CiAgICAgdGhpcy5wZWVyID0gcGVlcjsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BsdWdpblVzZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvUGx1Z2luVXNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MGFiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BsdWdpblVzZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworCisvKiogVXNlciBpZGVudGl0eSBmb3IgcGx1Z2luIGNvZGUgdGhhdCBuZWVkcyBhbiBpZGVudGl0eS4gKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5Vc2VyIGV4dGVuZHMgSW50ZXJuYWxVc2VyIHsKKyAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBQbHVnaW5Vc2VyIGNyZWF0ZShTdHJpbmcgcGx1Z2luTmFtZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBwbHVnaW5OYW1lOworCisgIEBJbmplY3QKKyAgcHJvdGVjdGVkIFBsdWdpblVzZXIoCisgICAgICBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSk7CisgICAgdGhpcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgIHJldHVybiAicGx1Z2luICIgKyBwbHVnaW5OYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJQbHVnaW5Vc2VyWyIgKyBwbHVnaW5OYW1lICsgIl0iOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1VybEVuY29kZWQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvVXJsRW5jb2RlZC5qYXZhCmluZGV4IGYxZjZkY2QuLjNhYzZjOTggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvVXJsRW5jb2RlZC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvVXJsRW5jb2RlZC5qYXZhCkBAIC0xNSw4ICsxNSw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKKwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTQ2LDIxICs0NiwxMyBAQAogICAgICAgaWYgKHNlcGFyYXRvciAhPSAwKSB7CiAgICAgICAgIGJ1ZmZlci5hcHBlbmQoc2VwYXJhdG9yKTsKICAgICAgIH0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoZW5jb2RlKGtleSkpOworICAgICAgYnVmZmVyLmFwcGVuZChVcmwuZW5jb2RlKGtleSkpOwogICAgICAgYnVmZmVyLmFwcGVuZCgnPScpOwogICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoZW5jb2RlKHZhbCkpOworICAgICAgICBidWZmZXIuYXBwZW5kKFVybC5lbmNvZGUodmFsKSk7CiAgICAgICB9CiAgICAgICBzZXBhcmF0b3IgPSAnJic7CiAgICAgfQogICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbmNvZGUoZmluYWwgU3RyaW5nIHN0cikgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gVVJMRW5jb2Rlci5lbmNvZGUoc3RyLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZS5qYXZhCmluZGV4IDA1NmJhYmQuLjg2MzA4YTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q2FjaGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENhY2hlLmphdmEKQEAgLTIwLDYgKzIwLDggQEAKIHB1YmxpYyBpbnRlcmZhY2UgQWNjb3VudENhY2hlIHsKICAgcHVibGljIEFjY291bnRTdGF0ZSBnZXQoQWNjb3VudC5JZCBhY2NvdW50SWQpOwogCisgIHB1YmxpYyBBY2NvdW50U3RhdGUgZ2V0SWZQcmVzZW50KEFjY291bnQuSWQgYWNjb3VudElkKTsKKwogICBwdWJsaWMgQWNjb3VudFN0YXRlIGdldEJ5VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKTsKIAogICBwdWJsaWMgdm9pZCBldmljdChBY2NvdW50LklkIGFjY291bnRJZCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENhY2hlSW1wbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZUltcGwuamF2YQppbmRleCA0MjE3ZjlmLi5iNzRkYWE1IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENhY2hlSW1wbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q2FjaGVJbXBsLmphdmEKQEAgLTg3LDYgKzg3LDEwIEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIEFjY291bnRTdGF0ZSBnZXRJZlByZXNlbnQoQWNjb3VudC5JZCBhY2NvdW50SWQpIHsKKyAgICByZXR1cm4gYnlJZC5nZXRJZlByZXNlbnQoYWNjb3VudElkKTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgQWNjb3VudFN0YXRlIGdldEJ5VXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7CiAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q29udHJvbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDb250cm9sLmphdmEKaW5kZXggMzJiNGUyYy4uZjE0OGIzMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDb250cm9sLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDb250cm9sLmphdmEKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgICAgZGVmYXVsdDoKICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmFkIEFjY291bnRWaXNpYmlsaXR5ICIgKyBhY2NvdW50VmlzaWJpbGl0eSk7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY3VycmVudFVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCk7CiAgIH0KIAogICBwcml2YXRlIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzT2YoQWNjb3VudC5JZCBhY2NvdW50KSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudEluZm8uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTY3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudEluZm8uamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50SW5mbyB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9hZGVyIHsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgICAgTG9hZGVyIGNyZWF0ZShib29sZWFuIGRldGFpbGVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKyAgICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRldGFpbGVkOworICAgIHByaXZhdGUgZmluYWwgTWFwPEFjY291bnQuSWQsIEFjY291bnRJbmZvPiBjcmVhdGVkOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxBY2NvdW50SW5mbz4gcHJvdmlkZWQ7CisKKyAgICBASW5qZWN0CisgICAgTG9hZGVyKFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgICAgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKKyAgICAgICAgQEFzc2lzdGVkIGJvb2xlYW4gZGV0YWlsZWQpIHsKKyAgICAgIHRoaXMuZGIgPSBkYjsKKyAgICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOworICAgICAgdGhpcy5kZXRhaWxlZCA9IGRldGFpbGVkOworICAgICAgY3JlYXRlZCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgcHJvdmlkZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjb3VudEluZm8gZ2V0KEFjY291bnQuSWQgaWQpIHsKKyAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgQWNjb3VudEluZm8gaW5mbyA9IGNyZWF0ZWQuZ2V0KGlkKTsKKyAgICAgIGlmIChpbmZvID09IG51bGwpIHsKKyAgICAgICAgaW5mbyA9IG5ldyBBY2NvdW50SW5mbyhpZCk7CisgICAgICAgIGNyZWF0ZWQucHV0KGlkLCBpbmZvKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dChBY2NvdW50SW5mbyBpbmZvKSB7CisgICAgICBwcm92aWRlZC5hZGQoaW5mbyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlsbCgpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgTXVsdGltYXA8QWNjb3VudC5JZCwgQWNjb3VudEluZm8+IG1pc3NpbmcgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICAgIGZvciAoQWNjb3VudEluZm8gaW5mbyA6IEl0ZXJhYmxlcy5jb25jYXQoY3JlYXRlZC52YWx1ZXMoKSwgcHJvdmlkZWQpKSB7CisgICAgICAgIEFjY291bnRTdGF0ZSBzdGF0ZSA9IGFjY291bnRDYWNoZS5nZXRJZlByZXNlbnQoaW5mby5faWQpOworICAgICAgICBpZiAoc3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgIGluZm8uZmlsbChzdGF0ZS5nZXRBY2NvdW50KCksIGRldGFpbGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtaXNzaW5nLnB1dChpbmZvLl9pZCwgaW5mbyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghbWlzc2luZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZm9yIChBY2NvdW50IGFjY291bnQgOiBkYi5nZXQoKS5hY2NvdW50cygpLmdldChtaXNzaW5nLmtleVNldCgpKSkgeworICAgICAgICAgIGZvciAoQWNjb3VudEluZm8gaW5mbyA6IG1pc3NpbmcuZ2V0KGFjY291bnQuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIGluZm8uZmlsbChhY2NvdW50LCBkZXRhaWxlZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmlsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50SW5mbz4gaW5mb3MpCisgICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgZm9yIChBY2NvdW50SW5mbyBpbmZvIDogaW5mb3MpIHsKKyAgICAgICAgcHV0KGluZm8pOworICAgICAgfQorICAgICAgZmlsbCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQWNjb3VudEluZm8gcGFyc2UoQWNjb3VudCBhLCBib29sZWFuIGRldGFpbGVkKSB7CisgICAgQWNjb3VudEluZm8gYWkgPSBuZXcgQWNjb3VudEluZm8oYS5nZXRJZCgpKTsKKyAgICBhaS5maWxsKGEsIGRldGFpbGVkKTsKKyAgICByZXR1cm4gYWk7CisgIH0KKworICBwdWJsaWMgdHJhbnNpZW50IEFjY291bnQuSWQgX2lkOworCisgIHB1YmxpYyBBY2NvdW50SW5mbyhBY2NvdW50LklkIGlkKSB7CisgICAgX2lkID0gaWQ7CisgIH0KKworICBwdWJsaWMgSW50ZWdlciBfYWNjb3VudF9pZDsKKyAgcHVibGljIFN0cmluZyBuYW1lOworICBwdWJsaWMgU3RyaW5nIGVtYWlsOworCisgIHByaXZhdGUgdm9pZCBmaWxsKEFjY291bnQgYWNjb3VudCwgYm9vbGVhbiBkZXRhaWxlZCkgeworICAgIG5hbWUgPSBhY2NvdW50LmdldEZ1bGxOYW1lKCk7CisgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICBfYWNjb3VudF9pZCA9IGFjY291bnQuZ2V0SWQoKS5nZXQoKTsKKyAgICAgIGVtYWlsID0gYWNjb3VudC5nZXRQcmVmZXJyZWRFbWFpbCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRSZXNvbHZlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRSZXNvbHZlci5qYXZhCmluZGV4IGFiZGYyOWUuLjY3ZDg3YjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb2x2ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudFJlc29sdmVyLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBMb2NhdGUgZXhhY3RseSBvbmUgYWNjb3VudCBtYXRjaGluZyB0aGUgbmFtZSBvciBuYW1lL2VtYWlsIHN0cmluZy4KKyAgICogRmluZCBhbGwgYWNjb3VudHMgbWF0Y2hpbmcgdGhlIG5hbWUgb3IgbmFtZS9lbWFpbCBzdHJpbmcuCiAgICAqCiAgICAqIEBwYXJhbSBuYW1lT3JFbWFpbCBhIHN0cmluZyBvZiB0aGUgZm9ybWF0CiAgICAqICAgICAgICAiRnVsbCBOYW1lICZsdDtlbWFpbEBleGFtcGxlJmd0OyIsIGp1c3QgdGhlIGVtYWlsIGFkZHJlc3MKQEAgLTcxLDExICs3MSwyMSBAQAogICBwdWJsaWMgU2V0PEFjY291bnQuSWQ+IGZpbmRBbGwoU3RyaW5nIG5hbWVPckVtYWlsKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICBNYXRjaGVyIG0gPSBQYXR0ZXJuLmNvbXBpbGUoIl4uKiBcXCgoWzEtOV1bMC05XSopXFwpJCIpLm1hdGNoZXIobmFtZU9yRW1haWwpOwogICAgIGlmIChtLm1hdGNoZXMoKSkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihBY2NvdW50LklkLnBhcnNlKG0uZ3JvdXAoMSkpKTsKKyAgICAgIEFjY291bnQuSWQgaWQgPSBBY2NvdW50LklkLnBhcnNlKG0uZ3JvdXAoMSkpOworICAgICAgaWYgKGV4aXN0cyhpZCkpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihpZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBpZiAobmFtZU9yRW1haWwubWF0Y2hlcygiXlsxLTldWzAtOV0qJCIpKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFjY291bnQuSWQucGFyc2UobmFtZU9yRW1haWwpKTsKKyAgICAgIEFjY291bnQuSWQgaWQgPSBBY2NvdW50LklkLnBhcnNlKG5hbWVPckVtYWlsKTsKKyAgICAgIGlmIChleGlzdHMoaWQpKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG5hbWVPckVtYWlsLm1hdGNoZXMoQWNjb3VudC5VU0VSX05BTUVfUEFUVEVSTikpIHsKQEAgLTg4LDYgKzk4LDEwIEBACiAgICAgcmV0dXJuIGZpbmRBbGxCeU5hbWVPckVtYWlsKG5hbWVPckVtYWlsKTsKICAgfQogCisgIHByaXZhdGUgYm9vbGVhbiBleGlzdHMoQWNjb3VudC5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHNjaGVtYS5nZXQoKS5hY2NvdW50cygpLmdldChpZCkgIT0gbnVsbDsKKyAgfQorCiAgIC8qKgogICAgKiBMb2NhdGUgZXhhY3RseSBvbmUgYWNjb3VudCBtYXRjaGluZyB0aGUgbmFtZSBvciBuYW1lL2VtYWlsIHN0cmluZy4KICAgICoKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM0MjNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIEFjY291bnRSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8QWNjb3VudFJlc291cmNlPj4gQUNDT1VOVF9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxBY2NvdW50UmVzb3VyY2U+PigpIHt9OworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8Q2FwYWJpbGl0eT4+IENBUEFCSUxJVFlfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8Q2FwYWJpbGl0eT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyOworCisgIHB1YmxpYyBBY2NvdW50UmVzb3VyY2UoSWRlbnRpZmllZFVzZXIgdXNlcikgeworICAgIHRoaXMudXNlciA9IHVzZXI7CisgIH0KKworICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgZ2V0VXNlcigpIHsKKyAgICByZXR1cm4gdXNlcjsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDYXBhYmlsaXR5IGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2FwYWJpbGl0eTsKKworICAgIENhcGFiaWxpdHkoSWRlbnRpZmllZFVzZXIgdXNlciwgU3RyaW5nIGNhcGFiaWxpdHkpIHsKKyAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICB0aGlzLmNhcGFiaWxpdHkgPSBjYXBhYmlsaXR5OworICAgIH0KKworICAgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBnZXRVc2VyKCkgeworICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYXBhYmlsaXR5KCkgeworICAgICAgcmV0dXJuIGNhcGFiaWxpdHk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzKCkgeworICAgICAgcmV0dXJuIHVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuUGVyZm9ybShnZXRDYXBhYmlsaXR5KCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRzQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDA0NmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudHNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0Q29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50c0NvbGxlY3Rpb24gaW1wbGVtZW50cworICAgIFJlc3RDb2xsZWN0aW9uPFRvcExldmVsUmVzb3VyY2UsIEFjY291bnRSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmOworICBwcml2YXRlIGZpbmFsIEFjY291bnRSZXNvbHZlciByZXNvbHZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q29udHJvbC5GYWN0b3J5IGFjY291bnRDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PEFjY291bnRSZXNvdXJjZT4+IHZpZXdzOworCisgIEBJbmplY3QKKyAgQWNjb3VudHNDb2xsZWN0aW9uKFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmLAorICAgICAgQWNjb3VudFJlc29sdmVyIHJlc29sdmVyLAorICAgICAgQWNjb3VudENvbnRyb2wuRmFjdG9yeSBhY2NvdW50Q29udHJvbEZhY3RvcnksCisgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgIER5bmFtaWNNYXA8UmVzdFZpZXc8QWNjb3VudFJlc291cmNlPj4gdmlld3MpIHsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICB0aGlzLmFjY291bnRDb250cm9sRmFjdG9yeSA9IGFjY291bnRDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLnVzZXJGYWN0b3J5ID0gdXNlckZhY3Rvcnk7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBY2NvdW50UmVzb3VyY2UgcGFyc2UoVG9wTGV2ZWxSZXNvdXJjZSByb290LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSBfcGFyc2UoaWQuZ2V0KCkpOworICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9IGVsc2UgaWYgKCFhY2NvdW50Q29udHJvbEZhY3RvcnkuZ2V0KCkuY2FuU2VlKHVzZXIuZ2V0QWNjb3VudCgpKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFjY291bnRSZXNvdXJjZSh1c2VyKTsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgYSBhY2NvdW50IElEIGZyb20gYSByZXF1ZXN0IGJvZHkgYW5kIHJldHVybnMgdGhlIHVzZXIuCisgICAqCisgICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgYWNjb3VudCwgY2FuIGJlIGEgc3RyaW5nIG9mIHRoZSBmb3JtYXQKKyAgICogICAgICAgICJGdWxsIE5hbWUgPGVtYWlsQGV4YW1wbGUuY29tPiIsIGp1c3QgdGhlIGVtYWlsIGFkZHJlc3MsIGEgZnVsbCBuYW1lCisgICAqICAgICAgICBpZiBpdCBpcyB1bmlxdWUsIGFuIGFjY291bnQgSUQsIGEgdXNlciBuYW1lIG9yICdzZWxmJyBmb3IgdGhlCisgICAqICAgICAgICBjYWxsaW5nIHVzZXIKKyAgICogQHJldHVybiB0aGUgcHJvamVjdAorICAgKiBAdGhyb3dzIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBhY2NvdW50IElEIGNhbm5vdCBiZQorICAgKiAgICAgICAgIHJlc29sdmVkIG9yIGlmIHRoZSBhY2NvdW50IGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIKKyAgICovCisgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBwYXJzZShTdHJpbmcgaWQpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gX3BhcnNlKGlkKTsKKyAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJBY2NvdW50IE5vdCBGb3VuZDogJXMiLCBpZCkpOworICAgIH0KKyAgICByZXR1cm4gdXNlcjsKKyAgfQorCisgIHByaXZhdGUgSWRlbnRpZmllZFVzZXIgX3BhcnNlKFN0cmluZyBpZCkgdGhyb3dzIEF1dGhFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgQ3VycmVudFVzZXIgdXNlciA9IHNlbGYuZ2V0KCk7CisKKyAgICBpZiAoaWQuZXF1YWxzKCJzZWxmIikpIHsKKyAgICAgIGlmICh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKKyAgICAgICAgcmV0dXJuIChJZGVudGlmaWVkVXNlcikgdXNlcjsKKyAgICAgIH0gZWxzZSBpZiAodXNlciBpbnN0YW5jZW9mIEFub255bW91c1VzZXIpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBTZXQ8QWNjb3VudC5JZD4gbWF0Y2hlcyA9IHJlc29sdmVyLmZpbmRBbGwoaWQpOworICAgIGlmIChtYXRjaGVzLnNpemUoKSAhPSAxKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIHVzZXJGYWN0b3J5LmNyZWF0ZShJdGVyYWJsZXMuZ2V0T25seUVsZW1lbnQobWF0Y2hlcykpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxUb3BMZXZlbFJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8QWNjb3VudFJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQXV0aE1ldGhvZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0F1dGhNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYWJkMi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQXV0aE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OwotCi0vKiogTWV0aG9kIGJ5IHdoaWNoIGEgdXNlciBoYXMgYXV0aGVudGljYXRlZCBmb3IgYSBnaXZlbiByZXF1ZXN0LiAqLwotcHVibGljIGVudW0gQXV0aE1ldGhvZCB7Ci0gIC8qKiBUaGUgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCAqLwotICBOT05FLAotCi0gIC8qKiBUaGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIHZpYSBhIGNvb2tpZS4gKi8KLSAgQ09PS0lFLAotCi0gIC8qKiBUaGUgdXNlciBhdXRoZW50aWNhdGVkIHdpdGggYSBwYXNzd29yZCBmb3IgdGhpcyByZXF1ZXN0LiAqLwotICBQQVNTV09SRCwKLQotICAvKiogVGhlIHVzZXIgaGFzIHVzZWQgYSBjcmVkZW50aWFsZXNzIGRldmVsb3BtZW50IGZlYXR1cmUgdG8gbG9naW4uICovCi0gIEJBQ0tET09SOwotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdGllcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTUwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQ2FwYWJpbGl0aWVzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc291cmNlLkNhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitjbGFzcyBDYXBhYmlsaXRpZXMgaW1wbGVtZW50cworICAgIENoaWxkQ29sbGVjdGlvbjxBY2NvdW50UmVzb3VyY2UsIEFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5PiB7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGY7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxBY2NvdW50UmVzb3VyY2UuQ2FwYWJpbGl0eT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdldENhcGFiaWxpdGllcz4gZ2V0OworCisgIEBJbmplY3QKKyAgQ2FwYWJpbGl0aWVzKAorICAgICAgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGYsCisgICAgICBEeW5hbWljTWFwPFJlc3RWaWV3PEFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5Pj4gdmlld3MsCisgICAgICBQcm92aWRlcjxHZXRDYXBhYmlsaXRpZXM+IGdldCkgeworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMuZ2V0ID0gZ2V0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHZXRDYXBhYmlsaXRpZXMgbGlzdCgpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0LmdldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDYXBhYmlsaXR5IHBhcnNlKEFjY291bnRSZXNvdXJjZSBwYXJlbnQsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIGlmIChzZWxmLmdldCgpICE9IHBhcmVudC5nZXRVc2VyKCkKKyAgICAgICAgJiYgIXNlbGYuZ2V0KCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJyZXN0cmljdGVkIHRvIGFkbWluaXN0cmF0b3IiKTsKKyAgICB9CisKKyAgICBTdHJpbmcgbmFtZSA9IGlkLmdldCgpOworICAgIENhcGFiaWxpdHlDb250cm9sIGNhcCA9IHBhcmVudC5nZXRVc2VyKCkuZ2V0Q2FwYWJpbGl0aWVzKCk7CisgICAgaWYgKGNhcC5jYW5QZXJmb3JtKG5hbWUpCisgICAgICAgIHx8IChjYXAuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkgJiYgR2xvYmFsQ2FwYWJpbGl0eS5pc0NhcGFiaWxpdHkobmFtZSkpKSB7CisgICAgICByZXR1cm4gbmV3IEFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5KHBhcmVudC5nZXRVc2VyKCksIG5hbWUpOworICAgIH0KKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8Q2FwYWJpbGl0eT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdHlDb250cm9sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQ2FwYWJpbGl0eUNvbnRyb2wuamF2YQppbmRleCAxNTI0MTg1Li45NDJiMGQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQ2FwYWJpbGl0eUNvbnRyb2wuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQ2FwYWJpbGl0eUNvbnRyb2wuamF2YQpAQCAtMTMwLDEyICsxMzAsMjQgQEAKICAgICAgIHx8IGNhbkFkbWluaXN0cmF0ZVNlcnZlcigpOwogICB9CiAKKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbiBhY2Nlc3MgdGhlIGRhdGFiYXNlICh3aXRoIGdzcWwpLiAqLworICBwdWJsaWMgYm9vbGVhbiBjYW5BY2Nlc3NEYXRhYmFzZSgpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShHbG9iYWxDYXBhYmlsaXR5LkFDQ0VTU19EQVRBQkFTRSk7CisgIH0KKwogICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbiBmb3JjZSByZXBsaWNhdGlvbiB0byBhbnkgY29uZmlndXJlZCBkZXN0aW5hdGlvbi4gKi8KICAgcHVibGljIGJvb2xlYW4gY2FuU3RhcnRSZXBsaWNhdGlvbigpIHsKICAgICByZXR1cm4gY2FuUGVyZm9ybShHbG9iYWxDYXBhYmlsaXR5LlNUQVJUX1JFUExJQ0FUSU9OKQogICAgICAgICB8fCBjYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKTsKICAgfQogCisgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgY2FuIHJ1biB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbi4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuUnVuR0MoKSB7CisgICAgcmV0dXJuIGNhblBlcmZvcm0oR2xvYmFsQ2FwYWJpbGl0eS5SVU5fR0MpCisgICAgICAgIHx8IGNhbkFkbWluaXN0cmF0ZVNlcnZlcigpOworICB9CisKICAgLyoqIEByZXR1cm4gd2hpY2ggcHJpb3JpdHkgcXVldWUgdGhlIHVzZXIncyB0YXNrcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvLiAqLwogICBwdWJsaWMgUXVldWVQcm92aWRlci5RdWV1ZVR5cGUgZ2V0UXVldWVUeXBlKCkgewogICAgIC8vIElmIGEgbm9uLWdlbmVyaWMgZ3JvdXAgKHRoYXQgaXMgbm90IEFub255bW91cyBVc2VycyBvciBSZWdpc3RlcmVkIFVzZXJzKQpAQCAtMTU5LDYgKzE3MSwxMSBAQAogICAgICAgICAgIGNhc2UgQkFUQ0g6CiAgICAgICAgICAgICBiYXRjaCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQUxMT1c6CisgICAgICAgICAgY2FzZSBCTE9DSzoKKyAgICAgICAgICBjYXNlIERFTlk6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DaGFuZ2VVc2VyTmFtZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NoYW5nZVVzZXJOYW1lLmphdmEKaW5kZXggZDZmNDVmNS4uMWI3M2M1NCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NoYW5nZVVzZXJOYW1lLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NoYW5nZVVzZXJOYW1lLmphdmEKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAgICAgICAgIC8vIE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIGhhcyB0aGlzIGlkZW50aXR5LgogICAgICAgICAvLwotICAgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKCk7CisgICAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24obmV3VXNlcm5hbWUpOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEFjY291bnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRBY2NvdW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAyMjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRBY2NvdW50LmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKKworcHVibGljIGNsYXNzIEdldEFjY291bnQgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8QWNjb3VudFJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgQWNjb3VudEluZm8gYXBwbHkoQWNjb3VudFJlc291cmNlIHJzcmMpIHsKKyAgICByZXR1cm4gQWNjb3VudEluZm8ucGFyc2UocnNyYy5nZXRVc2VyKCkuZ2V0QWNjb3VudCgpLCB0cnVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEF2YXRhci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEF2YXRhci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjY1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0QXZhdGFyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNJdGVtOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdmF0YXIuQXZhdGFyUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworY2xhc3MgR2V0QXZhdGFyIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEFjY291bnRSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNJdGVtPEF2YXRhclByb3ZpZGVyPiBhdmF0YXJQcm92aWRlcjsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1zaXplIiwgYWxpYXNlcyA9IHsiLXMifSwKKyAgICAgIHVzYWdlID0gInJlY29tbWVuZGVkIHNpemUgaW4gcGl4ZWxzLCBoZWlnaHQgYW5kIHdpZHRoIikKKyAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICBASW5qZWN0CisgIEdldEF2YXRhcihEeW5hbWljSXRlbTxBdmF0YXJQcm92aWRlcj4gYXZhdGFyUHJvdmlkZXIpIHsKKyAgICB0aGlzLmF2YXRhclByb3ZpZGVyID0gYXZhdGFyUHJvdmlkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3BvbnNlLlJlZGlyZWN0IGFwcGx5KEFjY291bnRSZXNvdXJjZSByc3JjKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIEF2YXRhclByb3ZpZGVyIGltcGwgPSBhdmF0YXJQcm92aWRlci5nZXQoKTsKKyAgICBpZiAoaW1wbCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIFN0cmluZyB1cmwgPSBpbXBsLmdldFVybChyc3JjLmdldFVzZXIoKSwgc2l6ZSk7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eSh1cmwpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QodXJsKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRDYXBhYmlsaXRpZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRDYXBhYmlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIyMWFhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldENhcGFiaWxpdGllcy5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5BQ0NFU1NfREFUQUJBU0U7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX0FDQ09VTlQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX0dST1VQOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9QUk9KRUNUOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkVNQUlMX1JFVklFV0VSUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5GTFVTSF9DQUNIRVM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuS0lMTF9UQVNLOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlBSSU9SSVRZOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlJVTl9HQzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5TVEFSVF9SRVBMSUNBVElPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NBQ0hFUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NPTk5FQ1RJT05TOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlZJRVdfUVVFVUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmluYXJ5UmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc291cmNlLkNhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5RdWV1ZVByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworY2xhc3MgR2V0Q2FwYWJpbGl0aWVzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEFjY291bnRSZXNvdXJjZT4geworICBARGVwcmVjYXRlZAorICBAT3B0aW9uKG5hbWUgPSAiLS1mb3JtYXQiLCB1c2FnZSA9ICIoZGVwcmVjYXRlZCkgb3V0cHV0IGZvcm1hdCIpCisgIHByaXZhdGUgT3V0cHV0Rm9ybWF0IGZvcm1hdDsKKworICBAT3B0aW9uKG5hbWUgPSAiLXEiLCBtZXRhVmFyID0gIkNBUCIsIG11bHRpVmFsdWVkID0gdHJ1ZSwgdXNhZ2UgPSAiQ2FwYWJpbGl0eSB0byBpbnNwZWN0IikKKyAgdm9pZCBhZGRRdWVyeShTdHJpbmcgbmFtZSkgeworICAgIGlmIChxdWVyeSA9PSBudWxsKSB7CisgICAgICBxdWVyeSA9IFNldHMubmV3SGFzaFNldCgpOworICAgIH0KKyAgICBJdGVyYWJsZXMuYWRkQWxsKHF1ZXJ5LCBJdGVyYWJsZXMudHJhbnNmb3JtKAorICAgICAgICBTcGxpdHRlci5vblBhdHRlcm4oIlssIF0iKS5vbWl0RW1wdHlTdHJpbmdzKCkudHJpbVJlc3VsdHMoKS5zcGxpdChuYW1lKSwKKyAgICAgICAgbmV3IEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KFN0cmluZyBpbnB1dCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0LnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgfQorICAgICAgICB9KSk7CisgIH0KKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBxdWVyeTsKKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmOworCisgIEBJbmplY3QKKyAgR2V0Q2FwYWJpbGl0aWVzKFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmKSB7CisgICAgdGhpcy5zZWxmID0gc2VsZjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KEFjY291bnRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgIGlmIChzZWxmLmdldCgpICE9IHJlc291cmNlLmdldFVzZXIoKQorICAgICAgICAmJiAhc2VsZi5nZXQoKS5nZXRDYXBhYmlsaXRpZXMoKS5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInJlc3RyaWN0ZWQgdG8gYWRtaW5pc3RyYXRvciIpOworICAgIH0KKworICAgIENhcGFiaWxpdHlDb250cm9sIGNjID0gcmVzb3VyY2UuZ2V0VXNlcigpLmdldENhcGFiaWxpdGllcygpOworICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gaGF2ZSA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBHbG9iYWxDYXBhYmlsaXR5LmdldEFsbE5hbWVzKCkpIHsKKyAgICAgIGlmICghbmFtZS5lcXVhbHMoUFJJT1JJVFkpICYmIHdhbnQobmFtZSkgJiYgY2MuY2FuUGVyZm9ybShuYW1lKSkgeworICAgICAgICBpZiAoR2xvYmFsQ2FwYWJpbGl0eS5oYXNSYW5nZShuYW1lKSkgeworICAgICAgICAgIGhhdmUucHV0KG5hbWUsIG5ldyBSYW5nZShjYy5nZXRSYW5nZShuYW1lKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhhdmUucHV0KG5hbWUsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaGF2ZS5wdXQoQ1JFQVRFX0FDQ09VTlQsIGNjLmNhbkNyZWF0ZUFjY291bnQoKSk7CisgICAgaGF2ZS5wdXQoQ1JFQVRFX0dST1VQLCBjYy5jYW5DcmVhdGVHcm91cCgpKTsKKyAgICBoYXZlLnB1dChDUkVBVEVfUFJPSkVDVCwgY2MuY2FuQ3JlYXRlUHJvamVjdCgpKTsKKyAgICBoYXZlLnB1dChFTUFJTF9SRVZJRVdFUlMsIGNjLmNhbkVtYWlsUmV2aWV3ZXJzKCkpOworICAgIGhhdmUucHV0KEtJTExfVEFTSywgY2MuY2FuS2lsbFRhc2soKSk7CisgICAgaGF2ZS5wdXQoVklFV19DQUNIRVMsIGNjLmNhblZpZXdDYWNoZXMoKSk7CisgICAgaGF2ZS5wdXQoRkxVU0hfQ0FDSEVTLCBjYy5jYW5GbHVzaENhY2hlcygpKTsKKyAgICBoYXZlLnB1dChWSUVXX0NPTk5FQ1RJT05TLCBjYy5jYW5WaWV3Q29ubmVjdGlvbnMoKSk7CisgICAgaGF2ZS5wdXQoVklFV19RVUVVRSwgY2MuY2FuVmlld1F1ZXVlKCkpOworICAgIGhhdmUucHV0KFJVTl9HQywgY2MuY2FuUnVuR0MoKSk7CisgICAgaGF2ZS5wdXQoU1RBUlRfUkVQTElDQVRJT04sIGNjLmNhblN0YXJ0UmVwbGljYXRpb24oKSk7CisgICAgaGF2ZS5wdXQoQUNDRVNTX0RBVEFCQVNFLCBjYy5jYW5BY2Nlc3NEYXRhYmFzZSgpKTsKKworICAgIFF1ZXVlUHJvdmlkZXIuUXVldWVUeXBlIHF1ZXVlID0gY2MuZ2V0UXVldWVUeXBlKCk7CisgICAgaWYgKHF1ZXVlICE9IFF1ZXVlUHJvdmlkZXIuUXVldWVUeXBlLklOVEVSQUNUSVZFCisgICAgICAgIHx8IChxdWVyeSAhPSBudWxsICYmIHF1ZXJ5LmNvbnRhaW5zKFBSSU9SSVRZKSkpIHsKKyAgICAgIGhhdmUucHV0KFBSSU9SSVRZLCBxdWV1ZSk7CisgICAgfQorCisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gaXRyID0gaGF2ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZSA9IGl0ci5uZXh0KCk7CisgICAgICBpZiAoIXdhbnQoZS5nZXRLZXkoKSkpIHsKKyAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgfSBlbHNlIGlmIChlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuICYmICEoKEJvb2xlYW4pIGUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChmb3JtYXQgPT0gT3V0cHV0Rm9ybWF0LlRFWFQpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGUgOiBoYXZlLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgc2IuYXBwZW5kKGUuZ2V0S2V5KCkpOworICAgICAgICBpZiAoIShlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuKSkgeworICAgICAgICAgIHNiLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICBzYi5hcHBlbmQoZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBCaW5hcnlSZXN1bHQuY3JlYXRlKHNiLnRvU3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gT3V0cHV0Rm9ybWF0LkpTT04ubmV3R3NvbigpLnRvSnNvblRyZWUoCisgICAgICAgIGhhdmUsCisgICAgICAgIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgT2JqZWN0Pj4oKSB7fS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiB3YW50KFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIHF1ZXJ5ID09IG51bGwgfHwgcXVlcnkuY29udGFpbnMobmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJhbmdlIHsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2U7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSBpbnQgbWluOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgaW50IG1heDsKKworICAgIFJhbmdlKFBlcm1pc3Npb25SYW5nZSByKSB7CisgICAgICByYW5nZSA9IHI7CisgICAgICBtaW4gPSByLmdldE1pbigpOworICAgICAgbWF4ID0gci5nZXRNYXgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHJhbmdlLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIENoZWNrT25lIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5PiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcHBseShDYXBhYmlsaXR5IHJlc291cmNlKSB7CisgICAgICByZXR1cm4gQmluYXJ5UmVzdWx0LmNyZWF0ZSgib2tcbiIpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEdyb3Vwcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTRlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0R3JvdXBzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgR2V0R3JvdXBzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEFjY291bnRSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXRHcm91cHMoR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmdyb3VwQ29udHJvbEZhY3RvcnkgPSBncm91cENvbnRyb2xGYWN0b3J5OworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8R3JvdXBJbmZvPiBhcHBseShBY2NvdW50UmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSByZXNvdXJjZS5nZXRVc2VyKCk7CisgICAgQWNjb3VudC5JZCB1c2VySWQgPSB1c2VyLmdldEFjY291bnRJZCgpOworICAgIExpc3Q8R3JvdXBJbmZvPiBncm91cHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIHV1aWQgOiB1c2VyLmdldEVmZmVjdGl2ZUdyb3VwcygpLmdldEtub3duR3JvdXBzKCkpIHsKKyAgICAgIEdyb3VwQ29udHJvbCBjdGw7CisgICAgICB0cnkgeworICAgICAgICBjdGwgPSBncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IodXVpZCk7CisgICAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGN0bC5pc1Zpc2libGUoKSAmJiBjdGwuY2FuU2VlTWVtYmVyKHVzZXJJZCkpIHsKKyAgICAgICAgZ3JvdXBzLmFkZChqc29uLmZvcm1hdChjdGwuZ2V0R3JvdXAoKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ3JvdXBzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBDb250cm9sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBDb250cm9sLmphdmEKaW5kZXggZDliMTJhYy4uMmE4ZTdjOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwQ29udHJvbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cENvbnRyb2wuamF2YQpAQCAtMjEsMTEgKzIxLDM0IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JbnRlcm5hbFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAogLyoqIEFjY2VzcyBjb250cm9sIG1hbmFnZW1lbnQgZm9yIGEgZ3JvdXAgb2YgYWNjb3VudHMgbWFuYWdlZCBpbiBHZXJyaXQuICovCiBwdWJsaWMgY2xhc3MgR3JvdXBDb250cm9sIHsKKworICBAU2luZ2xldG9uCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY0ZhY3RvcnkgeworICAgIHByaXZhdGUgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKworICAgIEBJbmplY3QKKyAgICBHZW5lcmljRmFjdG9yeShmaW5hbCBHcm91cEJhY2tlbmQgZ2IpIHsKKyAgICAgIGdyb3VwQmFja2VuZCA9IGdiOworICAgIH0KKworICAgIHB1YmxpYyBHcm91cENvbnRyb2wgY29udHJvbEZvcihmaW5hbCBDdXJyZW50VXNlciB3aG8sCisgICAgICAgIGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpCisgICAgICAgIHRocm93cyBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwID0gZ3JvdXBCYWNrZW5kLmdldChncm91cElkKTsKKyAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbihncm91cElkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZXcgR3JvdXBDb250cm9sKHdobywgZ3JvdXApOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSB7CiAgICAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlcjsKQEAgLTQ1LDcgKzY4LDcgQEAKICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CiAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbihncm91cElkKTsKICAgICAgIH0KLSAgICAgIHJldHVybiBuZXcgR3JvdXBDb250cm9sKHVzZXIuZ2V0KCksIGdyb3VwKTsKKyAgICAgIHJldHVybiBjb250cm9sRm9yKEdyb3VwRGVzY3JpcHRpb25zLmZvckFjY291bnRHcm91cChncm91cCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBHcm91cENvbnRyb2wgY29udHJvbEZvcihmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKQpAQCAtNTQsMTAgKzc3LDE0IEBACiAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgewogICAgICAgICB0aHJvdyBuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXBJZCk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwQ29udHJvbCh1c2VyLmdldCgpLCBncm91cCk7CisgICAgICByZXR1cm4gY29udHJvbEZvcihncm91cCk7CiAgICAgfQogCi0gICAgcHVibGljIEdyb3VwQ29udHJvbCBjb250cm9sRm9yKGZpbmFsIEFjY291bnRHcm91cCBncm91cCkgeworICAgIHB1YmxpYyBHcm91cENvbnRyb2wgY29udHJvbEZvcihBY2NvdW50R3JvdXAgZ3JvdXApIHsKKyAgICAgIHJldHVybiBjb250cm9sRm9yKEdyb3VwRGVzY3JpcHRpb25zLmZvckFjY291bnRHcm91cChncm91cCkpOworICAgIH0KKworICAgIHB1YmxpYyBHcm91cENvbnRyb2wgY29udHJvbEZvcihHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwKSB7CiAgICAgICByZXR1cm4gbmV3IEdyb3VwQ29udHJvbCh1c2VyLmdldCgpLCBncm91cCk7CiAgICAgfQogCkBAIC02OSw2ICs5NiwxNSBAQAogICAgICAgfQogICAgICAgcmV0dXJuIGM7CiAgICAgfQorCisgICAgcHVibGljIEdyb3VwQ29udHJvbCB2YWxpZGF0ZUZvcihmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cFVVSUQpCisgICAgICAgIHRocm93cyBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBHcm91cENvbnRyb2wgYyA9IGNvbnRyb2xGb3IoZ3JvdXBVVUlEKTsKKyAgICAgIGlmICghYy5pc1Zpc2libGUoKSkgeworICAgICAgICB0aHJvdyBuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXBVVUlEKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgZmluYWwgQ3VycmVudFVzZXIgdXNlcjsKQEAgLTgwLDggKzExNiw4IEBACiAgICAgZ3JvdXAgPSAgZ2Q7CiAgIH0KIAotICBHcm91cENvbnRyb2woQ3VycmVudFVzZXIgd2hvLCBBY2NvdW50R3JvdXAgYWcpIHsKLSAgICB0aGlzKHdobywgR3JvdXBEZXNjcmlwdGlvbnMuZm9yQWNjb3VudEdyb3VwKGFnKSk7CisgIHB1YmxpYyBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdldEdyb3VwKCkgeworICAgIHJldHVybiBncm91cDsKICAgfQogCiAgIHB1YmxpYyBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpIHsKQEAgLTkwLDcgKzEyNiw5IEBACiAKICAgLyoqIENhbiB0aGlzIHVzZXIgc2VlIHRoaXMgZ3JvdXAgZXhpc3RzPyAqLwogICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgcmV0dXJuIGdyb3VwLmlzVmlzaWJsZVRvQWxsKCkKKyAgICBBY2NvdW50R3JvdXAgYWNjb3VudEdyb3VwID0gR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoZ3JvdXApOworICAgIHJldHVybiAoYWNjb3VudEdyb3VwICE9IG51bGwgJiYgYWNjb3VudEdyb3VwLmlzVmlzaWJsZVRvQWxsKCkpCisgICAgICB8fCB1c2VyIGluc3RhbmNlb2YgSW50ZXJuYWxVc2VyCiAgICAgICB8fCB1c2VyLmdldEVmZmVjdGl2ZUdyb3VwcygpLmNvbnRhaW5zKGdyb3VwLmdldEdyb3VwVVVJRCgpKQogICAgICAgfHwgaXNPd25lcigpOwogICB9CkBAIC0xMjMsMTkgKzE2MSwyMSBAQAogICAgIHJldHVybiBjYW5TZWVNZW1iZXJzKCk7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBjYW5BZGRHcm91cChBY2NvdW50R3JvdXAuSWQgaWQpIHsKKyAgcHVibGljIGJvb2xlYW4gY2FuQWRkR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgewogICAgIHJldHVybiBpc093bmVyKCk7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmVHcm91cChBY2NvdW50R3JvdXAuSWQgaWQpIHsKKyAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgewogICAgIHJldHVybiBpc093bmVyKCk7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBjYW5TZWVHcm91cChBY2NvdW50R3JvdXAuSWQgaWQpIHsKKyAgcHVibGljIGJvb2xlYW4gY2FuU2VlR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgewogICAgIHJldHVybiBjYW5TZWVNZW1iZXJzKCk7CiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gY2FuU2VlTWVtYmVycygpIHsKLSAgICByZXR1cm4gZ3JvdXAuaXNWaXNpYmxlVG9BbGwoKSB8fCBpc093bmVyKCk7CisgICAgQWNjb3VudEdyb3VwIGFjY291bnRHcm91cCA9IEdyb3VwRGVzY3JpcHRpb25zLnRvQWNjb3VudEdyb3VwKGdyb3VwKTsKKyAgICByZXR1cm4gKGFjY291bnRHcm91cCAhPSBudWxsICYmIGFjY291bnRHcm91cC5pc1Zpc2libGVUb0FsbCgpKQorICAgICAgICB8fCBpc093bmVyKCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cERldGFpbEZhY3RvcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cERldGFpbEZhY3RvcnkuamF2YQppbmRleCAyZTUwMGJkLi5jYWRlOWM3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBEZXRhaWxGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwRGV0YWlsRmFjdG9yeS5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC04MCwxMCArODAsMTEgQEAKICAgICAgICAgZGV0YWlsLnNldE1lbWJlcnMobG9hZE1lbWJlcnMoKSk7CiAgICAgICAgIGRldGFpbC5zZXRJbmNsdWRlcyhsb2FkSW5jbHVkZXMoKSk7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTWVNURU06CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBkZXRhaWwuc2V0QWNjb3VudHMoYWljLmNyZWF0ZSgpKTsKICAgICBkZXRhaWwuc2V0Q2FuTW9kaWZ5KGNvbnRyb2wuaXNPd25lcigpKTsKLSAgICBkZXRhaWwuc2V0R3JvdXBzKGdpYy5jcmVhdGUoKSk7CiAgICAgcmV0dXJuIGRldGFpbDsKICAgfQogCkBAIC0xMjEsMzYgKzEyMiwzNCBAQAogICAgIHJldHVybiBtZW1iZXJzOwogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PEFjY291bnRHcm91cEluY2x1ZGU+IGxvYWRJbmNsdWRlcygpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZT4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPigpOworICBwcml2YXRlIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gbG9hZEluY2x1ZGVzKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+KCk7CiAKLSAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgbSA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkuYnlHcm91cChncm91cElkKSkgewotICAgICAgaWYgKGNvbnRyb2wuY2FuU2VlR3JvdXAobS5nZXRJbmNsdWRlSWQoKSkpIHsKLSAgICAgICAgZ2ljLndhbnQobS5nZXRJbmNsdWRlSWQoKSk7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIG0gOiBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmJ5R3JvdXAoZ3JvdXBJZCkpIHsKKyAgICAgIGlmIChjb250cm9sLmNhblNlZUdyb3VwKG0uZ2V0SW5jbHVkZVVVSUQoKSkpIHsKKyAgICAgICAgZ2ljLndhbnQobS5nZXRJbmNsdWRlVVVJRCgpKTsKICAgICAgICAgZ3JvdXBzLmFkZChtKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBDb2xsZWN0aW9ucy5zb3J0KGdyb3VwcywgbmV3IENvbXBhcmF0b3I8QWNjb3VudEdyb3VwSW5jbHVkZT4oKSB7Ci0gICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBvMSwKLSAgICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIG8yKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBhID0gZ2ljLmdldChvMS5nZXRJbmNsdWRlSWQoKSk7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBiID0gZ2ljLmdldChvMi5nZXRJbmNsdWRlSWQoKSk7CisgICAgQ29sbGVjdGlvbnMuc29ydChncm91cHMsIG5ldyBDb21wYXJhdG9yPEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+KCkgeworICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgbzEsCisgICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBvMikgeworICAgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGEgPSBnaWMuZ2V0KG8xLmdldEluY2x1ZGVVVUlEKCkpOworICAgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGIgPSBnaWMuZ2V0KG8yLmdldEluY2x1ZGVVVUlEKCkpOwogICAgICAgICByZXR1cm4gbihhKS5jb21wYXJlVG8obihiKSk7CiAgICAgICB9CiAKLSAgICAgIHByaXZhdGUgU3RyaW5nIG4oZmluYWwgQWNjb3VudEdyb3VwIGEpIHsKKyAgICAgIHByaXZhdGUgU3RyaW5nIG4gKEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgYSkgeworICAgICAgICBpZiAoYSA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKICAgICAgICAgU3RyaW5nIG4gPSBhLmdldE5hbWUoKTsKICAgICAgICAgaWYgKG4gIT0gbnVsbCAmJiBuLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgIHJldHVybiBuOwogICAgICAgICB9Ci0KLSAgICAgICAgbiA9IGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgaWYgKG4gIT0gbnVsbCAmJiBuLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGEuZ2V0SWQoKS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gYS5nZXRHcm91cFVVSUQoKS5nZXQoKTsKICAgICAgIH0KICAgICB9KTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGUuamF2YQppbmRleCA0MzJhOGI4Li5kMTMwMjQzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGUuamF2YQpAQCAtMTYsMTIgKzE2LDE5IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqIFRyYWNrcyBncm91cCBpbmNsdXNpb25zIGluIG1lbW9yeSBmb3IgZWZmaWNpZW50IGFjY2Vzcy4gKi8KIHB1YmxpYyBpbnRlcmZhY2UgR3JvdXBJbmNsdWRlQ2FjaGUgewotICBwdWJsaWMgQ29sbGVjdGlvbjxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0QnlJbmNsdWRlKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpOworICAvKiogQHJldHVybiBncm91cHMgZGlyZWN0bHkgYSBtZW1iZXIgb2YgdGhlIHBhc3NlZCBncm91cC4gKi8KKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gbWVtYmVyc09mKEFjY291bnRHcm91cC5VVUlEIGdyb3VwKTsKIAotICBwdWJsaWMgdm9pZCBldmljdEluY2x1ZGUoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCk7CisgIC8qKiBAcmV0dXJuIGFueSBncm91cHMgdGhlIHBhc3NlZCBncm91cCBiZWxvbmdzIHRvLiAqLworICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBtZW1iZXJJbihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKTsKKworICAvKiogQHJldHVybiBzZXQgb2YgYW55IFVVSURzIHRoYXQgYXJlIG5vdCBpbnRlcm5hbCBncm91cHMuICovCisgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGFsbEV4dGVybmFsTWVtYmVycygpOworCisgIHB1YmxpYyB2b2lkIGV2aWN0TWVtYmVyc09mKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpOworICBwdWJsaWMgdm9pZCBldmljdE1lbWJlckluKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpOwogfQotCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmphdmEKaW5kZXggN2ZiYmE0NS4uYmJjZGZhZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlSW1wbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluY2x1ZGVDYWNoZUltcGwuamF2YQpAQCAtMTksNyArMTksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2FjaGUuQ2FjaGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CkBAIC0zMiw3ICszMiw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtNDQsNiArNDMsOCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQogICAgICAgLmdldExvZ2dlcihHcm91cEluY2x1ZGVDYWNoZUltcGwuY2xhc3MpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllJTkNMVURFX05BTUUgPSAiZ3JvdXBzX2J5aW5jbHVkZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTX05BTUUgPSAiZ3JvdXBzX21lbWJlcnMiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfTkFNRSA9ICJncm91cHNfZXh0ZXJuYWwiOwogCiAgIHB1YmxpYyBzdGF0aWMgTW9kdWxlIG1vZHVsZSgpIHsKICAgICByZXR1cm4gbmV3IENhY2hlTW9kdWxlKCkgewpAQCAtNTIsNyArNTMsMTcgQEAKICAgICAgICAgY2FjaGUoQllJTkNMVURFX05BTUUsCiAgICAgICAgICAgICBBY2NvdW50R3JvdXAuVVVJRC5jbGFzcywKICAgICAgICAgICAgIG5ldyBUeXBlTGl0ZXJhbDxTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PigpIHt9KQotICAgICAgICAgIC5sb2FkZXIoQnlJbmNsdWRlTG9hZGVyLmNsYXNzKTsKKyAgICAgICAgICAubG9hZGVyKE1lbWJlckluTG9hZGVyLmNsYXNzKTsKKworICAgICAgICBjYWNoZShNRU1CRVJTX05BTUUsCisgICAgICAgICAgICBBY2NvdW50R3JvdXAuVVVJRC5jbGFzcywKKyAgICAgICAgICAgIG5ldyBUeXBlTGl0ZXJhbDxTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PigpIHt9KQorICAgICAgICAgIC5sb2FkZXIoTWVtYmVyc09mTG9hZGVyLmNsYXNzKTsKKworICAgICAgICBjYWNoZShFWFRFUk5BTF9OQU1FLAorICAgICAgICAgICAgU3RyaW5nLmNsYXNzLAorICAgICAgICAgICAgbmV3IFR5cGVMaXRlcmFsPFNldDxBY2NvdW50R3JvdXAuVVVJRD4+KCkge30pCisgICAgICAgICAgLmxvYWRlcihBbGxFeHRlcm5hbExvYWRlci5jbGFzcyk7CiAKICAgICAgICAgYmluZChHcm91cEluY2x1ZGVDYWNoZUltcGwuY2xhc3MpOwogICAgICAgICBiaW5kKEdyb3VwSW5jbHVkZUNhY2hlLmNsYXNzKS50byhHcm91cEluY2x1ZGVDYWNoZUltcGwuY2xhc3MpOwpAQCAtNjAsMzUgKzcxLDc0IEBACiAgICAgfTsKICAgfQogCi0gIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBieUluY2x1ZGU7CisgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBtZW1iZXJzT2Y7CisgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBtZW1iZXJJbjsKKyAgcHJpdmF0ZSBmaW5hbCBMb2FkaW5nQ2FjaGU8U3RyaW5nLCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBleHRlcm5hbDsKIAogICBASW5qZWN0CiAgIEdyb3VwSW5jbHVkZUNhY2hlSW1wbCgKLSAgICAgIEBOYW1lZChCWUlOQ0xVREVfTkFNRSkgTG9hZGluZ0NhY2hlPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBieUluY2x1ZGUpIHsKLSAgICB0aGlzLmJ5SW5jbHVkZSA9IGJ5SW5jbHVkZTsKKyAgICAgIEBOYW1lZChNRU1CRVJTX05BTUUpIExvYWRpbmdDYWNoZTxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gbWVtYmVyc09mLAorICAgICAgQE5hbWVkKEJZSU5DTFVERV9OQU1FKSBMb2FkaW5nQ2FjaGU8QWNjb3VudEdyb3VwLlVVSUQsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4+IG1lbWJlckluLAorICAgICAgQE5hbWVkKEVYVEVSTkFMX05BTUUpIExvYWRpbmdDYWNoZTxTdHJpbmcsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4+IGV4dGVybmFsKSB7CisgICAgdGhpcy5tZW1iZXJzT2YgPSBtZW1iZXJzT2Y7CisgICAgdGhpcy5tZW1iZXJJbiA9IG1lbWJlckluOworICAgIHRoaXMuZXh0ZXJuYWwgPSBleHRlcm5hbDsKICAgfQogCi0gIHB1YmxpYyBDb2xsZWN0aW9uPEFjY291bnRHcm91cC5VVUlEPiBnZXRCeUluY2x1ZGUoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gbWVtYmVyc09mKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpIHsKICAgICB0cnkgewotICAgICAgcmV0dXJuIGJ5SW5jbHVkZS5nZXQoZ3JvdXBJZCk7CisgICAgICByZXR1cm4gbWVtYmVyc09mLmdldChncm91cElkKTsKKyAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIG1lbWJlcnMgb2YgZ3JvdXAiLCBlKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBtZW1iZXJJbihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBtZW1iZXJJbi5nZXQoZ3JvdXBJZCk7CiAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBpbmNsdWRlZCBncm91cHMiLCBlKTsKICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIGV2aWN0SW5jbHVkZShBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBldmljdE1lbWJlcnNPZihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKSB7CiAgICAgaWYgKGdyb3VwSWQgIT0gbnVsbCkgewotICAgICAgYnlJbmNsdWRlLmludmFsaWRhdGUoZ3JvdXBJZCk7CisgICAgICBtZW1iZXJzT2YuaW52YWxpZGF0ZShncm91cElkKTsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgY2xhc3MgQnlJbmNsdWRlTG9hZGVyIGV4dGVuZHMKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGV2aWN0TWVtYmVySW4oQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkgeworICAgIGlmIChncm91cElkICE9IG51bGwpIHsKKyAgICAgIG1lbWJlckluLmludmFsaWRhdGUoZ3JvdXBJZCk7CisKKyAgICAgIGlmICghQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChncm91cElkKSkgeworICAgICAgICBleHRlcm5hbC5pbnZhbGlkYXRlKEVYVEVSTkFMX05BTUUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBhbGxFeHRlcm5hbE1lbWJlcnMoKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBleHRlcm5hbC5nZXQoRVhURVJOQUxfTkFNRSk7CisgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBzZXQgb2Ygbm9uLWludGVybmFsIGdyb3VwcyIsIGUpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIE1lbWJlcnNPZkxvYWRlciBleHRlbmRzCiAgICAgICBDYWNoZUxvYWRlcjxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gewogICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOwogCiAgICAgQEluamVjdAotICAgIEJ5SW5jbHVkZUxvYWRlcihmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZikgeworICAgIE1lbWJlcnNPZkxvYWRlcihmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZikgewogICAgICAgc2NoZW1hID0gc2Y7CiAgICAgfQogCkBAIC0xMDEsOSArMTUxLDM0IEBACiAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgICAgICAgIH0KIAorICAgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGlkcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgYWdpIDogZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKQorICAgICAgICAgICAgLmJ5R3JvdXAoZ3JvdXAuZ2V0KDApLmdldElkKCkpKSB7CisgICAgICAgICAgaWRzLmFkZChhZ2kuZ2V0SW5jbHVkZVVVSUQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoaWRzKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIE1lbWJlckluTG9hZGVyIGV4dGVuZHMKKyAgICAgIENhY2hlTG9hZGVyPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWE7CisKKyAgICBASW5qZWN0CisgICAgTWVtYmVySW5Mb2FkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YpIHsKKyAgICAgIHNjaGVtYSA9IHNmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGxvYWQoQWNjb3VudEdyb3VwLlVVSUQga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFJldmlld0RiIGRiID0gc2NoZW1hLm9wZW4oKTsKKyAgICAgIHRyeSB7CiAgICAgICAgIFNldDxBY2NvdW50R3JvdXAuSWQ+IGlkcyA9IFNldHMubmV3SGFzaFNldCgpOwotICAgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGUgYWdpIDogZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKQotICAgICAgICAgICAgLmJ5SW5jbHVkZShncm91cC5nZXQoMCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGFnaSA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkKKyAgICAgICAgICAgIC5ieUluY2x1ZGVVVUlEKGtleSkpIHsKICAgICAgICAgICBpZHMuYWRkKGFnaS5nZXRHcm91cElkKCkpOwogICAgICAgICB9CiAKQEAgLTExNyw0ICsxOTIsMzAgQEAKICAgICAgIH0KICAgICB9CiAgIH0KKworICBzdGF0aWMgY2xhc3MgQWxsRXh0ZXJuYWxMb2FkZXIgZXh0ZW5kcworICAgICAgQ2FjaGVMb2FkZXI8U3RyaW5nLCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWE7CisKKyAgICBASW5qZWN0CisgICAgQWxsRXh0ZXJuYWxMb2FkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YpIHsKKyAgICAgIHNjaGVtYSA9IHNmOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGxvYWQoU3RyaW5nIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7CisgICAgICB0cnkgeworICAgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGlkcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgYWdpIDogZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5hbGwoKSkgeworICAgICAgICAgIGlmICghQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChhZ2kuZ2V0SW5jbHVkZVVVSUQoKSkpIHsKKyAgICAgICAgICAgIGlkcy5hZGQoYWdpLmdldEluY2x1ZGVVVUlEKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0LmNvcHlPZihpZHMpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluZm9DYWNoZUZhY3RvcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluZm9DYWNoZUZhY3RvcnkuamF2YQppbmRleCAxOWQ5NTNkLi5lMzQ2ODAxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmZvQ2FjaGVGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5mb0NhY2hlRmFjdG9yeS5qYXZhCkBAIC0xNCwxNCArMTQsMTIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cEluZm9DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIEVmZmljaWVudGx5IGJ1aWxkcyBhIHtAbGluayBHcm91cEluZm9DYWNoZX0uICovCkBAIC0zMCw0NiArMjgsMzUgQEAKICAgICBHcm91cEluZm9DYWNoZUZhY3RvcnkgY3JlYXRlKCk7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBNYXA8QWNjb3VudEdyb3VwLklkLCBBY2NvdW50R3JvdXA+IG91dDsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kOworICBwcml2YXRlIGZpbmFsIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYz4gb3V0OwogCiAgIEBJbmplY3QKLSAgR3JvdXBJbmZvQ2FjaGVGYWN0b3J5KGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSkgewotICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7Ci0gICAgdGhpcy5vdXQgPSBuZXcgSGFzaE1hcDxBY2NvdW50R3JvdXAuSWQsIEFjY291bnRHcm91cD4oKTsKKyAgR3JvdXBJbmZvQ2FjaGVGYWN0b3J5KEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQpIHsKKyAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKKyAgICB0aGlzLm91dCA9IE1hcHMubmV3SGFzaE1hcCgpOwogICB9CiAKICAgLyoqCiAgICAqIEluZGljYXRlIGEgZ3JvdXAgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgb24uCiAgICAqCi0gICAqIEBwYXJhbSBpZCBpZGVudGl0eSB0aGF0IHdpbGwgYmUgbmVlZGVkIGluIHRoZSBmdXR1cmU7IG1heSBiZSBudWxsLgorICAgKiBAcGFyYW0gdXVpZCBpZGVudGl0eSB0aGF0IHdpbGwgYmUgbmVlZGVkIGluIHRoZSBmdXR1cmU7IG1heSBiZSBudWxsLgogICAgKi8KLSAgcHVibGljIHZvaWQgd2FudChmaW5hbCBBY2NvdW50R3JvdXAuSWQgaWQpIHsKLSAgICBpZiAoaWQgIT0gbnVsbCAmJiAhb3V0LmNvbnRhaW5zS2V5KGlkKSkgewotICAgICAgb3V0LnB1dChpZCwgZ3JvdXBDYWNoZS5nZXQoaWQpKTsKKyAgcHVibGljIHZvaWQgd2FudChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgaWYgKHV1aWQgIT0gbnVsbCAmJiAhb3V0LmNvbnRhaW5zS2V5KHV1aWQpKSB7CisgICAgICBvdXQucHV0KHV1aWQsIGdyb3VwQmFja2VuZC5nZXQodXVpZCkpOwogICAgIH0KICAgfQogCiAgIC8qKiBJbmRpY2F0ZSBvbmUgb3IgbW9yZSBncm91cHMgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgb24uICovCi0gIHB1YmxpYyB2b2lkIHdhbnQoZmluYWwgSXRlcmFibGU8QWNjb3VudEdyb3VwLklkPiBpZHMpIHsKLSAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cC5JZCBpZCA6IGlkcykgewotICAgICAgd2FudChpZCk7CisgIHB1YmxpYyB2b2lkIHdhbnQoZmluYWwgSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IHV1aWRzKSB7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkIDogdXVpZHMpIHsKKyAgICAgIHdhbnQodXVpZCk7CiAgICAgfQogICB9CiAKLSAgcHVibGljIEFjY291bnRHcm91cCBnZXQoZmluYWwgQWNjb3VudEdyb3VwLklkIGlkKSB7Ci0gICAgd2FudChpZCk7Ci0gICAgcmV0dXJuIG91dC5nZXQoaWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBHcm91cEluZm9DYWNoZSB3aXRoIHRoZSBjdXJyZW50bHkgbG9hZGVkIEFjY291bnRHcm91cCBlbnRpdGllcy4KLSAgICogKi8KLSAgcHVibGljIEdyb3VwSW5mb0NhY2hlIGNyZWF0ZSgpIHsKLSAgICBmaW5hbCBMaXN0PEdyb3VwSW5mbz4gciA9IG5ldyBBcnJheUxpc3Q8R3JvdXBJbmZvPihvdXQuc2l6ZSgpKTsKLSAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cCBhIDogb3V0LnZhbHVlcygpKSB7Ci0gICAgICByLmFkZChuZXcgR3JvdXBJbmZvKGEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBHcm91cEluZm9DYWNoZShyKTsKKyAgcHVibGljIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ2V0KGZpbmFsIEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICB3YW50KHV1aWQpOworICAgIHJldHVybiBvdXQuZ2V0KHV1aWQpOwogICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwTWVtYmVycy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwTWVtYmVycy5qYXZhCmluZGV4IDg0MjgyYjUuLjA4Y2YxYTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBNZW1iZXJzLmphdmEKQEAgLTE4LDE0ICsxOCwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTMzLDIxICszNCwyMSBAQAogCiBwdWJsaWMgY2xhc3MgR3JvdXBNZW1iZXJzIHsKICAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBHcm91cE1lbWJlcnMgY3JlYXRlKCk7CisgICAgR3JvdXBNZW1iZXJzIGNyZWF0ZShDdXJyZW50VXNlciBjdXJyZW50VXNlcik7CiAgIH0KIAogICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbC5HZW5lcmljRmFjdG9yeSBwcm9qZWN0Q29udHJvbDsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDdXJyZW50VXNlciBjdXJyZW50VXNlcjsKIAogICBASW5qZWN0CiAgIEdyb3VwTWVtYmVycyhmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCiAgICAgICBmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3RvcnksCiAgICAgICBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAogICAgICAgZmluYWwgUHJvamVjdENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgcHJvamVjdENvbnRyb2wsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcikgeworICAgICAgQEFzc2lzdGVkIGZpbmFsIEN1cnJlbnRVc2VyIGN1cnJlbnRVc2VyKSB7CiAgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKICAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKQEAgLTExMSwxMCArMTEyLDEwIEBACiAgICAgICB9CiAgICAgfQogICAgIGlmIChncm91cERldGFpbC5pbmNsdWRlcyAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgZ3JvdXBJbmNsdWRlIDogZ3JvdXBEZXRhaWwuaW5jbHVkZXMpIHsKKyAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBncm91cEluY2x1ZGUgOiBncm91cERldGFpbC5pbmNsdWRlcykgewogICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgaW5jbHVkZWRHcm91cCA9Ci0gICAgICAgICAgICBncm91cENhY2hlLmdldChncm91cEluY2x1ZGUuZ2V0SW5jbHVkZUlkKCkpOwotICAgICAgICBpZiAoIXNlZW4uY29udGFpbnMoaW5jbHVkZWRHcm91cC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgICAgICAgIGdyb3VwQ2FjaGUuZ2V0KGdyb3VwSW5jbHVkZS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgICAgaWYgKGluY2x1ZGVkR3JvdXAgIT0gbnVsbCAmJiAhc2Vlbi5jb250YWlucyhpbmNsdWRlZEdyb3VwLmdldEdyb3VwVVVJRCgpKSkgewogICAgICAgICAgIG1lbWJlcnMuYWRkQWxsKGxpc3RBY2NvdW50cyhpbmNsdWRlZEdyb3VwLmdldEdyb3VwVVVJRCgpLCBwcm9qZWN0LCBzZWVuKSk7CiAgICAgICAgIH0KICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnNoaXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnNoaXAuamF2YQppbmRleCBkNTM2YzA5Li5kN2E5N2ZiIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBNZW1iZXJzaGlwLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwTWVtYmVyc2hpcC5qYXZhCkBAIC00MCw2ICs0MCwyMCBAQAogICBib29sZWFuIGNvbnRhaW5zQW55T2YoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwSWRzKTsKIAogICAvKioKKyAgICogUmV0dXJucyBhIHNldCBjb250YWluaW5nIGFuIGlucHV0IG1lbWJlciBvZiB7QGNvZGUgY29udGFpbnMoaWQpfSBpcyB0cnVlLgorICAgKiA8cD4KKyAgICogVGhpcyBpcyBiYXRjaCBmb3JtIG9mIGNvbnRhaW5zIHRoYXQgcmV0dXJucyBzcGVjaWZpYyBncm91cCBpbmZvcm1hdGlvbi4KKyAgICogSW1wbGVtZW50b3JzIG1heSBpbXBsZW1lbnQgdGhlIG1ldGhvZCBhczoKKyAgICoKKyAgICogPHByZT4KKyAgICogU2V0Jmx0O0FjY291bnRHcm91cC5VVUlEJmd0OyByID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAqIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgaWQgOiBncm91cElkcykKKyAgICogICBpZiAoY29udGFpbnMoaWQpKSByLmFkZChpZCk7CisgICAqIDwvcHJlPgorICAgKi8KKyAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpbnRlcnNlY3Rpb24oSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwSWRzKTsKKworICAvKioKICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGdyb3VwcyB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICogVGhpcyBtYXkgbm90IHJldHVybiBhbGwgZ3JvdXBzIHRoZSB7QGxpbmsgI2NvbnRhaW5zKEFjY291bnRHcm91cC5VVUlEKX0KICAgICogd291bGQgcmV0dXJuIHtAY29kZSB0cnVlfSBmb3IsIGJ1dCB3aWxsIGF0IGxlYXN0IGNvbnRhaW4gYWxsIHRvcCBsZXZlbApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0luY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0luY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcC5qYXZhCmluZGV4IGQ0NDhmZmYuLmIwMjBlMjIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwLmphdmEKQEAgLTE0LDM2ICsxNCw0OSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIENyZWF0ZXMgYSBHcm91cE1lbWJlcnNoaXAgY2hlY2tlciBmb3IgdGhlIGludGVybmFsIGdyb3VwIHN5c3RlbSwgd2hpY2gKLSAqIHN0YXJ0cyB3aXRoIHRoZSBzZWVkIGdyb3VwcyBhbmQgaW5jbHVkZXMgYWxsIGNoaWxkIGdyb3Vwcy4KKyAqIEdyb3VwIG1lbWJlcnNoaXAgY2hlY2tlciBmb3IgdGhlIGludGVybmFsIGdyb3VwIHN5c3RlbS4KKyAqIDxwPgorICogR3JvdXBzIHRoZSB1c2VyIGlzIGRpcmVjdGx5IGEgbWVtYmVyIG9mIGFyZSBwdWxsZWQgZnJvbSB0aGUgaW4tbWVtb3J5CisgKiBBY2NvdW50Q2FjaGUgYnkgd2F5IG9mIHRoZSBJZGVudGlmaWVkVXNlci4gVHJhbnNpdGl2ZSBncm91cCBtZW1iZXJoaXBzIGFyZQorICogcmVzb2x2ZWQgb24gZGVtYW5kIHN0YXJ0aW5nIGZyb20gdGhlIHJlcXVlc3RlZCBncm91cCBhbmQgbG9va2luZyBmb3IgYSBwYXRoCisgKiB0byBhIGdyb3VwIHRoZSB1c2VyIGlzIGEgbWVtYmVyIG9mLiBPdGhlciBncm91cCBiYWNrZW5kcyBhcmUgc3VwcG9ydGVkIGJ5CisgKiByZWN1cnNpdmVseSBpbnZva2luZyB0aGUgdW5pdmVyc2FsIEdyb3VwTWVtYmVyc2hpcC4KICAqLwogcHVibGljIGNsYXNzIEluY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcCBpbXBsZW1lbnRzIEdyb3VwTWVtYmVyc2hpcCB7CiAgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwIGNyZWF0ZShJdGVyYWJsZTxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBJZHMpOworICAgIEluY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcCBjcmVhdGUoSWRlbnRpZmllZFVzZXIgdXNlcik7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZUNhY2hlOwotICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaW5jbHVkZXM7Ci0gIHByaXZhdGUgZmluYWwgUXVldWU8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwUXVldWU7CisgIHByaXZhdGUgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgaW5jbHVkZUNhY2hlOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CisgIHByaXZhdGUgZmluYWwgTWFwPEFjY291bnRHcm91cC5VVUlELCBCb29sZWFuPiBtZW1iZXJPZjsKKyAgcHJpdmF0ZSBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGtub3duR3JvdXBzOwogCiAgIEBJbmplY3QKLSAgSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwKAotICAgICAgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGUsCi0gICAgICBAQXNzaXN0ZWQgSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IHNlZWRHcm91cHMpIHsKLSAgICB0aGlzLmdyb3VwSW5jbHVkZUNhY2hlID0gZ3JvdXBJbmNsdWRlQ2FjaGU7Ci0gICAgdGhpcy5pbmNsdWRlcyA9IFNldHMubmV3SGFzaFNldChzZWVkR3JvdXBzKTsKLSAgICB0aGlzLmdyb3VwUXVldWUgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KHNlZWRHcm91cHMpOworICBJbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAoR3JvdXBJbmNsdWRlQ2FjaGUgaW5jbHVkZUNhY2hlLAorICAgICAgQEFzc2lzdGVkIElkZW50aWZpZWRVc2VyIHVzZXIpIHsKKyAgICB0aGlzLmluY2x1ZGVDYWNoZSA9IGluY2x1ZGVDYWNoZTsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworCisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBncm91cHMgPSB1c2VyLnN0YXRlKCkuZ2V0SW50ZXJuYWxHcm91cHMoKTsKKyAgICBtZW1iZXJPZiA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoZ3JvdXBzLnNpemUoKSk7CisgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBnIDogZ3JvdXBzKSB7CisgICAgICBtZW1iZXJPZi5wdXQoZywgdHJ1ZSk7CisgICAgfQogICB9CiAKICAgQE92ZXJyaWRlCkBAIC01MSw0NCArNjQsODcgQEAKICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAoaW5jbHVkZXMuY29udGFpbnMoaWQpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpbmRJbmNsdWRlZEdyb3VwKENvbGxlY3Rpb25zLnNpbmdsZXRvbihpZCkpOworCisgICAgQm9vbGVhbiBiID0gbWVtYmVyT2YuZ2V0KGlkKTsKKyAgICByZXR1cm4gYiAhPSBudWxsID8gYiA6IGNvbnRhaW5zQW55T2YoSW1tdXRhYmxlU2V0Lm9mKGlkKSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbnlPZihJdGVyYWJsZTxBY2NvdW50R3JvdXAuVVVJRD4gaWRzKSB7Ci0gICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBxdWVyeSA9IFNldHMubmV3SGFzaFNldCgpOwotICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCA6IGlkcykgewotICAgICAgaWYgKGluY2x1ZGVzLmNvbnRhaW5zKGdyb3VwSWQpKSB7CisgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQW55T2YoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IHF1ZXJ5SWRzKSB7CisgICAgLy8gUHJlZmVyIGxvb2t1cCBvZiBhIGNhY2hlZCByZXN1bHQgb3ZlciBleHBhbmRpbmcgaW5jbHVkZXMuCisgICAgYm9vbGVhbiB0cnlFeHBhbmRpbmcgPSBmYWxzZTsKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGlkIDogcXVlcnlJZHMpIHsKKyAgICAgIEJvb2xlYW4gYiA9IG1lbWJlck9mLmdldChpZCk7CisgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgIHRyeUV4cGFuZGluZyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9Ci0gICAgICBxdWVyeS5hZGQoZ3JvdXBJZCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGZpbmRJbmNsdWRlZEdyb3VwKHF1ZXJ5KTsKLSAgfQorICAgIGlmICh0cnlFeHBhbmRpbmcpIHsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgaWQgOiBxdWVyeUlkcykgeworICAgICAgICBpZiAobWVtYmVyT2YuY29udGFpbnNLZXkoaWQpKSB7CisgICAgICAgICAgLy8gTWVtYmVyc2hpcCB3YXMgZWFybGllciBwcm92ZW4gdG8gYmUgZmFsc2UuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotICBwcml2YXRlIGJvb2xlYW4gZmluZEluY2x1ZGVkR3JvdXAoU2V0PEFjY291bnRHcm91cC5VVUlEPiBxdWVyeSkgewotICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICB3aGlsZSAoIWZvdW5kICYmICFncm91cFF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgQWNjb3VudEdyb3VwLlVVSUQgaWQgPSBncm91cFF1ZXVlLnJlbW92ZSgpOwotCi0gICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQgOiBncm91cEluY2x1ZGVDYWNoZS5nZXRCeUluY2x1ZGUoaWQpKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlcy5hZGQoZ3JvdXBJZCkpIHsKLSAgICAgICAgICBncm91cFF1ZXVlLmFkZChncm91cElkKTsKLSAgICAgICAgICBmb3VuZCB8PSBxdWVyeS5jb250YWlucyhncm91cElkKTsKKyAgICAgICAgbWVtYmVyT2YucHV0KGlkLCBmYWxzZSk7CisgICAgICAgIGlmIChzZWFyY2goaW5jbHVkZUNhY2hlLm1lbWJlcnNPZihpZCkpKSB7CisgICAgICAgICAgbWVtYmVyT2YucHV0KGlkLCB0cnVlKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBmb3VuZDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaW50ZXJzZWN0aW9uKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcykgeworICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gciA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgaWQgOiBncm91cElkcykgeworICAgICAgaWYgKGNvbnRhaW5zKGlkKSkgeworICAgICAgICByLmFkZChpZCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIHNlYXJjaChTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGlkcykgeworICAgIHJldHVybiB1c2VyLmdldEVmZmVjdGl2ZUdyb3VwcygpLmNvbnRhaW5zQW55T2YoaWRzKTsKKyAgfQorCisgIHByaXZhdGUgSW1tdXRhYmxlU2V0PEFjY291bnRHcm91cC5VVUlEPiBjb21wdXRlS25vd25Hcm91cHMoKSB7CisgICAgR3JvdXBNZW1iZXJzaGlwIG1lbWJlcnNoaXAgPSB1c2VyLmdldEVmZmVjdGl2ZUdyb3VwcygpOworICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZGlyZWN0ID0gdXNlci5zdGF0ZSgpLmdldEludGVybmFsR3JvdXBzKCk7CisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiByID0gU2V0cy5uZXdIYXNoU2V0KGRpcmVjdCk7CisgICAgTGlzdDxBY2NvdW50R3JvdXAuVVVJRD4gcSA9IExpc3RzLm5ld0FycmF5TGlzdChyKTsKKworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgZyA6IG1lbWJlcnNoaXAuaW50ZXJzZWN0aW9uKAorICAgICAgICBpbmNsdWRlQ2FjaGUuYWxsRXh0ZXJuYWxNZW1iZXJzKCkpKSB7CisgICAgICBpZiAoci5hZGQoZykpIHsKKyAgICAgICAgcS5hZGQoZyk7CisgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgeworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgaWQgPSBxLnJlbW92ZShxLnNpemUoKSAtIDEpOworICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBnIDogaW5jbHVkZUNhY2hlLm1lbWJlckluKGlkKSkgeworICAgICAgICBpZiAoci5hZGQoZykpIHsKKyAgICAgICAgICBxLmFkZChnKTsKKyAgICAgICAgICBtZW1iZXJPZi5wdXQoZywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2Yocik7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0S25vd25Hcm91cHMoKSB7Ci0gICAgZmluZEluY2x1ZGVkR3JvdXAoQ29sbGVjdGlvbnMuPEFjY291bnRHcm91cC5VVUlEPmVtcHR5U2V0KCkpOyAvLyBmaW5kIGFsbAotICAgIHJldHVybiBTZXRzLm5ld0hhc2hTZXQoaW5jbHVkZXMpOworICAgIGlmIChrbm93bkdyb3VwcyA9PSBudWxsKSB7CisgICAgICBrbm93bkdyb3VwcyA9IGNvbXB1dGVLbm93bkdyb3VwcygpOworICAgIH0KKyAgICByZXR1cm4ga25vd25Hcm91cHM7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbnRlcm5hbEdyb3VwQmFja2VuZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0ludGVybmFsR3JvdXBCYWNrZW5kLmphdmEKaW5kZXggYWQ2NTQ5OS4uZDA2ZGI0ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0ludGVybmFsR3JvdXBCYWNrZW5kLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0ludGVybmFsR3JvdXBCYWNrZW5kLmphdmEKQEAgLTI4LDkgKzI4LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIEdyb3VwQmFja2VuZCBmb3IgdGhlIGludGVybmFsIGdyb3VwIHN5c3RlbS4KLSAqLworLyoqIEltcGxlbWVudGF0aW9uIG9mIEdyb3VwQmFja2VuZCBmb3IgdGhlIGludGVybmFsIGdyb3VwIHN5c3RlbS4gKi8KIEBTaW5nbGV0b24KIHB1YmxpYyBjbGFzcyBJbnRlcm5hbEdyb3VwQmFja2VuZCBpbXBsZW1lbnRzIEdyb3VwQmFja2VuZCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPEFjY291bnRHcm91cCwgR3JvdXBSZWZlcmVuY2U+IEFDVF9HUk9VUF9UT19HUk9VUF9SRUYgPQpAQCAtNDUsNyArNDMsNiBAQAogICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBJbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAuRmFjdG9yeSBncm91cE1lbWJlcnNoaXBGYWN0b3J5OwogCi0KICAgQEluamVjdAogICBJbnRlcm5hbEdyb3VwQmFja2VuZChHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5LAogICAgICAgR3JvdXBDYWNoZSBncm91cENhY2hlLApAQCAtODksNiArODYsNiBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgR3JvdXBNZW1iZXJzaGlwIG1lbWJlcnNoaXBzT2YoSWRlbnRpZmllZFVzZXIgdXNlcikgewotICAgIHJldHVybiBncm91cE1lbWJlcnNoaXBGYWN0b3J5LmNyZWF0ZSh1c2VyLnN0YXRlKCkuZ2V0SW50ZXJuYWxHcm91cHMoKSk7CisgICAgcmV0dXJuIGdyb3VwTWVtYmVyc2hpcEZhY3RvcnkuY3JlYXRlKHVzZXIpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvTGlzdEdyb3VwTWVtYmVyc2hpcC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0xpc3RHcm91cE1lbWJlcnNoaXAuamF2YQppbmRleCAzNDZmNDA2Li4xMTg5NDBmIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvTGlzdEdyb3VwTWVtYmVyc2hpcC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9MaXN0R3JvdXBNZW1iZXJzaGlwLmphdmEKQEAgLTI0LDcgKzI0LDYgQEAKICAqIEdyb3VwTWVtYmVyc2hpcCBvdmVyIGFuIGV4cGxpY2l0IGxpc3QuCiAgKi8KIHB1YmxpYyBjbGFzcyBMaXN0R3JvdXBNZW1iZXJzaGlwIGltcGxlbWVudHMgR3JvdXBNZW1iZXJzaGlwIHsKLQogICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzOwogCiAgIHB1YmxpYyBMaXN0R3JvdXBNZW1iZXJzaGlwKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcykgewpAQCAtNDcsNiArNDYsMTEgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpbnRlcnNlY3Rpb24oSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwSWRzKSB7CisgICAgcmV0dXJuIFNldHMuaW50ZXJzZWN0aW9uKEltbXV0YWJsZVNldC5jb3B5T2YoZ3JvdXBJZHMpLCBncm91cHMpOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdldEtub3duR3JvdXBzKCkgewogICAgIHJldHVybiBTZXRzLm5ld0hhc2hTZXQoZ3JvdXBzKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDQ1Zjc1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvdXJjZS5BQ0NPVU5UX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvdXJjZS5DQVBBQklMSVRZX0tJTkQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0QXBpTW9kdWxlOworCitwdWJsaWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgUmVzdEFwaU1vZHVsZSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChBY2NvdW50c0NvbGxlY3Rpb24uY2xhc3MpOworICAgIGJpbmQoQ2FwYWJpbGl0aWVzLmNsYXNzKTsKKworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIEFDQ09VTlRfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgQ0FQQUJJTElUWV9LSU5EKTsKKworICAgIGdldChBQ0NPVU5UX0tJTkQpLnRvKEdldEFjY291bnQuY2xhc3MpOworICAgIGdldChBQ0NPVU5UX0tJTkQsICJhdmF0YXIiKS50byhHZXRBdmF0YXIuY2xhc3MpOworICAgIGNoaWxkKEFDQ09VTlRfS0lORCwgImNhcGFiaWxpdGllcyIpLnRvKENhcGFiaWxpdGllcy5jbGFzcyk7CisgICAgZ2V0KEFDQ09VTlRfS0lORCwgImdyb3VwcyIpLnRvKEdldEdyb3Vwcy5jbGFzcyk7CisgICAgZ2V0KENBUEFCSUxJVFlfS0lORCkudG8oR2V0Q2FwYWJpbGl0aWVzLkNoZWNrT25lLmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1BlcmZvcm1DcmVhdGVHcm91cC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1BlcmZvcm1DcmVhdGVHcm91cC5qYXZhCmluZGV4IDFmZjFhM2UuLjhiOTY2Y2IgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtQ3JlYXRlR3JvdXAuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvUGVyZm9ybUNyZWF0ZUdyb3VwLmphdmEKQEAgLTE4LDggKzE4LDggQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE5hbWU7CkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBQZXJmb3JtQ3JlYXRlR3JvdXAgewpAQCAtODUsMTEgKzg0LDExIEBACiAgICAqICAgICAgICAgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgKiBAdGhyb3dzIFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gdXNlciBjYW5ub3QgY3JlYXRlIGEgZ3JvdXAuCiAgICAqLwotICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGNyZWF0ZUdyb3VwKGZpbmFsIFN0cmluZyBncm91cE5hbWUsCisgIHB1YmxpYyBBY2NvdW50R3JvdXAgY3JlYXRlR3JvdXAoZmluYWwgU3RyaW5nIGdyb3VwTmFtZSwKICAgICAgIGZpbmFsIFN0cmluZyBncm91cERlc2NyaXB0aW9uLCBmaW5hbCBib29sZWFuIHZpc2libGVUb0FsbCwKICAgICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBvd25lckdyb3VwSWQsCiAgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50LklkPiBpbml0aWFsTWVtYmVycywKLSAgICAgIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEFjY291bnRHcm91cC5JZD4gaW5pdGlhbEdyb3VwcykKKyAgICAgIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEFjY291bnRHcm91cC5VVUlEPiBpbml0aWFsR3JvdXBzKQogICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLCBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIHsKICAgICBpZiAoIWN1cnJlbnRVc2VyLmdldENhcGFiaWxpdGllcygpLmNhbkNyZWF0ZUdyb3VwKCkpIHsKICAgICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCkBAIC0xMjEsNyArMTIwLDcgQEAKICAgICB0cnkgewogICAgICAgZGIuYWNjb3VudEdyb3VwTmFtZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGduKSk7CiAgICAgfSBjYXRjaCAoT3JtRHVwbGljYXRlS2V5RXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKTsKKyAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oZ3JvdXBOYW1lKTsKICAgICB9CiAgICAgZGIuYWNjb3VudEdyb3VwcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ3JvdXApKTsKIApAQCAtMTI5LDExICsxMjgsMTIgQEAKIAogICAgIGlmIChpbml0aWFsR3JvdXBzICE9IG51bGwpIHsKICAgICAgIGFkZEdyb3Vwcyhncm91cElkLCBpbml0aWFsR3JvdXBzKTsKKyAgICAgIGdyb3VwSW5jbHVkZUNhY2hlLmV2aWN0TWVtYmVyc09mKHV1aWQpOwogICAgIH0KIAogICAgIGdyb3VwQ2FjaGUub25DcmVhdGVHcm91cChuYW1lS2V5KTsKIAotICAgIHJldHVybiBncm91cElkOworICAgIHJldHVybiBncm91cDsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBhZGRNZW1iZXJzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLApAQCAtMTYwLDI2ICsxNjAsMjUgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBhZGRHcm91cHMoZmluYWwgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQsCi0gICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50R3JvdXAuSWQ+IGdyb3VwcykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPiBpbmNsdWRlTGlzdCA9Ci0gICAgICBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGU+KCk7Ci0gICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQ+IGluY2x1ZGVzQXVkaXQgPQotICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQ+KCk7Ci0gICAgZm9yIChBY2NvdW50R3JvdXAuSWQgaW5jbHVkZUlkIDogZ3JvdXBzKSB7Ci0gICAgICBmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIGdyb3VwSW5jbHVkZSA9Ci0gICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlKG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlLktleShncm91cElkLCBpbmNsdWRlSWQpKTsKKyAgICAgIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEFjY291bnRHcm91cC5VVUlEPiBncm91cHMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gaW5jbHVkZUxpc3QgPQorICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPigpOworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0PiBpbmNsdWRlc0F1ZGl0ID0KKyAgICAgIG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0PigpOworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgaW5jbHVkZVVVSUQgOiBncm91cHMpIHsKKyAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZ3JvdXBJbmNsdWRlID0KKyAgICAgICAgbmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQobmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5KGdyb3VwSWQsIGluY2x1ZGVVVUlEKSk7CiAgICAgICBpbmNsdWRlTGlzdC5hZGQoZ3JvdXBJbmNsdWRlKTsKIAotICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0IGF1ZGl0ID0KLSAgICAgICAgbmV3IEFjY291bnRHcm91cEluY2x1ZGVBdWRpdChncm91cEluY2x1ZGUsIGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCBhdWRpdCA9CisgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQoZ3JvdXBJbmNsdWRlLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CiAgICAgICBpbmNsdWRlc0F1ZGl0LmFkZChhdWRpdCk7CiAgICAgfQotICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkuaW5zZXJ0KGluY2x1ZGVMaXN0KTsKLSAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0F1ZGl0KCkuaW5zZXJ0KGluY2x1ZGVzQXVkaXQpOworICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuaW5zZXJ0KGluY2x1ZGVMaXN0KTsKKyAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZEF1ZGl0KCkuaW5zZXJ0KGluY2x1ZGVzQXVkaXQpOwogCi0gICAgZm9yIChBY2NvdW50R3JvdXAgZ3JvdXAgOiBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KAotICAgICAgICBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuSWQ+KGdyb3VwcykpKSB7Ci0gICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdEluY2x1ZGUoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpOworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA6IGdyb3VwcykgeworICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RNZW1iZXJJbih1dWlkKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtUmVuYW1lR3JvdXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtUmVuYW1lR3JvdXAuamF2YQppbmRleCA0YzcyZDQ5Li4zNjIzY2MzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvUGVyZm9ybVJlbmFtZUdyb3VwLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1BlcmZvcm1SZW5hbWVHcm91cC5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlJlbmFtZUdyb3VwT3A7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUR1cGxpY2F0ZUtleUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtODksMTcgKzg4LDIxIEBACiAgICAgdHJ5IHsKICAgICAgIGZpbmFsIEFjY291bnRHcm91cE5hbWUgaWQgPSBuZXcgQWNjb3VudEdyb3VwTmFtZShrZXksIGdyb3VwSWQpOwogICAgICAgZGIuYWNjb3VudEdyb3VwTmFtZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGlkKSk7Ci0gICAgfSBjYXRjaCAoT3JtRHVwbGljYXRlS2V5RXhjZXB0aW9uIGR1cGVFcnIpIHsKLSAgICAgIC8vIElmIHdlIGFyZSB1c2luZyB0aGlzIGlkZW50aXR5LCBkb24ndCByZXBvcnQgdGhlIGV4Y2VwdGlvbi4KLSAgICAgIC8vCisgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKICAgICAgIEFjY291bnRHcm91cE5hbWUgb3RoZXIgPSBkYi5hY2NvdW50R3JvdXBOYW1lcygpLmdldChrZXkpOwotICAgICAgaWYgKG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0SWQoKS5lcXVhbHMoZ3JvdXBJZCkpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkuY2FsbCgpOwotICAgICAgfQorICAgICAgaWYgKG90aGVyICE9IG51bGwpIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoaXMgaWRlbnRpdHksIGRvbid0IHJlcG9ydCB0aGUgZXhjZXB0aW9uLgorICAgICAgICAvLworICAgICAgICBpZiAob3RoZXIuZ2V0SWQoKS5lcXVhbHMoZ3JvdXBJZCkpIHsKKyAgICAgICAgICByZXR1cm4gZ3JvdXBEZXRhaWxGYWN0b3J5LmNyZWF0ZShncm91cElkKS5jYWxsKCk7CisgICAgICAgIH0KIAotICAgICAgLy8gT3RoZXJ3aXNlLCBzb21lb25lIGVsc2UgaGFzIHRoaXMgaWRlbnRpdHkuCi0gICAgICAvLwotICAgICAgdGhyb3cgbmV3IE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbigpOworICAgICAgICAvLyBPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSBoYXMgdGhpcyBpZGVudGl0eS4KKyAgICAgICAgLy8KKyAgICAgICAgdGhyb3cgbmV3IE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbihuZXdOYW1lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGU7CisgICAgICB9CiAgICAgfQogCiAgICAgZ3JvdXAuc2V0TmFtZUtleShrZXkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1VuaXZlcnNhbEdyb3VwQmFja2VuZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1VuaXZlcnNhbEdyb3VwQmFja2VuZC5qYXZhCmluZGV4IDE5NzQ5NjEuLmQ5YzkyNTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Vbml2ZXJzYWxHcm91cEJhY2tlbmQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvVW5pdmVyc2FsR3JvdXBCYWNrZW5kLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKQEAgLTEyOCwzNCArMTI5LDYwIEBACiAgICAgIHJldHVybiBtLmNvbnRhaW5zKHV1aWQpOwogICAgfQogCi0gICBAT3ZlcnJpZGUKLSAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQW55T2YoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IHV1aWRzKSB7Ci0gICAgIE11bHRpbWFwPEdyb3VwTWVtYmVyc2hpcCwgQWNjb3VudEdyb3VwLlVVSUQ+IGxvb2t1cHMgPQotICAgICAgICAgQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7Ci0gICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA6IHV1aWRzKSB7Ci0gICAgICAgR3JvdXBNZW1iZXJzaGlwIG0gPSBtZW1iZXJzaGlwKHV1aWQpOwotICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgIGxvZy53YXJuKCJVbmtub3duIEdyb3VwTWVtYmVyc2hpcCBmb3IgVVVJRDogIiArIHV1aWQpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICAgfQotICAgICAgIGxvb2t1cHMucHV0KG0sIHV1aWQpOwotICAgICB9Ci0gICAgIGZvciAoTWFwLkVudHJ5PEdyb3VwTWVtYmVyc2hpcCwgQ29sbGVjdGlvbjxBY2NvdW50R3JvdXAuVVVJRD4+IGVudHJ5IDoKLSAgICAgICAgICBsb29rdXBzLmFzTWFwKCkuZW50cnlTZXQoKSkgewotICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5jb250YWluc0FueU9mKGVudHJ5LmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgcmV0dXJuIGZhbHNlOwotICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQW55T2YoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IHV1aWRzKSB7CisgICAgICBNdWx0aW1hcDxHcm91cE1lbWJlcnNoaXAsIEFjY291bnRHcm91cC5VVUlEPiBsb29rdXBzID0KKyAgICAgICAgICBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA6IHV1aWRzKSB7CisgICAgICAgIEdyb3VwTWVtYmVyc2hpcCBtID0gbWVtYmVyc2hpcCh1dWlkKTsKKyAgICAgICAgaWYgKG0gPT0gbnVsbCkgeworICAgICAgICAgIGxvZy53YXJuKCJVbmtub3duIEdyb3VwTWVtYmVyc2hpcCBmb3IgVVVJRDogIiArIHV1aWQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxvb2t1cHMucHV0KG0sIHV1aWQpOworICAgICAgfQorICAgICAgZm9yIChNYXAuRW50cnk8R3JvdXBNZW1iZXJzaGlwLCBDb2xsZWN0aW9uPEFjY291bnRHcm91cC5VVUlEPj4gZW50cnkKKyAgICAgICAgICA6IGxvb2t1cHMgLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICBHcm91cE1lbWJlcnNoaXAgbSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICBDb2xsZWN0aW9uPEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoaWRzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgaWYgKG0uY29udGFpbnMoSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KGlkcykpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobS5jb250YWluc0FueU9mKGlkcykpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgQE92ZXJyaWRlCi0gICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnZXRLbm93bkdyb3VwcygpIHsKLSAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBncm91cHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICAgZm9yIChHcm91cE1lbWJlcnNoaXAgbSA6IG1lbWJlcnNoaXBzLnZhbHVlcygpKSB7Ci0gICAgICAgZ3JvdXBzLmFkZEFsbChtLmdldEtub3duR3JvdXBzKCkpOwotICAgICB9Ci0gICAgIHJldHVybiBncm91cHM7Ci0gICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaW50ZXJzZWN0aW9uKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiB1dWlkcykgeworICAgICAgTXVsdGltYXA8R3JvdXBNZW1iZXJzaGlwLCBBY2NvdW50R3JvdXAuVVVJRD4gbG9va3VwcyA9CisgICAgICAgICAgQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIHV1aWQgOiB1dWlkcykgeworICAgICAgICBHcm91cE1lbWJlcnNoaXAgbSA9IG1lbWJlcnNoaXAodXVpZCk7CisgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICBsb2cud2FybigiVW5rbm93biBHcm91cE1lbWJlcnNoaXAgZm9yIFVVSUQ6ICIgKyB1dWlkKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsb29rdXBzLnB1dChtLCB1dWlkKTsKKyAgICAgIH0KKyAgICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxHcm91cE1lbWJlcnNoaXAsIENvbGxlY3Rpb248QWNjb3VudEdyb3VwLlVVSUQ+PiBlbnRyeQorICAgICAgICAgIDogbG9va3Vwcy5hc01hcCgpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgZ3JvdXBzLmFkZEFsbChlbnRyeS5nZXRLZXkoKS5pbnRlcnNlY3Rpb24oZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIGdyb3VwczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnZXRLbm93bkdyb3VwcygpIHsKKyAgICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKEdyb3VwTWVtYmVyc2hpcCBtIDogbWVtYmVyc2hpcHMudmFsdWVzKCkpIHsKKyAgICAgICAgZ3JvdXBzLmFkZEFsbChtLmdldEtub3duR3JvdXBzKCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGdyb3VwczsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9WaXNpYmxlR3JvdXBzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvVmlzaWJsZUdyb3Vwcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2IyYzgzLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9WaXNpYmxlR3JvdXBzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cExpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgVmlzaWJsZUdyb3VwcyB7Ci0KLSAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBWaXNpYmxlR3JvdXBzIGNyZWF0ZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gaWRlbnRpZmllZFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOwotICBwcml2YXRlIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIG9ubHlWaXNpYmxlVG9BbGw7Ci0gIHByaXZhdGUgQWNjb3VudEdyb3VwLlR5cGUgZ3JvdXBUeXBlOwotCi0gIEBJbmplY3QKLSAgVmlzaWJsZUdyb3VwcyhmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCi0gICAgICBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5KSB7Ci0gICAgdGhpcy5pZGVudGlmaWVkVXNlciA9IGN1cnJlbnRVc2VyOwotICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7Ci0gICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE9ubHlWaXNpYmxlVG9BbGwoZmluYWwgYm9vbGVhbiBvbmx5VmlzaWJsZVRvQWxsKSB7Ci0gICAgdGhpcy5vbmx5VmlzaWJsZVRvQWxsID0gb25seVZpc2libGVUb0FsbDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEdyb3VwVHlwZShmaW5hbCBBY2NvdW50R3JvdXAuVHlwZSBncm91cFR5cGUpIHsKLSAgICB0aGlzLmdyb3VwVHlwZSA9IGdyb3VwVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBHcm91cExpc3QgZ2V0KCkgewotICAgIHJldHVybiBjcmVhdGVHcm91cExpc3QoZmlsdGVyR3JvdXBzKGdyb3VwQ2FjaGUuYWxsKCkpKTsKLSAgfQotCi0gIHB1YmxpYyBHcm91cExpc3QgZ2V0KGZpbmFsIENvbGxlY3Rpb248UHJvamVjdENvbnRyb2w+IHByb2plY3RzKQotICAgICAgdGhyb3dzIE5vU3VjaEdyb3VwRXhjZXB0aW9uIHsKLSAgICBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEFjY291bnRHcm91cD4gZ3JvdXBzID0gTWFwcy5uZXdIYXNoTWFwKCk7Ci0gICAgZm9yIChmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCA6IHByb2plY3RzKSB7Ci0gICAgICBmaW5hbCBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdyb3Vwc1JlZnMgPSBwcm9qZWN0Q29udHJvbC5nZXRBbGxHcm91cHMoKTsKLSAgICAgIGZvciAoZmluYWwgR3JvdXBSZWZlcmVuY2UgZ3JvdXBSZWYgOiBncm91cHNSZWZzKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGdyb3VwUmVmLmdldFVVSUQoKSk7Ci0gICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEdyb3VwRXhjZXB0aW9uKGdyb3VwUmVmLmdldFVVSUQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ3JvdXBzLnB1dChncm91cC5nZXRHcm91cFVVSUQoKSwgZ3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY3JlYXRlR3JvdXBMaXN0KGZpbHRlckdyb3Vwcyhncm91cHMudmFsdWVzKCkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHZpc2libGUgbGlzdCBvZiBrbm93biBncm91cHMgZm9yIHRoZSB1c2VyLiBEZXBlbmRpbmcgb24gdGhlIGdyb3VwCi0gICAqIG1lbWJlcnNoaXAgcmVhbG1zIHN1cHBvcnRlZCwgdGhpcyBtYXkgb25seSByZXR1cm4gYSBzdWJzZXQgb2YgdGhlIGVmZmVjdGl2ZQotICAgKiBncm91cHMuCi0gICAqIEBTZWUgR3JvdXBNZW1iZXJzaGlwI2dldEtub3duR3JvdXBzKCkKLSAgICovCi0gIHB1YmxpYyBHcm91cExpc3QgZ2V0KGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIpIHRocm93cyBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGlkZW50aWZpZWRVc2VyLmdldCgpLmdldEFjY291bnRJZCgpLmVxdWFscyh1c2VyLmdldEFjY291bnRJZCgpKQotICAgICAgICB8fCBpZGVudGlmaWVkVXNlci5nZXQoKS5nZXRDYXBhYmlsaXRpZXMoKS5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgewotICAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBtaW5lID0gdXNlci5nZXRFZmZlY3RpdmVHcm91cHMoKS5nZXRLbm93bkdyb3VwcygpOwotICAgICAgTWFwPEFjY291bnRHcm91cC5VVUlELCBBY2NvdW50R3JvdXA+IGdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cElkIDogbWluZSkgewotICAgICAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSBncm91cENhY2hlLmdldChncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKLSAgICAgICAgICBncm91cHMucHV0KGdyb3VwSWQsIGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGNyZWF0ZUdyb3VwTGlzdChmaWx0ZXJHcm91cHMoZ3JvdXBzLnZhbHVlcygpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbigiR3JvdXBzIG9mIHVzZXIgJyIgKyB1c2VyLmdldEFjY291bnRJZCgpCi0gICAgICAgICAgKyAiJyBhcmUgbm90IHZpc2libGUuIik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0PEFjY291bnRHcm91cD4gZmlsdGVyR3JvdXBzKGZpbmFsIEl0ZXJhYmxlPEFjY291bnRHcm91cD4gZ3JvdXBzKSB7Ci0gICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IGZpbHRlcmVkR3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgZmluYWwgYm9vbGVhbiBpc0FkbWluID0KLSAgICAgICAgaWRlbnRpZmllZFVzZXIuZ2V0KCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCk7Ci0gICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgOiBncm91cHMpIHsKLSAgICAgIGlmICghaXNBZG1pbikgewotICAgICAgICBmaW5hbCBHcm91cENvbnRyb2wgYyA9IGdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cCk7Ci0gICAgICAgIGlmICghYy5pc1Zpc2libGUoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoKG9ubHlWaXNpYmxlVG9BbGwgJiYgIWdyb3VwLmlzVmlzaWJsZVRvQWxsKCkpCi0gICAgICAgICAgfHwgKGdyb3VwVHlwZSAhPSBudWxsICYmICFncm91cFR5cGUuZXF1YWxzKGdyb3VwLmdldFR5cGUoKSkpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZmlsdGVyZWRHcm91cHMuYWRkKGdyb3VwKTsKLSAgICB9Ci0gICAgQ29sbGVjdGlvbnMuc29ydChmaWx0ZXJlZEdyb3VwcywgbmV3IEdyb3VwQ29tcGFyYXRvcigpKTsKLSAgICByZXR1cm4gZmlsdGVyZWRHcm91cHM7Ci0gIH0KLQotICBwcml2YXRlIEdyb3VwTGlzdCBjcmVhdGVHcm91cExpc3QoZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IGdyb3VwcykgewotICAgIHJldHVybiBuZXcgR3JvdXBMaXN0KGdyb3VwcywgaWRlbnRpZmllZFVzZXIuZ2V0KCkKLSAgICAgICAgLmdldENhcGFiaWxpdGllcygpLmNhbkNyZWF0ZUdyb3VwKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FyZ3M0ai9Qcm9qZWN0Q29udHJvbEhhbmRsZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXJnczRqL1Byb2plY3RDb250cm9sSGFuZGxlci5qYXZhCmluZGV4IGRhMDMzZTcuLjdiNDRjMDIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXJnczRqL1Byb2plY3RDb250cm9sSGFuZGxlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXJnczRqL1Byb2plY3RDb250cm9sSGFuZGxlci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFyZ3M0ajsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5Qcm9qZWN0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwpAQCAtNDIsMjMgKzQzLDEyIEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgZmluYWwgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKQogICAgICAgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewotICAgIGZpbmFsIFN0cmluZyB0b2tlbiA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7Ci0gICAgU3RyaW5nIHByb2plY3ROYW1lID0gdG9rZW47CisgICAgU3RyaW5nIHByb2plY3ROYW1lID0gcGFyYW1zLmdldFBhcmFtZXRlcigwKTsKIAogICAgIHdoaWxlIChwcm9qZWN0TmFtZS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygwLCBwcm9qZWN0TmFtZS5sZW5ndGgoKSAtIDEpOwogICAgIH0KIAotICAgIGlmIChwcm9qZWN0TmFtZS5lbmRzV2l0aCgiLmdpdCIpKSB7Ci0gICAgICAvLyBCZSBuaWNlIGFuZCBkcm9wIHRoZSB0cmFpbGluZyAiLmdpdCIgc3VmZml4LCB3aGljaCB3ZSBuZXZlciBrZWVwCi0gICAgICAvLyBpbiBvdXIgZGF0YWJhc2UsIGJ1dCBjbGllbnRzIG1pZ2h0IG1pc3Rha2VubHkgcHJvdmlkZSBhbnl3YXkuCi0gICAgICAvLwotICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS5zdWJzdHJpbmcoMCwgcHJvamVjdE5hbWUubGVuZ3RoKCkgLSA0KTsKLSAgICAgIHdoaWxlIChwcm9qZWN0TmFtZS5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIHByb2plY3ROYW1lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICB9Ci0gICAgfQotCiAgICAgd2hpbGUgKHByb2plY3ROYW1lLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgLy8gQmUgbmljZSBhbmQgZHJvcCB0aGUgbGVhZGluZyAiLyIgaWYgc3VwcGxpZWQgYnkgYW4gYWJzb2x1dGUgcGF0aC4KICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBmaWxlIHN5c3RlbSBoaWVyYXJjaHksIGp1c3QgYSBmbGF0IG5hbWVzcGFjZSBpbgpAQCAtNjgsMTIgKzU4LDE0IEBACiAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygxKTsKICAgICB9CiAKKyAgICBTdHJpbmcgbmFtZVdpdGhvdXRTdWZmaXggPSBQcm9qZWN0VXRpbC5zdHJpcEdpdFN1ZmZpeChwcm9qZWN0TmFtZSk7CisKICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBjb250cm9sOwogICAgIHRyeSB7Ci0gICAgICBQcm9qZWN0Lk5hbWVLZXkgbmFtZUtleSA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdE5hbWUpOworICAgICAgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBuZXcgUHJvamVjdC5OYW1lS2V5KG5hbWVXaXRob3V0U3VmZml4KTsKICAgICAgIGNvbnRyb2wgPSBwcm9qZWN0Q29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IobmFtZUtleSwgUHJvamVjdENvbnRyb2wuT1dORVIgfCBQcm9qZWN0Q29udHJvbC5WSVNJQkxFKTsKICAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBDbWRMaW5lRXhjZXB0aW9uKG93bmVyLCAiJyIgKyB0b2tlbiArICInOiBub3QgYSBHZXJyaXQgcHJvamVjdCIpOworICAgICAgdGhyb3cgbmV3IENtZExpbmVFeGNlcHRpb24ob3duZXIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICB9CiAKICAgICBzZXR0ZXIuYWRkVmFsdWUoY29udHJvbCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoQmFja2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTA5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEJhY2tlbmQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4dGVuc2lvblBvaW50OworCisvKioKKyAqIEltcGxlbWVudGF0aW9ucyBvZiBBdXRoQmFja2VuZCBhdXRoZW50aWNhdGUgdXNlcnMgZm9yIGluY29taW5nIHJlcXVlc3QuCisgKi8KK0BFeHRlbnNpb25Qb2ludAorcHVibGljIGludGVyZmFjZSBBdXRoQmFja2VuZCB7CisKKyAgLyoqIEByZXR1cm4gYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGRlc2NyaWJlcyB0aGUgYmFja2VuZC4gKi8KKyAgU3RyaW5nIGdldERvbWFpbigpOworCisgIC8qKgorICAgKiBBdXRoZW50aWNhdGUgaW5zcGVjdHMgdGhlIEF1dGhSZXF1ZXN0IGFuZCByZXR1cm5zIGF1dGhlbnRpY2F0ZWQgdXNlci4gSWYKKyAgICogdGhlIHJlcXVlc3QgaXMgdW5hYmxlIHRvIGJlIGF1dGhlbnRpY2F0ZWQsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gVGhlCisgICAqIHtAbGluayBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb259IG11c3QgYmUgdGhyb3duIHdoZW4gdGhlcmUgYXJlIG5vCisgICAqIGNyZWRlbnRpYWxzIGZvciB0aGUgcmVxdWVzdC4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBhdCBtb3N0IG9uZSBBdXRoQmFja2VuZAorICAgKiB3aWxsIGVpdGhlciByZXR1cm4gYW4gQXV0aFVzZXIgb3IgdGhyb3cgYSBub24tTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uLgorICAgKgorICAgKiBAcGFyYW0gcmVxIHRoZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVxdWVzdC4KKyAgICogQHJldHVybiB0aGUgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQgdXNlci4KKyAgICogQHRocm93cyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24gd2hlbiB0aGVyZSBhcmUgbm8gY3JlZGVudGlhbHMuCisgICAqIEB0aHJvd3MgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGFyZSBwcmVzZW50IGFuZAorICAgKiAgICAgICAgIGludmFsaWQuCisgICAqIEB0aHJvd3MgVW5rbm93blVzZXJFeGNlcHRpb24gd2hlbiB0aGUgY3JlZGVudGlhbHMgYXJlIHZhbGlkIGJ1dCB0aGVyZSBpcworICAgKiAgICAgICAgIG5vIG1hdGNoaW5nIHVzZXIuCisgICAqIEB0aHJvd3MgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24gd2hlbiB0aGUgY3JlZGVudGlhbHMgYXJlIHZhbGlkIGJ1dCB0aGUgdXNlcgorICAgKiAgICAgICAgIGlzIG5vdCBhbGxvd2VkLgorICAgKiBAdGhyb3dzIEF1dGhFeGNlcHRpb24gd2hlbiBhbnkgb3RoZXIgZXJyb3Igb2NjdXJzLgorICAgKi8KKyAgQXV0aFVzZXIgYXV0aGVudGljYXRlKEF1dGhSZXF1ZXN0IHJlcSkgdGhyb3dzIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbiwKKyAgICAgIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbiwgVW5rbm93blVzZXJFeGNlcHRpb24sCisgICAgICBVc2VyTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZjRhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworLyoqCisgKiBCYXNlIHR5cGUgZm9yIGF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg5NDYzMDI2NzY1MjU1ODAzNzJMOworCisgIHB1YmxpYyBBdXRoRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIEF1dGhFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KKworICBwdWJsaWMgQXV0aEV4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihleCk7CisgIH0KKworICBwdWJsaWMgQXV0aEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihtc2csIGV4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhSZXF1ZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTc5ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBEZWZpbmVzIGFuIGFic3RyYWN0IHJlcXVlc3QgZm9yIHVzZXIgYXV0aGVudGljYXRpb24gdG8gR2Vycml0LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXV0aFJlcXVlc3QgeworICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VybmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7CisKKyAgcHJvdGVjdGVkIEF1dGhSZXF1ZXN0KFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB1c2VybmFtZSB0byBiZSBhdXRoZW50aWNhdGVkLgorICAgKgorICAgKiBAcmV0dXJuIHVzZXJuYW1lIGZvciBhdXRoZW50aWNhdGlvbiBvciBudWxsIGZvciBhbm9ueW1vdXMgYWNjZXNzLgorICAgKi8KKyAgQE51bGxhYmxlCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgcmV0dXJuIHVzZXJuYW1lOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHVzZXIncyBjcmVkZW50aWFscworICAgKgorICAgKiBAcmV0dXJuIHVzZXIncyBjcmVkZW50aWFscyBvciBudWxsCisgICAqLworICBATnVsbGFibGUKKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKKyAgICByZXR1cm4gcGFzc3dvcmQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBjaGVja1Bhc3N3b3JkKFN0cmluZyBwd2QpIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAoIU9iamVjdHMuZXF1YWwoZ2V0UGFzc3dvcmQoKSwgcHdkKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aFVzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA4MTczCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhVc2VyLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBBbiBhdXRoZW50aWNhdGVkIHVzZXIgYXMgc3BlY2lmaWVkIGJ5IHRoZSBBdXRoQmFja2VuZC4KKyAqLworcHVibGljIGNsYXNzIEF1dGhVc2VyIHsKKworICAvKioKKyAgICogR2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyLgorICAgKi8KKyAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBVVUlEIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1dWlkOworCisgICAgLyoqCisgICAgICogQSBuZXcgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXVpZCB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICovCisgICAgcHVibGljIFVVSUQoU3RyaW5nIHV1aWQpIHsKKyAgICAgIHRoaXMudXVpZCA9IGNoZWNrTm90TnVsbCh1dWlkKTsKKyAgICB9CisKKyAgICAvKiogQHJldHVybiB0aGUgZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXIuICovCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICByZXR1cm4gdXVpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFVVSUQpIHsKKyAgICAgICAgcmV0dXJuIGdldCgpLmVxdWFscygoKFVVSUQpIG9iaikuZ2V0KCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gZ2V0KCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkF1dGhVc2VyLlVVSURbJXNdIiwgZ2V0KCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgVVVJRCB1dWlkOworICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VybmFtZTsKKworICAvKioKKyAgICogQW4gYXV0aGVudGljYXRlZCB1c2VyLgorICAgKgorICAgKiBAcGFyYW0gdXVpZCB0aGUgZ2xvYmFsbHkgdW5pcXVlIElELgorICAgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIG5hbWUgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci4KKyAgICovCisgIHB1YmxpYyBBdXRoVXNlcihVVUlEIHV1aWQsIEBOdWxsYWJsZSBTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICB0aGlzLnV1aWQgPSBjaGVja05vdE51bGwodXVpZCk7CisgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICB9CisKKyAgLyoqIEByZXR1cm4gdGhlIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyLiAqLworICBwdWJsaWMgZmluYWwgVVVJRCBnZXRVVUlEKCkgeworICAgIHJldHVybiB1dWlkOworICB9CisKKyAgLyoqIEByZXR1cm4gdGhlIGJhY2tlbmQgc3BlY2lmaWMgdXNlciBuYW1lLCBvciBudWxsIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4gKi8KKyAgQE51bGxhYmxlCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgcmV0dXJuIHVzZXJuYW1lOworICB9CisKKyAgLyoqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAbGluayAjZ2V0VXNlcm5hbWUoKX0gaXMgbm90IG51bGwuICovCisgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1VzZXJuYW1lKCkgeworICAgIHJldHVybiBnZXRVc2VybmFtZSgpICE9IG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAob2JqIGluc3RhbmNlb2YgQXV0aFVzZXIpIHsKKyAgICAgIHJldHVybiBnZXRVVUlEKCkuZXF1YWxzKCgoQXV0aFVzZXIpIG9iaikuZ2V0VVVJRCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIGdldFVVSUQoKS5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkF1dGhVc2VyW3V1aWQ9JXMsIHVzZXJuYW1lPSVzXSIsIGdldFVVSUQoKSwKKyAgICAgICAgZ2V0VXNlcm5hbWUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9JbnRlcm5hbEF1dGhCYWNrZW5kLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW50ZXJuYWxBdXRoQmFja2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWU3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW50ZXJuYWxBdXRoQmFja2VuZC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxBdXRoQmFja2VuZCBpbXBsZW1lbnRzIEF1dGhCYWNrZW5kIHsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOworICBwcml2YXRlIGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZzsKKworICBASW5qZWN0CisgIEludGVybmFsQXV0aEJhY2tlbmQoQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwgQXV0aENvbmZpZyBhdXRoQ29uZmlnKSB7CisgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CisgICAgdGhpcy5hdXRoQ29uZmlnID0gYXV0aENvbmZpZzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICByZXR1cm4gImdlcnJpdCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEF1dGhVc2VyIGF1dGhlbnRpY2F0ZShBdXRoUmVxdWVzdCByZXEpCisgICAgICB0aHJvd3MgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uLCBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24sCisgICAgICBVbmtub3duVXNlckV4Y2VwdGlvbiwgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIGlmIChyZXEuZ2V0VXNlcm5hbWUoKSA9PSBudWxsIHx8IHJlcS5nZXRQYXNzd29yZCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdXNlcm5hbWU7CisgICAgaWYgKGF1dGhDb25maWcuaXNVc2VyTmFtZVRvTG93ZXJDYXNlKCkpIHsKKyAgICAgIHVzZXJuYW1lID0gcmVxLmdldFVzZXJuYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKKyAgICB9IGVsc2UgeworICAgICAgdXNlcm5hbWUgPSByZXEuZ2V0VXNlcm5hbWUoKTsKKyAgICB9CisKKyAgICBmaW5hbCBBY2NvdW50U3RhdGUgd2hvID0gYWNjb3VudENhY2hlLmdldEJ5VXNlcm5hbWUodXNlcm5hbWUpOworICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFVua25vd25Vc2VyRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmICghd2hvLmdldEFjY291bnQoKS5pc0FjdGl2ZSgpKSB7CisgICAgICB0aHJvdyBuZXcgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCBmb3IgIiArIHVzZXJuYW1lCisgICAgICAgICAgKyAiOiBhY2NvdW50IGluYWN0aXZlIG9yIG5vdCBwcm92aXNpb25lZCBpbiBHZXJyaXQiKTsKKyAgICB9CisKKyAgICByZXEuY2hlY2tQYXNzd29yZCh3aG8uZ2V0UGFzc3dvcmQodXNlcm5hbWUpKTsKKyAgICByZXR1cm4gbmV3IEF1dGhVc2VyKG5ldyBBdXRoVXNlci5VVUlEKHVzZXJuYW1lKSwgdXNlcm5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhODU4NgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9JbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKKy8qKgorICogQW4gYXV0aGVudGljYXRpb24gZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGFyZSBwcmVzZW50CisgKiBhbmQgYXJlIHVuYWJsZSB0byBiZSB2ZXJpZmllZC4KKyAqLworcHVibGljIGNsYXNzIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbiBleHRlbmRzIEF1dGhFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNzA5MjAxMDQyMDgwNDQ0Mjc2TDsKKworICBwdWJsaWMgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorCisgIHB1YmxpYyBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24oVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIoZXgpOworICB9CisKKyAgcHVibGljIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihtc2csIGV4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL01pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL01pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjcyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoOworCisvKioKKyAqIEFuIGF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBjcmVkZW50aWFscyBhcmUgbm90CisgKiBwcmVzZW50LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBBdXRoQmFja2VuZCBoYXMgbm9uZSBvZiB0aGUgbmVlZGVkCisgKiBpbmZvcm1hdGlvbiBpbiB0aGUgcmVxdWVzdCB0byBwZXJmb3JtIGF1dGhlbnRpY2F0aW9uLiBJZiBwYXJ0cyBvZiB0aGUKKyAqIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgYmFja2VuZCwgdGhlbiBhIGRpZmZlcmVudAorICogQXV0aEV4Y2VwdGlvbiBzaG91bGQgYmUgdXNlZC4KKyAqLworcHVibGljIGNsYXNzIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbiBleHRlbmRzIEF1dGhFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjQ5OTg2Njk3NzUxMzUwODA1MUw7CisKKyAgcHVibGljIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KKworICBwdWJsaWMgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uKFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKGV4KTsKKyAgfQorCisgIHB1YmxpYyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIobXNnLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbml2ZXJzYWxBdXRoQmFja2VuZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL1VuaXZlcnNhbEF1dGhCYWNrZW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5Yzk0YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbml2ZXJzYWxBdXRoQmFja2VuZC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogVW5pdmVyc2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBdXRoQmFja2VuZCB0aGF0IHdvcmtzIHdpdGggdGhlIGluamVjdGVkCisgKiBzZXQgb2YgQXV0aEJhY2tlbmRzLgorICovCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgVW5pdmVyc2FsQXV0aEJhY2tlbmQgaW1wbGVtZW50cyBBdXRoQmFja2VuZCB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY1NldDxBdXRoQmFja2VuZD4gYXV0aEJhY2tlbmRzOworCisgIEBJbmplY3QKKyAgVW5pdmVyc2FsQXV0aEJhY2tlbmQoRHluYW1pY1NldDxBdXRoQmFja2VuZD4gYXV0aEJhY2tlbmRzKSB7CisgICAgdGhpcy5hdXRoQmFja2VuZHMgPSBhdXRoQmFja2VuZHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEF1dGhVc2VyIGF1dGhlbnRpY2F0ZShmaW5hbCBBdXRoUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgTGlzdDxBdXRoVXNlcj4gYXV0aFVzZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxBdXRoRXhjZXB0aW9uPiBhdXRoRXhzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChBdXRoQmFja2VuZCBiYWNrZW5kIDogYXV0aEJhY2tlbmRzKSB7CisgICAgICB0cnkgeworICAgICAgICBhdXRoVXNlcnMuYWRkKGNoZWNrTm90TnVsbChiYWNrZW5kLmF1dGhlbnRpY2F0ZShyZXF1ZXN0KSkpOworICAgICAgfSBjYXRjaCAoTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIC8vIE5vdCBoYW5kbGVkIGJ5IHRoaXMgYmFja2VuZC4KKyAgICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgYXV0aEV4cy5hZGQoZXgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEhhbmRsZSB0aGUgdmFsaWQgcmVzcG9uc2VzCisgICAgaWYgKGF1dGhVc2Vycy5zaXplKCkgPT0gMSkgeworICAgICAgcmV0dXJuIGF1dGhVc2Vycy5nZXQoMCk7CisgICAgfSBlbHNlIGlmIChhdXRoVXNlcnMuaXNFbXB0eSgpICYmIGF1dGhFeHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIHRocm93IGF1dGhFeHMuZ2V0KDApOworICAgIH0gZWxzZSBpZiAoYXV0aEV4cy5pc0VtcHR5KCkgJiYgYXV0aFVzZXJzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbigpOworICAgIH0KKworICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJNdWx0aXBsZSBBdXRoQmFja2VuZHMgYXR0ZW1wdGVkIHRvIGhhbmRsZSByZXF1ZXN0OiIKKyAgICAgICAgKyAiIGF1dGhVc2Vycz0lcyBhdXRoRXhzPSVzIiwgYXV0aFVzZXJzLCBhdXRoRXhzKTsKKyAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbihtc2cpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgIlVuaXZlcnNhbEF1dGhCYWNrZW5kIGRvZXNuJ3Qgc3VwcG9ydCBkb21haW4uIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbmtub3duVXNlckV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL1Vua25vd25Vc2VyRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0OTEyYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbmtub3duVXNlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworLyoqCisgKiBBbiBhdXRoZW50aWNhdGlvbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiBjcmVkZW50aWFscyBhcmUgcHJlc2VudGVkIGZvcgorICogYW4gdW5rbm93biB1c2VyLgorICovCitwdWJsaWMgY2xhc3MgVW5rbm93blVzZXJFeGNlcHRpb24gZXh0ZW5kcyBBdXRoRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTYyNjE4NjE2NjkyNDY3MDc1NEw7CisKKyAgcHVibGljIFVua25vd25Vc2VyRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIFVua25vd25Vc2VyRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9CisKKyAgcHVibGljIFVua25vd25Vc2VyRXhjZXB0aW9uKFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKGV4KTsKKyAgfQorCisgIHB1YmxpYyBVbmtub3duVXNlckV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihtc2csIGV4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL1VzZXJOb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvVXNlck5vdEFsbG93ZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDIwMzMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL1VzZXJOb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoOworCisvKioKKyAqIEFuIGF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSB1c2VyIGNyZWRlbnRpYWxzIGFyZQorICogdmFsaWQsIGJ1dCBub3QgYWxsb3dlZCB0byBhdXRoZW50aWNhdGUgZm9yIG90aGVyIHJlYXNvbnMgaS5lLiBhY2NvdW50CisgKiBkaXNhYmxlZC4KKyAqLworcHVibGljIGNsYXNzIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgQXV0aEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNTMxNDExOTk5OTMyOTIyNTU4TDsKKworICBwdWJsaWMgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24oKSB7CisgIH0KKworICBwdWJsaWMgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KKworICBwdWJsaWMgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24oVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIoZXgpOworICB9CisKKyAgcHVibGljIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKG1zZywgZXgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9IZWxwZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0hlbHBlci5qYXZhCmluZGV4IDY0NGY1ZGYuLjAxNTFkZGUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0hlbHBlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0hlbHBlci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGgubGRhcDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXJhbWV0ZXJpemVkU3RyaW5nOwpAQCAtMjgsNiArMjksOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogCitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTQ3LDYgKzUwLDkgQEAKIGltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CiBpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5Jbml0aWFsRGlyQ29udGV4dDsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247CiAKIEBTaW5nbGV0b24gY2xhc3MgSGVscGVyIHsKICAgc3RhdGljIGZpbmFsIFN0cmluZyBMREFQX1VVSUQgPSAibGRhcDoiOwpAQCAtNTgsNiArNjQsNyBAQAogICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVmZXJyYWw7CiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzc2xWZXJpZnk7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGF1dGhlbnRpY2F0aW9uOwogICBwcml2YXRlIHZvbGF0aWxlIExkYXBTY2hlbWEgbGRhcFNjaGVtYTsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhZFRpbWVPdXRNaWxsaXM7CiAKQEAgLTY2LDExICs3MywxMiBAQAogICAgICAgQE5hbWVkKExkYXBNb2R1bGUuR1JPVVBTX0JZSU5DTFVERV9DQUNIRSkKICAgICAgIENhY2hlPFN0cmluZywgSW1tdXRhYmxlU2V0PFN0cmluZz4+IGdyb3Vwc0J5SW5jbHVkZSkgewogICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwotICAgIHRoaXMuc2VydmVyID0gTGRhcFJlYWxtLnJlcXVpcmVkKGNvbmZpZywgInNlcnZlciIpOworICAgIHRoaXMuc2VydmVyID0gTGRhcFJlYWxtLm9wdGlvbmFsKGNvbmZpZywgInNlcnZlciIpOwogICAgIHRoaXMudXNlcm5hbWUgPSBMZGFwUmVhbG0ub3B0aW9uYWwoY29uZmlnLCAidXNlcm5hbWUiKTsKICAgICB0aGlzLnBhc3N3b3JkID0gTGRhcFJlYWxtLm9wdGlvbmFsKGNvbmZpZywgInBhc3N3b3JkIik7CiAgICAgdGhpcy5yZWZlcnJhbCA9IExkYXBSZWFsbS5vcHRpb25hbChjb25maWcsICJyZWZlcnJhbCIpOwogICAgIHRoaXMuc3NsVmVyaWZ5ID0gY29uZmlnLmdldEJvb2xlYW4oImxkYXAiLCAic3NsdmVyaWZ5IiwgdHJ1ZSk7CisgICAgdGhpcy5hdXRoZW50aWNhdGlvbiA9IExkYXBSZWFsbS5vcHRpb25hbChjb25maWcsICJhdXRoZW50aWNhdGlvbiIpOwogICAgIFN0cmluZyB0aW1lb3V0ID0gTGRhcFJlYWxtLm9wdGlvbmFsKGNvbmZpZywgInJlYWRUaW1lb3V0Iik7CiAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgcmVhZFRpbWVPdXRNaWxsaXMgPQpAQCAtOTYsMTUgKzEwNCw0MSBAQAogICAgIHJldHVybiBlbnY7CiAgIH0KIAotICBEaXJDb250ZXh0IG9wZW4oKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgRGlyQ29udGV4dCBvcGVuKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiwgTG9naW5FeGNlcHRpb24gewogICAgIGZpbmFsIFByb3BlcnRpZXMgZW52ID0gY3JlYXRlQ29udGV4dFByb3BlcnRpZXMoKTsKLSAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCkgewotICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OLCAic2ltcGxlIik7Ci0gICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLCB1c2VybmFtZSk7Ci0gICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQ1JFREVOVElBTFMsIHBhc3N3b3JkICE9IG51bGwgPyBwYXNzd29yZCA6ICIiKTsKLSAgICAgIGVudi5wdXQoQ29udGV4dC5SRUZFUlJBTCwgcmVmZXJyYWwgIT0gbnVsbCA/IHJlZmVycmFsIDogImlnbm9yZSIpOworICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9BVVRIRU5USUNBVElPTiwgYXV0aGVudGljYXRpb24gIT0gbnVsbCA/IGF1dGhlbnRpY2F0aW9uIDogInNpbXBsZSIpOworICAgIGVudi5wdXQoQ29udGV4dC5SRUZFUlJBTCwgcmVmZXJyYWwgIT0gbnVsbCA/IHJlZmVycmFsIDogImlnbm9yZSIpOworICAgIGlmICgiR1NTQVBJIi5lcXVhbHMoYXV0aGVudGljYXRpb24pKSB7CisgICAgICByZXR1cm4ga2VyYmVyb3NPcGVuKGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICh1c2VybmFtZSAhPSBudWxsKSB7CisgICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9QUklOQ0lQQUwsIHVzZXJuYW1lKTsKKyAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBwYXNzd29yZCAhPSBudWxsID8gcGFzc3dvcmQgOiAiIik7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEluaXRpYWxEaXJDb250ZXh0KGVudik7CiAgICAgfQotICAgIHJldHVybiBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKKyAgfQorCisgIHByaXZhdGUgRGlyQ29udGV4dCBrZXJiZXJvc09wZW4oZmluYWwgUHJvcGVydGllcyBlbnYpIHRocm93cyBMb2dpbkV4Y2VwdGlvbiwKKyAgICAgIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgTG9naW5Db250ZXh0IGN0eCA9IG5ldyBMb2dpbkNvbnRleHQoIktlcmJlcm9zTG9naW4iKTsKKyAgICBjdHgubG9naW4oKTsKKyAgICBTdWJqZWN0IHN1YmplY3QgPSBjdHguZ2V0U3ViamVjdCgpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gU3ViamVjdC5kb0FzKHN1YmplY3QsIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPERpckNvbnRleHQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBEaXJDb250ZXh0IHJ1bigpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbml0aWFsRGlyQ29udGV4dChlbnYpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmUG9zc2libGUoZS5nZXRFeGNlcHRpb24oKSwgTmFtaW5nRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZQb3NzaWJsZShlLmdldEV4Y2VwdGlvbigpLCBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgIExkYXBSZWFsbS5sb2cud2FybigiSW50ZXJuYWwgZXJyb3IiLCBlLmdldEV4Y2VwdGlvbigpKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gZmluYWxseSB7CisgICAgICBjdHgubG9nb3V0KCk7CisgICAgfQogICB9CiAKICAgRGlyQ29udGV4dCBhdXRoZW50aWNhdGUoU3RyaW5nIGRuLCBTdHJpbmcgcGFzc3dvcmQpIHRocm93cyBBY2NvdW50RXhjZXB0aW9uIHsKQEAgLTIwNyw3ICsyNDEsNyBAQAogICAgIGlmIChhY3R1YWwuaXNFbXB0eSgpKSB7CiAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChhY3R1YWwpOworICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoYWN0dWFsKTsKICAgICB9CiAgIH0KIApAQCAtMjU2LDYgKzI5MCw3IEBACiAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGdyb3VwQmFzZXM7CiAgICAgZmluYWwgU2VhcmNoU2NvcGUgZ3JvdXBTY29wZTsKICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkU3RyaW5nIGdyb3VwUGF0dGVybjsKKyAgICBmaW5hbCBQYXJhbWV0ZXJpemVkU3RyaW5nIGdyb3VwTmFtZTsKICAgICBmaW5hbCBMaXN0PExkYXBRdWVyeT4gZ3JvdXBNZW1iZXJRdWVyeUxpc3Q7CiAKICAgICBMZGFwU2NoZW1hKGZpbmFsIERpckNvbnRleHQgY3R4KSB7CkBAIC0yNzEsNiArMzA2LDcgQEAKICAgICAgIGdyb3VwQmFzZXMgPSBMZGFwUmVhbG0ub3B0aW9uYWxMaXN0KGNvbmZpZywgImdyb3VwQmFzZSIpOwogICAgICAgZ3JvdXBTY29wZSA9IExkYXBSZWFsbS5zY29wZShjb25maWcsICJncm91cFNjb3BlIik7CiAgICAgICBncm91cFBhdHRlcm4gPSBMZGFwUmVhbG0ucGFyYW1TdHJpbmcoY29uZmlnLCAiZ3JvdXBQYXR0ZXJuIiwgdHlwZS5ncm91cFBhdHRlcm4oKSk7CisgICAgICBncm91cE5hbWUgPSBMZGFwUmVhbG0ucGFyYW1TdHJpbmcoY29uZmlnLCAiZ3JvdXBOYW1lIiwgdHlwZS5ncm91cE5hbWUoKSk7CiAgICAgICBmaW5hbCBTdHJpbmcgZ3JvdXBNZW1iZXJQYXR0ZXJuID0KICAgICAgICAgICBMZGFwUmVhbG0ub3B0ZGVmKGNvbmZpZywgImdyb3VwTWVtYmVyUGF0dGVybiIsIHR5cGUuZ3JvdXBNZW1iZXJQYXR0ZXJuKCkpOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwQXV0aEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBBdXRoQmFja2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjhhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwQXV0aEJhY2tlbmQuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLmxkYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhSZXF1ZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5NaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguVW5rbm93blVzZXJFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguVXNlck5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgQXV0aEJhY2tlbmQgZm9yIHRoZSBMREFQIGF1dGhlbnRpY2F0aW9uIHN5c3RlbS4KKyAqLworcHVibGljIGNsYXNzIExkYXBBdXRoQmFja2VuZCBpbXBsZW1lbnRzIEF1dGhCYWNrZW5kIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExkYXBBdXRoQmFja2VuZC5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBIZWxwZXIgaGVscGVyOworICBwcml2YXRlIGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZzsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGxvd2VyQ2FzZVVzZXJuYW1lOworCisgIEBJbmplY3QKKyAgcHVibGljIExkYXBBdXRoQmFja2VuZChIZWxwZXIgaGVscGVyLAorICAgICAgQXV0aENvbmZpZyBhdXRoQ29uZmlnLAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnKSB7CisgICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CisgICAgdGhpcy5hdXRoQ29uZmlnID0gYXV0aENvbmZpZzsKKyAgICB0aGlzLmxvd2VyQ2FzZVVzZXJuYW1lID0KKyAgICAgICAgY29uZmlnLmdldEJvb2xlYW4oImxkYXAiLCAibG9jYWxVc2VybmFtZVRvTG93ZXJDYXNlIiwgZmFsc2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgeworICAgIHJldHVybiAibGRhcCI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEF1dGhVc2VyIGF1dGhlbnRpY2F0ZShBdXRoUmVxdWVzdCByZXEpCisgICAgICB0aHJvd3MgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uLCBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24sCisgICAgICBVbmtub3duVXNlckV4Y2VwdGlvbiwgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIGlmIChyZXEuZ2V0VXNlcm5hbWUoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHVzZXJuYW1lID0gbG93ZXJDYXNlVXNlcm5hbWUKKyAgICAgICAgPyByZXEuZ2V0VXNlcm5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpCisgICAgICAgIDogcmVxLmdldFVzZXJuYW1lKCk7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIERpckNvbnRleHQgY3R4OworICAgICAgaWYgKGF1dGhDb25maWcuZ2V0QXV0aFR5cGUoKSA9PSBBdXRoVHlwZS5MREFQX0JJTkQpIHsKKyAgICAgICAgY3R4ID0gaGVscGVyLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcmVxLmdldFBhc3N3b3JkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4ID0gaGVscGVyLm9wZW4oKTsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIEhlbHBlci5MZGFwU2NoZW1hIHNjaGVtYSA9IGhlbHBlci5nZXRTY2hlbWEoY3R4KTsKKyAgICAgICAgZmluYWwgTGRhcFF1ZXJ5LlJlc3VsdCBtID0gaGVscGVyLmZpbmRBY2NvdW50KHNjaGVtYSwgY3R4LCB1c2VybmFtZSk7CisKKyAgICAgICAgaWYgKGF1dGhDb25maWcuZ2V0QXV0aFR5cGUoKSA9PSBBdXRoVHlwZS5MREFQKSB7CisgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIHVzZXIgYWNjb3VudCwgYnV0IHdlIG5lZWQgdG8gdmVyaWZ5CisgICAgICAgICAgLy8gdGhlIHBhc3N3b3JkIG1hdGNoZXMgaXQgYmVmb3JlIHdlIGNhbiBjb250aW51ZS4KKyAgICAgICAgICAvLworICAgICAgICAgIGhlbHBlci5hdXRoZW50aWNhdGUobS5nZXRETigpLCByZXEuZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBdXRoVXNlcihuZXcgQXV0aFVzZXIuVVVJRCh1c2VybmFtZSksIHVzZXJuYW1lKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgY3R4LmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBjbG9zZSBMREFQIHF1ZXJ5IGhhbmRsZSIsIGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoQWNjb3VudEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBxdWVyeSBMREFQIHRvIGF1dGhlbnRpY2F0ZSB1c2VyIiwgZSk7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uKCJDYW5ub3QgcXVlcnkgTERBUCBmb3IgYWNjb3VudCIsIGUpOworICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBxdWVyeSBMREFQIHRvIGF1dGhlbnRpY2F0ZSB1c2VyIiwgZSk7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGFjY291bnQiLCBlKTsKKyAgICB9IGNhdGNoIChMb2dpbkV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBhdXRoZW50aWNhdGUgc2VydmVyIHZpYSBKQUFTIiwgZSk7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGFjY291bnQiLCBlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBHcm91cEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBHcm91cEJhY2tlbmQuamF2YQppbmRleCA1YzMwZTVjLi4yY2YzNzJiIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwR3JvdXBCYWNrZW5kLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcEdyb3VwQmFja2VuZC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzaGlwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkxpc3RHcm91cE1lbWJlcnNoaXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGgubGRhcC5IZWxwZXIuTGRhcFNjaGVtYTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZWQ7CkBAIC00MSwxNSArNDIsMTggQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIGltcG9ydCBqYXZheC5uYW1pbmcuSW52YWxpZE5hbWVFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CiBpbXBvcnQgamF2YXgubmFtaW5nLmxkYXAuTGRhcE5hbWU7CiBpbXBvcnQgamF2YXgubmFtaW5nLmxkYXAuUmRuOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5FeGNlcHRpb247CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgR3JvdXBCYWNrZW5kIGZvciB0aGUgTERBUCBncm91cCBzeXN0ZW0uCkBAIC02Myw2ICs2Nyw3IEBACiAgIHByaXZhdGUgZmluYWwgSGVscGVyIGhlbHBlcjsKICAgcHJpdmF0ZSBmaW5hbCBMb2FkaW5nQ2FjaGU8U3RyaW5nLCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBtZW1iZXJzaGlwQ2FjaGU7CiAgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPFN0cmluZywgQm9vbGVhbj4gZXhpc3RzQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlclByb3ZpZGVyOwogCiAgIEBJbmplY3QKQEAgLTcwLDIyICs3NSwyNCBAQAogICAgICAgSGVscGVyIGhlbHBlciwKICAgICAgIEBOYW1lZChHUk9VUF9DQUNIRSkgTG9hZGluZ0NhY2hlPFN0cmluZywgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gbWVtYmVyc2hpcENhY2hlLAogICAgICAgQE5hbWVkKEdST1VQX0VYSVNUX0NBQ0hFKSBMb2FkaW5nQ2FjaGU8U3RyaW5nLCBCb29sZWFuPiBleGlzdHNDYWNoZSwKKyAgICAgIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCiAgICAgICBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlclByb3ZpZGVyKSB7CiAgICAgdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAgICAgdGhpcy5tZW1iZXJzaGlwQ2FjaGUgPSBtZW1iZXJzaGlwQ2FjaGU7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CiAgICAgdGhpcy5leGlzdHNDYWNoZSA9IGV4aXN0c0NhY2hlOwogICAgIHRoaXMudXNlclByb3ZpZGVyID0gdXNlclByb3ZpZGVyOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xkYXBVVUlEKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgcHJpdmF0ZSBib29sZWFuIGlzTGRhcFVVSUQoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgewogICAgIHJldHVybiB1dWlkLmdldCgpLnN0YXJ0c1dpdGgoTERBUF9VVUlEKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEdyb3VwUmVmZXJlbmNlIGdyb3VwUmVmZXJlbmNlKExkYXBRdWVyeS5SZXN1bHQgcmVzKQotICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIEdyb3VwUmVmZXJlbmNlIGdyb3VwUmVmZXJlbmNlKFBhcmFtZXRlcml6ZWRTdHJpbmcgcCwKKyAgICAgIExkYXBRdWVyeS5SZXN1bHQgcmVzKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKICAgICByZXR1cm4gbmV3IEdyb3VwUmVmZXJlbmNlKAogICAgICAgICBuZXcgQWNjb3VudEdyb3VwLlVVSUQoTERBUF9VVUlEICsgcmVzLmdldEROKCkpLAotICAgICAgICBMREFQX05BTUUgKyBjbkZvcihyZXMuZ2V0RE4oKSkpOworICAgICAgICBMREFQX05BTUUgKyBMZGFwUmVhbG0uYXBwbHkocCwgcmVzKSk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY25Gb3IoU3RyaW5nIGRuKSB7CkBAIC0xNDMsOCArMTUwLDE1IEBACiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlVG9BbGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIEBOdWxsYWJsZQorICAgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIEBOdWxsYWJsZQorICAgICAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgICAgIHJldHVybiBudWxsOwogICAgICAgfQogICAgIH07CiAgIH0KQEAgLTE3Miw3ICsxODYsMTUgQEAKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBMaXN0R3JvdXBNZW1iZXJzaGlwKG1lbWJlcnNoaXBDYWNoZS5nZXQoaWQpKTsKKyAgICAgIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzID0gbWVtYmVyc2hpcENhY2hlLmdldChpZCk7CisgICAgICByZXR1cm4gbmV3IExpc3RHcm91cE1lbWJlcnNoaXAoZ3JvdXBzKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnZXRLbm93bkdyb3VwcygpIHsKKyAgICAgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGcgPSBTZXRzLm5ld0hhc2hTZXQoZ3JvdXBzKTsKKyAgICAgICAgICBnLnJldGFpbkFsbChwcm9qZWN0Q2FjaGUuZ3Vlc3NSZWxldmFudEdyb3VwVVVJRHMoKSk7CisgICAgICAgICAgcmV0dXJuIGc7CisgICAgICAgIH0KKyAgICAgIH07CiAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBsb29rdXAgbWVtYmVyc2hpcHNPZiAlcyBpbiBMREFQIiwgaWQpLCBlKTsKICAgICAgIHJldHVybiBHcm91cE1lbWJlcnNoaXAuRU1QVFk7CkBAIC0yMDMsMTMgKzIyNSwxNCBAQAogICAgICAgICBMZGFwU2NoZW1hIHNjaGVtYSA9IGhlbHBlci5nZXRTY2hlbWEoY3R4KTsKICAgICAgICAgUGFyYW1ldGVyaXplZFN0cmluZyBmaWx0ZXIgPSBQYXJhbWV0ZXJpemVkU3RyaW5nLmFzaXMoCiAgICAgICAgICAgICBzY2hlbWEuZ3JvdXBQYXR0ZXJuLnJlcGxhY2UoR1JPVVBOQU1FLCBuYW1lKS50b1N0cmluZygpKTsKLSAgICAgICAgU2V0PFN0cmluZz4gcmV0dXJuQXR0cnMgPSBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHJldHVybkF0dHJzID0KKyAgICAgICAgICAgIG5ldyBIYXNoU2V0PFN0cmluZz4oc2NoZW1hLmdyb3VwTmFtZS5nZXRQYXJhbWV0ZXJOYW1lcygpKTsKICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogICAgICAgICBmb3IgKFN0cmluZyBncm91cEJhc2UgOiBzY2hlbWEuZ3JvdXBCYXNlcykgewogICAgICAgICAgIExkYXBRdWVyeSBxdWVyeSA9IG5ldyBMZGFwUXVlcnkoCiAgICAgICAgICAgICAgIGdyb3VwQmFzZSwgc2NoZW1hLmdyb3VwU2NvcGUsIGZpbHRlciwgcmV0dXJuQXR0cnMpOwogICAgICAgICAgIGZvciAoTGRhcFF1ZXJ5LlJlc3VsdCByZXMgOiBxdWVyeS5xdWVyeShjdHgsIHBhcmFtcykpIHsKLSAgICAgICAgICAgIG91dC5hZGQoZ3JvdXBSZWZlcmVuY2UocmVzKSk7CisgICAgICAgICAgICBvdXQuYWRkKGdyb3VwUmVmZXJlbmNlKHNjaGVtYS5ncm91cE5hbWUsIHJlcykpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKQEAgLTIyMSw2ICsyNDQsOCBAQAogICAgICAgfQogICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cud2FybigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGdyb3VwcyBtYXRjaGluZyByZXF1ZXN0ZWQgbmFtZSIsIGUpOworICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3QgcXVlcnkgTERBUCBmb3IgZ3JvdXBzIG1hdGNoaW5nIHJlcXVlc3RlZCBuYW1lIiwgZSk7CiAgICAgfQogICAgIHJldHVybiBvdXQ7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBNb2R1bGUuamF2YQppbmRleCBmMWIxNWY5Li44OGNmNDViIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcE1vZHVsZS5qYXZhCkBAIC02MCw4ICs2MCw4IEBACiAgICAgICAgIG5ldyBUeXBlTGl0ZXJhbDxJbW11dGFibGVTZXQ8U3RyaW5nPj4oKSB7fSkKICAgICAgIC5leHBpcmVBZnRlcldyaXRlKDEsIEhPVVJTKTsKIAotICAgIGJpbmQoUmVhbG0uY2xhc3MpLnRvKExkYXBSZWFsbS5jbGFzcykuaW4oU2NvcGVzLlNJTkdMRVRPTik7CiAgICAgYmluZChIZWxwZXIuY2xhc3MpOworICAgIGJpbmQoUmVhbG0uY2xhc3MpLnRvKExkYXBSZWFsbS5jbGFzcykuaW4oU2NvcGVzLlNJTkdMRVRPTik7CiAKICAgICBEeW5hbWljU2V0LmJpbmQoYmluZGVyKCksIEdyb3VwQmFja2VuZC5jbGFzcykudG8oTGRhcEdyb3VwQmFja2VuZC5jbGFzcyk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBSZWFsbS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFJlYWxtLmphdmEKaW5kZXggNzJlYjdlYy4uZmMxMTAyZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFJlYWxtLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFJlYWxtLmphdmEKQEAgLTU2LDYgKzU2LDcgQEAKIGltcG9ydCBqYXZheC5uYW1pbmcuTmFtZTsKIGltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwogCiBAU2luZ2xldG9uCiBjbGFzcyBMZGFwUmVhbG0gaW1wbGVtZW50cyBSZWFsbSB7CkBAIC0xNjcsNyArMTY4LDcgQEAKICAgICByZXR1cm4gIXJlYWRPbmx5QWNjb3VudEZpZWxkcy5jb250YWlucyhmaWVsZCk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwbHkoUGFyYW1ldGVyaXplZFN0cmluZyBwLCBMZGFwUXVlcnkuUmVzdWx0IG0pCisgIHN0YXRpYyBTdHJpbmcgYXBwbHkoUGFyYW1ldGVyaXplZFN0cmluZyBwLCBMZGFwUXVlcnkuUmVzdWx0IG0pCiAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKICAgICBpZiAocCA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTI0MCw2ICsyNDEsOSBAQAogICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBxdWVyeSBMREFQIHRvIGF1dGVudGljYXRlIHVzZXIiLCBlKTsKICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvblVuYXZhaWxhYmxlRXhjZXB0aW9uKCJDYW5ub3QgcXVlcnkgTERBUCBmb3IgYWNjb3VudCIsIGUpOworICAgIH0gY2F0Y2ggKExvZ2luRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGF1dGhlbnRpY2F0ZSBzZXJ2ZXIgdmlhIEpBQVMiLCBlKTsKKyAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvblVuYXZhaWxhYmxlRXhjZXB0aW9uKCJDYW5ub3QgcXVlcnkgTERBUCBmb3IgYWNjb3VudCIsIGUpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwVHlwZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFR5cGUuamF2YQppbmRleCAzYzRhNTRiLi5kYjViYWViIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwVHlwZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBUeXBlLmphdmEKQEAgLTI1LDggKzI1LDkgQEAKICAgc3RhdGljIExkYXBUeXBlIGd1ZXNzVHlwZShmaW5hbCBEaXJDb250ZXh0IGN0eCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgQXR0cmlidXRlcyByb290QXR0cyA9IGN0eC5nZXRBdHRyaWJ1dGVzKCIiKTsKICAgICBBdHRyaWJ1dGUgc3VwcG9ydGVkID0gcm9vdEF0dHMuZ2V0KCJzdXBwb3J0ZWRDYXBhYmlsaXRpZXMiKTsKLSAgICBpZiAoc3VwcG9ydGVkICE9IG51bGwgJiYgc3VwcG9ydGVkLmNvbnRhaW5zKCIxLjIuODQwLjExMzU1Ni4xLjQuODAwIikpIHsKLSAgICAgIHJldHVybiBuZXcgQWN0aXZlRGlyZWN0b3J5KHJvb3RBdHRzKTsKKyAgICBpZiAoc3VwcG9ydGVkICE9IG51bGwgJiYgKHN1cHBvcnRlZC5jb250YWlucygiMS4yLjg0MC4xMTM1NTYuMS40LjgwMCIpCisgICAgICAgICAgfHwgc3VwcG9ydGVkLmNvbnRhaW5zKCIxLjIuODQwLjExMzU1Ni4xLjQuMTg1MSIpKSkgeworICAgICAgcmV0dXJuIG5ldyBBY3RpdmVEaXJlY3RvcnkoKTsKICAgICB9CiAKICAgICByZXR1cm4gUkZDXzIzMDc7CkBAIC0zNiw2ICszNyw4IEBACiAKICAgYWJzdHJhY3QgU3RyaW5nIGdyb3VwTWVtYmVyUGF0dGVybigpOwogCisgIGFic3RyYWN0IFN0cmluZyBncm91cE5hbWUoKTsKKwogICBhYnN0cmFjdCBTdHJpbmcgYWNjb3VudEZ1bGxOYW1lKCk7CiAKICAgYWJzdHJhY3QgU3RyaW5nIGFjY291bnRFbWFpbEFkZHJlc3MoKTsKQEAgLTU4LDYgKzYxLDExIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgU3RyaW5nIGdyb3VwTmFtZSgpIHsKKyAgICAgIHJldHVybiAiY24iOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIFN0cmluZyBhY2NvdW50RnVsbE5hbWUoKSB7CiAgICAgICByZXR1cm4gImRpc3BsYXlOYW1lIjsKICAgICB9CkBAIC04NCwyMyArOTIsMTcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjdGl2ZURpcmVjdG9yeSBleHRlbmRzIExkYXBUeXBlIHsKLSAgICBBY3RpdmVEaXJlY3RvcnkoZmluYWwgQXR0cmlidXRlcyBhdHRzKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKLSAgICAgIC8vIENvbnZlcnQgImRlZmF1bHROYW1pbmdDb250ZXh0OiBEQz1mb28sREM9ZXhhbXBsZSxEQz1jb20iIGludG8KLSAgICAgIC8vIHRoZSBhIHN0YW5kYXJkIEROUyBuYW1lIGFzIHdlIHdvdWxkIGV4cGVjdCB0byBmaW5kIGluIHRoZSBzdWZmaXgKLSAgICAgIC8vIHBhcnQgb2YgdGhlIHVzZXJQcmluY2lwYWxOYW1lLgotICAgICAgLy8KLSAgICAgIEF0dHJpYnV0ZSBkZWZhdWx0TmFtaW5nQ29udGV4dCA9IGF0dHMuZ2V0KCJkZWZhdWx0TmFtaW5nQ29udGV4dCIpOwotICAgICAgaWYgKGRlZmF1bHROYW1pbmdDb250ZXh0ID09IG51bGwgfHwgZGVmYXVsdE5hbWluZ0NvbnRleHQuc2l6ZSgpIDwgMSkgewotICAgICAgICB0aHJvdyBuZXcgTmFtaW5nRXhjZXB0aW9uKCJyb290RFNFIGhhcyBubyBkZWZhdWx0TmFtaW5nQ29udGV4dCIpOwotICAgICAgfQotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIFN0cmluZyBncm91cFBhdHRlcm4oKSB7CiAgICAgICByZXR1cm4gIigmKG9iamVjdENsYXNzPWdyb3VwKShjbj0ke2dyb3VwbmFtZX0pKSI7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgU3RyaW5nIGdyb3VwTmFtZSgpIHsKKyAgICAgIHJldHVybiAiY24iOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIFN0cmluZyBncm91cE1lbWJlclBhdHRlcm4oKSB7CiAgICAgICByZXR1cm4gbnVsbDsgLy8gQWN0aXZlIERpcmVjdG9yeSB1c2VzIG1lbWJlck9mIGluIHRoZSBhY2NvdW50CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL29wZW5pZC9PcGVuSWRQcm92aWRlclBhdHRlcm4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9vcGVuaWQvT3BlbklkUHJvdmlkZXJQYXR0ZXJuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxNWY1MgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9vcGVuaWQvT3BlbklkUHJvdmlkZXJQYXR0ZXJuLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLm9wZW5pZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKKworcHVibGljIGNsYXNzIE9wZW5JZFByb3ZpZGVyUGF0dGVybiB7CisgIHB1YmxpYyBzdGF0aWMgT3BlbklkUHJvdmlkZXJQYXR0ZXJuIGNyZWF0ZShTdHJpbmcgcGF0dGVybikgeworICAgIE9wZW5JZFByb3ZpZGVyUGF0dGVybiByID0gbmV3IE9wZW5JZFByb3ZpZGVyUGF0dGVybigpOworICAgIHIucmVnZXggPSBwYXR0ZXJuLnN0YXJ0c1dpdGgoIl4iKSAmJiBwYXR0ZXJuLmVuZHNXaXRoKCIkIik7CisgICAgci5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIHJlZ2V4OworICBwcm90ZWN0ZWQgU3RyaW5nIHBhdHRlcm47CisKKyAgcHJvdGVjdGVkIE9wZW5JZFByb3ZpZGVyUGF0dGVybigpIHsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIHJlZ2V4ID8gaWQubWF0Y2hlcyhwYXR0ZXJuKSA6IGlkLnN0YXJ0c1dpdGgocGF0dGVybik7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEFjY291bnRFeHRlcm5hbElkIGlkKSB7CisgICAgcmV0dXJuIG1hdGNoZXMoaWQuZ2V0RXh0ZXJuYWxJZCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBwYXR0ZXJuOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F2YXRhci9BdmF0YXJQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdmF0YXIvQXZhdGFyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE0MGQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdmF0YXIvQXZhdGFyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF2YXRhcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXh0ZW5zaW9uUG9pbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworCisvKioKKyAqIFByb3ZpZGUgYXZhdGFyIFVSTHMgZm9yIHNwZWNpZmllZCB1c2VyLgorICoKKyAqIEludm9rZWQgYnkgR2Vycml0IHdoZW4gQXZhdGFyIGltYWdlIHJlcXVlc3RzIGFyZSBtYWRlLgorICovCitARXh0ZW5zaW9uUG9pbnQKK3B1YmxpYyBpbnRlcmZhY2UgQXZhdGFyUHJvdmlkZXIgeworICAvKioKKyAgICogR2V0IGF2YXRhciBVUkwuCisgICAqCisgICAqIEBwYXJhbSBmb3JVc2VyIFRoZSB1c2VyIGZvciB3aGljaCB0byBsb2FkIGFuIGF2YXRhciBpbWFnZQorICAgKiBAcGFyYW0gaW1hZ2VTaXplIEEgcmVxdWVzdGVkIGltYWdlIHNpemUsIGluIHBpeGVscy4gQW4gaW1hZ2VTaXplIG9mIDAKKyAgICogICAgICAgIGluZGljYXRlcyB0byB1c2Ugd2hhdGV2ZXIgZGVmYXVsdCBzaXplIHRoZSBwcm92aWRlciBkZXRlcm1pbmVzLgorICAgKiAgICAgICAgQXZhdGFyUHJvdmlkZXJzIG1heSBpZ25vcmUgdGhlIHJlcXVlc3RlZCBpbWFnZSBzaXplLiBUaGUgd2ViCisgICAqICAgICAgICBpbnRlcmZhY2Ugd2lsbCByZXNpemUgYW55IGltYWdlIHRvIG1hdGNoIGltYWdlU2l6ZSwgc28gaWRlYWxseSB0aGUKKyAgICogICAgICAgIHByb3ZpZGVyIHNob3VsZCByZXR1cm4gYW4gaW1hZ2Ugc2l6ZWQgY29ycmVjdGx5LgorICAgKiBAcmV0dXJuIGEgVVJMIG9mIGFuIGF2YXRhciBpbWFnZSBmb3IgdGhlIHNwZWNpZmllZCB1c2VyLiBBIHJldHVybiB2YWx1ZSBvZgorICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpcyBhY2NlcHRhYmxlLCBhbmQgcmVzdWx0cyBpbiB0aGUgc2VydmVyIHJlc3BvbmRpbmcKKyAgICogICAgICAgICB3aXRoIGEgNDA0LiBUaGlzIHdpbGwgaGlkZSB0aGUgYXZhdGFyIGltYWdlIGluIHRoZSB3ZWIgVUkuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldFVybChJZGVudGlmaWVkVXNlciBmb3JVc2VyLCBpbnQgaW1hZ2VTaXplKTsKKworICAvKioKKyAgICogR2V0cyBhIFVSTCBmb3IgYSB1c2VyIHRvIG1vZGlmeSB0aGVpciBhdmF0YXIgaW1hZ2UuCisgICAqCisgICAqIEBwYXJhbSB1c2VyIFRoZSB1c2VyIHdpc2hpbmcgdG8gY2hhbmdlIHRoZWlyIGF2YXRhciBpbWFnZQorICAgKiBAcmV0dXJuIGEgVVJMIHRoZSB1c2VyIHNob3VsZCB2aXNpdCB0byBtb2RpZnkgdGhlaXIgYXZhdGFyLCBvciBudWxsIGlmCisgICAqICAgICAgICAgbW9kaWZpY2F0aW9uIGlzIG5vdCBwb3NzaWJsZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlQXZhdGFyVXJsKElkZW50aWZpZWRVc2VyIGZvclVzZXIpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQWJhbmRvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQWJhbmRvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjYyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9BYmFuZG9uLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5BYmFuZG9uLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkFiYW5kb25lZFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBseVRvQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBBYmFuZG9uIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8Q2hhbmdlUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYmFuZG9uLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOworICBwcml2YXRlIGZpbmFsIEFiYW5kb25lZFNlbmRlci5GYWN0b3J5IGFiYW5kb25lZFNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBASW5qZWN0CisgIEFiYW5kb24oQ2hhbmdlSG9va3MgaG9va3MsCisgICAgICBBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeSBhYmFuZG9uZWRTZW5kZXJGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBDaGFuZ2VKc29uIGpzb24pIHsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5hYmFuZG9uZWRTZW5kZXJGYWN0b3J5ID0gYWJhbmRvbmVkU2VuZGVyRmFjdG9yeTsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShDaGFuZ2VSZXNvdXJjZSByZXEsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJlcS5nZXRDb250cm9sKCk7CisgICAgSWRlbnRpZmllZFVzZXIgY2FsbGVyID0gKElkZW50aWZpZWRVc2VyKSBjb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgQ2hhbmdlIGNoYW5nZSA9IHJlcS5nZXRDaGFuZ2UoKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuQWJhbmRvbigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiYWJhbmRvbiBub3QgcGVybWl0dGVkIik7CisgICAgfSBlbHNlIGlmICghY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY2hhbmdlIGlzICIgKyBzdGF0dXMoY2hhbmdlKSk7CisgICAgfQorCisgICAgQ2hhbmdlTWVzc2FnZSBtZXNzYWdlOworICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7CisgICAgdHJ5IHsKKyAgICAgIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoCisgICAgICAgIGNoYW5nZS5nZXRJZCgpLAorICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgeworICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgeworICAgICAgICAgICAgICBjaGFuZ2Uuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuQUJBTkRPTkVEKTsKKyAgICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7CisgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgIgorICAgICAgICAgICAgKyBzdGF0dXMoZGIuY2hhbmdlcygpLmdldChyZXEuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSkpKTsKKyAgICAgIH0KKyAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKGlucHV0LCBjYWxsZXIsIGNoYW5nZSk7CisgICAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obWVzc2FnZSkpOworICAgICAgbmV3IEFwcHJvdmFsc1V0aWwoZGIpLnN5bmNDaGFuZ2VTdGF0dXMoY2hhbmdlKTsKKyAgICAgIGRiLmNvbW1pdCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBkYi5yb2xsYmFjaygpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBSZXBseVRvQ2hhbmdlU2VuZGVyIGNtID0gYWJhbmRvbmVkU2VuZGVyRmFjdG9yeS5jcmVhdGUoY2hhbmdlKTsKKyAgICAgIGNtLnNldEZyb20oY2FsbGVyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICBjbS5zZW5kKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIHVwZGF0ZSBmb3IgY2hhbmdlICIgKyBjaGFuZ2UuZ2V0Q2hhbmdlSWQoKSwgZSk7CisgICAgfQorICAgIGhvb2tzLmRvQ2hhbmdlQWJhbmRvbmVkSG9vayhjaGFuZ2UsCisgICAgICAgIGNhbGxlci5nZXRBY2NvdW50KCksCisgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQubWVzc2FnZSksCisgICAgICAgIGRiKTsKKyAgICByZXR1cm4ganNvbi5mb3JtYXQoY2hhbmdlKTsKKyAgfQorCisgIHByaXZhdGUgQ2hhbmdlTWVzc2FnZSBuZXdNZXNzYWdlKElucHV0IGlucHV0LCBJZGVudGlmaWVkVXNlciBjYWxsZXIsCisgICAgICBDaGFuZ2UgY2hhbmdlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgbXNnLmFwcGVuZCgiQWJhbmRvbmVkIik7CisgICAgaWYgKCFTdHJpbmdzLm51bGxUb0VtcHR5KGlucHV0Lm1lc3NhZ2UpLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgIG1zZy5hcHBlbmQoIlxuXG4iKTsKKyAgICAgIG1zZy5hcHBlbmQoaW5wdXQubWVzc2FnZS50cmltKCkpOworICAgIH0KKworICAgIENoYW5nZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBDaGFuZ2VNZXNzYWdlKAorICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoCisgICAgICAgICAgICBjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGJQcm92aWRlci5nZXQoKSkpLAorICAgICAgICBjYWxsZXIuZ2V0QWNjb3VudElkKCksCisgICAgICAgIGNoYW5nZS5nZXRMYXN0VXBkYXRlZE9uKCksCisgICAgICAgIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICBtZXNzYWdlLnNldE1lc3NhZ2UobXNnLnRvU3RyaW5nKCkpOworICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXR1cyhDaGFuZ2UgY2hhbmdlKSB7CisgICAgcmV0dXJuIGNoYW5nZSAhPSBudWxsID8gY2hhbmdlLmdldFN0YXR1cygpLm5hbWUoKS50b0xvd2VyQ2FzZSgpIDogImRlbGV0ZWQiOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VJbnNlcnRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSW5zZXJ0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGM3OGVhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSW5zZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BcHByb3ZhbHNVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuVHJhY2tpbmdGb290ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlckxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQ2hhbmdlSW5zZXJ0ZXIgeworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7CisgIHByaXZhdGUgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVyczsKKworICBASW5qZWN0CisgIHB1YmxpYyBDaGFuZ2VJbnNlcnRlcihmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCisgICAgICBDaGFuZ2VIb29rcyBob29rcywgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsLAorICAgICAgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVycykgeworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMuYXBwcm92YWxzVXRpbCA9IGFwcHJvdmFsc1V0aWw7CisgICAgdGhpcy50cmFja2luZ0Zvb3RlcnMgPSB0cmFja2luZ0Zvb3RlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBpbnNlcnRDaGFuZ2UoUmV2aWV3RGIgZGIsIENoYW5nZSBjaGFuZ2UsIFBhdGNoU2V0IHBzLAorICAgICAgUmV2Q29tbWl0IGNvbW1pdCwgTGFiZWxUeXBlcyBsYWJlbFR5cGVzLCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzLAorICAgICAgUGF0Y2hTZXRJbmZvIGluZm8sIFNldDxBY2NvdW50LklkPiByZXZpZXdlcnMpIHRocm93cyBPcm1FeGNlcHRpb24geworCisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBDaGFuZ2VVdGlsLmluc2VydEFuY2VzdG9ycyhkYiwgcHMuZ2V0SWQoKSwgY29tbWl0KTsKKyAgICAgIGRiLnBhdGNoU2V0cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHMpKTsKKyAgICAgIGRiLmNoYW5nZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNoYW5nZSkpOworICAgICAgQ2hhbmdlVXRpbC51cGRhdGVUcmFja2luZ0lkcyhkYiwgY2hhbmdlLCB0cmFja2luZ0Zvb3RlcnMsIGZvb3RlckxpbmVzKTsKKyAgICAgIGFwcHJvdmFsc1V0aWwuYWRkUmV2aWV3ZXJzKGRiLCBsYWJlbFR5cGVzLCBjaGFuZ2UsIHBzLCBpbmZvLCByZXZpZXdlcnMsCisgICAgICAgICAgQ29sbGVjdGlvbnMuPEFjY291bnQuSWQ+IGVtcHR5U2V0KCkpOworICAgICAgZGIuY29tbWl0KCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgfQorCisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHBzLmdldFJlZk5hbWUoKSwgT2JqZWN0SWQuemVyb0lkKCksCisgICAgICAgIGNvbW1pdCk7CisgICAgaG9va3MuZG9QYXRjaHNldENyZWF0ZWRIb29rKGNoYW5nZSwgcHMsIGRiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSnNvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTJiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VKc29uLmphdmEKQEAgLTAsMCArMSw5MzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkFMTF9DT01NSVRTOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5BTExfRklMRVM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkFMTF9SRVZJU0lPTlM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkNVUlJFTlRfQ09NTUlUOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5DVVJSRU5UX0ZJTEVTOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5DVVJSRU5UX1JFVklTSU9OOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5ERVRBSUxFRF9BQ0NPVU5UUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfTEFCRUxTOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5MQUJFTFM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSGFzaEJhc2VkVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuU3RhdHVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvLlBhcmVudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkxhYmVsTm9ybWFsaXplcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0RW50cnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkhvc3RLZXk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitwdWJsaWMgY2xhc3MgQ2hhbmdlSnNvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGFuZ2VKc29uLmNsYXNzKTsKKworICBAU2luZ2xldG9uCisgIHN0YXRpYyBjbGFzcyBVcmxzIHsKKyAgICBmaW5hbCBTdHJpbmcgZ2l0OworICAgIGZpbmFsIFN0cmluZyBodHRwOworCisgICAgQEluamVjdAorICAgIFVybHMoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnKSB7CisgICAgICB0aGlzLmdpdCA9IGVuc3VyZVNsYXNoKGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJjYW5vbmljYWxHaXRVcmwiKSk7CisgICAgICB0aGlzLmh0dHAgPSBlbnN1cmVTbGFzaChjZmcuZ2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiZ2l0SHR0cFVybCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5zdXJlU2xhc2goU3RyaW5nIGluKSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCAmJiAhaW4uZW5kc1dpdGgoIi8iKSkgeworICAgICAgICByZXR1cm4gaW4gKyAiLyI7CisgICAgICB9CisgICAgICByZXR1cm4gaW47CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgIHByaXZhdGUgZmluYWwgTGFiZWxOb3JtYWxpemVyIGxhYmVsTm9ybWFsaXplcjsKKyAgcHJpdmF0ZSBmaW5hbCBDdXJyZW50VXNlciB1c2VyOworICBwcml2YXRlIGZpbmFsIEFub255bW91c1VzZXIgYW5vbnltb3VzOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlQ29udHJvbEdlbmVyaWNGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaExpc3RDYWNoZSBwYXRjaExpc3RDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeSBhY2NvdW50TG9hZGVyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIFVybHMgdXJsczsKKyAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbFVzZXJGYWN0b3J5OworICBwcml2YXRlIFNzaEluZm8gc3NoSW5mbzsKKyAgcHJpdmF0ZSBFbnVtU2V0PExpc3RDaGFuZ2VzT3B0aW9uPiBvcHRpb25zOworICBwcml2YXRlIEFjY291bnRJbmZvLkxvYWRlciBhY2NvdW50TG9hZGVyOworICBwcml2YXRlIENoYW5nZUNvbnRyb2wgbGFzdENvbnRyb2w7CisKKyAgQEluamVjdAorICBDaGFuZ2VKc29uKAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLAorICAgICAgTGFiZWxOb3JtYWxpemVyIGxuLAorICAgICAgQ3VycmVudFVzZXIgdSwKKyAgICAgIEFub255bW91c1VzZXIgYXUsCisgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1ZiwKKyAgICAgIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2NmLAorICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwc2ksCisgICAgICBQYXRjaExpc3RDYWNoZSBwbGMsCisgICAgICBBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeSBhaWxmLAorICAgICAgQENhbm9uaWNhbFdlYlVybCBQcm92aWRlcjxTdHJpbmc+IGN1cmwsCisgICAgICBVcmxzIHVybHMpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5sYWJlbE5vcm1hbGl6ZXIgPSBsbjsKKyAgICB0aGlzLnVzZXIgPSB1OworICAgIHRoaXMuYW5vbnltb3VzID0gYXU7CisgICAgdGhpcy51c2VyRmFjdG9yeSA9IHVmOworICAgIHRoaXMuY2hhbmdlQ29udHJvbEdlbmVyaWNGYWN0b3J5ID0gY2NmOworICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBzaTsKKyAgICB0aGlzLnBhdGNoTGlzdENhY2hlID0gcGxjOworICAgIHRoaXMuYWNjb3VudExvYWRlckZhY3RvcnkgPSBhaWxmOworICAgIHRoaXMudXJsUHJvdmlkZXIgPSBjdXJsOworICAgIHRoaXMudXJscyA9IHVybHM7CisKKyAgICBvcHRpb25zID0gRW51bVNldC5ub25lT2YoTGlzdENoYW5nZXNPcHRpb24uY2xhc3MpOworICB9CisKKyAgcHVibGljIENoYW5nZUpzb24gYWRkT3B0aW9uKExpc3RDaGFuZ2VzT3B0aW9uIG8pIHsKKyAgICBvcHRpb25zLmFkZChvKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VKc29uIGFkZE9wdGlvbnMoQ29sbGVjdGlvbjxMaXN0Q2hhbmdlc09wdGlvbj4gbykgeworICAgIG9wdGlvbnMuYWRkQWxsKG8pOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIENoYW5nZUpzb24gc2V0U3NoSW5mbyhTc2hJbmZvIGluZm8pIHsKKyAgICBzc2hJbmZvID0gaW5mbzsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VKc29uIHNldENoYW5nZUNvbnRyb2xGYWN0b3J5KENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjZikgeworICAgIGNoYW5nZUNvbnRyb2xVc2VyRmFjdG9yeSA9IGNmOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIENoYW5nZUluZm8gZm9ybWF0KENoYW5nZVJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBmb3JtYXQobmV3IENoYW5nZURhdGEocnNyYy5nZXRDb250cm9sKCkpKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VJbmZvIGZvcm1hdChDaGFuZ2UgY2hhbmdlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZm9ybWF0KG5ldyBDaGFuZ2VEYXRhKGNoYW5nZSkpOworICB9CisKKyAgcHVibGljIENoYW5nZUluZm8gZm9ybWF0KENoYW5nZS5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGZvcm1hdChuZXcgQ2hhbmdlRGF0YShpZCkpOworICB9CisKKyAgcHVibGljIENoYW5nZUluZm8gZm9ybWF0KENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8Q2hhbmdlRGF0YT4gdG1wID0gSW1tdXRhYmxlTGlzdC5vZihjZCk7CisgICAgcmV0dXJuIGZvcm1hdExpc3QyKEltbXV0YWJsZUxpc3Qub2YodG1wKSkuZ2V0KDApLmdldCgwKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VJbmZvIGZvcm1hdChSZXZpc2lvblJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIENoYW5nZURhdGEgY2QgPSBuZXcgQ2hhbmdlRGF0YShyc3JjLmdldENvbnRyb2woKSk7CisgICAgY2QubGltaXRUb1BhdGNoU2V0cyhJbW11dGFibGVMaXN0Lm9mKHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpKSk7CisgICAgcmV0dXJuIGZvcm1hdChjZCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxMaXN0PENoYW5nZUluZm8+PiBmb3JtYXRMaXN0MihMaXN0PExpc3Q8Q2hhbmdlRGF0YT4+IGluKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgYWNjb3VudExvYWRlciA9IGFjY291bnRMb2FkZXJGYWN0b3J5LmNyZWF0ZShoYXMoREVUQUlMRURfQUNDT1VOVFMpKTsKKyAgICBMaXN0PExpc3Q8Q2hhbmdlSW5mbz4+IHJlcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShpbi5zaXplKCkpOworICAgIGZvciAoTGlzdDxDaGFuZ2VEYXRhPiBjaGFuZ2VzIDogaW4pIHsKKyAgICAgIENoYW5nZURhdGEuZW5zdXJlQ2hhbmdlTG9hZGVkKGRiLCBjaGFuZ2VzKTsKKyAgICAgIENoYW5nZURhdGEuZW5zdXJlQ3VycmVudFBhdGNoU2V0TG9hZGVkKGRiLCBjaGFuZ2VzKTsKKyAgICAgIENoYW5nZURhdGEuZW5zdXJlQ3VycmVudEFwcHJvdmFsc0xvYWRlZChkYiwgY2hhbmdlcyk7CisgICAgICByZXMuYWRkKHRvQ2hhbmdlSW5mbyhjaGFuZ2VzKSk7CisgICAgfQorICAgIGFjY291bnRMb2FkZXIuZmlsbCgpOworICAgIHJldHVybiByZXM7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaGFzKExpc3RDaGFuZ2VzT3B0aW9uIG9wdGlvbikgeworICAgIHJldHVybiBvcHRpb25zLmNvbnRhaW5zKG9wdGlvbik7CisgIH0KKworICBwcml2YXRlIExpc3Q8Q2hhbmdlSW5mbz4gdG9DaGFuZ2VJbmZvKExpc3Q8Q2hhbmdlRGF0YT4gY2hhbmdlcykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8Q2hhbmdlSW5mbz4gaW5mbyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShjaGFuZ2VzLnNpemUoKSk7CisgICAgZm9yIChDaGFuZ2VEYXRhIGNkIDogY2hhbmdlcykgeworICAgICAgaW5mby5hZGQodG9DaGFuZ2VJbmZvKGNkKSk7CisgICAgfQorICAgIHJldHVybiBpbmZvOworICB9CisKKyAgcHJpdmF0ZSBDaGFuZ2VJbmZvIHRvQ2hhbmdlSW5mbyhDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VJbmZvIG91dCA9IG5ldyBDaGFuZ2VJbmZvKCk7CisgICAgQ2hhbmdlIGluID0gY2QuY2hhbmdlKGRiKTsKKyAgICBvdXQucHJvamVjdCA9IGluLmdldFByb2plY3QoKS5nZXQoKTsKKyAgICBvdXQuYnJhbmNoID0gaW4uZ2V0RGVzdCgpLmdldFNob3J0TmFtZSgpOworICAgIG91dC50b3BpYyA9IGluLmdldFRvcGljKCk7CisgICAgb3V0LmNoYW5nZUlkID0gaW4uZ2V0S2V5KCkuZ2V0KCk7CisgICAgb3V0Lm1lcmdlYWJsZSA9IGluLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuTUVSR0VEID8gaW4uaXNNZXJnZWFibGUoKSA6IG51bGw7CisgICAgb3V0LnN1YmplY3QgPSBpbi5nZXRTdWJqZWN0KCk7CisgICAgb3V0LnN0YXR1cyA9IGluLmdldFN0YXR1cygpOworICAgIG91dC5vd25lciA9IGFjY291bnRMb2FkZXIuZ2V0KGluLmdldE93bmVyKCkpOworICAgIG91dC5jcmVhdGVkID0gaW4uZ2V0Q3JlYXRlZE9uKCk7CisgICAgb3V0LnVwZGF0ZWQgPSBpbi5nZXRMYXN0VXBkYXRlZE9uKCk7CisgICAgb3V0Ll9udW1iZXIgPSBpbi5nZXRJZCgpLmdldCgpOworICAgIG91dC5fc29ydGtleSA9IGluLmdldFNvcnRLZXkoKTsKKyAgICBvdXQuc3RhcnJlZCA9IHVzZXIuZ2V0U3RhcnJlZENoYW5nZXMoKS5jb250YWlucyhpbi5nZXRJZCgpKSA/IHRydWUgOiBudWxsOworICAgIG91dC5yZXZpZXdlZCA9IGluLmdldFN0YXR1cygpLmlzT3BlbigpICYmIGlzQ2hhbmdlUmV2aWV3ZWQoY2QpID8gdHJ1ZSA6IG51bGw7CisgICAgb3V0LmxhYmVscyA9IGxhYmVsc0ZvcihjZCwgaGFzKExBQkVMUyksIGhhcyhERVRBSUxFRF9MQUJFTFMpKTsKKworICAgIENvbGxlY3Rpb248UGF0Y2hTZXQuSWQ+IGxpbWl0ZWQgPSBjZC5nZXRMaW1pdGVkUGF0Y2hTZXRzKCk7CisgICAgaWYgKG91dC5sYWJlbHMgIT0gbnVsbCAmJiBoYXMoREVUQUlMRURfTEFCRUxTKSkgeworICAgICAgLy8gSWYgbGltaXRlZCB0byBzcGVjaWZpYyBwYXRjaCBzZXRzIGJ1dCBub3QgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0LCBkb24ndAorICAgICAgLy8gbGlzdCBwZXJtaXR0ZWQgbGFiZWxzLCBzaW5jZSB1c2VycyBjYW4ndCB2b3RlIG9uIHRob3NlIHBhdGNoIHNldHMuCisgICAgICBpZiAobGltaXRlZCA9PSBudWxsIHx8IGxpbWl0ZWQuY29udGFpbnMoaW4uY3VycmVudFBhdGNoU2V0SWQoKSkpIHsKKyAgICAgICAgb3V0LnBlcm1pdHRlZF9sYWJlbHMgPSBwZXJtaXR0ZWRMYWJlbHMoY2QpOworICAgICAgfQorICAgICAgb3V0LnJlbW92YWJsZV9yZXZpZXdlcnMgPSByZW1vdmFibGVSZXZpZXdlcnMoY2QsIG91dC5sYWJlbHMudmFsdWVzKCkpOworICAgIH0KKyAgICBvdXQuZmluaXNoKCk7CisKKyAgICBpZiAoaGFzKEFMTF9SRVZJU0lPTlMpIHx8IGhhcyhDVVJSRU5UX1JFVklTSU9OKSB8fCBsaW1pdGVkICE9IG51bGwpIHsKKyAgICAgIG91dC5yZXZpc2lvbnMgPSByZXZpc2lvbnMoY2QpOworICAgICAgaWYgKG91dC5yZXZpc2lvbnMgIT0gbnVsbCkgeworICAgICAgICBmb3IgKFN0cmluZyBjb21taXQgOiBvdXQucmV2aXNpb25zLmtleVNldCgpKSB7CisgICAgICAgICAgaWYgKG91dC5yZXZpc2lvbnMuZ2V0KGNvbW1pdCkuaXNDdXJyZW50KSB7CisgICAgICAgICAgICBvdXQuY3VycmVudF9yZXZpc2lvbiA9IGNvbW1pdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGxhc3RDb250cm9sID0gbnVsbDsKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sIGNvbnRyb2woQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjdHJsID0gY2QuY2hhbmdlQ29udHJvbCgpOworICAgIGlmIChjdHJsICE9IG51bGwgJiYgY3RybC5nZXRDdXJyZW50VXNlcigpID09IHVzZXIpIHsKKyAgICAgIHJldHVybiBjdHJsOworICAgIH0gZWxzZSBpZiAobGFzdENvbnRyb2wgIT0gbnVsbAorICAgICAgICAmJiBjZC5nZXRJZCgpLmVxdWFscyhsYXN0Q29udHJvbC5nZXRDaGFuZ2UoKS5nZXRJZCgpKSkgeworICAgICAgcmV0dXJuIGxhc3RDb250cm9sOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAoY2hhbmdlQ29udHJvbFVzZXJGYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgY3RybCA9IGNoYW5nZUNvbnRyb2xVc2VyRmFjdG9yeS5jb250cm9sRm9yKGNkLmNoYW5nZShkYikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY3RybCA9IGNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeS5jb250cm9sRm9yKGNkLmNoYW5nZShkYiksIHVzZXIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgbGFzdENvbnRyb2wgPSBjdHJsOworICAgIHJldHVybiBjdHJsOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVjb3JkcyhDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoY2QuZ2V0U3VibWl0UmVjb3JkcygpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBjZC5nZXRTdWJtaXRSZWNvcmRzKCk7CisgICAgfQorICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7CisgICAgaWYgKGN0bCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZigpOworICAgIH0KKyAgICBQYXRjaFNldCBwcyA9IGNkLmN1cnJlbnRQYXRjaFNldChkYik7CisgICAgaWYgKHBzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCk7CisgICAgfQorICAgIGNkLnNldFN1Ym1pdFJlY29yZHMoY3RsLmNhblN1Ym1pdChkYi5nZXQoKSwgcHMsIGNkLCB0cnVlLCBmYWxzZSwgdHJ1ZSkpOworICAgIHJldHVybiBjZC5nZXRTdWJtaXRSZWNvcmRzKCk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzRm9yKENoYW5nZURhdGEgY2QsIGJvb2xlYW4gc3RhbmRhcmQsCisgICAgICBib29sZWFuIGRldGFpbGVkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoIXN0YW5kYXJkICYmICFkZXRhaWxlZCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKKyAgICBpZiAoY3RsID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFBhdGNoU2V0IHBzID0gY2QuY3VycmVudFBhdGNoU2V0KGRiKTsKKyAgICBpZiAocHMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY3RsLmdldExhYmVsVHlwZXMoKTsKKyAgICBpZiAoY2QuZ2V0Q2hhbmdlKCkuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgIHJldHVybiBsYWJlbHNGb3JPcGVuQ2hhbmdlKGNkLCBsYWJlbFR5cGVzLCBzdGFuZGFyZCwgZGV0YWlsZWQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbGFiZWxzRm9yQ2xvc2VkQ2hhbmdlKGNkLCBsYWJlbFR5cGVzLCBzdGFuZGFyZCwgZGV0YWlsZWQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBsYWJlbHNGb3JPcGVuQ2hhbmdlKENoYW5nZURhdGEgY2QsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIGJvb2xlYW4gc3RhbmRhcmQsIGJvb2xlYW4gZGV0YWlsZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVscyA9IGluaXRMYWJlbHMoY2QsIGxhYmVsVHlwZXMsIHN0YW5kYXJkKTsKKyAgICBpZiAoZGV0YWlsZWQpIHsKKyAgICAgIHNldEFsbEFwcHJvdmFscyhjZCwgbGFiZWxzKTsKKyAgICB9CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMYWJlbEluZm8+IGUgOiBsYWJlbHMuZW50cnlTZXQoKSkgeworICAgICAgTGFiZWxUeXBlIHR5cGUgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoZS5nZXRLZXkoKSk7CisgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHN0YW5kYXJkKSB7CisgICAgICAgIHNldFJlY29tbWVuZGVkQW5kRGlzbGlrZWQoY2QsIHR5cGUsIGUuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgICBpZiAoZGV0YWlsZWQpIHsKKyAgICAgICAgc2V0TGFiZWxWYWx1ZXModHlwZSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxhYmVsczsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBpbml0TGFiZWxzKENoYW5nZURhdGEgY2QsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIGJvb2xlYW4gc3RhbmRhcmQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIC8vIERvbid0IHVzZSBNYXBzLm5ld1RyZWVNYXAoQ29tcGFyYXRvcikgZHVlIHRvIE9wZW5KREsgYnVnIDEwMDE2Ny4KKyAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVscyA9CisgICAgICAgIG5ldyBUcmVlTWFwPFN0cmluZywgTGFiZWxJbmZvPihsYWJlbFR5cGVzLm5hbWVDb21wYXJhdG9yKCkpOworICAgIGZvciAoU3VibWl0UmVjb3JkIHJlYyA6IHN1Ym1pdFJlY29yZHMoY2QpKSB7CisgICAgICBpZiAocmVjLmxhYmVscyA9PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChTdWJtaXRSZWNvcmQuTGFiZWwgciA6IHJlYy5sYWJlbHMpIHsKKyAgICAgICAgTGFiZWxJbmZvIHAgPSBsYWJlbHMuZ2V0KHIubGFiZWwpOworICAgICAgICBpZiAocCA9PSBudWxsIHx8IHAuX3N0YXR1cy5jb21wYXJlVG8oci5zdGF0dXMpIDwgMCkgeworICAgICAgICAgIExhYmVsSW5mbyBuID0gbmV3IExhYmVsSW5mbygpOworICAgICAgICAgIG4uX3N0YXR1cyA9IHIuc3RhdHVzOworICAgICAgICAgIGlmIChzdGFuZGFyZCkgeworICAgICAgICAgICAgc3dpdGNoIChyLnN0YXR1cykgeworICAgICAgICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgICAgIG4uYXBwcm92ZWQgPSBhY2NvdW50TG9hZGVyLmdldChyLmFwcGxpZWRCeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgUkVKRUNUOgorICAgICAgICAgICAgICAgIG4ucmVqZWN0ZWQgPSBhY2NvdW50TG9hZGVyLmdldChyLmFwcGxpZWRCeSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgbi5vcHRpb25hbCA9IG4uX3N0YXR1cyA9PSBTdWJtaXRSZWNvcmQuTGFiZWwuU3RhdHVzLk1BWSA/IHRydWUgOiBudWxsOworICAgICAgICAgIGxhYmVscy5wdXQoci5sYWJlbCwgbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxhYmVsczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRSZWNvbW1lbmRlZEFuZERpc2xpa2VkKENoYW5nZURhdGEgY2QsIExhYmVsVHlwZSB0eXBlLAorICAgICAgTGFiZWxJbmZvIGxhYmVsKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAobGFiZWwuYXBwcm92ZWQgIT0gbnVsbCB8fCBsYWJlbC5yZWplY3RlZCAhPSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHR5cGUuZ2V0TWluKCkgPT0gbnVsbCB8fCB0eXBlLmdldE1heCgpID09IG51bGwpIHsKKyAgICAgIC8vIFVua25vd24gb3IgbWlzY29uZmlndXJlZCB0eXBlIGNhbid0IGhhdmUgaW50ZXJtZWRpYXRlIHNjb3Jlcy4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaG9ydCBtaW4gPSB0eXBlLmdldE1pbigpLmdldFZhbHVlKCk7CisgICAgc2hvcnQgbWF4ID0gdHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpOworICAgIGlmICgtMSA8PSBtaW4gJiYgbWF4IDw9IDEpIHsKKyAgICAgIC8vIFR5cGVzIHdpdGggYSByYW5nZSBvZiAtMS4uKzEgY2FuJ3QgaGF2ZSBpbnRlcm1lZGlhdGUgc2NvcmVzLgorICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBjZC5jdXJyZW50QXBwcm92YWxzKGRiKSkgeworICAgICAgc2hvcnQgdmFsID0gcHNhLmdldFZhbHVlKCk7CisgICAgICBpZiAodmFsICE9IDAgJiYgbWluIDwgdmFsICYmIHZhbCA8IG1heCAmJiB0eXBlLm1hdGNoZXMocHNhKSkgeworICAgICAgICBpZiAoMCA8IHZhbCkgeworICAgICAgICAgIGxhYmVsLnJlY29tbWVuZGVkID0gYWNjb3VudExvYWRlci5nZXQocHNhLmdldEFjY291bnRJZCgpKTsKKyAgICAgICAgICBsYWJlbC52YWx1ZSA9IHZhbCAhPSAxID8gdmFsIDogbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBsYWJlbC5kaXNsaWtlZCA9IGFjY291bnRMb2FkZXIuZ2V0KHBzYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgICAgbGFiZWwudmFsdWUgPSB2YWwgIT0gLTEgPyB2YWwgOiBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZXRBbGxBcHByb3ZhbHMoQ2hhbmdlRGF0YSBjZCwKKyAgICAgIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGJhc2VDdHJsID0gY29udHJvbChjZCk7CisgICAgaWYgKGJhc2VDdHJsID09IG51bGwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBbGwgdXNlcnMgZXZlciBhZGRlZCwgZXZlbiBpZiB0aGV5IGNhbid0IHZvdGUgb24gb25lIG9yIGFsbCBsYWJlbHMuCisgICAgU2V0PEFjY291bnQuSWQ+IGFsbFVzZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgTGlzdE11bHRpbWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldEFwcHJvdmFsPiBhbGxBcHByb3ZhbHMgPQorICAgICAgICBjZC5hbGxBcHByb3ZhbHNNYXAoZGIpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBhbGxBcHByb3ZhbHMudmFsdWVzKCkpIHsKKyAgICAgIGFsbFVzZXJzLmFkZChwc2EuZ2V0QWNjb3VudElkKCkpOworICAgIH0KKworICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudExpc3QgPSBsYWJlbE5vcm1hbGl6ZXIubm9ybWFsaXplKAorICAgICAgICBiYXNlQ3RybCwgYWxsQXBwcm92YWxzLmdldChiYXNlQ3RybC5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpKSk7CisgICAgLy8gTW9zdCByZWNlbnQsIG5vcm1hbGl6ZWQgdm90ZSBvbiBlYWNoIGxhYmVsIGZvciB0aGUgY3VycmVudCBwYXRjaCBzZXQgYnkKKyAgICAvLyBlYWNoIHVzZXIgKG1heSBiZSAwKS4KKyAgICBUYWJsZTxBY2NvdW50LklkLCBTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnQgPSBIYXNoQmFzZWRUYWJsZS5jcmVhdGUoCisgICAgICAgIGFsbFVzZXJzLnNpemUoKSwgYmFzZUN0cmwuZ2V0TGFiZWxUeXBlcygpLmdldExhYmVsVHlwZXMoKS5zaXplKCkpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBjdXJyZW50TGlzdCkgeworICAgICAgY3VycmVudC5wdXQocHNhLmdldEFjY291bnRJZCgpLCBwc2EuZ2V0TGFiZWwoKSwgcHNhKTsKKyAgICB9CisKKyAgICBmb3IgKEFjY291bnQuSWQgYWNjb3VudElkIDogYWxsVXNlcnMpIHsKKyAgICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSB1c2VyRmFjdG9yeS5jcmVhdGUoYWNjb3VudElkKTsKKyAgICAgIENoYW5nZUNvbnRyb2wgY3RsID0gYmFzZUN0cmwuZm9yVXNlcih1c2VyKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGFiZWxJbmZvPiBlIDogbGFiZWxzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgTGFiZWxUeXBlIGx0ID0gY3RsLmdldExhYmVsVHlwZXMoKS5ieUxhYmVsKGUuZ2V0S2V5KCkpOworICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgIC8vIElnbm9yZSBzdWJtaXQgcmVjb3JkIGZvciB1bmRlZmluZWQgbGFiZWw7IGxpa2VseSB0aGUgc3VibWl0IHJ1bGUKKyAgICAgICAgICAvLyBhdXRob3IgZGlkbid0IGludGVuZCBmb3IgdGhlIGxhYmVsIHRvIHNob3cgdXAgaW4gdGhlIHRhYmxlLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEludGVnZXIgdmFsdWU7CisgICAgICAgIFBhdGNoU2V0QXBwcm92YWwgcHNhID0gY3VycmVudC5nZXQoYWNjb3VudElkLCBsdC5nZXROYW1lKCkpOworICAgICAgICBpZiAocHNhICE9IG51bGwpIHsKKyAgICAgICAgICB2YWx1ZSA9IEludGVnZXIudmFsdWVPZihwc2EuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRWl0aGVyIHRoZSB1c2VyIGNhbm5vdCB2b3RlIG9uIHRoaXMgbGFiZWwsIG9yIHRoZXJlIGp1c3Qgd2Fzbid0IGEKKyAgICAgICAgICAvLyBkdW1teSBhcHByb3ZhbCBmb3IgdGhpcyBsYWJlbC4gRXhwbGljaXRseSBjaGVjayB3aGV0aGVyIHRoZSB1c2VyCisgICAgICAgICAgLy8gY2FuIHZvdGUgb24gdGhpcyBsYWJlbC4KKyAgICAgICAgICB2YWx1ZSA9IGxhYmVsTm9ybWFsaXplci5jYW5Wb3RlKGN0bCwgbHQsIGFjY291bnRJZCkgPyAwIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlLmdldFZhbHVlKCkuYWRkQXBwcm92YWwoYXBwcm92YWxJbmZvKGFjY291bnRJZCwgdmFsdWUpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzRm9yQ2xvc2VkQ2hhbmdlKENoYW5nZURhdGEgY2QsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIGJvb2xlYW4gc3RhbmRhcmQsIGJvb2xlYW4gZGV0YWlsZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBTZXQ8QWNjb3VudC5JZD4gYWxsVXNlcnMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogY2QuYWxsQXBwcm92YWxzKGRiKSkgeworICAgICAgYWxsVXNlcnMuYWRkKHBzYS5nZXRBY2NvdW50SWQoKSk7CisgICAgfQorCisgICAgU2V0PFN0cmluZz4gbGFiZWxOYW1lcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIE11bHRpbWFwPEFjY291bnQuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnQgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBjZC5jdXJyZW50QXBwcm92YWxzKGRiKSkgeworICAgICAgTGFiZWxUeXBlIHR5cGUgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoYS5nZXRMYWJlbElkKCkpOworICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiBhLmdldFZhbHVlKCkgIT0gMCkgeworICAgICAgICBsYWJlbE5hbWVzLmFkZCh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIGN1cnJlbnQucHV0KGEuZ2V0QWNjb3VudElkKCksIGEpOworICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGNhbiBvbmx5IGFwcHJveGltYXRlbHkgcmVjb25zdHJ1Y3Qgd2hhdCB0aGUgc3VibWl0IHJ1bGUgZXZhbHVhdG9yCisgICAgLy8gd291bGQgaGF2ZSBkb25lLiBUaGVzZSBzaG91bGQgcmVhbGx5IGNvbWUgZnJvbSBhIHN0b3JlZCBzdWJtaXQgcmVjb3JkLgorICAgIC8vCisgICAgLy8gRG9uJ3QgdXNlIE1hcHMubmV3VHJlZU1hcChDb21wYXJhdG9yKSBkdWUgdG8gT3BlbkpESyBidWcgMTAwMTY3LgorICAgIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzID0KKyAgICAgICAgbmV3IFRyZWVNYXA8U3RyaW5nLCBMYWJlbEluZm8+KGxhYmVsVHlwZXMubmFtZUNvbXBhcmF0b3IoKSk7CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGxhYmVsTmFtZXMpIHsKKyAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKG5hbWUpOworICAgICAgTGFiZWxJbmZvIGxpID0gbmV3IExhYmVsSW5mbygpOworICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgIHNldExhYmVsVmFsdWVzKHR5cGUsIGxpKTsKKyAgICAgIH0KKyAgICAgIGxhYmVscy5wdXQodHlwZS5nZXROYW1lKCksIGxpKTsKKyAgICB9CisKKyAgICBmb3IgKEFjY291bnQuSWQgYWNjb3VudElkIDogYWxsVXNlcnMpIHsKKyAgICAgIE1hcDxTdHJpbmcsIEFwcHJvdmFsSW5mbz4gYnlMYWJlbCA9CisgICAgICAgICAgTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZShsYWJlbHMuc2l6ZSgpKTsKKworICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBsYWJlbHMua2V5U2V0KCkpIHsKKyAgICAgICAgICBBcHByb3ZhbEluZm8gYWkgPSBhcHByb3ZhbEluZm8oYWNjb3VudElkLCAwKTsKKyAgICAgICAgICBieUxhYmVsLnB1dChuYW1lLCBhaSk7CisgICAgICAgICAgbGFiZWxzLmdldChuYW1lKS5hZGRBcHByb3ZhbChhaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBjdXJyZW50LmdldChhY2NvdW50SWQpKSB7CisgICAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKHBzYS5nZXRMYWJlbElkKCkpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzaG9ydCB2YWwgPSBwc2EuZ2V0VmFsdWUoKTsKKyAgICAgICAgQXBwcm92YWxJbmZvIGluZm8gPSBieUxhYmVsLmdldCh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICBpbmZvLnZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBMYWJlbEluZm8gbGkgPSBsYWJlbHMuZ2V0KHR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKCFzdGFuZGFyZCB8fCBsaS5hcHByb3ZlZCAhPSBudWxsIHx8IGxpLnJlamVjdGVkICE9IG51bGwpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsID09IHR5cGUuZ2V0TWF4KCkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGxpLmFwcHJvdmVkID0gYWNjb3VudExvYWRlci5nZXQoYWNjb3VudElkKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgPT0gdHlwZS5nZXRNaW4oKS5nZXRWYWx1ZSgpCisgICAgICAgICAgICAvLyBBIG1lcmdlZCBjaGFuZ2UgY2FuJ3QgaGF2ZSBiZWVuIHJlamVjdGVkLgorICAgICAgICAgICAgJiYgY2QuZ2V0Q2hhbmdlKCkuZ2V0U3RhdHVzKCkgIT0gU3RhdHVzLk1FUkdFRCkgeworICAgICAgICAgIGxpLnJlamVjdGVkID0gYWNjb3VudExvYWRlci5nZXQoYWNjb3VudElkKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgPiAwKSB7CisgICAgICAgICAgbGkucmVjb21tZW5kZWQgPSBhY2NvdW50TG9hZGVyLmdldChhY2NvdW50SWQpOworICAgICAgICAgIGxpLnZhbHVlID0gdmFsOworICAgICAgICB9IGVsc2UgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgICBsaS5kaXNsaWtlZCA9IGFjY291bnRMb2FkZXIuZ2V0KGFjY291bnRJZCk7CisgICAgICAgICAgbGkudmFsdWUgPSB2YWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxhYmVsczsKKyAgfQorCisgIHByaXZhdGUgQXBwcm92YWxJbmZvIGFwcHJvdmFsSW5mbyhBY2NvdW50LklkIGlkLCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgQXBwcm92YWxJbmZvIGFpID0gbmV3IEFwcHJvdmFsSW5mbyhpZCk7CisgICAgYWkudmFsdWUgPSB2YWx1ZTsKKyAgICBhY2NvdW50TG9hZGVyLnB1dChhaSk7CisgICAgcmV0dXJuIGFpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09ubHlaZXJvKENvbGxlY3Rpb248U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICByZXR1cm4gdmFsdWVzLmlzRW1wdHkoKSB8fCAodmFsdWVzLnNpemUoKSA9PSAxICYmIHZhbHVlcy5jb250YWlucygiIDAiKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0TGFiZWxWYWx1ZXMoTGFiZWxUeXBlIHR5cGUsIExhYmVsSW5mbyBsYWJlbCkgeworICAgIGxhYmVsLnZhbHVlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIGZvciAoTGFiZWxWYWx1ZSB2IDogdHlwZS5nZXRWYWx1ZXMoKSkgeworICAgICAgbGFiZWwudmFsdWVzLnB1dCh2LmZvcm1hdFZhbHVlKCksIHYuZ2V0VGV4dCgpKTsKKyAgICB9CisgICAgaWYgKGlzT25seVplcm8obGFiZWwudmFsdWVzLmtleVNldCgpKSkgeworICAgICAgbGFiZWwudmFsdWVzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGVybWl0dGVkTGFiZWxzKENoYW5nZURhdGEgY2QpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOworICAgIGlmIChjdGwgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY3RsLmdldExhYmVsVHlwZXMoKTsKKyAgICBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBlcm1pdHRlZCA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICBmb3IgKFN1Ym1pdFJlY29yZCByZWMgOiBzdWJtaXRSZWNvcmRzKGNkKSkgeworICAgICAgaWYgKHJlYy5sYWJlbHMgPT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoU3VibWl0UmVjb3JkLkxhYmVsIHIgOiByZWMubGFiZWxzKSB7CisgICAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKHIubGFiZWwpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gY3RsLmdldFJhbmdlKFBlcm1pc3Npb24uZm9yTGFiZWwoci5sYWJlbCkpOworICAgICAgICBmb3IgKExhYmVsVmFsdWUgdiA6IHR5cGUuZ2V0VmFsdWVzKCkpIHsKKyAgICAgICAgICBpZiAocmFuZ2UuY29udGFpbnModi5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgcGVybWl0dGVkLnB1dChyLmxhYmVsLCB2LmZvcm1hdFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBMaXN0PFN0cmluZz4gdG9DbGVhciA9CisgICAgICBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocGVybWl0dGVkLmtleVNldCgpLnNpemUoKSk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGUKKyAgICAgICAgOiBwZXJtaXR0ZWQuYXNNYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICBpZiAoaXNPbmx5WmVybyhlLmdldFZhbHVlKCkpKSB7CisgICAgICAgIHRvQ2xlYXIuYWRkKGUuZ2V0S2V5KCkpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKFN0cmluZyBsYWJlbCA6IHRvQ2xlYXIpIHsKKyAgICAgIHBlcm1pdHRlZC5yZW1vdmVBbGwobGFiZWwpOworICAgIH0KKyAgICByZXR1cm4gcGVybWl0dGVkLmFzTWFwKCk7CisgIH0KKworICBwcml2YXRlIENvbGxlY3Rpb248QWNjb3VudEluZm8+IHJlbW92YWJsZVJldmlld2VycyhDaGFuZ2VEYXRhIGNkLAorICAgICAgQ29sbGVjdGlvbjxMYWJlbEluZm8+IGxhYmVscykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKKyAgICBpZiAoY3RsID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFNldDxBY2NvdW50LklkPiBmaXhlZCA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUobGFiZWxzLnNpemUoKSk7CisgICAgU2V0PEFjY291bnQuSWQ+IHJlbW92YWJsZSA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUobGFiZWxzLnNpemUoKSk7CisgICAgZm9yIChMYWJlbEluZm8gbGFiZWwgOiBsYWJlbHMpIHsKKyAgICAgIGlmIChsYWJlbC5hbGwgPT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoQXBwcm92YWxJbmZvIGFpIDogbGFiZWwuYWxsKSB7CisgICAgICAgIGlmIChjdGwuY2FuUmVtb3ZlUmV2aWV3ZXIoYWkuX2lkLCBPYmplY3RzLmZpcnN0Tm9uTnVsbChhaS52YWx1ZSwgMCkpKSB7CisgICAgICAgICAgcmVtb3ZhYmxlLmFkZChhaS5faWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpeGVkLmFkZChhaS5faWQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJlbW92YWJsZS5yZW1vdmVBbGwoZml4ZWQpOworCisgICAgTGlzdDxBY2NvdW50SW5mbz4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJlbW92YWJsZS5zaXplKCkpOworICAgIGZvciAoQWNjb3VudC5JZCBpZCA6IHJlbW92YWJsZSkgeworICAgICAgcmVzdWx0LmFkZChhY2NvdW50TG9hZGVyLmdldChpZCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzQ2hhbmdlUmV2aWV3ZWQoQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikgeworICAgICAgUGF0Y2hTZXQgY3VycmVudFBhdGNoU2V0ID0gY2QuY3VycmVudFBhdGNoU2V0KGRiKTsKKyAgICAgIGlmIChjdXJyZW50UGF0Y2hTZXQgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIExpc3Q8Q2hhbmdlTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgIGRiLmdldCgpLmNoYW5nZU1lc3NhZ2VzKCkuYnlQYXRjaFNldChjdXJyZW50UGF0Y2hTZXQuZ2V0SWQoKSkudG9MaXN0KCk7CisKKyAgICAgIGlmIChtZXNzYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICAvLyBTb3J0IG1lc3NhZ2VzIHRvIGxldCB0aGUgbW9zdCByZWNlbnQgb25lcyBhdCB0aGUgYmVnaW5uaW5nLgorICAgICAgQ29sbGVjdGlvbnMuc29ydChtZXNzYWdlcywgbmV3IENvbXBhcmF0b3I8Q2hhbmdlTWVzc2FnZT4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQ2hhbmdlTWVzc2FnZSBhLCBDaGFuZ2VNZXNzYWdlIGIpIHsKKyAgICAgICAgICByZXR1cm4gYi5nZXRXcml0dGVuT24oKS5jb21wYXJlVG8oYS5nZXRXcml0dGVuT24oKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBBY2NvdW50LklkIGN1cnJlbnRVc2VySWQgPSAoKElkZW50aWZpZWRVc2VyKSB1c2VyKS5nZXRBY2NvdW50SWQoKTsKKyAgICAgIEFjY291bnQuSWQgY2hhbmdlT3duZXJJZCA9IGNkLmNoYW5nZShkYikuZ2V0T3duZXIoKTsKKyAgICAgIGZvciAoQ2hhbmdlTWVzc2FnZSBjbSA6IG1lc3NhZ2VzKSB7CisgICAgICAgIGlmIChjdXJyZW50VXNlcklkLmVxdWFscyhjbS5nZXRBdXRob3IoKSkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VPd25lcklkLmVxdWFscyhjbS5nZXRBdXRob3IoKSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXZpc2lvbkluZm8+IHJldmlzaW9ucyhDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOworICAgIGlmIChjdGwgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQ29sbGVjdGlvbjxQYXRjaFNldD4gc3JjOworICAgIGlmIChjZC5nZXRMaW1pdGVkUGF0Y2hTZXRzKCkgIT0gbnVsbCB8fCBoYXMoQUxMX1JFVklTSU9OUykpIHsKKyAgICAgIHNyYyA9IGNkLnBhdGNoZXMoZGIpOworICAgIH0gZWxzZSB7CisgICAgICBzcmMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNkLmN1cnJlbnRQYXRjaFNldChkYikpOworICAgIH0KKyAgICBNYXA8U3RyaW5nLCBSZXZpc2lvbkluZm8+IHJlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIGZvciAoUGF0Y2hTZXQgaW4gOiBzcmMpIHsKKyAgICAgIGlmIChjdGwuaXNQYXRjaFZpc2libGUoaW4sIGRiLmdldCgpKSkgeworICAgICAgICByZXMucHV0KGluLmdldFJldmlzaW9uKCkuZ2V0KCksIHRvUmV2aXNpb25JbmZvKGNkLCBpbikpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgcHJpdmF0ZSBSZXZpc2lvbkluZm8gdG9SZXZpc2lvbkluZm8oQ2hhbmdlRGF0YSBjZCwgUGF0Y2hTZXQgaW4pCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBSZXZpc2lvbkluZm8gb3V0ID0gbmV3IFJldmlzaW9uSW5mbygpOworICAgIG91dC5pc0N1cnJlbnQgPSBpbi5nZXRJZCgpLmVxdWFscyhjZC5jaGFuZ2UoZGIpLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgIG91dC5fbnVtYmVyID0gaW4uZ2V0SWQoKS5nZXQoKTsKKyAgICBvdXQuZHJhZnQgPSBpbi5pc0RyYWZ0KCkgPyB0cnVlIDogbnVsbDsKKyAgICBvdXQuZmV0Y2ggPSBtYWtlRmV0Y2hNYXAoY2QsIGluKTsKKworICAgIGlmIChoYXMoQUxMX0NPTU1JVFMpIHx8IChvdXQuaXNDdXJyZW50ICYmIGhhcyhDVVJSRU5UX0NPTU1JVCkpKSB7CisgICAgICB0cnkgeworICAgICAgICBQYXRjaFNldEluZm8gaW5mbyA9IHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KGRiLmdldCgpLCBpbi5nZXRJZCgpKTsKKyAgICAgICAgb3V0LmNvbW1pdCA9IG5ldyBDb21taXRJbmZvKCk7CisgICAgICAgIG91dC5jb21taXQucGFyZW50cyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShpbmZvLmdldFBhcmVudHMoKS5zaXplKCkpOworICAgICAgICBvdXQuY29tbWl0LmF1dGhvciA9IHRvR2l0UGVyc29uKGluZm8uZ2V0QXV0aG9yKCkpOworICAgICAgICBvdXQuY29tbWl0LmNvbW1pdHRlciA9IHRvR2l0UGVyc29uKGluZm8uZ2V0Q29tbWl0dGVyKCkpOworICAgICAgICBvdXQuY29tbWl0LnN1YmplY3QgPSBpbmZvLmdldFN1YmplY3QoKTsKKyAgICAgICAgb3V0LmNvbW1pdC5tZXNzYWdlID0gaW5mby5nZXRNZXNzYWdlKCk7CisKKyAgICAgICAgZm9yIChQYXJlbnRJbmZvIHBhcmVudCA6IGluZm8uZ2V0UGFyZW50cygpKSB7CisgICAgICAgICAgQ29tbWl0SW5mbyBpID0gbmV3IENvbW1pdEluZm8oKTsKKyAgICAgICAgICBpLmNvbW1pdCA9IHBhcmVudC5pZC5nZXQoKTsKKyAgICAgICAgICBpLnN1YmplY3QgPSBwYXJlbnQuc2hvcnRNZXNzYWdlOworICAgICAgICAgIG91dC5jb21taXQucGFyZW50cy5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBQYXRjaFNldEluZm8gIiArIGluLmdldElkKCksIGUpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChoYXMoQUxMX0ZJTEVTKSB8fCAob3V0LmlzQ3VycmVudCAmJiBoYXMoQ1VSUkVOVF9GSUxFUykpKSB7CisgICAgICBQYXRjaExpc3QgbGlzdDsKKyAgICAgIHRyeSB7CisgICAgICAgIGxpc3QgPSBwYXRjaExpc3RDYWNoZS5nZXQoY2QuY2hhbmdlKGRiKSwgaW4pOworICAgICAgfSBjYXRjaCAoUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIFBhdGNoTGlzdCAiICsgaW4uZ2V0SWQoKSwgZSk7CisgICAgICAgIGxpc3QgPSBudWxsOworICAgICAgfQorICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgeworICAgICAgICBvdXQuZmlsZXMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgICAgICAgZm9yIChQYXRjaExpc3RFbnRyeSBlIDogbGlzdC5nZXRQYXRjaGVzKCkpIHsKKyAgICAgICAgICBpZiAoUGF0Y2guQ09NTUlUX01TRy5lcXVhbHMoZS5nZXROZXdOYW1lKCkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBGaWxlSW5mbyBkID0gbmV3IEZpbGVJbmZvKCk7CisgICAgICAgICAgZC5zdGF0dXMgPSBlLmdldENoYW5nZVR5cGUoKSAhPSBQYXRjaC5DaGFuZ2VUeXBlLk1PRElGSUVECisgICAgICAgICAgICAgID8gZS5nZXRDaGFuZ2VUeXBlKCkuZ2V0Q29kZSgpCisgICAgICAgICAgICAgIDogbnVsbDsKKyAgICAgICAgICBkLm9sZFBhdGggPSBlLmdldE9sZE5hbWUoKTsKKyAgICAgICAgICBpZiAoZS5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuQklOQVJZKSB7CisgICAgICAgICAgICBkLmJpbmFyeSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGQubGluZXNJbnNlcnRlZCA9IGUuZ2V0SW5zZXJ0aW9ucygpID4gMCA/IGUuZ2V0SW5zZXJ0aW9ucygpIDogbnVsbDsKKyAgICAgICAgICAgIGQubGluZXNEZWxldGVkID0gZS5nZXREZWxldGlvbnMoKSA+IDAgPyBlLmdldERlbGV0aW9ucygpIDogbnVsbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBGaWxlSW5mbyBvID0gb3V0LmZpbGVzLnB1dChlLmdldE5ld05hbWUoKSwgZCk7CisgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gYSBkZWxldGUtYWRkIGJyZWFrIGNyZWF0ZWQgYnkgSkdpdAorICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmlsZSB3YXMgcmV3cml0dGVuIGFuZCB0b28gbGl0dGxlIGNvbnRlbnQgc3Vydml2ZWQuIFdyaXRlCisgICAgICAgICAgICAvLyBhIHNpbmdsZSByZWNvcmQgd2l0aCBkYXRhIGZyb20gYm90aCBzaWRlcy4KKyAgICAgICAgICAgIGQuc3RhdHVzID0gUGF0Y2guQ2hhbmdlVHlwZS5SRVdSSVRFLmdldENvZGUoKTsKKyAgICAgICAgICAgIGlmIChvLmJpbmFyeSAhPSBudWxsICYmIG8uYmluYXJ5KSB7CisgICAgICAgICAgICAgIGQuYmluYXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvLmxpbmVzSW5zZXJ0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICBkLmxpbmVzSW5zZXJ0ZWQgPSBvLmxpbmVzSW5zZXJ0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoby5saW5lc0RlbGV0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICBkLmxpbmVzRGVsZXRlZCA9IG8ubGluZXNEZWxldGVkOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGZXRjaEluZm8+IG1ha2VGZXRjaE1hcChDaGFuZ2VEYXRhIGNkLCBQYXRjaFNldCBpbikKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIEZldGNoSW5mbz4gciA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIFN0cmluZyByZWZOYW1lID0gaW4uZ2V0UmVmTmFtZSgpOworICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7CisgICAgaWYgKGN0bCAhPSBudWxsICYmIGN0bC5mb3JVc2VyKGFub255bW91cykuaXNQYXRjaFZpc2libGUoaW4sIGRiLmdldCgpKSkgeworICAgICAgaWYgKHVybHMuZ2l0ICE9IG51bGwpIHsKKyAgICAgICAgci5wdXQoImdpdCIsIG5ldyBGZXRjaEluZm8odXJscy5naXQKKyAgICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHVybHMuaHR0cCAhPSBudWxsKSB7CisgICAgICByLnB1dCgiaHR0cCIsIG5ldyBGZXRjaEluZm8odXJscy5odHRwCisgICAgICAgICAgKyBjZC5jaGFuZ2UoZGIpLmdldFByb2plY3QoKS5nZXQoKSwgcmVmTmFtZSkpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmcgaHR0cCA9IHVybFByb3ZpZGVyLmdldCgpOworICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaHR0cCkpIHsKKyAgICAgICAgci5wdXQoImh0dHAiLCBuZXcgRmV0Y2hJbmZvKGh0dHAKKyAgICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHNzaEluZm8gIT0gbnVsbCAmJiAhc3NoSW5mby5nZXRIb3N0S2V5cygpLmlzRW1wdHkoKSkgeworICAgICAgSG9zdEtleSBob3N0ID0gc3NoSW5mby5nZXRIb3N0S2V5cygpLmdldCgwKTsKKyAgICAgIHIucHV0KCJzc2giLCBuZXcgRmV0Y2hJbmZvKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgInNzaDovLyVzLyVzIiwKKyAgICAgICAgICBob3N0LmdldEhvc3QoKSwgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCkpLAorICAgICAgICAgIHJlZk5hbWUpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEdpdFBlcnNvbiB0b0dpdFBlcnNvbihVc2VySWRlbnRpdHkgY29tbWl0dGVyKSB7CisgICAgR2l0UGVyc29uIHAgPSBuZXcgR2l0UGVyc29uKCk7CisgICAgcC5uYW1lID0gY29tbWl0dGVyLmdldE5hbWUoKTsKKyAgICBwLmVtYWlsID0gY29tbWl0dGVyLmdldEVtYWlsKCk7CisgICAgcC5kYXRlID0gY29tbWl0dGVyLmdldERhdGUoKTsKKyAgICBwLnR6ID0gY29tbWl0dGVyLmdldFRpbWVab25lKCk7CisgICAgcmV0dXJuIHA7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIENoYW5nZUluZm8geworICAgIGZpbmFsIFN0cmluZyBraW5kID0gImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIjsKKyAgICBTdHJpbmcgaWQ7CisgICAgU3RyaW5nIHByb2plY3Q7CisgICAgU3RyaW5nIGJyYW5jaDsKKyAgICBTdHJpbmcgdG9waWM7CisgICAgcHVibGljIFN0cmluZyBjaGFuZ2VJZDsKKyAgICBwdWJsaWMgU3RyaW5nIHN1YmplY3Q7CisgICAgQ2hhbmdlLlN0YXR1cyBzdGF0dXM7CisgICAgVGltZXN0YW1wIGNyZWF0ZWQ7CisgICAgVGltZXN0YW1wIHVwZGF0ZWQ7CisgICAgQm9vbGVhbiBzdGFycmVkOworICAgIEJvb2xlYW4gcmV2aWV3ZWQ7CisgICAgQm9vbGVhbiBtZXJnZWFibGU7CisKKyAgICBTdHJpbmcgX3NvcnRrZXk7CisgICAgaW50IF9udW1iZXI7CisKKyAgICBBY2NvdW50SW5mbyBvd25lcjsKKworICAgIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzOworICAgIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4gcGVybWl0dGVkX2xhYmVsczsKKyAgICBDb2xsZWN0aW9uPEFjY291bnRJbmZvPiByZW1vdmFibGVfcmV2aWV3ZXJzOworCisgICAgU3RyaW5nIGN1cnJlbnRfcmV2aXNpb247CisgICAgTWFwPFN0cmluZywgUmV2aXNpb25JbmZvPiByZXZpc2lvbnM7CisgICAgcHVibGljIEJvb2xlYW4gX21vcmVDaGFuZ2VzOworCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICBpZCA9IEpvaW5lci5vbignficpLmpvaW4oCisgICAgICAgICAgVXJsLmVuY29kZShwcm9qZWN0KSwKKyAgICAgICAgICBVcmwuZW5jb2RlKGJyYW5jaCksCisgICAgICAgICAgVXJsLmVuY29kZShjaGFuZ2VJZCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBSZXZpc2lvbkluZm8geworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gaXNDdXJyZW50OworICAgIEJvb2xlYW4gZHJhZnQ7CisgICAgaW50IF9udW1iZXI7CisgICAgTWFwPFN0cmluZywgRmV0Y2hJbmZvPiBmZXRjaDsKKyAgICBDb21taXRJbmZvIGNvbW1pdDsKKyAgICBNYXA8U3RyaW5nLCBGaWxlSW5mbz4gZmlsZXM7CisgIH0KKworICBzdGF0aWMgY2xhc3MgRmV0Y2hJbmZvIHsKKyAgICBTdHJpbmcgdXJsOworICAgIFN0cmluZyByZWY7CisKKyAgICBGZXRjaEluZm8oU3RyaW5nIHVybCwgU3RyaW5nIHJlZikgeworICAgICAgdGhpcy51cmwgPSB1cmw7CisgICAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgR2l0UGVyc29uIHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgZW1haWw7CisgICAgVGltZXN0YW1wIGRhdGU7CisgICAgaW50IHR6OworICB9CisKKyAgc3RhdGljIGNsYXNzIENvbW1pdEluZm8geworICAgIFN0cmluZyBjb21taXQ7CisgICAgTGlzdDxDb21taXRJbmZvPiBwYXJlbnRzOworICAgIEdpdFBlcnNvbiBhdXRob3I7CisgICAgR2l0UGVyc29uIGNvbW1pdHRlcjsKKyAgICBTdHJpbmcgc3ViamVjdDsKKyAgICBTdHJpbmcgbWVzc2FnZTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyB7CisgICAgQ2hhcmFjdGVyIHN0YXR1czsKKyAgICBCb29sZWFuIGJpbmFyeTsKKyAgICBTdHJpbmcgb2xkUGF0aDsKKyAgICBJbnRlZ2VyIGxpbmVzSW5zZXJ0ZWQ7CisgICAgSW50ZWdlciBsaW5lc0RlbGV0ZWQ7CisgIH0KKworICBzdGF0aWMgY2xhc3MgTGFiZWxJbmZvIHsKKyAgICB0cmFuc2llbnQgU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cyBfc3RhdHVzOworCisgICAgQWNjb3VudEluZm8gYXBwcm92ZWQ7CisgICAgQWNjb3VudEluZm8gcmVqZWN0ZWQ7CisgICAgQWNjb3VudEluZm8gcmVjb21tZW5kZWQ7CisgICAgQWNjb3VudEluZm8gZGlzbGlrZWQ7CisgICAgTGlzdDxBcHByb3ZhbEluZm8+IGFsbDsKKworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzOworCisgICAgU2hvcnQgdmFsdWU7CisgICAgQm9vbGVhbiBvcHRpb25hbDsKKworICAgIHZvaWQgYWRkQXBwcm92YWwoQXBwcm92YWxJbmZvIGFpKSB7CisgICAgICBpZiAoYWxsID09IG51bGwpIHsKKyAgICAgICAgYWxsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICB9CisgICAgICBhbGwuYWRkKGFpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgQXBwcm92YWxJbmZvIGV4dGVuZHMgQWNjb3VudEluZm8geworICAgIEludGVnZXIgdmFsdWU7CisKKyAgICBBcHByb3ZhbEluZm8oQWNjb3VudC5JZCBpZCkgeworICAgICAgc3VwZXIoaWQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZU1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzNmQzZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZU1lc3NhZ2VzLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm5scy5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ubHMuVHJhbnNsYXRpb25CdW5kbGU7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2VNZXNzYWdlcyBleHRlbmRzIFRyYW5zbGF0aW9uQnVuZGxlIHsKKyAgcHVibGljIHN0YXRpYyBDaGFuZ2VNZXNzYWdlcyBnZXQoKSB7CisgICAgcmV0dXJuIE5MUy5nZXRCdW5kbGVGb3IoQ2hhbmdlTWVzc2FnZXMuY2xhc3MpOworICB9CisKKyAgcHVibGljIFN0cmluZyByZXZlcnRDaGFuZ2VEZWZhdWx0TWVzc2FnZTsKKyAgcHVibGljIFN0cmluZyByZXZpZXdlck5vdEZvdW5kOworCisgIHB1YmxpYyBTdHJpbmcgZ3JvdXBJc05vdEFsbG93ZWQ7CisgIHB1YmxpYyBTdHJpbmcgZ3JvdXBIYXNUb29NYW55TWVtYmVyczsKKyAgcHVibGljIFN0cmluZyBncm91cE1hbnlNZW1iZXJzQ29uZmlybWF0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzMDgxYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2VSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8Q2hhbmdlUmVzb3VyY2U+PiBDSEFOR0VfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8Q2hhbmdlUmVzb3VyY2U+PigpIHt9OworCisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbCBjb250cm9sOworCisgIHB1YmxpYyBDaGFuZ2VSZXNvdXJjZShDaGFuZ2VDb250cm9sIGNvbnRyb2wpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sOworICB9CisKKyAgcHJvdGVjdGVkIENoYW5nZVJlc291cmNlKENoYW5nZVJlc291cmNlIGNvcHkpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSBjb3B5LmNvbnRyb2w7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlQ29udHJvbCBnZXRDb250cm9sKCkgeworICAgIHJldHVybiBjb250cm9sOworICB9CisKKyAgcHVibGljIENoYW5nZSBnZXRDaGFuZ2UoKSB7CisgICAgcmV0dXJuIGdldENvbnRyb2woKS5nZXRDaGFuZ2UoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZXNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwMGViYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZXNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0Q29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuUXVlcnlDaGFuZ2VzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENoYW5nZXNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBSZXN0Q29sbGVjdGlvbjxUb3BMZXZlbFJlc291cmNlLCBDaGFuZ2VSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UXVlcnlDaGFuZ2VzPiBxdWVyeUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxDaGFuZ2VSZXNvdXJjZT4+IHZpZXdzOworCisgIEBJbmplY3QKKyAgQ2hhbmdlc0NvbGxlY3Rpb24oCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPFF1ZXJ5Q2hhbmdlcz4gcXVlcnlGYWN0b3J5LAorICAgICAgRHluYW1pY01hcDxSZXN0VmlldzxDaGFuZ2VSZXNvdXJjZT4+IHZpZXdzKSB7CisgICAgdGhpcy5kYiA9IGRiUHJvdmlkZXI7CisgICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OworICAgIHRoaXMucXVlcnlGYWN0b3J5ID0gcXVlcnlGYWN0b3J5OworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8VG9wTGV2ZWxSZXNvdXJjZT4gbGlzdCgpIHsKKyAgICByZXR1cm4gcXVlcnlGYWN0b3J5LmdldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PENoYW5nZVJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFuZ2VSZXNvdXJjZSBwYXJzZShUb3BMZXZlbFJlc291cmNlIHJvb3QsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFBhcnNlZElkIHAgPSBuZXcgUGFyc2VkSWQoaWQuZW5jb2RlZCgpKTsKKyAgICBMaXN0PENoYW5nZT4gY2hhbmdlcyA9IGZpbmRDaGFuZ2VzKHApOworICAgIGlmIChjaGFuZ2VzLnNpemUoKSAhPSAxKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorCisgICAgQ2hhbmdlQ29udHJvbCBjb250cm9sOworICAgIHRyeSB7CisgICAgICBjb250cm9sID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlcy5nZXQoMCkpOworICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ2hhbmdlUmVzb3VyY2UoY29udHJvbCk7CisgIH0KKworICBwcml2YXRlIExpc3Q8Q2hhbmdlPiBmaW5kQ2hhbmdlcyhQYXJzZWRJZCBrKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoay5sZWdhY3lJZCAhPSBudWxsKSB7CisgICAgICBDaGFuZ2UgYyA9IGRiLmdldCgpLmNoYW5nZXMoKS5nZXQoay5sZWdhY3lJZCk7CisgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKGMpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0gZWxzZSBpZiAoay5wcm9qZWN0ID09IG51bGwgJiYgay5icmFuY2ggPT0gbnVsbCAmJiBrLmNoYW5nZUlkICE9IG51bGwpIHsKKyAgICAgIENoYW5nZS5LZXkgaWQgPSBuZXcgQ2hhbmdlLktleShrLmNoYW5nZUlkKTsKKyAgICAgIGlmIChpZC5nZXQoKS5sZW5ndGgoKSA9PSA0MSkgeworICAgICAgICByZXR1cm4gZGIuZ2V0KCkuY2hhbmdlcygpLmJ5S2V5KGlkKS50b0xpc3QoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkYi5nZXQoKS5jaGFuZ2VzKCkuYnlLZXlSYW5nZShpZCwgaWQubWF4KCkpLnRvTGlzdCgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGIuZ2V0KCkuY2hhbmdlcygpLmJ5QnJhbmNoS2V5KAorICAgICAgICBrLmJyYW5jaCgpLAorICAgICAgICBuZXcgQ2hhbmdlLktleShrLmNoYW5nZUlkKSkudG9MaXN0KCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJzZWRJZCB7CisgICAgQ2hhbmdlLklkIGxlZ2FjeUlkOworICAgIFN0cmluZyBwcm9qZWN0OworICAgIFN0cmluZyBicmFuY2g7CisgICAgU3RyaW5nIGNoYW5nZUlkOworCisgICAgUGFyc2VkSWQoU3RyaW5nIGlkKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICBpZiAoaWQubWF0Y2hlcygiXlsxLTldWzAtOV0qJCIpKSB7CisgICAgICAgIGxlZ2FjeUlkID0gQ2hhbmdlLklkLnBhcnNlKGlkKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpbnQgdDIgPSBpZC5sYXN0SW5kZXhPZignficpOworICAgICAgaW50IHQxID0gaWQubGFzdEluZGV4T2YoJ34nLCB0MiAtIDEpOworICAgICAgaWYgKHQxIDwgMCB8fCB0MiA8IDApIHsKKyAgICAgICAgaWYgKCFpZC5tYXRjaGVzKCJeSVswLTlhLXpdezQsNDB9JCIpKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgICAgICB9CisgICAgICAgIGNoYW5nZUlkID0gaWQ7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgcHJvamVjdCA9IFVybC5kZWNvZGUoaWQuc3Vic3RyaW5nKDAsIHQxKSk7CisgICAgICBicmFuY2ggPSBVcmwuZGVjb2RlKGlkLnN1YnN0cmluZyh0MSArIDEsIHQyKSk7CisgICAgICBjaGFuZ2VJZCA9IFVybC5kZWNvZGUoaWQuc3Vic3RyaW5nKHQyICsgMSkpOworCisgICAgICBpZiAoIWJyYW5jaC5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFRlMpKSB7CisgICAgICAgIGJyYW5jaCA9IENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoOworICAgICAgfQorICAgIH0KKworICAgIEJyYW5jaC5OYW1lS2V5IGJyYW5jaCgpIHsKKyAgICAgIHJldHVybiBuZXcgQnJhbmNoLk5hbWVLZXkobmV3IFByb2plY3QuTmFtZUtleShwcm9qZWN0KSwgYnJhbmNoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NyZWF0ZURyYWZ0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DcmVhdGVEcmFmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OGJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DcmVhdGVEcmFmdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQuU3RhdHVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlB1dERyYWZ0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitjbGFzcyBDcmVhdGVEcmFmdCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworCisgIEBJbmplY3QKKyAgQ3JlYXRlRHJhZnQoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKSB7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXNwb25zZTxHZXREcmFmdC5Db21tZW50PiBhcHBseShSZXZpc2lvblJlc291cmNlIHJzcmMsIElucHV0IGluKQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbi5wYXRoKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oInBhdGggbXVzdCBiZSBub24tZW1wdHkiKTsKKyAgICB9IGVsc2UgaWYgKGluLm1lc3NhZ2UgPT0gbnVsbCB8fCBpbi5tZXNzYWdlLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJtZXNzYWdlIG11c3QgYmUgbm9uLWVtcHR5Iik7CisgICAgfSBlbHNlIGlmIChpbi5saW5lICE9IG51bGwgJiYgaW4ubGluZSA8PSAwKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibGluZSBtdXN0IGJlID4gMCIpOworICAgIH0KKworICAgIFBhdGNoTGluZUNvbW1lbnQgYyA9IG5ldyBQYXRjaExpbmVDb21tZW50KAorICAgICAgICBuZXcgUGF0Y2hMaW5lQ29tbWVudC5LZXkoCisgICAgICAgICAgICBuZXcgUGF0Y2guS2V5KHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLCBpbi5wYXRoKSwKKyAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGIuZ2V0KCkpKSwKKyAgICAgICAgaW4ubGluZSAhPSBudWxsID8gaW4ubGluZSA6IDAsCisgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCksCisgICAgICAgIFVybC5kZWNvZGUoaW4uaW5SZXBseVRvKSk7CisgICAgYy5zZXRTdGF0dXMoU3RhdHVzLkRSQUZUKTsKKyAgICBjLnNldFNpZGUoaW4uc2lkZSA9PSBHZXREcmFmdC5TaWRlLlBBUkVOVCA/IChzaG9ydCkgMCA6IChzaG9ydCkgMSk7CisgICAgYy5zZXRNZXNzYWdlKGluLm1lc3NhZ2UudHJpbSgpKTsKKyAgICBkYi5nZXQoKS5wYXRjaENvbW1lbnRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjKSk7CisgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQobmV3IEdldERyYWZ0LkNvbW1lbnQoYykpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EZWxldGVEcmFmdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlRHJhZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDU4OThlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlRHJhZnQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuRGVsZXRlRHJhZnQuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2NsYXNzIERlbGV0ZURyYWZ0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8RHJhZnRSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworCisgIEBJbmplY3QKKyAgRGVsZXRlRHJhZnQoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKSB7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoRHJhZnRSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZGIuZ2V0KCkucGF0Y2hDb21tZW50cygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24ocnNyYy5nZXRDb21tZW50KCkpKTsKKyAgICByZXR1cm4gUmVzcG9uc2Uubm9uZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EZWxldGVSZXZpZXdlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlUmV2aWV3ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmZmZmFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlUmV2aWV3ZXIuamF2YQpAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkRlbGV0ZVJldmlld2VyLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIERlbGV0ZVJldmlld2VyIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UmV2aWV3ZXJSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgRGVsZXRlUmV2aWV3ZXIoUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIpIHsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aWV3ZXJSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJzcmMuZ2V0Q29udHJvbCgpOworICAgIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0SWQoKTsKKyAgICBSZXZpZXdEYiBkYiA9IGRiUHJvdmlkZXIuZ2V0KCk7CisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlSWQpOworICAgIHRyeSB7CisgICAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGRlbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMoZGIsIHJzcmMpKSB7CisgICAgICAgIGlmIChjb250cm9sLmNhblJlbW92ZVJldmlld2VyKGEpKSB7CisgICAgICAgICAgZGVsLmFkZChhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiZGVsZXRlIG5vdCBwZXJtaXR0ZWQiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGRlbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuZGVsZXRlKGRlbCk7CisgICAgICBkYi5jb21taXQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3BvbnNlLm5vbmUoKTsKKyAgfQorCisgIHByaXZhdGUgSXRlcmFibGU8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKFJldmlld0RiIGRiLAorICAgICAgUmV2aWV3ZXJSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBY2NvdW50LklkIHVzZXIgPSByc3JjLmdldFVzZXIoKS5nZXRBY2NvdW50SWQoKTsKKyAgICByZXR1cm4gSXRlcmFibGVzLmZpbHRlcigKKyAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShyc3JjLmdldENoYW5nZSgpLmdldElkKCkpLAorICAgICAgICBuZXcgUHJlZGljYXRlPFBhdGNoU2V0QXBwcm92YWw+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFwcGx5KFBhdGNoU2V0QXBwcm92YWwgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiB1c2VyLmVxdWFscyhpbnB1dC5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRHJhZnRSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRHJhZnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDg5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EcmFmdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIERyYWZ0UmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PERyYWZ0UmVzb3VyY2U+PiBEUkFGVF9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxEcmFmdFJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIFJldmlzaW9uUmVzb3VyY2UgcmV2OworICBwcml2YXRlIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgY29tbWVudDsKKworICBEcmFmdFJlc291cmNlKFJldmlzaW9uUmVzb3VyY2UgcmV2LCBQYXRjaExpbmVDb21tZW50IGMpIHsKKyAgICB0aGlzLnJldiA9IHJldjsKKyAgICB0aGlzLmNvbW1lbnQgPSBjOworICB9CisKKyAgcHVibGljIENoYW5nZUNvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKyAgICByZXR1cm4gcmV2LmdldENvbnRyb2woKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2UgZ2V0Q2hhbmdlKCkgeworICAgIHJldHVybiBnZXRDb250cm9sKCkuZ2V0Q2hhbmdlKCk7CisgIH0KKworICBwdWJsaWMgUGF0Y2hTZXQgZ2V0UGF0Y2hTZXQoKSB7CisgICAgcmV0dXJuIHJldi5nZXRQYXRjaFNldCgpOworICB9CisKKyAgUGF0Y2hMaW5lQ29tbWVudCBnZXRDb21tZW50KCkgeworICAgIHJldHVybiBjb21tZW50OworICB9CisKKyAgU3RyaW5nIGdldElkKCkgeworICAgIHJldHVybiBjb21tZW50LmdldEtleSgpLmdldCgpOworICB9CisKKyAgQWNjb3VudC5JZCBnZXRBdXRob3JJZCgpIHsKKyAgICByZXR1cm4gKChJZGVudGlmaWVkVXNlcikgZ2V0Q29udHJvbCgpLmdldEN1cnJlbnRVc2VyKCkpLmdldEFjY291bnRJZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EcmFmdHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RyYWZ0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyODJkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EcmFmdHMuamF2YQpAQCAtMCwwICsxLDgwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkNoaWxkQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitjbGFzcyBEcmFmdHMgaW1wbGVtZW50cyBDaGlsZENvbGxlY3Rpb248UmV2aXNpb25SZXNvdXJjZSwgRHJhZnRSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8RHJhZnRSZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3REcmFmdHM+IGxpc3Q7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisKKyAgQEluamVjdAorICBEcmFmdHMoRHluYW1pY01hcDxSZXN0VmlldzxEcmFmdFJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlciwKKyAgICAgIFByb3ZpZGVyPExpc3REcmFmdHM+IGxpc3QsCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcikgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxEcmFmdFJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPiBsaXN0KCkgdGhyb3dzIEF1dGhFeGNlcHRpb24geworICAgIGNoZWNrSWRlbnRpZmllZFVzZXIoKTsKKyAgICByZXR1cm4gbGlzdC5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHJhZnRSZXNvdXJjZSBwYXJzZShSZXZpc2lvblJlc291cmNlIHJldiwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBjaGVja0lkZW50aWZpZWRVc2VyKCk7CisgICAgU3RyaW5nIHV1aWQgPSBpZC5nZXQoKTsKKyAgICBmb3IgKFBhdGNoTGluZUNvbW1lbnQgYyA6IGRiUHJvdmlkZXIuZ2V0KCkucGF0Y2hDb21tZW50cygpCisgICAgICAgIC5kcmFmdEJ5UGF0Y2hTZXRBdXRob3IoCisgICAgICAgICAgICByZXYuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgcmV2LmdldEFjY291bnRJZCgpKSkgeworICAgICAgaWYgKHV1aWQuZXF1YWxzKGMuZ2V0S2V5KCkuZ2V0KCkpKSB7CisgICAgICAgIHJldHVybiBuZXcgRHJhZnRSZXNvdXJjZShyZXYsIGMpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tJZGVudGlmaWVkVXNlcigpIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAoISh1c2VyLmdldCgpIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiZHJhZnRzIG9ubHkgYXZhaWxhYmxlIHRvIGF1dGhlbnRpY2F0ZWQgdXNlcnMiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0VtYWlsUmV2aWV3Q29tbWVudHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0VtYWlsUmV2aWV3Q29tbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWE5ZWRkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRW1haWxSZXZpZXdDb21tZW50cy5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBvc3RSZXZpZXcuTm90aWZ5SGFuZGxpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ29tbWVudFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIEVtYWlsUmV2aWV3Q29tbWVudHMgaW1wbGVtZW50cyBSdW5uYWJsZSwgUmVxdWVzdENvbnRleHQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRW1haWxSZXZpZXdDb21tZW50cy5jbGFzcyk7CisKKyAgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIEVtYWlsUmV2aWV3Q29tbWVudHMgY3JlYXRlKAorICAgICAgICBOb3RpZnlIYW5kbGluZyBub3RpZnksCisgICAgICAgIENoYW5nZSBjaGFuZ2UsCisgICAgICAgIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgICBBY2NvdW50LklkIGF1dGhvcklkLAorICAgICAgICBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2UsCisgICAgICAgIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gY29tbWVudHMpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlOworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDb21tZW50U2VuZGVyLkZhY3RvcnkgY29tbWVudFNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0OworCisgIHByaXZhdGUgZmluYWwgUG9zdFJldmlldy5Ob3RpZnlIYW5kbGluZyBub3RpZnk7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlIGNoYW5nZTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldCBwYXRjaFNldDsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50LklkIGF1dGhvcklkOworICBwcml2YXRlIGZpbmFsIENoYW5nZU1lc3NhZ2UgbWVzc2FnZTsKKyAgcHJpdmF0ZSBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGNvbW1lbnRzOworICBwcml2YXRlIFJldmlld0RiIGRiOworCisgIEBJbmplY3QKKyAgRW1haWxSZXZpZXdDb21tZW50cyAoCisgICAgICBXb3JrUXVldWUgd29ya1F1ZXVlLAorICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgQ29tbWVudFNlbmRlci5GYWN0b3J5IGNvbW1lbnRTZW5kZXJGYWN0b3J5LAorICAgICAgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeSwKKyAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICBAQXNzaXN0ZWQgTm90aWZ5SGFuZGxpbmcgbm90aWZ5LAorICAgICAgQEFzc2lzdGVkIENoYW5nZSBjaGFuZ2UsCisgICAgICBAQXNzaXN0ZWQgUGF0Y2hTZXQgcGF0Y2hTZXQsCisgICAgICBAQXNzaXN0ZWQgQWNjb3VudC5JZCBhdXRob3JJZCwKKyAgICAgIEBBc3Npc3RlZCBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2UsCisgICAgICBAQXNzaXN0ZWQgTGlzdDxQYXRjaExpbmVDb21tZW50PiBjb21tZW50cykgeworICAgIHRoaXMud29ya1F1ZXVlID0gd29ya1F1ZXVlOworICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CisgICAgdGhpcy5jb21tZW50U2VuZGVyRmFjdG9yeSA9IGNvbW1lbnRTZW5kZXJGYWN0b3J5OworICAgIHRoaXMuc2NoZW1hRmFjdG9yeSA9IHNjaGVtYUZhY3Rvcnk7CisgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0OworICAgIHRoaXMubm90aWZ5ID0gbm90aWZ5OworICAgIHRoaXMuY2hhbmdlID0gY2hhbmdlOworICAgIHRoaXMucGF0Y2hTZXQgPSBwYXRjaFNldDsKKyAgICB0aGlzLmF1dGhvcklkID0gYXV0aG9ySWQ7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aGlzLmNvbW1lbnRzID0gY29tbWVudHM7CisgIH0KKworICB2b2lkIHNlbmRBc3luYygpIHsKKyAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkuc3VibWl0KHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgcmVxdWVzdENvbnRleHQuc2V0Q29udGV4dCh0aGlzKTsKKworICAgICAgY29tbWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoY29tbWVudHMpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChjb21tZW50cywgbmV3IENvbXBhcmF0b3I8UGF0Y2hMaW5lQ29tbWVudD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUGF0Y2hMaW5lQ29tbWVudCBhLCBQYXRjaExpbmVDb21tZW50IGIpIHsKKyAgICAgICAgICBpbnQgY21wID0gcGF0aChhKS5jb21wYXJlVG8ocGF0aChiKSk7CisgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIDAgaXMgYW5jZXN0b3IsIDEgaXMgcmV2aXNpb24uIFNvcnQgYW5jZXN0b3IgZmlyc3QuCisgICAgICAgICAgY21wID0gYS5nZXRTaWRlKCkgLSBiLmdldFNpZGUoKTsKKyAgICAgICAgICBpZiAoY21wICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIGEuZ2V0TGluZSgpIC0gYi5nZXRMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoKFBhdGNoTGluZUNvbW1lbnQgYykgeworICAgICAgICAgIHJldHVybiBjLmdldEtleSgpLmdldFBhcmVudEtleSgpLmdldEZpbGVOYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgICBDb21tZW50U2VuZGVyIGNtID0gY29tbWVudFNlbmRlckZhY3RvcnkuY3JlYXRlKG5vdGlmeSwgY2hhbmdlKTsKKyAgICAgIGNtLnNldEZyb20oYXV0aG9ySWQpOworICAgICAgY20uc2V0UGF0Y2hTZXQocGF0Y2hTZXQsIHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KGNoYW5nZSwgcGF0Y2hTZXQpKTsKKyAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICBjbS5zZXRQYXRjaExpbmVDb21tZW50cyhjb21tZW50cyk7CisgICAgICBjbS5zZW5kKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIGNvbW1lbnRzIGZvciAiICsgcGF0Y2hTZXQuZ2V0SWQoKSwgZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcXVlc3RDb250ZXh0LnNldENvbnRleHQobnVsbCk7CisgICAgICBpZiAoZGIgIT0gbnVsbCkgeworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICBkYiA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICJzZW5kLWVtYWlsIGNvbW1lbnRzIjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCkgeworICAgIHJldHVybiBuZXcgUHJvdmlkZXI8UmV2aWV3RGI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUmV2aWV3RGIgZ2V0KCkgeworICAgICAgICBpZiAoZGIgPT0gbnVsbCkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkYiA9IHNjaGVtYUZhY3Rvcnkub3BlbigpOworICAgICAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBSZXZpZXdEYiIsIGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGI7CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0Q2hhbmdlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRDaGFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI1NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0Q2hhbmdlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0Q2hhbmdlIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PENoYW5nZVJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0Q2hhbmdlKENoYW5nZUpzb24ganNvbikgeworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShDaGFuZ2VSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4ganNvbi5mb3JtYXQocnNyYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldERldGFpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0RGV0YWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZDllOTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXREZXRhaWwuamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBHZXREZXRhaWwgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8Q2hhbmdlUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXREZXRhaWwoQ2hhbmdlSnNvbiBqc29uKSB7CisgICAgdGhpcy5qc29uID0ganNvbgorICAgICAgICAuYWRkT3B0aW9uKExpc3RDaGFuZ2VzT3B0aW9uLkxBQkVMUykKKyAgICAgICAgLmFkZE9wdGlvbihMaXN0Q2hhbmdlc09wdGlvbi5ERVRBSUxFRF9MQUJFTFMpCisgICAgICAgIC5hZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfQUNDT1VOVFMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJzcmMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXREcmFmdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0RHJhZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY2NTlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0RHJhZnQuamF2YQpAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CisKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CisKK2NsYXNzIEdldERyYWZ0IGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PERyYWZ0UmVzb3VyY2U+IHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoRHJhZnRSZXNvdXJjZSByc3JjKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBDb21tZW50KHJzcmMuZ2V0Q29tbWVudCgpKTsKKyAgfQorCisgIHN0YXRpYyBlbnVtIFNpZGUgeworICAgIFBBUkVOVCwgUkVWSVNJT047CisgIH0KKworICBzdGF0aWMgY2xhc3MgQ29tbWVudCB7CisgICAgZmluYWwgU3RyaW5nIGtpbmQgPSAiZ2Vycml0Y29kZXJldmlldyNjb21tZW50IjsKKyAgICBTdHJpbmcgaWQ7CisgICAgU3RyaW5nIHBhdGg7CisgICAgU2lkZSBzaWRlOworICAgIEludGVnZXIgbGluZTsKKyAgICBTdHJpbmcgaW5SZXBseVRvOworICAgIFN0cmluZyBtZXNzYWdlOworICAgIFRpbWVzdGFtcCB1cGRhdGVkOworCisgICAgQ29tbWVudChQYXRjaExpbmVDb21tZW50IGMpIHsKKyAgICAgIGlkID0gVXJsLmVuY29kZShjLmdldEtleSgpLmdldCgpKTsKKyAgICAgIHBhdGggPSBjLmdldEtleSgpLmdldFBhcmVudEtleSgpLmdldEZpbGVOYW1lKCk7CisgICAgICBpZiAoYy5nZXRTaWRlKCkgPT0gMCkgeworICAgICAgICBzaWRlID0gU2lkZS5QQVJFTlQ7CisgICAgICB9CisgICAgICBpZiAoYy5nZXRMaW5lKCkgPiAwKSB7CisgICAgICAgIGxpbmUgPSBjLmdldExpbmUoKTsKKyAgICAgIH0KKyAgICAgIGluUmVwbHlUbyA9IFVybC5lbmNvZGUoYy5nZXRQYXJlbnRVdWlkKCkpOworICAgICAgbWVzc2FnZSA9IFN0cmluZ3MuZW1wdHlUb051bGwoYy5nZXRNZXNzYWdlKCkpOworICAgICAgdXBkYXRlZCA9IGMuZ2V0V3JpdHRlbk9uKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRSZXZpZXcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldFJldmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2Y1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRSZXZpZXcuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBHZXRSZXZpZXcgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UmV2aXNpb25SZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldFJldmlldyhDaGFuZ2VKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uLmFkZE9wdGlvbihMaXN0Q2hhbmdlc09wdGlvbi5ERVRBSUxFRF9MQUJFTFMpCisgICAgICAgIC5hZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfQUNDT1VOVFMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJlc291cmNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0UmV2aWV3ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldFJldmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0MWJlOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldFJldmlld2VyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0UmV2aWV3ZXIgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UmV2aWV3ZXJSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIFJldmlld2VySnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0UmV2aWV3ZXIoUmV2aWV3ZXJKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aWV3ZXJSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4ganNvbi5mb3JtYXQocnNyYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldFRvcGljLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRUb3BpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YTVjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRUb3BpYy5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKKworY2xhc3MgR2V0VG9waWMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8Q2hhbmdlUmVzb3VyY2U+IHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIFN0cmluZ3MubnVsbFRvRW1wdHkocnNyYy5nZXRDaGFuZ2UoKS5nZXRUb3BpYygpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdERyYWZ0cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdERyYWZ0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NDM2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9MaXN0RHJhZnRzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzLmZpcnN0Tm9uTnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuR2V0RHJhZnQuQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkdldERyYWZ0LlNpZGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2NsYXNzIExpc3REcmFmdHMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UmV2aXNpb25SZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKworICBASW5qZWN0CisgIExpc3REcmFmdHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKSB7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByc3JjKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgTGlzdDxDb21tZW50Pj4gb3V0ID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgZm9yIChQYXRjaExpbmVDb21tZW50IGMgOiBkYi5nZXQoKS5wYXRjaENvbW1lbnRzKCkKKyAgICAgICAgLmRyYWZ0QnlQYXRjaFNldEF1dGhvcigKKyAgICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgcnNyYy5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgIENvbW1lbnQgbyA9IG5ldyBDb21tZW50KGMpOworICAgICAgTGlzdDxDb21tZW50PiBsaXN0ID0gb3V0LmdldChvLnBhdGgpOworICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIG91dC5wdXQoby5wYXRoLCBsaXN0KTsKKyAgICAgIH0KKyAgICAgIG8ucGF0aCA9IG51bGw7CisgICAgICBsaXN0LmFkZChvKTsKKyAgICB9CisgICAgZm9yIChMaXN0PENvbW1lbnQ+IGxpc3QgOiBvdXQudmFsdWVzKCkpIHsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8Q29tbWVudD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQ29tbWVudCBhLCBDb21tZW50IGIpIHsKKyAgICAgICAgICBpbnQgYyA9IGZpcnN0Tm9uTnVsbChhLnNpZGUsIFNpZGUuUkVWSVNJT04pLm9yZGluYWwoKQorICAgICAgICAgICAgICAgIC0gZmlyc3ROb25OdWxsKGIuc2lkZSwgU2lkZS5SRVZJU0lPTikub3JkaW5hbCgpOworICAgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgIGMgPSBmaXJzdE5vbk51bGwoYS5saW5lLCAwKSAtIGZpcnN0Tm9uTnVsbChiLmxpbmUsIDApOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgICAgICBjID0gYS5pZC5jb21wYXJlVG8oYi5pZCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgICAgcmV0dXJuIG91dDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdFJldmlld2Vycy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdFJldmlld2Vycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Y2MxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9MaXN0UmV2aWV3ZXJzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2NsYXNzIExpc3RSZXZpZXdlcnMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8Q2hhbmdlUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlckpzb24ganNvbjsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlclJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5OworCisgIEBJbmplY3QKKyAgTGlzdFJldmlld2VycyhQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnksCisgICAgICBSZXZpZXdlckpzb24ganNvbikgeworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgICAgdGhpcy5yZXNvdXJjZUZhY3RvcnkgPSByZXNvdXJjZUZhY3Rvcnk7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJzcmMpIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uIHsKKyAgICBNYXA8QWNjb3VudC5JZCwgUmV2aWV3ZXJSZXNvdXJjZT4gcmV2aWV3ZXJzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0SWQoKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcGF0Y2hTZXRBcHByb3ZhbAorICAgICAgICAgOiBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGNoYW5nZUlkKSkgeworICAgICAgQWNjb3VudC5JZCBhY2NvdW50SWQgPSBwYXRjaFNldEFwcHJvdmFsLmdldEFjY291bnRJZCgpOworICAgICAgaWYgKCFyZXZpZXdlcnMuY29udGFpbnNLZXkoYWNjb3VudElkKSkgeworICAgICAgICByZXZpZXdlcnMucHV0KGFjY291bnRJZCwgcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZShyc3JjLCBhY2NvdW50SWQpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJldmlld2Vycy52YWx1ZXMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxNzVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlUmVzb3VyY2UuQ0hBTkdFX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuRHJhZnRSZXNvdXJjZS5EUkFGVF9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBhdGNoUmVzb3VyY2UuUEFUQ0hfS0lORDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpZXdlclJlc291cmNlLlJFVklFV0VSX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aXNpb25SZXNvdXJjZS5SRVZJU0lPTl9LSU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaU1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlld2VkLkRlbGV0ZVJldmlld2VkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZWQuUHV0UmV2aWV3ZWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5GYWN0b3J5TW9kdWxlOworCitwdWJsaWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgUmVzdEFwaU1vZHVsZSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChSZXZpc2lvbnMuY2xhc3MpOworICAgIGJpbmQoUmV2aWV3ZXJzLmNsYXNzKTsKKyAgICBiaW5kKERyYWZ0cy5jbGFzcyk7CisgICAgYmluZChQYXRjaGVzLmNsYXNzKTsKKworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIENIQU5HRV9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBEUkFGVF9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBQQVRDSF9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBSRVZJRVdFUl9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBSRVZJU0lPTl9LSU5EKTsKKworICAgIGdldChDSEFOR0VfS0lORCkudG8oR2V0Q2hhbmdlLmNsYXNzKTsKKyAgICBnZXQoQ0hBTkdFX0tJTkQsICJkZXRhaWwiKS50byhHZXREZXRhaWwuY2xhc3MpOworICAgIGdldChDSEFOR0VfS0lORCwgInRvcGljIikudG8oR2V0VG9waWMuY2xhc3MpOworICAgIHB1dChDSEFOR0VfS0lORCwgInRvcGljIikudG8oUHV0VG9waWMuY2xhc3MpOworICAgIGRlbGV0ZShDSEFOR0VfS0lORCwgInRvcGljIikudG8oUHV0VG9waWMuY2xhc3MpOworICAgIHBvc3QoQ0hBTkdFX0tJTkQsICJhYmFuZG9uIikudG8oQWJhbmRvbi5jbGFzcyk7CisgICAgcG9zdChDSEFOR0VfS0lORCwgInJlc3RvcmUiKS50byhSZXN0b3JlLmNsYXNzKTsKKyAgICBwb3N0KENIQU5HRV9LSU5ELCAicmV2ZXJ0IikudG8oUmV2ZXJ0LmNsYXNzKTsKKyAgICBwb3N0KENIQU5HRV9LSU5ELCAic3VibWl0IikudG8oU3VibWl0LkN1cnJlbnRSZXZpc2lvbi5jbGFzcyk7CisKKyAgICBwb3N0KENIQU5HRV9LSU5ELCAicmV2aWV3ZXJzIikudG8oUG9zdFJldmlld2Vycy5jbGFzcyk7CisgICAgY2hpbGQoQ0hBTkdFX0tJTkQsICJyZXZpZXdlcnMiKS50byhSZXZpZXdlcnMuY2xhc3MpOworICAgIGdldChSRVZJRVdFUl9LSU5EKS50byhHZXRSZXZpZXdlci5jbGFzcyk7CisgICAgZGVsZXRlKFJFVklFV0VSX0tJTkQpLnRvKERlbGV0ZVJldmlld2VyLmNsYXNzKTsKKworICAgIGNoaWxkKENIQU5HRV9LSU5ELCAicmV2aXNpb25zIikudG8oUmV2aXNpb25zLmNsYXNzKTsKKyAgICBnZXQoUkVWSVNJT05fS0lORCwgInJldmlldyIpLnRvKEdldFJldmlldy5jbGFzcyk7CisgICAgcG9zdChSRVZJU0lPTl9LSU5ELCAicmV2aWV3IikudG8oUG9zdFJldmlldy5jbGFzcyk7CisgICAgcG9zdChSRVZJU0lPTl9LSU5ELCAic3VibWl0IikudG8oU3VibWl0LmNsYXNzKTsKKyAgICBnZXQoUkVWSVNJT05fS0lORCwgInN1Ym1pdF90eXBlIikudG8oVGVzdFN1Ym1pdFR5cGUuR2V0LmNsYXNzKTsKKyAgICBwb3N0KFJFVklTSU9OX0tJTkQsICJ0ZXN0LnN1Ym1pdF9ydWxlIikudG8oVGVzdFN1Ym1pdFJ1bGUuY2xhc3MpOworICAgIHBvc3QoUkVWSVNJT05fS0lORCwgInRlc3Quc3VibWl0X3R5cGUiKS50byhUZXN0U3VibWl0VHlwZS5jbGFzcyk7CisKKyAgICBjaGlsZChSRVZJU0lPTl9LSU5ELCAiZHJhZnRzIikudG8oRHJhZnRzLmNsYXNzKTsKKyAgICBwdXQoUkVWSVNJT05fS0lORCwgImRyYWZ0cyIpLnRvKENyZWF0ZURyYWZ0LmNsYXNzKTsKKyAgICBnZXQoRFJBRlRfS0lORCkudG8oR2V0RHJhZnQuY2xhc3MpOworICAgIHB1dChEUkFGVF9LSU5EKS50byhQdXREcmFmdC5jbGFzcyk7CisgICAgZGVsZXRlKERSQUZUX0tJTkQpLnRvKERlbGV0ZURyYWZ0LmNsYXNzKTsKKworICAgIGNoaWxkKFJFVklTSU9OX0tJTkQsICJmaWxlcyIpLnRvKFBhdGNoZXMuY2xhc3MpOworICAgIHB1dChQQVRDSF9LSU5ELCAicmV2aWV3ZWQiKS50byhQdXRSZXZpZXdlZC5jbGFzcyk7CisgICAgZGVsZXRlKFBBVENIX0tJTkQsICJyZXZpZXdlZCIpLnRvKERlbGV0ZVJldmlld2VkLmNsYXNzKTsKKworICAgIGluc3RhbGwobmV3IEZhY3RvcnlNb2R1bGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmFjdG9yeShSZXZpZXdlclJlc291cmNlLkZhY3RvcnkuY2xhc3MpOworICAgICAgICBmYWN0b3J5KEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICAgICAgZmFjdG9yeShFbWFpbFJldmlld0NvbW1lbnRzLkZhY3RvcnkuY2xhc3MpOworICAgICAgfQorICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaFJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZjVjNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1BhdGNoUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIFBhdGNoUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PFBhdGNoUmVzb3VyY2U+PiBQQVRDSF9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxQYXRjaFJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIFJldmlzaW9uUmVzb3VyY2UgcmV2OworICBwcml2YXRlIGZpbmFsIFBhdGNoLktleSBrZXk7CisKKyAgUGF0Y2hSZXNvdXJjZShSZXZpc2lvblJlc291cmNlIHJldiwgU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLnJldiA9IHJldjsKKyAgICB0aGlzLmtleSA9IG5ldyBQYXRjaC5LZXkocmV2LmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwgbmFtZSk7CisgIH0KKworICBwdWJsaWMgUGF0Y2guS2V5IGdldFBhdGNoS2V5KCkgeworICAgIHJldHVybiBrZXk7CisgIH0KKworICBBY2NvdW50LklkIGdldEFjY291bnRJZCgpIHsKKyAgICByZXR1cm4gcmV2LmdldEFjY291bnRJZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaGVzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwYTliZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1BhdGNoZXMuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkNoaWxkQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitjbGFzcyBQYXRjaGVzIGltcGxlbWVudHMgQ2hpbGRDb2xsZWN0aW9uPFJldmlzaW9uUmVzb3VyY2UsIFBhdGNoUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PFBhdGNoUmVzb3VyY2U+PiB2aWV3czsKKworICBASW5qZWN0CisgIFBhdGNoZXMoRHluYW1pY01hcDxSZXN0VmlldzxQYXRjaFJlc291cmNlPj4gdmlld3MpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8UGF0Y2hSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8UmV2aXNpb25SZXNvdXJjZT4gbGlzdCgpIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUGF0Y2hSZXNvdXJjZSBwYXJzZShSZXZpc2lvblJlc291cmNlIHJldiwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IFBhdGNoUmVzb3VyY2UocmV2LCBpZC5nZXQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Bvc3RSZXZpZXcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Bvc3RSZXZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI5MzliCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUG9zdFJldmlldy5qYXZhCkBAIC0wLDAgKzEsNDk2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUG9zdFJldmlldy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBQb3N0UmV2aWV3IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UmV2aXNpb25SZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBvc3RSZXZpZXcuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU2hvcnQ+IGxhYmVsczsKKyAgICBNYXA8U3RyaW5nLCBMaXN0PENvbW1lbnQ+PiBjb21tZW50czsKKworICAgIC8qKgorICAgICAqIElmIHRydWUgcmVxdWlyZSBhbGwgbGFiZWxzIHRvIGJlIHdpdGhpbiB0aGUgdXNlcidzIHBlcm1pdHRlZCByYW5nZXMgYmFzZWQKKyAgICAgKiBvbiBhY2Nlc3MgY29udHJvbHMsIGF0dGVtcHRpbmcgdG8gdXNlIGEgbGFiZWwgbm90IGdyYW50ZWQgdG8gdGhlIHVzZXIKKyAgICAgKiB3aWxsIGZhaWwgdGhlIGVudGlyZSBtb2RpZnkgb3BlcmF0aW9uIGVhcmx5LiBJZiBmYWxzZSB0aGUgb3BlcmF0aW9uIHdpbGwKKyAgICAgKiBleGVjdXRlIGFueXdheSwgYnV0IHRoZSBwcm9wb3NlZCBsYWJlbHMgZ2l2ZW4gYnkgdGhlIHVzZXIgd2lsbCBiZQorICAgICAqIG1vZGlmaWVkIHRvIGJlIHRoZSAiYmVzdCIgdmFsdWUgYWxsb3dlZCBieSB0aGUgYWNjZXNzIGNvbnRyb2xzLCBvcgorICAgICAqIGlnbm9yZWQgaWYgdGhlIGxhYmVsIGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0cmljdExhYmVscyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBIb3cgdG8gcHJvY2VzcyBkcmFmdCBjb21tZW50cyBhbHJlYWR5IGluIHRoZSBkYXRhYmFzZSB0aGF0IHdlcmUgbm90IGFsc28KKyAgICAgKiBkZXNjcmliZWQgaW4gdGhpcyBpbnB1dCByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBEcmFmdEhhbmRsaW5nIGRyYWZ0cyA9IERyYWZ0SGFuZGxpbmcuREVMRVRFOworCisgICAgLyoqIFdobyB0byBzZW5kIGVtYWlsIG5vdGlmaWNhdGlvbnMgdG8gYWZ0ZXIgcmV2aWV3IGlzIHN0b3JlZC4gKi8KKyAgICBwdWJsaWMgTm90aWZ5SGFuZGxpbmcgbm90aWZ5ID0gTm90aWZ5SGFuZGxpbmcuQUxMOworICB9CisKKyAgcHVibGljIHN0YXRpYyBlbnVtIERyYWZ0SGFuZGxpbmcgeworICAgIERFTEVURSwgUFVCTElTSCwgS0VFUDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZW51bSBOb3RpZnlIYW5kbGluZyB7CisgICAgTk9ORSwgT1dORVIsIE9XTkVSX1JFVklFV0VSUywgQUxMOworICB9CisKKyAgc3RhdGljIGNsYXNzIENvbW1lbnQgeworICAgIFN0cmluZyBpZDsKKyAgICBHZXREcmFmdC5TaWRlIHNpZGU7CisgICAgaW50IGxpbmU7CisgICAgU3RyaW5nIGluUmVwbHlUbzsKKyAgICBTdHJpbmcgbWVzc2FnZTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBPdXRwdXQgeworICAgIE1hcDxTdHJpbmcsIFNob3J0PiBsYWJlbHM7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIEVtYWlsUmV2aWV3Q29tbWVudHMuRmFjdG9yeSBlbWFpbDsKKyAgQERlcHJlY2F0ZWQgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKworICBwcml2YXRlIENoYW5nZSBjaGFuZ2U7CisgIHByaXZhdGUgQ2hhbmdlTWVzc2FnZSBtZXNzYWdlOworICBwcml2YXRlIFRpbWVzdGFtcCB0aW1lc3RhbXA7CisgIHByaXZhdGUgTGlzdDxQYXRjaExpbmVDb21tZW50PiBjb21tZW50cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBsYWJlbERlbHRhID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU2hvcnQ+IGNhdGVnb3JpZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKworICBASW5qZWN0CisgIFBvc3RSZXZpZXcoUmV2aWV3RGIgZGIsCisgICAgICBFbWFpbFJldmlld0NvbW1lbnRzLkZhY3RvcnkgZW1haWwsCisgICAgICBDaGFuZ2VIb29rcyBob29rcykgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByZXZpc2lvbiwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQubGFiZWxzICE9IG51bGwpIHsKKyAgICAgIGNoZWNrTGFiZWxzKHJldmlzaW9uLCBpbnB1dC5zdHJpY3RMYWJlbHMsIGlucHV0LmxhYmVscyk7CisgICAgfQorICAgIGlmIChpbnB1dC5jb21tZW50cyAhPSBudWxsKSB7CisgICAgICBjaGVja0NvbW1lbnRzKGlucHV0LmNvbW1lbnRzKTsKKyAgICB9CisgICAgaWYgKGlucHV0Lm5vdGlmeSA9PSBudWxsKSB7CisgICAgICBpbnB1dC5ub3RpZnkgPSBOb3RpZnlIYW5kbGluZy5OT05FOworICAgIH0KKworICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKHJldmlzaW9uLmdldENoYW5nZSgpLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KHJldmlzaW9uLmdldENoYW5nZSgpLmdldElkKCkpOworICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7CisgICAgICB0aW1lc3RhbXAgPSBjaGFuZ2UuZ2V0TGFzdFVwZGF0ZWRPbigpOworCisgICAgICBib29sZWFuIGRpcnR5ID0gZmFsc2U7CisgICAgICBkaXJ0eSB8PSBpbnNlcnRDb21tZW50cyhyZXZpc2lvbiwgaW5wdXQuY29tbWVudHMsIGlucHV0LmRyYWZ0cyk7CisgICAgICBkaXJ0eSB8PSB1cGRhdGVMYWJlbHMocmV2aXNpb24sIGlucHV0LmxhYmVscyk7CisgICAgICBkaXJ0eSB8PSBpbnNlcnRNZXNzYWdlKHJldmlzaW9uLCBpbnB1dC5tZXNzYWdlKTsKKyAgICAgIGlmIChkaXJ0eSkgeworICAgICAgICBkYi5jaGFuZ2VzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKKyAgICAgICAgZGIuY29tbWl0KCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgfQorCisgICAgaWYgKGlucHV0Lm5vdGlmeS5jb21wYXJlVG8oTm90aWZ5SGFuZGxpbmcuTk9ORSkgPiAwICYmIG1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgZW1haWwuY3JlYXRlKAorICAgICAgICAgIGlucHV0Lm5vdGlmeSwKKyAgICAgICAgICBjaGFuZ2UsCisgICAgICAgICAgcmV2aXNpb24uZ2V0UGF0Y2hTZXQoKSwKKyAgICAgICAgICByZXZpc2lvbi5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgIGNvbW1lbnRzKS5zZW5kQXN5bmMoKTsKKyAgICAgIGZpcmVDb21tZW50QWRkZWRIb29rKHJldmlzaW9uKTsKKyAgICB9CisKKyAgICBPdXRwdXQgb3V0cHV0ID0gbmV3IE91dHB1dCgpOworICAgIG91dHB1dC5sYWJlbHMgPSBpbnB1dC5sYWJlbHM7CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja0xhYmVscyhSZXZpc2lvblJlc291cmNlIHJldmlzaW9uLCBib29sZWFuIHN0cmljdCwKKyAgICAgIE1hcDxTdHJpbmcsIFNob3J0PiBsYWJlbHMpIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGN0bCA9IHJldmlzaW9uLmdldENvbnRyb2woKTsKKyAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTaG9ydD4+IGl0ciA9IGxhYmVscy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKKyAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFNob3J0PiBlbnQgPSBpdHIubmV4dCgpOworCisgICAgICBMYWJlbFR5cGUgbHQgPSByZXZpc2lvbi5nZXRDb250cm9sKCkuZ2V0TGFiZWxUeXBlcygpCisgICAgICAgICAgLmJ5TGFiZWwoZW50LmdldEtleSgpKTsKKyAgICAgIGlmIChsdCA9PSBudWxsKSB7CisgICAgICAgIGlmIChzdHJpY3QpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAibGFiZWwgXCIlc1wiIGlzIG5vdCBhIGNvbmZpZ3VyZWQgbGFiZWwiLCBlbnQuZ2V0S2V5KCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpdHIucmVtb3ZlKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGVudC5nZXRWYWx1ZSgpID09IG51bGwgfHwgZW50LmdldFZhbHVlKCkgPT0gMCkgeworICAgICAgICAvLyBBbHdheXMgcGVybWl0IDAsIGV2ZW4gaWYgaXQgaXMgbm90IHdpdGhpbiByYW5nZS4KKyAgICAgICAgLy8gTGF0ZXIgbnVsbC8wIHdpbGwgYmUgZGVsZXRlZCBhbmQgcmV2b2tlIHRoZSBsYWJlbC4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChsdC5nZXRWYWx1ZShlbnQuZ2V0VmFsdWUoKSkgPT0gbnVsbCkgeworICAgICAgICBpZiAoc3RyaWN0KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgImxhYmVsIFwiJXNcIjogJWQgaXMgbm90IGEgdmFsaWQgdmFsdWUiLAorICAgICAgICAgICAgICBlbnQuZ2V0S2V5KCksIGVudC5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFN0cmluZyBuYW1lID0gbHQuZ2V0TmFtZSgpOworICAgICAgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gY3RsLmdldFJhbmdlKFBlcm1pc3Npb24uZm9yTGFiZWwobmFtZSkpOworICAgICAgaWYgKHJhbmdlID09IG51bGwgfHwgIXJhbmdlLmNvbnRhaW5zKGVudC5nZXRWYWx1ZSgpKSkgeworICAgICAgICBpZiAoc3RyaWN0KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgIkFwcGx5aW5nIGxhYmVsIFwiJXNcIjogJWQgaXMgcmVzdHJpY3RlZCIsCisgICAgICAgICAgICAgIGVudC5nZXRLZXkoKSwgZW50LmdldFZhbHVlKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYW5nZSA9PSBudWxsIHx8IHJhbmdlLmlzRW1wdHkoKSkgeworICAgICAgICAgIGVudC5zZXRWYWx1ZSgoc2hvcnQpIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVudC5zZXRWYWx1ZSgoc2hvcnQpIHJhbmdlLnNxdWFzaChlbnQuZ2V0VmFsdWUoKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29tbWVudHMoTWFwPFN0cmluZywgTGlzdDxDb21tZW50Pj4gaW4pCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiB7CisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgTGlzdDxDb21tZW50Pj4+IG1hcEl0ciA9CisgICAgICAgIGluLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAobWFwSXRyLmhhc05leHQoKSkgeworICAgICAgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDb21tZW50Pj4gZW50ID0gbWFwSXRyLm5leHQoKTsKKyAgICAgIFN0cmluZyBwYXRoID0gZW50LmdldEtleSgpOworICAgICAgTGlzdDxDb21tZW50PiBsaXN0ID0gZW50LmdldFZhbHVlKCk7CisgICAgICBpZiAobGlzdCA9PSBudWxsKSB7CisgICAgICAgIG1hcEl0ci5yZW1vdmUoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEl0ZXJhdG9yPENvbW1lbnQ+IGxpc3RJdHIgPSBsaXN0Lml0ZXJhdG9yKCk7CisgICAgICB3aGlsZSAobGlzdEl0ci5oYXNOZXh0KCkpIHsKKyAgICAgICAgQ29tbWVudCBjID0gbGlzdEl0ci5uZXh0KCk7CisgICAgICAgIGlmIChjLmxpbmUgPCAwKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgIm5lZ2F0aXZlIGxpbmUgbnVtYmVyICVkIG5vdCBhbGxvd2VkIG9uICVzIiwKKyAgICAgICAgICAgICAgYy5saW5lLCBwYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgYy5tZXNzYWdlID0gU3RyaW5ncy5lbXB0eVRvTnVsbChjLm1lc3NhZ2UpLnRyaW0oKTsKKyAgICAgICAgaWYgKGMubWVzc2FnZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBsaXN0SXRyLnJlbW92ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgbWFwSXRyLnJlbW92ZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRDb21tZW50cyhSZXZpc2lvblJlc291cmNlIHJzcmMsCisgICAgICBNYXA8U3RyaW5nLCBMaXN0PENvbW1lbnQ+PiBpbiwgRHJhZnRIYW5kbGluZyBkcmFmdHNIYW5kbGluZykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICBpbiA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgUGF0Y2hMaW5lQ29tbWVudD4gZHJhZnRzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICBpZiAoIWluLmlzRW1wdHkoKSB8fCBkcmFmdHNIYW5kbGluZyAhPSBEcmFmdEhhbmRsaW5nLktFRVApIHsKKyAgICAgIGRyYWZ0cyA9IHNjYW5EcmFmdENvbW1lbnRzKHJzcmMpOworICAgIH0KKworICAgIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZGVsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxQYXRjaExpbmVDb21tZW50PiBpbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IHVwZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PENvbW1lbnQ+PiBlbnQgOiBpbi5lbnRyeVNldCgpKSB7CisgICAgICBTdHJpbmcgcGF0aCA9IGVudC5nZXRLZXkoKTsKKyAgICAgIGZvciAoQ29tbWVudCBjIDogZW50LmdldFZhbHVlKCkpIHsKKyAgICAgICAgU3RyaW5nIHBhcmVudCA9IFVybC5kZWNvZGUoYy5pblJlcGx5VG8pOworICAgICAgICBQYXRjaExpbmVDb21tZW50IGUgPSBkcmFmdHMucmVtb3ZlKFVybC5kZWNvZGUoYy5pZCkpOworICAgICAgICBib29sZWFuIGNyZWF0ZSA9IGUgPT0gbnVsbDsKKyAgICAgICAgaWYgKGNyZWF0ZSkgeworICAgICAgICAgIGUgPSBuZXcgUGF0Y2hMaW5lQ29tbWVudCgKKyAgICAgICAgICAgICAgbmV3IFBhdGNoTGluZUNvbW1lbnQuS2V5KAorICAgICAgICAgICAgICAgICAgbmV3IFBhdGNoLktleShyc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwgcGF0aCksCisgICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksCisgICAgICAgICAgICAgIGMubGluZSwKKyAgICAgICAgICAgICAgcnNyYy5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICAgICAgcGFyZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgIGUuc2V0UGFyZW50VXVpZChwYXJlbnQpOworICAgICAgICB9CisgICAgICAgIGUuc2V0U3RhdHVzKFBhdGNoTGluZUNvbW1lbnQuU3RhdHVzLlBVQkxJU0hFRCk7CisgICAgICAgIGUuc2V0V3JpdHRlbk9uKHRpbWVzdGFtcCk7CisgICAgICAgIGUuc2V0U2lkZShjLnNpZGUgPT0gR2V0RHJhZnQuU2lkZS5QQVJFTlQgPyAoc2hvcnQpIDAgOiAoc2hvcnQpIDEpOworICAgICAgICBlLnNldE1lc3NhZ2UoYy5tZXNzYWdlKTsKKyAgICAgICAgKGNyZWF0ZSA/IGlucyA6IHVwZCkuYWRkKGUpOworICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoT2JqZWN0cy5maXJzdE5vbk51bGwoZHJhZnRzSGFuZGxpbmcsIERyYWZ0SGFuZGxpbmcuREVMRVRFKSkgeworICAgICAgY2FzZSBLRUVQOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERFTEVURToKKyAgICAgICAgZGVsLmFkZEFsbChkcmFmdHMudmFsdWVzKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFVCTElTSDoKKyAgICAgICAgZm9yIChQYXRjaExpbmVDb21tZW50IGUgOiBkcmFmdHMudmFsdWVzKCkpIHsKKyAgICAgICAgICBlLnNldFN0YXR1cyhQYXRjaExpbmVDb21tZW50LlN0YXR1cy5QVUJMSVNIRUQpOworICAgICAgICAgIGUuc2V0V3JpdHRlbk9uKHRpbWVzdGFtcCk7CisgICAgICAgICAgdXBkLmFkZChlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGIucGF0Y2hDb21tZW50cygpLmRlbGV0ZShkZWwpOworICAgIGRiLnBhdGNoQ29tbWVudHMoKS5pbnNlcnQoaW5zKTsKKyAgICBkYi5wYXRjaENvbW1lbnRzKCkudXBkYXRlKHVwZCk7CisgICAgY29tbWVudHMuYWRkQWxsKGlucyk7CisgICAgY29tbWVudHMuYWRkQWxsKHVwZCk7CisgICAgcmV0dXJuICFkZWwuaXNFbXB0eSgpIHx8ICFpbnMuaXNFbXB0eSgpIHx8ICF1cGQuaXNFbXB0eSgpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXRjaExpbmVDb21tZW50PiBzY2FuRHJhZnRDb21tZW50cygKKyAgICAgIFJldmlzaW9uUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgUGF0Y2hMaW5lQ29tbWVudD4gZHJhZnRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChQYXRjaExpbmVDb21tZW50IGMgOiBkYi5wYXRjaENvbW1lbnRzKCkuZHJhZnRCeVBhdGNoU2V0QXV0aG9yKAorICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICBkcmFmdHMucHV0KGMuZ2V0S2V5KCkuZ2V0KCksIGMpOworICAgIH0KKyAgICByZXR1cm4gZHJhZnRzOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUxhYmVscyhSZXZpc2lvblJlc291cmNlIHJzcmMsIE1hcDxTdHJpbmcsIFNob3J0PiBsYWJlbHMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAobGFiZWxzID09IG51bGwpIHsKKyAgICAgIGxhYmVscyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBkZWwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGlucyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gdXBkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTWFwPFN0cmluZywgUGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudCA9IHNjYW5MYWJlbHMocnNyYywgZGVsKTsKKworICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IHJzcmMuZ2V0Q29udHJvbCgpLmdldExhYmVsVHlwZXMoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNob3J0PiBlbnQgOiBsYWJlbHMuZW50cnlTZXQoKSkgeworICAgICAgU3RyaW5nIG5hbWUgPSBlbnQuZ2V0S2V5KCk7CisgICAgICBMYWJlbFR5cGUgbHQgPSBjaGVja05vdE51bGwobGFiZWxUeXBlcy5ieUxhYmVsKG5hbWUpLCBuYW1lKTsKKyAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNDbG9zZWQoKSkgeworICAgICAgICAvLyBUT0RPIEFsbG93IHVwZGF0aW5nIHNvbWUgbGFiZWxzIGV2ZW4gd2hlbiBjbG9zZWQuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBQYXRjaFNldEFwcHJvdmFsIGMgPSBjdXJyZW50LnJlbW92ZShuYW1lKTsKKyAgICAgIGlmIChlbnQuZ2V0VmFsdWUoKSA9PSBudWxsIHx8IGVudC5nZXRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgLy8gVXNlciByZXF1ZXN0ZWQgZGVsZXRlIG9mIHRoaXMgbGFiZWwuCisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoYy5nZXRWYWx1ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGxhYmVsRGVsdGEuYWRkKCItIiArIG5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWwuYWRkKGMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGMgIT0gbnVsbCAmJiBjLmdldFZhbHVlKCkgIT0gZW50LmdldFZhbHVlKCkpIHsKKyAgICAgICAgYy5zZXRWYWx1ZShlbnQuZ2V0VmFsdWUoKSk7CisgICAgICAgIGMuc2V0R3JhbnRlZCh0aW1lc3RhbXApOworICAgICAgICBjLmNhY2hlKGNoYW5nZSk7CisgICAgICAgIHVwZC5hZGQoYyk7CisgICAgICAgIGxhYmVsRGVsdGEuYWRkKGZvcm1hdChuYW1lLCBjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgY2F0ZWdvcmllcy5wdXQobmFtZSwgYy5nZXRWYWx1ZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoYyAhPSBudWxsICYmIGMuZ2V0VmFsdWUoKSA9PSBlbnQuZ2V0VmFsdWUoKSkgeworICAgICAgICBjdXJyZW50LnB1dChuYW1lLCBjKTsKKyAgICAgIH0gZWxzZSBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgIGMgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbChuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkoCisgICAgICAgICAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCksCisgICAgICAgICAgICAgICAgcnNyYy5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICAgICAgICBsdC5nZXRMYWJlbElkKCkpLAorICAgICAgICAgICAgZW50LmdldFZhbHVlKCkpOworICAgICAgICBjLnNldEdyYW50ZWQodGltZXN0YW1wKTsKKyAgICAgICAgYy5jYWNoZShjaGFuZ2UpOworICAgICAgICBpbnMuYWRkKGMpOworICAgICAgICBsYWJlbERlbHRhLmFkZChmb3JtYXQobmFtZSwgYy5nZXRWYWx1ZSgpKSk7CisgICAgICAgIGNhdGVnb3JpZXMucHV0KG5hbWUsIGMuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yY2VDYWxsZXJBc1Jldmlld2VyKHJzcmMsIGN1cnJlbnQsIGlucywgdXBkLCBkZWwpOworICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuZGVsZXRlKGRlbCk7CisgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5pbnNlcnQoaW5zKTsKKyAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLnVwZGF0ZSh1cGQpOworICAgIHJldHVybiAhZGVsLmlzRW1wdHkoKSB8fCAhaW5zLmlzRW1wdHkoKSB8fCAhdXBkLmlzRW1wdHkoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBmb3JjZUNhbGxlckFzUmV2aWV3ZXIoUmV2aXNpb25SZXNvdXJjZSByc3JjLAorICAgICAgTWFwPFN0cmluZywgUGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudCwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBpbnMsCisgICAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHVwZCwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBkZWwpIHsKKyAgICBpZiAoY3VycmVudC5pc0VtcHR5KCkgJiYgaW5zLmlzRW1wdHkoKSAmJiB1cGQuaXNFbXB0eSgpKSB7CisgICAgICAvLyBUT0RPIEZpbmQgYW5vdGhlciB3YXkgdG8gbGluayByZXZpZXdlcnMgdG8gY2hhbmdlcy4KKyAgICAgIGlmIChkZWwuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIElmIG5vIGV4aXN0aW5nIGxhYmVsIGlzIGJlaW5nIHNldCB0byAwLCBoYWNrIGluIHRoZSBjYWxsZXIKKyAgICAgICAgLy8gYXMgYSByZXZpZXdlciBieSBwaWNraW5nIHRoZSBmaXJzdCBzZXJ2ZXItd2lkZSBMYWJlbFR5cGUuCisgICAgICAgIFBhdGNoU2V0QXBwcm92YWwgYyA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKG5ldyBQYXRjaFNldEFwcHJvdmFsLktleSgKKyAgICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgcnNyYy5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICAgIHJzcmMuZ2V0Q29udHJvbCgpLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkuZ2V0KDApCisgICAgICAgICAgICAgICAgLmdldExhYmVsSWQoKSksCisgICAgICAgICAgICAoc2hvcnQpIDApOworICAgICAgICBjLnNldEdyYW50ZWQodGltZXN0YW1wKTsKKyAgICAgICAgYy5jYWNoZShjaGFuZ2UpOworICAgICAgICBpbnMuYWRkKGMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGljayBhIHJhbmRvbSBsYWJlbCB0aGF0IGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQgYW5kIGtlZXAgaXQuCisgICAgICAgIEl0ZXJhdG9yPFBhdGNoU2V0QXBwcm92YWw+IGkgPSBkZWwuaXRlcmF0b3IoKTsKKyAgICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBjID0gaS5uZXh0KCk7CisgICAgICAgIGMuc2V0VmFsdWUoKHNob3J0KSAwKTsKKyAgICAgICAgYy5zZXRHcmFudGVkKHRpbWVzdGFtcCk7CisgICAgICAgIGMuY2FjaGUoY2hhbmdlKTsKKyAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgdXBkLmFkZChjKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IHNjYW5MYWJlbHMoUmV2aXNpb25SZXNvdXJjZSByc3JjLAorICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBkZWwpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IHJzcmMuZ2V0Q29udHJvbCgpLmdldExhYmVsVHlwZXMoKTsKKyAgICBNYXA8U3RyaW5nLCBQYXRjaFNldEFwcHJvdmFsPiBjdXJyZW50ID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXRVc2VyKAorICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLCByc3JjLmdldEFjY291bnRJZCgpKSkgeworICAgICAgaWYgKGEuaXNTdWJtaXQoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgTGFiZWxUeXBlIGx0ID0gbGFiZWxUeXBlcy5ieUxhYmVsKGEuZ2V0TGFiZWxJZCgpKTsKKyAgICAgIGlmIChsdCAhPSBudWxsKSB7CisgICAgICAgIGN1cnJlbnQucHV0KGx0LmdldE5hbWUoKSwgYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWwuYWRkKGEpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3VycmVudDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIG5hbWUsIHNob3J0IHZhbHVlKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUubGVuZ3RoKCkgKyAyKTsKKyAgICBzYi5hcHBlbmQobmFtZSk7CisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgIHNiLmFwcGVuZCgnKycpOworICAgIH0KKyAgICBzYi5hcHBlbmQodmFsdWUpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGluc2VydE1lc3NhZ2UoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBTdHJpbmcgbXNnKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgbXNnID0gU3RyaW5ncy5udWxsVG9FbXB0eShtc2cpLnRyaW0oKTsKKworICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKFN0cmluZyBkIDogbGFiZWxEZWx0YSkgeworICAgICAgYnVmLmFwcGVuZCgiICIpLmFwcGVuZChkKTsKKyAgICB9CisgICAgaWYgKGNvbW1lbnRzLnNpemUoKSA9PSAxKSB7CisgICAgICBidWYuYXBwZW5kKCJcblxuKDEgY29tbWVudCkiKTsKKyAgICB9IGVsc2UgaWYgKGNvbW1lbnRzLnNpemUoKSA+IDEpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiXG5cbiglZCBjb21tZW50cykiLCBjb21tZW50cy5zaXplKCkpKTsKKyAgICB9CisgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7CisgICAgICBidWYuYXBwZW5kKCJcblxuIikuYXBwZW5kKG1zZyk7CisgICAgfQorICAgIGlmIChidWYubGVuZ3RoKCkgPT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lc3NhZ2UgPSBuZXcgQ2hhbmdlTWVzc2FnZSgKKyAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UuS2V5KGNoYW5nZS5nZXRJZCgpLCBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksCisgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCksCisgICAgICAgIHRpbWVzdGFtcCwKKyAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCkpOworICAgIG1lc3NhZ2Uuc2V0TWVzc2FnZShTdHJpbmcuZm9ybWF0KAorICAgICAgICAiUGF0Y2ggU2V0ICVkOiVzIiwKKyAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldFBhdGNoU2V0SWQoKSwKKyAgICAgICAgYnVmLnRvU3RyaW5nKCkpKTsKKyAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obWVzc2FnZSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQERlcHJlY2F0ZWQKKyAgcHJpdmF0ZSB2b2lkIGZpcmVDb21tZW50QWRkZWRIb29rKFJldmlzaW9uUmVzb3VyY2UgcnNyYykgeworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIHJzcmMuZ2V0Q29udHJvbCgpLmdldEN1cnJlbnRVc2VyKCk7CisgICAgdHJ5IHsKKyAgICAgIGhvb2tzLmRvQ29tbWVudEFkZGVkSG9vayhjaGFuZ2UsCisgICAgICAgICAgdXNlci5nZXRBY2NvdW50KCksCisgICAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLAorICAgICAgICAgIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgIGNhdGVnb3JpZXMsIGRiKTsKKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgeworICAgICAgbG9nLndhcm4oIkNoYW5nZUhvb2suZG9Db21tZW50QWRkZWRIb29rIGRlbGl2ZXJ5IGZhaWxlZCIsIGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUG9zdFJldmlld2Vycy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUG9zdFJldmlld2Vycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2YyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9Qb3N0UmV2aWV3ZXJzLmphdmEKQEAgLTAsMCArMSwyOTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbC5MYWJlbElkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cE1lbWJlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3ZXJzLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZXJKc29uLlBvc3RSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpZXdlckpzb24uUmV2aWV3ZXJJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkFkZFJldmlld2VyU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQb3N0UmV2aWV3ZXJzIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8Q2hhbmdlUmVzb3VyY2UsIElucHV0PiB7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfTUFYX1JFVklFV0VSU19XSVRIT1VUX0NIRUNLID0gMTA7CisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfTUFYX1JFVklFV0VSUyA9IDIwOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBwdWJsaWMgU3RyaW5nIHJldmlld2VyOworICAgIEJvb2xlYW4gY29uZmlybWVkOworCisgICAgYm9vbGVhbiBjb25maXJtZWQoKSB7CisgICAgICByZXR1cm4gT2JqZWN0cy5maXJzdE5vbk51bGwoY29uZmlybWVkLCBmYWxzZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50c0NvbGxlY3Rpb24gYWNjb3VudHM7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3ZXJSZXNvdXJjZS5GYWN0b3J5IHJldmlld2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBBZGRSZXZpZXdlclNlbmRlci5GYWN0b3J5IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uOworICBwcml2YXRlIGZpbmFsIEdyb3VwTWVtYmVycy5GYWN0b3J5IGdyb3VwTWVtYmVyc0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWNjb3VudExvYWRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDb25maWcgY2ZnOworICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOworICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3ZXJKc29uIGpzb247CisKKyAgQEluamVjdAorICBQb3N0UmV2aWV3ZXJzKEFjY291bnRzQ29sbGVjdGlvbiBhY2NvdW50cywKKyAgICAgIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXZpZXdlckZhY3RvcnksCisgICAgICBBZGRSZXZpZXdlclNlbmRlci5GYWN0b3J5IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb24sCisgICAgICBHcm91cE1lbWJlcnMuRmFjdG9yeSBncm91cE1lbWJlcnNGYWN0b3J5LAorICAgICAgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWNjb3VudExvYWRlckZhY3RvcnksCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwKKyAgICAgIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKKyAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZywKKyAgICAgIENoYW5nZUhvb2tzIGhvb2tzLAorICAgICAgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKKyAgICAgIFJldmlld2VySnNvbiBqc29uKSB7CisgICAgdGhpcy5hY2NvdW50cyA9IGFjY291bnRzOworICAgIHRoaXMucmV2aWV3ZXJGYWN0b3J5ID0gcmV2aWV3ZXJGYWN0b3J5OworICAgIHRoaXMuYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5ID0gYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5OworICAgIHRoaXMuZ3JvdXBzQ29sbGVjdGlvbiA9IGdyb3Vwc0NvbGxlY3Rpb247CisgICAgdGhpcy5ncm91cE1lbWJlcnNGYWN0b3J5ID0gZ3JvdXBNZW1iZXJzRmFjdG9yeTsKKyAgICB0aGlzLmFjY291bnRMb2FkZXJGYWN0b3J5ID0gYWNjb3VudExvYWRlckZhY3Rvcnk7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKKyAgICB0aGlzLmlkZW50aWZpZWRVc2VyRmFjdG9yeSA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKKyAgICB0aGlzLmNmZyA9IGNmZzsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUG9zdFJlc3VsdCBhcHBseShDaGFuZ2VSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBFbWFpbEV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0LnJldmlld2VyID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJtaXNzaW5nIHJldmlld2VyIGZpZWxkIik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIEFjY291bnQuSWQgYWNjb3VudElkID0gYWNjb3VudHMucGFyc2UoaW5wdXQucmV2aWV3ZXIpLmdldEFjY291bnRJZCgpOworICAgICAgcmV0dXJuIHB1dEFjY291bnQocmV2aWV3ZXJGYWN0b3J5LmNyZWF0ZShyc3JjLCBhY2NvdW50SWQpKTsKKyAgICB9IGNhdGNoIChVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBwdXRHcm91cChyc3JjLCBpbnB1dCk7CisgICAgICB9IGNhdGNoIChVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIGUyKSB7CisgICAgICAgIHRocm93IG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgQ2hhbmdlTWVzc2FnZXMuZ2V0KCkucmV2aWV3ZXJOb3RGb3VuZCwKKyAgICAgICAgICAgIGlucHV0LnJldmlld2VyKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBQb3N0UmVzdWx0IHB1dEFjY291bnQoUmV2aWV3ZXJSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAorICAgICAgRW1haWxFeGNlcHRpb24geworICAgIFBvc3RSZXN1bHQgcmVzdWx0ID0gbmV3IFBvc3RSZXN1bHQoKTsKKyAgICBhZGRSZXZpZXdlcnMocnNyYywgcmVzdWx0LCBJbW11dGFibGVTZXQub2YocnNyYy5nZXRVc2VyKCkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBQb3N0UmVzdWx0IHB1dEdyb3VwKENoYW5nZVJlc291cmNlIHJzcmMsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwID0gZ3JvdXBzQ29sbGVjdGlvbi5nZXQoKS5wYXJzZUludGVybmFsKGlucHV0LnJldmlld2VyKTsKKyAgICBQb3N0UmVzdWx0IHJlc3VsdCA9IG5ldyBQb3N0UmVzdWx0KCk7CisgICAgaWYgKCFpc0xlZ2FsUmV2aWV3ZXJHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgIHJlc3VsdC5lcnJvciA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgIENoYW5nZU1lc3NhZ2VzLmdldCgpLmdyb3VwSXNOb3RBbGxvd2VkLCBncm91cC5nZXROYW1lKCkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBTZXQ8SWRlbnRpZmllZFVzZXI+IHJldmlld2VycyA9IFNldHMubmV3TGlua2VkSGFzaFNldCgpOworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJzcmMuZ2V0Q29udHJvbCgpOworICAgIFNldDxBY2NvdW50PiBtZW1iZXJzOworICAgIHRyeSB7CisgICAgICBtZW1iZXJzID0gZ3JvdXBNZW1iZXJzRmFjdG9yeS5jcmVhdGUoY29udHJvbC5nZXRDdXJyZW50VXNlcigpKS5saXN0QWNjb3VudHMoCisgICAgICAgICAgICAgIGdyb3VwLmdldEdyb3VwVVVJRCgpLCBjb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgIH0gY2F0Y2ggKE5vU3VjaEdyb3VwRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICAvLyBpZiBtYXhBbGxvd2VkIGlzIHNldCB0byAwLCBpdCBpcyBhbGxvd2VkIHRvIGFkZCBhbnkgbnVtYmVyIG9mCisgICAgLy8gcmV2aWV3ZXJzCisgICAgaW50IG1heEFsbG93ZWQgPQorICAgICAgICBjZmcuZ2V0SW50KCJhZGRyZXZpZXdlciIsICJtYXhBbGxvd2VkIiwgREVGQVVMVF9NQVhfUkVWSUVXRVJTKTsKKyAgICBpZiAobWF4QWxsb3dlZCA+IDAgJiYgbWVtYmVycy5zaXplKCkgPiBtYXhBbGxvd2VkKSB7CisgICAgICByZXN1bHQuZXJyb3IgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICBDaGFuZ2VNZXNzYWdlcy5nZXQoKS5ncm91cEhhc1Rvb01hbnlNZW1iZXJzLCBncm91cC5nZXROYW1lKCkpOworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBpZiBtYXhXaXRob3V0Q2hlY2sgaXMgc2V0IHRvIDAsIHdlIG5ldmVyIGFzayBmb3IgY29uZmlybWF0aW9uCisgICAgaW50IG1heFdpdGhvdXRDb25maXJtYXRpb24gPQorICAgICAgICBjZmcuZ2V0SW50KCJhZGRyZXZpZXdlciIsICJtYXhXaXRob3V0Q29uZmlybWF0aW9uIiwKKyAgICAgICAgICAgIERFRkFVTFRfTUFYX1JFVklFV0VSU19XSVRIT1VUX0NIRUNLKTsKKyAgICBpZiAoIWlucHV0LmNvbmZpcm1lZCgpICYmIG1heFdpdGhvdXRDb25maXJtYXRpb24gPiAwCisgICAgICAgICYmIG1lbWJlcnMuc2l6ZSgpID4gbWF4V2l0aG91dENvbmZpcm1hdGlvbikgeworICAgICAgcmVzdWx0LmNvbmZpcm0gPSB0cnVlOworICAgICAgcmVzdWx0LmVycm9yID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgICAgICAgICAgQ2hhbmdlTWVzc2FnZXMuZ2V0KCkuZ3JvdXBNYW55TWVtYmVyc0NvbmZpcm1hdGlvbiwKKyAgICAgICAgICBncm91cC5nZXROYW1lKCksIG1lbWJlcnMuc2l6ZSgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgZm9yIChBY2NvdW50IG1lbWJlciA6IG1lbWJlcnMpIHsKKyAgICAgIGlmIChtZW1iZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShtZW1iZXIuZ2V0SWQoKSk7CisgICAgICAgIC8vIERvZXMgbm90IGFjY291bnQgZm9yIGRyYWZ0IHN0YXR1cyBhcyBhIHVzZXIgbWlnaHQgd2FudCB0byBsZXQgYQorICAgICAgICAvLyByZXZpZXdlciBzZWUgYSBkcmFmdC4KKyAgICAgICAgaWYgKGNvbnRyb2wuZm9yVXNlcih1c2VyKS5pc1JlZlZpc2libGUoKSkgeworICAgICAgICAgIHJldmlld2Vycy5hZGQodXNlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhZGRSZXZpZXdlcnMocnNyYywgcmVzdWx0LCByZXZpZXdlcnMpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkUmV2aWV3ZXJzKENoYW5nZVJlc291cmNlIHJzcmMsIFBvc3RSZXN1bHQgcmVzdWx0LAorICAgICAgU2V0PElkZW50aWZpZWRVc2VyPiByZXZpZXdlcnMpIHRocm93cyBPcm1FeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBpZiAocmV2aWV3ZXJzLmlzRW1wdHkoKSkgeworICAgICAgcmVzdWx0LnJldmlld2VycyA9IEltbXV0YWJsZUxpc3Qub2YoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQYXRjaFNldC5JZCBwc2lkID0gcnNyYy5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOworICAgIFNldDxBY2NvdW50LklkPiBleGlzdGluZyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQocHNpZCkpIHsKKyAgICAgIGV4aXN0aW5nLmFkZChwc2EuZ2V0QWNjb3VudElkKCkpOworICAgIH0KKworICAgIHJlc3VsdC5yZXZpZXdlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmV2aWV3ZXJzLnNpemUoKSk7CisgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiB0b0luc2VydCA9CisgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyZXZpZXdlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKElkZW50aWZpZWRVc2VyIHVzZXIgOiByZXZpZXdlcnMpIHsKKyAgICAgIEFjY291bnQuSWQgaWQgPSB1c2VyLmdldEFjY291bnRJZCgpOworICAgICAgaWYgKGV4aXN0aW5nLmNvbnRhaW5zKGlkKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJzcmMuZ2V0Q29udHJvbCgpLmZvclVzZXIodXNlcik7CisgICAgICBQYXRjaFNldEFwcHJvdmFsIHBzYSA9IGR1bW15QXBwcm92YWwoY29udHJvbCwgcHNpZCwgaWQpOworICAgICAgcmVzdWx0LnJldmlld2Vycy5hZGQoanNvbi5mb3JtYXQoCisgICAgICAgICAgbmV3IFJldmlld2VySW5mbyhpZCksIGNvbnRyb2wsIEltbXV0YWJsZUxpc3Qub2YocHNhKSkpOworICAgICAgdG9JbnNlcnQuYWRkKHBzYSk7CisgICAgfQorICAgIGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KHRvSW5zZXJ0KTsKKyAgICBhY2NvdW50TG9hZGVyRmFjdG9yeS5jcmVhdGUodHJ1ZSkuZmlsbChyZXN1bHQucmV2aWV3ZXJzKTsKKyAgICBwb3N0QWRkKHJzcmMuZ2V0Q2hhbmdlKCksIHJlc3VsdCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcG9zdEFkZChDaGFuZ2UgY2hhbmdlLCBQb3N0UmVzdWx0IHJlc3VsdCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBpZiAocmVzdWx0LnJldmlld2Vycy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBFeGVjdXRlIGhvb2sgZm9yIGFkZGVkIHJldmlld2VycworICAgIC8vCisgICAgUGF0Y2hTZXQgcGF0Y2hTZXQgPSBkYi5nZXQoKS5wYXRjaFNldHMoKS5nZXQoY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgIGZvciAoQWNjb3VudEluZm8gaW5mbyA6IHJlc3VsdC5yZXZpZXdlcnMpIHsKKyAgICAgIEFjY291bnQgYWNjb3VudCA9IGFjY291bnRDYWNoZS5nZXQoaW5mby5faWQpLmdldEFjY291bnQoKTsKKyAgICAgIGhvb2tzLmRvUmV2aWV3ZXJBZGRlZEhvb2soY2hhbmdlLCBhY2NvdW50LCBwYXRjaFNldCwgZGIuZ2V0KCkpOworICAgIH0KKworICAgIC8vIEVtYWlsIHRoZSByZXZpZXdlcnMKKyAgICAvLworICAgIC8vIFRoZSB1c2VyIGtub3dzIHRoZXkgYWRkZWQgdGhlbXNlbHZlcywgZG9uJ3QgYm90aGVyIGVtYWlsaW5nIHRoZW0uCisgICAgTGlzdDxBY2NvdW50LklkPiBhZGRlZCA9CisgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyZXN1bHQucmV2aWV3ZXJzLnNpemUoKSk7CisgICAgZm9yIChBY2NvdW50SW5mbyBpbmZvIDogcmVzdWx0LnJldmlld2VycykgeworICAgICAgaWYgKCFpbmZvLl9pZC5lcXVhbHMoY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICAgIGFkZGVkLmFkZChpbmZvLl9pZCk7CisgICAgICB9CisgICAgfQorICAgIGlmICghYWRkZWQuaXNFbXB0eSgpKSB7CisgICAgICBBZGRSZXZpZXdlclNlbmRlciBjbTsKKworICAgICAgY20gPSBhZGRSZXZpZXdlclNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CisgICAgICBjbS5zZXRGcm9tKGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIGNtLmFkZFJldmlld2VycyhhZGRlZCk7CisgICAgICBjbS5zZW5kKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWxSZXZpZXdlckdyb3VwKEFjY291bnRHcm91cC5VVUlEIGdyb3VwVVVJRCkgeworICAgIHJldHVybiAhKEFjY291bnRHcm91cC5BTk9OWU1PVVNfVVNFUlMuZXF1YWxzKGdyb3VwVVVJRCkKKyAgICAgICAgICAgICB8fCBBY2NvdW50R3JvdXAuUkVHSVNURVJFRF9VU0VSUy5lcXVhbHMoZ3JvdXBVVUlEKSk7CisgIH0KKworICBwcml2YXRlIFBhdGNoU2V0QXBwcm92YWwgZHVtbXlBcHByb3ZhbChDaGFuZ2VDb250cm9sIGN0bCwKKyAgICAgIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIEFjY291bnQuSWQgcmV2aWV3ZXJJZCkgeworICAgIExhYmVsSWQgaWQgPQorICAgICAgICBJdGVyYWJsZXMuZ2V0TGFzdChjdGwuZ2V0TGFiZWxUeXBlcygpLmdldExhYmVsVHlwZXMoKSkuZ2V0TGFiZWxJZCgpOworICAgIFBhdGNoU2V0QXBwcm92YWwgZHVtbXlBcHByb3ZhbCA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKAorICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkocGF0Y2hTZXRJZCwgcmV2aWV3ZXJJZCwgaWQpLCAoc2hvcnQpIDApOworICAgIGR1bW15QXBwcm92YWwuY2FjaGUoY3RsLmdldENoYW5nZSgpKTsKKyAgICByZXR1cm4gZHVtbXlBcHByb3ZhbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUHV0RHJhZnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1B1dERyYWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlYWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1B1dERyYWZ0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuR2V0RHJhZnQuU2lkZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlB1dERyYWZ0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworY2xhc3MgUHV0RHJhZnQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxEcmFmdFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIFN0cmluZyBraW5kOworICAgIFN0cmluZyBpZDsKKyAgICBTdHJpbmcgcGF0aDsKKyAgICBTaWRlIHNpZGU7CisgICAgSW50ZWdlciBsaW5lOworICAgIFN0cmluZyBpblJlcGx5VG87CisgICAgVGltZXN0YW1wIHVwZGF0ZWQ7IC8vIEFjY2VwdGVkIGJ1dCBpZ25vcmVkLgorCisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBtZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8RGVsZXRlRHJhZnQ+IGRlbGV0ZTsKKworICBASW5qZWN0CisgIFB1dERyYWZ0KFByb3ZpZGVyPFJldmlld0RiPiBkYiwgUHJvdmlkZXI8RGVsZXRlRHJhZnQ+IGRlbGV0ZSkgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmRlbGV0ZSA9IGRlbGV0ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KERyYWZ0UmVzb3VyY2UgcnNyYywgSW5wdXQgaW4pIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBQYXRjaExpbmVDb21tZW50IGMgPSByc3JjLmdldENvbW1lbnQoKTsKKyAgICBpZiAoaW4gPT0gbnVsbCB8fCBpbi5tZXNzYWdlID09IG51bGwgfHwgaW4ubWVzc2FnZS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gZGVsZXRlLmdldCgpLmFwcGx5KHJzcmMsIG51bGwpOworICAgIH0gZWxzZSBpZiAoaW4ua2luZCAhPSBudWxsICYmICEiZ2Vycml0Y29kZXJldmlldyNjb21tZW50Ii5lcXVhbHMoaW4ua2luZCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJleHBlY3RlZCBraW5kIGdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIpOworICAgIH0gZWxzZSBpZiAoaW4uaWQgIT0gbnVsbCAmJiAhcnNyYy5nZXRJZCgpLmVxdWFscyhpbi5pZCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJpZCBtdXN0IG1hdGNoIFVSTCIpOworICAgIH0gZWxzZSBpZiAoaW4ubGluZSAhPSBudWxsICYmIGluLmxpbmUgPCAwKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibGluZSBtdXN0IGJlID49IDAiKTsKKyAgICB9CisKKyAgICBpZiAoaW4ucGF0aCAhPSBudWxsCisgICAgICAgICYmICFpbi5wYXRoLmVxdWFscyhjLmdldEtleSgpLmdldFBhcmVudEtleSgpLmdldEZpbGVOYW1lKCkpKSB7CisgICAgICAvLyBVcGRhdGluZyB0aGUgcGF0aCBhbHRlcnMgdGhlIHByaW1hcnkga2V5LCB3aGljaCBpc24ndCBwb3NzaWJsZS4KKyAgICAgIC8vIERlbGV0ZSB0aGVuIHJlY3JlYXRlIHRoZSBjb21tZW50IGluc3RlYWQgb2YgYW4gdXBkYXRlLgorICAgICAgZGIuZ2V0KCkucGF0Y2hDb21tZW50cygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oYykpOworICAgICAgYyA9IG5ldyBQYXRjaExpbmVDb21tZW50KAorICAgICAgICAgIG5ldyBQYXRjaExpbmVDb21tZW50LktleSgKKyAgICAgICAgICAgICAgbmV3IFBhdGNoLktleShyc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwgaW4ucGF0aCksCisgICAgICAgICAgICAgIGMuZ2V0S2V5KCkuZ2V0KCkpLAorICAgICAgICAgIGMuZ2V0TGluZSgpLAorICAgICAgICAgIHJzcmMuZ2V0QXV0aG9ySWQoKSwKKyAgICAgICAgICBjLmdldFBhcmVudFV1aWQoKSk7CisgICAgICBkYi5nZXQoKS5wYXRjaENvbW1lbnRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbih1cGRhdGUoYywgaW4pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRiLmdldCgpLnBhdGNoQ29tbWVudHMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHVwZGF0ZShjLCBpbikpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHZXREcmFmdC5Db21tZW50KGMpOworICB9CisKKyAgcHJpdmF0ZSBQYXRjaExpbmVDb21tZW50IHVwZGF0ZShQYXRjaExpbmVDb21tZW50IGUsIElucHV0IGluKSB7CisgICAgaWYgKGluLnNpZGUgIT0gbnVsbCkgeworICAgICAgZS5zZXRTaWRlKGluLnNpZGUgPT0gR2V0RHJhZnQuU2lkZS5QQVJFTlQgPyAoc2hvcnQpIDAgOiAoc2hvcnQpIDEpOworICAgIH0KKyAgICBpZiAoaW4ubGluZSAhPSBudWxsKSB7CisgICAgICBlLnNldExpbmUoaW4ubGluZSk7CisgICAgfQorICAgIGlmIChpbi5pblJlcGx5VG8gIT0gbnVsbCkgeworICAgICAgZS5zZXRQYXJlbnRVdWlkKFVybC5kZWNvZGUoaW4uaW5SZXBseVRvKSk7CisgICAgfQorICAgIGUuc2V0TWVzc2FnZShpbi5tZXNzYWdlLnRyaW0oKSk7CisgICAgZS51cGRhdGVkKCk7CisgICAgcmV0dXJuIGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1B1dFRvcGljLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QdXRUb3BpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QdXRUb3BpYy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUHV0VG9waWMuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworY2xhc3MgUHV0VG9waWMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxDaGFuZ2VSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgdG9waWM7CisgICAgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBASW5qZWN0CisgIFB1dFRvcGljKFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyKSB7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJlcSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7CisgICAgfQorCisgICAgQ2hhbmdlQ29udHJvbCBjb250cm9sID0gcmVxLmdldENvbnRyb2woKTsKKyAgICBDaGFuZ2UgY2hhbmdlID0gcmVxLmdldENoYW5nZSgpOworICAgIGlmICghY29udHJvbC5jYW5FZGl0VG9waWNOYW1lKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJjaGFuZ2luZyB0b3BpYyBub3QgcGVybWl0dGVkIik7CisgICAgfQorCisgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgIGZpbmFsIFN0cmluZyBuZXdUb3BpY05hbWUgPSBTdHJpbmdzLm51bGxUb0VtcHR5KGlucHV0LnRvcGljKTsKKyAgICBTdHJpbmcgb2xkVG9waWNOYW1lID0gU3RyaW5ncy5udWxsVG9FbXB0eShjaGFuZ2UuZ2V0VG9waWMoKSk7CisgICAgaWYgKCFvbGRUb3BpY05hbWUuZXF1YWxzKG5ld1RvcGljTmFtZSkpIHsKKyAgICAgIFN0cmluZyBzdW1tYXJ5OworICAgICAgaWYgKG9sZFRvcGljTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3VtbWFyeSA9ICJUb3BpYyBzZXQgdG8gXCIiICsgbmV3VG9waWNOYW1lICsgIlwiLiI7CisgICAgICB9IGVsc2UgaWYgKG5ld1RvcGljTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgc3VtbWFyeSA9ICJUb3BpYyBcIiIgKyBvbGRUb3BpY05hbWUgKyAiXCIgcmVtb3ZlZC4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3VtbWFyeSA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiVG9waWMgdXBkYXRlZCBmcm9tIFwiJXNcIiB0byBcIiVzXCIuIiwKKyAgICAgICAgICAgIG9sZFRvcGljTmFtZSwgbmV3VG9waWNOYW1lKTsKKyAgICAgIH0KKworICAgICAgQ2hhbmdlTWVzc2FnZSBjbXNnID0gbmV3IENoYW5nZU1lc3NhZ2UoCisgICAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UuS2V5KGNoYW5nZS5nZXRJZCgpLCBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksCisgICAgICAgICAgKChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpKS5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICBTdHJpbmdCdWlsZGVyIG1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1bW1hcnkpOworICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW5wdXQubWVzc2FnZSkpIHsKKyAgICAgICAgbXNnQnVmLmFwcGVuZCgiXG5cbiIpOworICAgICAgICBtc2dCdWYuYXBwZW5kKGlucHV0Lm1lc3NhZ2UpOworICAgICAgfQorICAgICAgY21zZy5zZXRNZXNzYWdlKG1zZ0J1Zi50b1N0cmluZygpKTsKKworICAgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgIGNoYW5nZS5zZXRUb3BpYyhTdHJpbmdzLmVtcHR5VG9OdWxsKG5ld1RvcGljTmFtZSkpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNtc2cpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZ3MuaXNOdWxsT3JFbXB0eShuZXdUb3BpY05hbWUpCisgICAgICAgID8gUmVzcG9uc2Uubm9uZSgpCisgICAgICAgIDogbmV3VG9waWNOYW1lOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXN0b3JlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiNThmOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jlc3RvcmUuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZS5TdGF0dXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BcHByb3ZhbHNVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJlc3RvcmUuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVwbHlUb0NoYW5nZVNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXN0b3JlZFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgUmVzdG9yZSBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PENoYW5nZVJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVzdG9yZS5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBSZXN0b3JlZFNlbmRlci5GYWN0b3J5IHJlc3RvcmVkU2VuZGVyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VKc29uIGpzb247CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKKyAgfQorCisgIEBJbmplY3QKKyAgUmVzdG9yZShDaGFuZ2VIb29rcyBob29rcywKKyAgICAgIFJlc3RvcmVkU2VuZGVyLkZhY3RvcnkgcmVzdG9yZWRTZW5kZXJGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBDaGFuZ2VKc29uIGpzb24pIHsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5yZXN0b3JlZFNlbmRlckZhY3RvcnkgPSByZXN0b3JlZFNlbmRlckZhY3Rvcnk7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcmVxLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJlcS5nZXRDb250cm9sKCk7CisgICAgSWRlbnRpZmllZFVzZXIgY2FsbGVyID0gKElkZW50aWZpZWRVc2VyKSBjb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgQ2hhbmdlIGNoYW5nZSA9IHJlcS5nZXRDaGFuZ2UoKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuUmVzdG9yZSgpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigicmVzdG9yZSBub3QgcGVybWl0dGVkIik7CisgICAgfSBlbHNlIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgIT0gU3RhdHVzLkFCQU5ET05FRCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiICsgc3RhdHVzKGNoYW5nZSkpOworICAgIH0KKworICAgIENoYW5nZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBSZXZpZXdEYiBkYiA9IGRiUHJvdmlkZXIuZ2V0KCk7CisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKAorICAgICAgICBjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5BQkFORE9ORUQpIHsKKyAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk5FVyk7CisgICAgICAgICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOworICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY2hhbmdlIGlzICIKKyAgICAgICAgICAgICsgc3RhdHVzKGRiLmNoYW5nZXMoKS5nZXQocmVxLmdldENoYW5nZSgpLmdldElkKCkpKSk7CisgICAgICB9CisgICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZShpbnB1dCwgY2FsbGVyLCBjaGFuZ2UpOworICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lc3NhZ2UpKTsKKyAgICAgIG5ldyBBcHByb3ZhbHNVdGlsKGRiKS5zeW5jQ2hhbmdlU3RhdHVzKGNoYW5nZSk7CisgICAgICBkYi5jb21taXQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgUmVwbHlUb0NoYW5nZVNlbmRlciBjbSA9IHJlc3RvcmVkU2VuZGVyRmFjdG9yeS5jcmVhdGUoY2hhbmdlKTsKKyAgICAgIGNtLnNldEZyb20oY2FsbGVyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICBjbS5zZW5kKCk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIHVwZGF0ZSBmb3IgY2hhbmdlICIgKyBjaGFuZ2UuZ2V0Q2hhbmdlSWQoKSwgZSk7CisgICAgfQorICAgIGhvb2tzLmRvQ2hhbmdlUmVzdG9yZWRIb29rKGNoYW5nZSwKKyAgICAgICAgY2FsbGVyLmdldEFjY291bnQoKSwKKyAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5tZXNzYWdlKSwKKyAgICAgICAgZGJQcm92aWRlci5nZXQoKSk7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KGNoYW5nZSk7CisgIH0KKworICBwcml2YXRlIENoYW5nZU1lc3NhZ2UgbmV3TWVzc2FnZShJbnB1dCBpbnB1dCwgSWRlbnRpZmllZFVzZXIgY2FsbGVyLAorICAgICAgQ2hhbmdlIGNoYW5nZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIG1zZy5hcHBlbmQoIlJlc3RvcmVkIik7CisgICAgaWYgKCFTdHJpbmdzLm51bGxUb0VtcHR5KGlucHV0Lm1lc3NhZ2UpLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgIG1zZy5hcHBlbmQoIlxuXG4iKTsKKyAgICAgIG1zZy5hcHBlbmQoaW5wdXQubWVzc2FnZS50cmltKCkpOworICAgIH0KKworICAgIENoYW5nZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBDaGFuZ2VNZXNzYWdlKAorICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoCisgICAgICAgICAgICBjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGJQcm92aWRlci5nZXQoKSkpLAorICAgICAgICBjYWxsZXIuZ2V0QWNjb3VudElkKCksCisgICAgICAgIGNoYW5nZS5nZXRMYXN0VXBkYXRlZE9uKCksCisgICAgICAgIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICBtZXNzYWdlLnNldE1lc3NhZ2UobXNnLnRvU3RyaW5nKCkpOworICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXR1cyhDaGFuZ2UgY2hhbmdlKSB7CisgICAgcmV0dXJuIGNoYW5nZSAhPSBudWxsID8gY2hhbmdlLmdldFN0YXR1cygpLm5hbWUoKS50b0xvd2VyQ2FzZSgpIDogImRlbGV0ZWQiOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZlcnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1JldmVydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjg1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZlcnQuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuU3RhdHVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2ZXJ0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzLkNvbW1pdFZhbGlkYXRvcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmV2ZXJ0ZWRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guTm9Tc2hJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgUmV2ZXJ0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8Q2hhbmdlUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CisgIHByaXZhdGUgZmluYWwgUmV2ZXJ0ZWRTZW5kZXIuRmFjdG9yeSByZXZlcnRlZFNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQ29tbWl0VmFsaWRhdG9ycy5GYWN0b3J5IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZTsKKyAgfQorCisgIEBJbmplY3QKKyAgUmV2ZXJ0KENoYW5nZUhvb2tzIGhvb2tzLAorICAgICAgUmV2ZXJ0ZWRTZW5kZXIuRmFjdG9yeSByZXZlcnRlZFNlbmRlckZhY3RvcnksCisgICAgICBmaW5hbCBDb21taXRWYWxpZGF0b3JzLkZhY3RvcnkgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnksCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgIENoYW5nZUpzb24ganNvbiwKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCisgICAgICBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCisgICAgICBAR2Vycml0UGVyc29uSWRlbnQgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudCwKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5yZXZlcnRlZFNlbmRlckZhY3RvcnkgPSByZXZlcnRlZFNlbmRlckZhY3Rvcnk7CisgICAgdGhpcy5jb21taXRWYWxpZGF0b3JzRmFjdG9yeSA9IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5OworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgICB0aGlzLmdpdE1hbmFnZXIgPSBnaXRNYW5hZ2VyOworICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuY2Fub25pY2FsV2ViVXJsID0gY2Fub25pY2FsV2ViVXJsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcmVxLCBJbnB1dCBpbnB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjb250cm9sID0gcmVxLmdldENvbnRyb2woKTsKKyAgICBDaGFuZ2UgY2hhbmdlID0gcmVxLmdldENoYW5nZSgpOworICAgIGlmICghY29udHJvbC5jYW5BZGRQYXRjaFNldCgpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigicmV2ZXJ0IG5vdCBwZXJtaXR0ZWQiKTsKKyAgICB9IGVsc2UgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuTUVSR0VEKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY2hhbmdlIGlzICIgKyBzdGF0dXMoY2hhbmdlKSk7CisgICAgfQorCisgICAgZmluYWwgUmVwb3NpdG9yeSBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGNvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgdHJ5IHsKKyAgICAgIENvbW1pdFZhbGlkYXRvcnMgY29tbWl0VmFsaWRhdG9ycyA9CisgICAgICAgICAgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnkuY3JlYXRlKGNvbnRyb2wuZ2V0UmVmQ29udHJvbCgpLCBuZXcgTm9Tc2hJbmZvKCksIGdpdCk7CisKKyAgICAgIENoYW5nZS5JZCByZXZlcnRlZENoYW5nZUlkID0KKyAgICAgICAgICBDaGFuZ2VVdGlsLnJldmVydChjb250cm9sLmdldFJlZkNvbnRyb2woKSwgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCksCisgICAgICAgICAgICAgIChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpLAorICAgICAgICAgICAgICBjb21taXRWYWxpZGF0b3JzLAorICAgICAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0Lm1lc3NhZ2UpLCBkYlByb3ZpZGVyLmdldCgpLAorICAgICAgICAgICAgICByZXZlcnRlZFNlbmRlckZhY3RvcnksIGhvb2tzLCBnaXQsIHBhdGNoU2V0SW5mb0ZhY3RvcnksCisgICAgICAgICAgICAgIGdpdFJlZlVwZGF0ZWQsIG15SWRlbnQsIGNhbm9uaWNhbFdlYlVybCk7CisKKyAgICAgIHJldHVybiBqc29uLmZvcm1hdChyZXZlcnRlZENoYW5nZUlkKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZ2l0LmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXR1cyhDaGFuZ2UgY2hhbmdlKSB7CisgICAgcmV0dXJuIGNoYW5nZSAhPSBudWxsID8gY2hhbmdlLmdldFN0YXR1cygpLm5hbWUoKS50b0xvd2VyQ2FzZSgpIDogImRlbGV0ZWQiOworICAgfQorIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2VkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlZC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFBhdGNoUmV2aWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworY2xhc3MgUmV2aWV3ZWQgeworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICB9CisKKyAgc3RhdGljIGNsYXNzIFB1dFJldmlld2VkIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGF0Y2hSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworCisgICAgQEluamVjdAorICAgIFB1dFJldmlld2VkKFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyKSB7CisgICAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoUGF0Y2hSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgICAgQWNjb3VudFBhdGNoUmV2aWV3IGFwciA9IGdldEV4aXN0aW5nKGRiLCByZXNvdXJjZSk7CisgICAgICBpZiAoYXByID09IG51bGwpIHsKKyAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmluc2VydCgKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgQWNjb3VudFBhdGNoUmV2aWV3KHJlc291cmNlLmdldFBhdGNoS2V5KCksCisgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0QWNjb3VudElkKCkpKSk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKCIiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIERlbGV0ZVJldmlld2VkIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGF0Y2hSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworCisgICAgQEluamVjdAorICAgIERlbGV0ZVJldmlld2VkKFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyKSB7CisgICAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoUGF0Y2hSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgICAgQWNjb3VudFBhdGNoUmV2aWV3IGFwciA9IGdldEV4aXN0aW5nKGRiLCByZXNvdXJjZSk7CisgICAgICBpZiAoYXByICE9IG51bGwpIHsKKyAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oYXByKSk7CisgICAgICB9CisgICAgICByZXR1cm4gUmVzcG9uc2Uubm9uZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEFjY291bnRQYXRjaFJldmlldyBnZXRFeGlzdGluZyhSZXZpZXdEYiBkYiwKKyAgICAgIFBhdGNoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRQYXRjaFJldmlldy5LZXkga2V5ID0gbmV3IEFjY291bnRQYXRjaFJldmlldy5LZXkoCisgICAgICAgIHJlc291cmNlLmdldFBhdGNoS2V5KCksIHJlc291cmNlLmdldEFjY291bnRJZCgpKTsKKyAgICByZXR1cm4gZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmdldChrZXkpOworICB9CisKKyAgcHJpdmF0ZSBSZXZpZXdlZCgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJKc29uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlckpzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRkNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJKc29uLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWUuZm9ybWF0VmFsdWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkxhYmVsTm9ybWFsaXplcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK3B1YmxpYyBjbGFzcyBSZXZpZXdlckpzb24geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBMYWJlbE5vcm1hbGl6ZXIgbGFiZWxOb3JtYWxpemVyOworICBwcml2YXRlIGZpbmFsIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGFjY291bnRMb2FkZXJGYWN0b3J5OworCisgIEBJbmplY3QKKyAgUmV2aWV3ZXJKc29uKFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgIExhYmVsTm9ybWFsaXplciBsYWJlbE5vcm1hbGl6ZXIsCisgICAgICBBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeSBhY2NvdW50TG9hZGVyRmFjdG9yeSkgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmxhYmVsTm9ybWFsaXplciA9IGxhYmVsTm9ybWFsaXplcjsKKyAgICB0aGlzLmFjY291bnRMb2FkZXJGYWN0b3J5ID0gYWNjb3VudExvYWRlckZhY3Rvcnk7CisgIH0KKworICBwdWJsaWMgTGlzdDxSZXZpZXdlckluZm8+IGZvcm1hdChDb2xsZWN0aW9uPFJldmlld2VyUmVzb3VyY2U+IHJzcmNzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTGlzdDxSZXZpZXdlckluZm8+IGluZm9zID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJzcmNzLnNpemUoKSk7CisgICAgQWNjb3VudEluZm8uTG9hZGVyIGxvYWRlciA9IGFjY291bnRMb2FkZXJGYWN0b3J5LmNyZWF0ZSh0cnVlKTsKKyAgICBmb3IgKFJldmlld2VyUmVzb3VyY2UgcnNyYyA6IHJzcmNzKSB7CisgICAgICBSZXZpZXdlckluZm8gaW5mbyA9IGZvcm1hdChyc3JjLCBudWxsKTsKKyAgICAgIGxvYWRlci5wdXQoaW5mbyk7CisgICAgICBpbmZvcy5hZGQoaW5mbyk7CisgICAgfQorICAgIGxvYWRlci5maWxsKCk7CisgICAgcmV0dXJuIGluZm9zOworICB9CisKKyAgcHVibGljIExpc3Q8UmV2aWV3ZXJJbmZvPiBmb3JtYXQoUmV2aWV3ZXJSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZm9ybWF0KEltbXV0YWJsZUxpc3QuPFJldmlld2VyUmVzb3VyY2U+IG9mKHJzcmMpKTsKKyAgfQorCisgIHB1YmxpYyBSZXZpZXdlckluZm8gZm9ybWF0KFJldmlld2VySW5mbyBvdXQsIENoYW5nZUNvbnRyb2wgY3RsLAorICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFBhdGNoU2V0LklkIHBzSWQgPSBjdGwuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKKworICAgIGlmIChhcHByb3ZhbHMgPT0gbnVsbCkgeworICAgICAgYXBwcm92YWxzID0gQ2hhbmdlRGF0YS5zb3J0QXBwcm92YWxzKGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkKKyAgICAgICAgICAuYnlQYXRjaFNldFVzZXIocHNJZCwgb3V0Ll9pZCkpOworICAgIH0KKyAgICBhcHByb3ZhbHMgPSBsYWJlbE5vcm1hbGl6ZXIubm9ybWFsaXplKGN0bCwgYXBwcm92YWxzKTsKKyAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBjdGwuZ2V0TGFiZWxUeXBlcygpOworCisgICAgLy8gRG9uJ3QgdXNlIE1hcHMubmV3VHJlZU1hcChDb21wYXJhdG9yKSBkdWUgdG8gT3BlbkpESyBidWcgMTAwMTY3LgorICAgIG91dC5hcHByb3ZhbHMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsU3RyaW5nPihsYWJlbFR5cGVzLm5hbWVDb21wYXJhdG9yKCkpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBjYSA6IGFwcHJvdmFscykgeworICAgICAgZm9yIChQZXJtaXNzaW9uUmFuZ2UgcHIgOiBjdGwuZ2V0TGFiZWxSYW5nZXMoKSkgeworICAgICAgICBpZiAoIXByLmlzRW1wdHkoKSkgeworICAgICAgICAgIExhYmVsVHlwZSBhdCA9IGxhYmVsVHlwZXMuYnlMYWJlbChjYS5nZXRMYWJlbElkKCkpOworICAgICAgICAgIGlmIChhdCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQuYXBwcm92YWxzLnB1dChhdC5nZXROYW1lKCksIGZvcm1hdFZhbHVlKGNhLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgZHVtbXkgYXBwcm92YWxzIGZvciBhbGwgcGVybWl0dGVkIGxhYmVscyBmb3IgdGhlIHVzZXIgZXZlbiBpZiB0aGV5CisgICAgLy8gZG8gbm90IGV4aXN0IGluIHRoZSBEQi4KKyAgICBDaGFuZ2VEYXRhIGNkID0gbmV3IENoYW5nZURhdGEoY3RsKTsKKyAgICBQYXRjaFNldCBwcyA9IGNkLmN1cnJlbnRQYXRjaFNldChkYik7CisgICAgaWYgKHBzICE9IG51bGwpIHsKKyAgICAgIGZvciAoU3VibWl0UmVjb3JkIHJlYyA6CisgICAgICAgICAgY3RsLmNhblN1Ym1pdChkYi5nZXQoKSwgcHMsIGNkLCB0cnVlLCBmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgaWYgKHJlYy5sYWJlbHMgPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoU3VibWl0UmVjb3JkLkxhYmVsIGxhYmVsIDogcmVjLmxhYmVscykgeworICAgICAgICAgIFN0cmluZyBuYW1lID0gbGFiZWwubGFiZWw7CisgICAgICAgICAgaWYgKCFvdXQuYXBwcm92YWxzLmNvbnRhaW5zS2V5KG5hbWUpCisgICAgICAgICAgICAgICYmICFjdGwuZ2V0UmFuZ2UoUGVybWlzc2lvbi5mb3JMYWJlbChuYW1lKSkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBvdXQuYXBwcm92YWxzLnB1dChuYW1lLCBmb3JtYXRWYWx1ZSgoc2hvcnQpIDApKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0LmFwcHJvdmFscy5pc0VtcHR5KCkpIHsKKyAgICAgIG91dC5hcHByb3ZhbHMgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0KKworICBwcml2YXRlIFJldmlld2VySW5mbyBmb3JtYXQoUmV2aWV3ZXJSZXNvdXJjZSByc3JjLAorICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBmb3JtYXQobmV3IFJldmlld2VySW5mbyhyc3JjLmdldFVzZXIoKS5nZXRBY2NvdW50SWQoKSksCisgICAgICAgIHJzcmMuZ2V0VXNlckNvbnRyb2woKSwgYXBwcm92YWxzKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV2aWV3ZXJJbmZvIGV4dGVuZHMgQWNjb3VudEluZm8geworICAgIGZpbmFsIFN0cmluZyBraW5kID0gImdlcnJpdGNvZGVyZXZpZXcjcmV2aWV3ZXIiOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXBwcm92YWxzOworCisgICAgcHJvdGVjdGVkIFJldmlld2VySW5mbyhBY2NvdW50LklkIGlkKSB7CisgICAgICBzdXBlcihpZCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3N0UmVzdWx0IHsKKyAgICBwdWJsaWMgTGlzdDxSZXZpZXdlckluZm8+IHJldmlld2VyczsKKyAgICBwdWJsaWMgU3RyaW5nIGVycm9yOworICAgIEJvb2xlYW4gY29uZmlybTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YjUyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWRJbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBSZXZpZXdlclJlc291cmNlIGV4dGVuZHMgQ2hhbmdlUmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PFJldmlld2VyUmVzb3VyY2U+PiBSRVZJRVdFUl9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxSZXZpZXdlclJlc291cmNlPj4oKSB7fTsKKworICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBSZXZpZXdlclJlc291cmNlIGNyZWF0ZShDaGFuZ2VSZXNvdXJjZSByc3JjLCBJZGVudGlmaWVkVXNlciB1c2VyKTsKKyAgICBSZXZpZXdlclJlc291cmNlIGNyZWF0ZShDaGFuZ2VSZXNvdXJjZSByc3JjLCBBY2NvdW50LklkIGlkKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKKworICBAQXNzaXN0ZWRJbmplY3QKKyAgUmV2aWV3ZXJSZXNvdXJjZShAQXNzaXN0ZWQgQ2hhbmdlUmVzb3VyY2UgcnNyYywKKyAgICAgIEBBc3Npc3RlZCBJZGVudGlmaWVkVXNlciB1c2VyKSB7CisgICAgc3VwZXIocnNyYyk7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgfQorCisgIEBBc3Npc3RlZEluamVjdAorICBSZXZpZXdlclJlc291cmNlKElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5LAorICAgICAgQEFzc2lzdGVkIENoYW5nZVJlc291cmNlIHJzcmMsCisgICAgICBAQXNzaXN0ZWQgQWNjb3VudC5JZCBpZCkgeworICAgIHRoaXMocnNyYywgdXNlckZhY3RvcnkuY3JlYXRlKGlkKSk7CisgIH0KKworICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgZ2V0VXNlcigpIHsKKyAgICByZXR1cm4gdXNlcjsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIHRoZSBjb250cm9sIGZvciB0aGUgcmV2aWV3ZXIncyB1c2VyIChhcyBvcHBvc2VkIHRvIHRoZSBjYWxsZXIncworICAgKiAgICAgdXNlciBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2dldENvbnRyb2woKX0pLgorICAgKi8KKyAgcHVibGljIENoYW5nZUNvbnRyb2wgZ2V0VXNlckNvbnRyb2woKSB7CisgICAgcmV0dXJuIGdldENvbnRyb2woKS5mb3JVc2VyKHVzZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2Vycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWUwODkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlcnMuamF2YQpAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFJldmlld2VycyBpbXBsZW1lbnRzCisgICAgQ2hpbGRDb2xsZWN0aW9uPENoYW5nZVJlc291cmNlLCBSZXZpZXdlclJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxSZXZpZXdlclJlc291cmNlPj4gdmlld3M7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudHNDb2xsZWN0aW9uIGFjY291bnRzOworICBwcml2YXRlIGZpbmFsIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdFJldmlld2Vycz4gbGlzdDsKKworICBASW5qZWN0CisgIFJldmlld2VycyhQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgIEFjY291bnRzQ29sbGVjdGlvbiBhY2NvdW50cywKKyAgICAgIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnksCisgICAgICBEeW5hbWljTWFwPFJlc3RWaWV3PFJldmlld2VyUmVzb3VyY2U+PiB2aWV3cywKKyAgICAgIFByb3ZpZGVyPExpc3RSZXZpZXdlcnM+IGxpc3QpIHsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMuYWNjb3VudHMgPSBhY2NvdW50czsKKyAgICB0aGlzLnJlc291cmNlRmFjdG9yeSA9IHJlc291cmNlRmFjdG9yeTsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxSZXZpZXdlclJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxDaGFuZ2VSZXNvdXJjZT4gbGlzdCgpIHsKKyAgICByZXR1cm4gbGlzdC5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmV2aWV3ZXJSZXNvdXJjZSBwYXJzZShDaGFuZ2VSZXNvdXJjZSByc3JjLCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIEFjY291bnQuSWQgYWNjb3VudElkID0KKyAgICAgICAgYWNjb3VudHMucGFyc2UoVG9wTGV2ZWxSZXNvdXJjZS5JTlNUQU5DRSwgaWQpLmdldFVzZXIoKS5nZXRBY2NvdW50SWQoKTsKKworICAgIC8vIFNlZSBpZiB0aGUgaWQgZXhpc3RzIGFzIGEgcmV2aWV3ZXIgZm9yIHRoaXMgY2hhbmdlCisgICAgaWYgKGZldGNoQWNjb3VudElkcyhyc3JjKS5jb250YWlucyhhY2NvdW50SWQpKSB7CisgICAgICByZXR1cm4gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZShyc3JjLCBhY2NvdW50SWQpOworICAgIH0KKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgIH0KKworICBwcml2YXRlIFNldDxBY2NvdW50LklkPiBmZXRjaEFjY291bnRJZHMoQ2hhbmdlUmVzb3VyY2UgcnNyYykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFNldDxBY2NvdW50LklkPiBhY2NvdW50SWRzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEKKyAgICAgICAgIDogZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSkpIHsKKyAgICAgIGFjY291bnRJZHMuYWRkKGEuZ2V0QWNjb3VudElkKCkpOworICAgIH0KKyAgICByZXR1cm4gYWNjb3VudElkczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25SZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDllMGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpc2lvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIFJldmlzaW9uUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PFJldmlzaW9uUmVzb3VyY2U+PiBSRVZJU0lPTl9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIENoYW5nZVJlc291cmNlIGNoYW5nZTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldCBwczsKKworICBwdWJsaWMgUmV2aXNpb25SZXNvdXJjZShDaGFuZ2VSZXNvdXJjZSBjaGFuZ2UsIFBhdGNoU2V0IHBzKSB7CisgICAgdGhpcy5jaGFuZ2UgPSBjaGFuZ2U7CisgICAgdGhpcy5wcyA9IHBzOworICB9CisKKyAgcHVibGljIENoYW5nZUNvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKyAgICByZXR1cm4gY2hhbmdlLmdldENvbnRyb2woKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2UgZ2V0Q2hhbmdlKCkgeworICAgIHJldHVybiBnZXRDb250cm9sKCkuZ2V0Q2hhbmdlKCk7CisgIH0KKworICBwdWJsaWMgUGF0Y2hTZXQgZ2V0UGF0Y2hTZXQoKSB7CisgICAgcmV0dXJuIHBzOworICB9CisKKyAgQWNjb3VudC5JZCBnZXRBY2NvdW50SWQoKSB7CisgICAgcmV0dXJuICgoSWRlbnRpZmllZFVzZXIpIGdldENvbnRyb2woKS5nZXRDdXJyZW50VXNlcigpKS5nZXRBY2NvdW50SWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25zLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGVmNjNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25zLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgUmV2aXNpb25zIGltcGxlbWVudHMgQ2hpbGRDb2xsZWN0aW9uPENoYW5nZVJlc291cmNlLCBSZXZpc2lvblJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPj4gdmlld3M7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisKKyAgQEluamVjdAorICBSZXZpc2lvbnMoRHluYW1pY01hcDxSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcikgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PFJldmlzaW9uUmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PENoYW5nZVJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJldmlzaW9uUmVzb3VyY2UgcGFyc2UoQ2hhbmdlUmVzb3VyY2UgY2hhbmdlLCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChpZC5lcXVhbHMoImN1cnJlbnQiKSkgeworICAgICAgUGF0Y2hTZXQuSWQgcCA9IGNoYW5nZS5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOworICAgICAgUGF0Y2hTZXQgcHMgPSBwICE9IG51bGwgPyBkYlByb3ZpZGVyLmdldCgpLnBhdGNoU2V0cygpLmdldChwKSA6IG51bGw7CisgICAgICBpZiAocHMgIT0gbnVsbCAmJiB2aXNpYmxlKGNoYW5nZSwgcHMpKSB7CisgICAgICAgIHJldHVybiBuZXcgUmV2aXNpb25SZXNvdXJjZShjaGFuZ2UsIHBzKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgTGlzdDxQYXRjaFNldD4gbWF0Y2ggPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgIGZvciAoUGF0Y2hTZXQgcHMgOiBmaW5kKGNoYW5nZSwgaWQuZ2V0KCkpKSB7CisgICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwcy5nZXRJZCgpLmdldFBhcmVudEtleSgpOworICAgICAgaWYgKGNoYW5nZUlkLmVxdWFscyhjaGFuZ2UuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSkgJiYgdmlzaWJsZShjaGFuZ2UsIHBzKSkgeworICAgICAgICBtYXRjaC5hZGQocHMpOworICAgICAgfQorICAgIH0KKyAgICBpZiAobWF0Y2guc2l6ZSgpICE9IDEpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZXZpc2lvblJlc291cmNlKGNoYW5nZSwgbWF0Y2guZ2V0KDApKTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiB2aXNpYmxlKENoYW5nZVJlc291cmNlIGNoYW5nZSwgUGF0Y2hTZXQgcHMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY2hhbmdlLmdldENvbnRyb2woKS5pc1BhdGNoVmlzaWJsZShwcywgZGJQcm92aWRlci5nZXQoKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8UGF0Y2hTZXQ+IGZpbmQoQ2hhbmdlUmVzb3VyY2UgY2hhbmdlLCBTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBSZXZpZXdEYiBkYiA9IGRiUHJvdmlkZXIuZ2V0KCk7CisKKyAgICBpZiAoaWQubGVuZ3RoKCkgPCA2ICYmIGlkLm1hdGNoZXMoIl5bMS05XVswLTldezAsNH0kIikpIHsKKyAgICAgIC8vIExlZ2FjeSBwYXRjaCBzZXQgbnVtYmVyIHN5bnRheC4KKyAgICAgIFBhdGNoU2V0IHBzID0gZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldHMoKS5nZXQobmV3IFBhdGNoU2V0LklkKAorICAgICAgICAgIGNoYW5nZS5nZXRDaGFuZ2UoKS5nZXRJZCgpLAorICAgICAgICAgIEludGVnZXIucGFyc2VJbnQoaWQpKSk7CisgICAgICBpZiAocHMgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcyk7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfSBlbHNlIGlmIChpZC5sZW5ndGgoKSA8IDQgfHwgaWQubGVuZ3RoKCkgPiBSZXZJZC5MRU4pIHsKKyAgICAgIC8vIFJlcXVpcmUgYSBtaW5pbXVtIG9mIDQgZGlnaXRzLgorICAgICAgLy8gSW1wb3NzaWJseSBsb25nIGlkZW50aWZpZXIgd2lsbCBuZXZlciBtYXRjaC4KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9IGVsc2UgaWYgKGlkLmxlbmd0aCgpID49IDgpIHsKKyAgICAgIC8vIENvbW1pdCBuYW1lcyBhcmUgcmF0aGVyIHVuaXF1ZS4gUXVlcnkgZm9yIHRoZSBjb21taXQgYW5kIGxhdGVyCisgICAgICAvLyBtYXRjaCB0byB0aGUgY2hhbmdlLiBUaGlzIGlzIG1vc3QgbGlrZWx5IGdvaW5nIHRvIGlkZW50aWZ5IDEgb3IKKyAgICAgIC8vIGF0IG1vc3QgMiBwYXRjaCBzZXRzIHRvIGNvbnNpZGVyLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gbG9va2luZworICAgICAgLy8gZm9yIGFsbCBwYXRjaCBzZXRzIGluIHRoZSBjaGFuZ2UuCisgICAgICBSZXZJZCByZXZpZCA9IG5ldyBSZXZJZChpZCk7CisgICAgICBpZiAocmV2aWQuaXNDb21wbGV0ZSgpKSB7CisgICAgICAgIHJldHVybiBkYi5wYXRjaFNldHMoKS5ieVJldmlzaW9uKHJldmlkKS50b0xpc3QoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBkYi5wYXRjaFNldHMoKS5ieVJldmlzaW9uUmFuZ2UocmV2aWQsIHJldmlkLm1heCgpKS50b0xpc3QoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gQ2hhbmNlIG9mIGNvbGxpc2lvbiByaXNlczsgbG9vayBhdCBhbGwgcGF0Y2ggc2V0cyBvbiB0aGUgY2hhbmdlLgorICAgICAgTGlzdDxQYXRjaFNldD4gb3V0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKFBhdGNoU2V0IHBzIDogZGIucGF0Y2hTZXRzKCkuYnlDaGFuZ2UoY2hhbmdlLmdldENoYW5nZSgpLmdldElkKCkpKSB7CisgICAgICAgIGlmIChwcy5nZXRSZXZpc2lvbigpICE9IG51bGwgJiYgcHMuZ2V0UmV2aXNpb24oKS5nZXQoKS5zdGFydHNXaXRoKGlkKSkgeworICAgICAgICAgIG91dC5hZGQocHMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gb3V0OworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvU3VibWl0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9TdWJtaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjNiZjVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvU3VibWl0LmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZC5TdGF0dXMuT0s7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbC5MYWJlbElkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlByb2plY3RVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuU3VibWl0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVF1ZXVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFN1Ym1pdCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIHB1YmxpYyBib29sZWFuIHdhaXRGb3JNZXJnZTsKKyAgfQorCisgIHB1YmxpYyBlbnVtIFN0YXR1cyB7CisgICAgU1VCTUlUVEVELCBNRVJHRUQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dHB1dCB7CisgICAgcHVibGljIFN0YXR1cyBzdGF0dXM7CisgICAgdHJhbnNpZW50IENoYW5nZSBjaGFuZ2U7CisKKyAgICBwcml2YXRlIE91dHB1dChTdGF0dXMgcywgQ2hhbmdlIGMpIHsKKyAgICAgIHN0YXR1cyA9IHM7CisgICAgICBjaGFuZ2UgPSBjOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgTWVyZ2VRdWV1ZSBtZXJnZVF1ZXVlOworCisgIEBJbmplY3QKKyAgU3VibWl0KFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLAorICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsCisgICAgICBNZXJnZVF1ZXVlIG1lcmdlUXVldWUpIHsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgICB0aGlzLm1lcmdlUXVldWUgPSBtZXJnZVF1ZXVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPdXRwdXQgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgdGhyb3dzIEF1dGhFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByc3JjLmdldENvbnRyb2woKTsKKyAgICBJZGVudGlmaWVkVXNlciBjYWxsZXIgPSAoSWRlbnRpZmllZFVzZXIpIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICBDaGFuZ2UgY2hhbmdlID0gcnNyYy5nZXRDaGFuZ2UoKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuU3VibWl0KCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJzdWJtaXQgbm90IHBlcm1pdHRlZCIpOworICAgIH0gZWxzZSBpZiAoIWNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiICsgc3RhdHVzKGNoYW5nZSkpOworICAgIH0gZWxzZSBpZiAoIVByb2plY3RVdGlsLmJyYW5jaEV4aXN0cyhyZXBvTWFuYWdlciwgY2hhbmdlLmdldERlc3QoKSkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgImRlc3RpbmF0aW9uIGJyYW5jaCBcIiVzXCIgbm90IGZvdW5kLiIsCisgICAgICAgICAgY2hhbmdlLmdldERlc3QoKS5nZXQoKSkpOworICAgIH0gZWxzZSBpZiAoIXJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLmVxdWFscyhjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSkpIHsKKyAgICAgIC8vIFRPRE8gQWxsb3cgc3VibWl0dGluZyBub24tY3VycmVudCByZXZpc2lvbiBieSBjaGFuZ2luZyB0aGUgY3VycmVudC4KKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgInJldmlzaW9uICVzIGlzIG5vdCBjdXJyZW50IHJldmlzaW9uIiwKKyAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0UmV2aXNpb24oKS5nZXQoKSkpOworICAgIH0KKworICAgIGNoZWNrU3VibWl0UnVsZShyc3JjKTsKKyAgICBjaGFuZ2UgPSBzdWJtaXQocnNyYywgY2FsbGVyKTsKKworICAgIGlmIChpbnB1dC53YWl0Rm9yTWVyZ2UpIHsKKyAgICAgIG1lcmdlUXVldWUubWVyZ2UoY2hhbmdlLmdldERlc3QoKSk7CisgICAgICBjaGFuZ2UgPSBkYlByb3ZpZGVyLmdldCgpLmNoYW5nZXMoKS5nZXQoY2hhbmdlLmdldElkKCkpOworICAgIH0gZWxzZSB7CisgICAgICBtZXJnZVF1ZXVlLnNjaGVkdWxlKGNoYW5nZS5nZXREZXN0KCkpOworICAgIH0KKworICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyBkZWxldGVkIik7CisgICAgfQorICAgIHN3aXRjaCAoY2hhbmdlLmdldFN0YXR1cygpKSB7CisgICAgICBjYXNlIFNVQk1JVFRFRDoKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXQoU3RhdHVzLlNVQk1JVFRFRCwgY2hhbmdlKTsKKyAgICAgIGNhc2UgTUVSR0VEOgorICAgICAgICByZXR1cm4gbmV3IE91dHB1dChTdGF0dXMuTUVSR0VELCBjaGFuZ2UpOworICAgICAgY2FzZSBORVc6CisgICAgICAgIC8vIElmIHRoZSBtZXJnZSB3YXMgYXR0ZW1wdGVkIGFuZCBpdCBmYWlsZWQgdGhlIHN5c3RlbSB1c3VhbGx5CisgICAgICAgIC8vIHdyaXRlcyBhIGNvbW1lbnQgYXMgYSBDaGFuZ2VNZXNzYWdlIGFuZCBzZXRzIHN0YXR1cyB0byBORVcuCisgICAgICAgIC8vIEZpbmQgdGhlIHJlbGV2YW50IG1lc3NhZ2UgYW5kIHJlcG9ydCB0aGF0IGFzIHRoZSBjb25mbGljdC4KKyAgICAgICAgZmluYWwgVGltZXN0YW1wIGJlZm9yZSA9IHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0TGFzdFVwZGF0ZWRPbigpOworICAgICAgICBDaGFuZ2VNZXNzYWdlIG1zZyA9IEl0ZXJhYmxlcy5nZXRGaXJzdChJdGVyYWJsZXMuZmlsdGVyKAorICAgICAgICAgIExpc3RzLnJldmVyc2UoZGJQcm92aWRlci5nZXQoKS5jaGFuZ2VNZXNzYWdlcygpCisgICAgICAgICAgICAgIC5ieUNoYW5nZShjaGFuZ2UuZ2V0SWQoKSkKKyAgICAgICAgICAgICAgLnRvTGlzdCgpKSwKKyAgICAgICAgICBuZXcgUHJlZGljYXRlPENoYW5nZU1lc3NhZ2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShDaGFuZ2VNZXNzYWdlIGlucHV0KSB7CisgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5nZXRBdXRob3IoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAmJiBpbnB1dC5nZXRXcml0dGVuT24oKS5nZXRUaW1lKCkgPj0gYmVmb3JlLmdldFRpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSwgbnVsbCk7CisgICAgICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKG1zZy5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY2hhbmdlIGlzICIgKyBzdGF0dXMoY2hhbmdlKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBDaGFuZ2Ugc3VibWl0KFJldmlzaW9uUmVzb3VyY2UgcnNyYywgSWRlbnRpZmllZFVzZXIgY2FsbGVyKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgIENoYW5nZSBjaGFuZ2UgPSByc3JjLmdldENoYW5nZSgpOworICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7CisgICAgdHJ5IHsKKyAgICAgIGFwcHJvdmUocnNyYy5nZXRQYXRjaFNldCgpLCBjYWxsZXIsIHRpbWVzdGFtcCk7CisgICAgICBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKAorICAgICAgICBjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLlNVQk1JVFRFRCk7CisgICAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0VXBkYXRlZE9uKHRpbWVzdGFtcCk7CisgICAgICAgICAgICAgIENoYW5nZVV0aWwuY29tcHV0ZVNvcnRLZXkoY2hhbmdlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiCisgICAgICAgICAgICArIHN0YXR1cyhkYi5jaGFuZ2VzKCkuZ2V0KHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSkpKTsKKyAgICAgIH0KKyAgICAgIGRiLmNvbW1pdCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBkYi5yb2xsYmFjaygpOworICAgIH0KKyAgICByZXR1cm4gY2hhbmdlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFwcHJvdmUoUGF0Y2hTZXQgcmV2LCBJZGVudGlmaWVkVXNlciBjYWxsZXIsIFRpbWVzdGFtcCB0aW1lc3RhbXApCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdCA9IEl0ZXJhYmxlcy5nZXRGaXJzdChJdGVyYWJsZXMuZmlsdGVyKAorICAgICAgZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpCisgICAgICAgIC5ieVBhdGNoU2V0VXNlcihyZXYuZ2V0SWQoKSwgY2FsbGVyLmdldEFjY291bnRJZCgpKSwKKyAgICAgIG5ldyBQcmVkaWNhdGU8UGF0Y2hTZXRBcHByb3ZhbD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShQYXRjaFNldEFwcHJvdmFsIGlucHV0KSB7CisgICAgICAgICAgcmV0dXJuIGlucHV0LmlzU3VibWl0KCk7CisgICAgICAgIH0KKyAgICAgIH0pLCBudWxsKTsKKyAgICBpZiAoc3VibWl0ID09IG51bGwpIHsKKyAgICAgIHN1Ym1pdCA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKAorICAgICAgICAgIG5ldyBQYXRjaFNldEFwcHJvdmFsLktleSgKKyAgICAgICAgICAgICAgcmV2LmdldElkKCksCisgICAgICAgICAgICAgIGNhbGxlci5nZXRBY2NvdW50SWQoKSwKKyAgICAgICAgICAgICAgTGFiZWxJZC5TVUJNSVQpLAorICAgICAgICAgIChzaG9ydCkgMSk7CisgICAgfQorICAgIHN1Ym1pdC5zZXRWYWx1ZSgoc2hvcnQpIDEpOworICAgIHN1Ym1pdC5zZXRHcmFudGVkKHRpbWVzdGFtcCk7CisgICAgZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLnVwc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3VibWl0KSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tTdWJtaXRSdWxlKFJldmlzaW9uUmVzb3VyY2UgcnNyYykKKyAgICAgIHRocm93cyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIHsKKyAgTGlzdDxTdWJtaXRSZWNvcmQ+IHJlc3VsdHMgPSByc3JjLmdldENvbnRyb2woKS5jYW5TdWJtaXQoCisgICAgICAgIGRiUHJvdmlkZXIuZ2V0KCksCisgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKSk7CisgICAgT3B0aW9uYWw8U3VibWl0UmVjb3JkPiBvayA9IGZpbmRPa1JlY29yZChyZXN1bHRzKTsKKyAgICBpZiAob2suaXNQcmVzZW50KCkpIHsKKyAgICAgIC8vIFJ1bGVzIHN1cHBsaWVkIGEgdmFsaWQgc29sdXRpb24uCisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJDaGFuZ2VDb250cm9sLmNhblN1Ym1pdCByZXR1cm5lZCBlbXB0eSBsaXN0IGZvciAlcyBpbiAlcyIsCisgICAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCksCisgICAgICAgICAgcnNyYy5nZXRDaGFuZ2UoKS5nZXRQcm9qZWN0KCkuZ2V0KCkpKTsKKyAgICB9CisKKyAgICBmb3IgKFN1Ym1pdFJlY29yZCByZWNvcmQgOiByZXN1bHRzKSB7CisgICAgICBzd2l0Y2ggKHJlY29yZC5zdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyBjbG9zZWQiKTsKKworICAgICAgICBjYXNlIFJVTEVfRVJST1I6CisgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgInJ1bGUgZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgcmVjb3JkLmVycm9yTWVzc2FnZSkpOworCisgICAgICAgIGNhc2UgTk9UX1JFQURZOgorICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCBsYmwgOiByZWNvcmQubGFiZWxzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxibC5zdGF0dXMpIHsKKyAgICAgICAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgICAgY2FzZSBNQVk6CisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgY2FzZSBSRUpFQ1Q6CisgICAgICAgICAgICAgICAgaWYgKG1zZy5sZW5ndGgoKSA+IDApIG1zZy5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiYmxvY2tlZCBieSAiICsgbGJsLmxhYmVsKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICBjYXNlIE5FRUQ6CisgICAgICAgICAgICAgICAgaWYgKG1zZy5sZW5ndGgoKSA+IDApIG1zZy5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgibmVlZHMgIiArIGxibC5sYWJlbCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgY2FzZSBJTVBPU1NJQkxFOgorICAgICAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoKCkgPiAwKSBtc2cuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIm5lZWRzICIgKyBsYmwubGFiZWwgKyAiIChjaGVjayBwcm9qZWN0IGFjY2VzcykiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFN1Ym1pdFJlY29yZC5MYWJlbCAlcyBmb3IgJXMgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICBsYmwudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCksCisgICAgICAgICAgICAgICAgICAgIHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpLmdldCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKG1zZy50b1N0cmluZygpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFN1Ym1pdFJlY29yZCAlcyBmb3IgJXMgaW4gJXMiLAorICAgICAgICAgICAgICByZWNvcmQsCisgICAgICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgICByc3JjLmdldENoYW5nZSgpLmdldFByb2plY3QoKS5nZXQoKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPFN1Ym1pdFJlY29yZD4gZmluZE9rUmVjb3JkKENvbGxlY3Rpb248U3VibWl0UmVjb3JkPiBpbikgeworICAgIHJldHVybiBJdGVyYWJsZXMudHJ5RmluZChpbiwgbmV3IFByZWRpY2F0ZTxTdWJtaXRSZWNvcmQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShTdWJtaXRSZWNvcmQgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0LnN0YXR1cyA9PSBPSzsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0dXMoQ2hhbmdlIGNoYW5nZSkgeworICAgIHJldHVybiBjaGFuZ2UgIT0gbnVsbCA/IGNoYW5nZS5nZXRTdGF0dXMoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSA6ICJkZWxldGVkIjsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VycmVudFJldmlzaW9uIGltcGxlbWVudHMKKyAgICAgIFJlc3RNb2RpZnlWaWV3PENoYW5nZVJlc291cmNlLCBJbnB1dD4geworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdWJtaXQgc3VibWl0OworICAgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworCisgICAgQEluamVjdAorICAgIEN1cnJlbnRSZXZpc2lvbihQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgICAgU3VibWl0IHN1Ym1pdCwKKyAgICAgICAgQ2hhbmdlSnNvbiBqc29uKSB7CisgICAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgICAgdGhpcy5zdWJtaXQgPSBzdWJtaXQ7CisgICAgICB0aGlzLmpzb24gPSBqc29uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICBPcm1FeGNlcHRpb24geworICAgICAgUGF0Y2hTZXQgcHMgPSBkYlByb3ZpZGVyLmdldCgpLnBhdGNoU2V0cygpCisgICAgICAgIC5nZXQocnNyYy5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICAgIGlmIChwcyA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjdXJyZW50IHJldmlzaW9uIGlzIG1pc3NpbmciKTsKKyAgICAgIH0gZWxzZSBpZiAoIXJzcmMuZ2V0Q29udHJvbCgpLmlzUGF0Y2hWaXNpYmxlKHBzLCBkYlByb3ZpZGVyLmdldCgpKSkgeworICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiY3VycmVudCByZXZpc2lvbiBub3QgYWNjZXNzaWJsZSIpOworICAgICAgfQorICAgICAgT3V0cHV0IG91dCA9IHN1Ym1pdC5hcHBseShuZXcgUmV2aXNpb25SZXNvdXJjZShyc3JjLCBwcyksIGlucHV0KTsKKyAgICAgIHJldHVybiBqc29uLmZvcm1hdChvdXQuY2hhbmdlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Rlc3RTdWJtaXRSdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9UZXN0U3VibWl0UnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMThmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9UZXN0U3VibWl0UnVsZS5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUnVsZXNDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlJ1bGVFdmFsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlN1Ym1pdFJ1bGVFdmFsdWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFRlc3RTdWJtaXRSdWxlIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UmV2aXNpb25SZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHVibGljIGVudW0gRmlsdGVycyB7CisgICAgUlVOLCBTS0lQOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIHB1YmxpYyBTdHJpbmcgcnVsZTsKKyAgICBwdWJsaWMgRmlsdGVycyBmaWx0ZXJzOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBSdWxlc0NhY2hlIHJ1bGVzOworICBwcml2YXRlIGZpbmFsIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGFjY291bnRJbmZvRmFjdG9yeTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1maWx0ZXJzIiwgdXNhZ2UgPSAiaW1wYWN0IG9mIGZpbHRlcnMgaW4gcGFyZW50IHByb2plY3RzIikKKyAgcHJpdmF0ZSBGaWx0ZXJzIGZpbHRlcnMgPSBGaWx0ZXJzLlJVTjsKKworICBASW5qZWN0CisgIFRlc3RTdWJtaXRSdWxlKFJldmlld0RiIGRiLCBSdWxlc0NhY2hlIHJ1bGVzLAorICAgICAgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgaW5mb0ZhY3RvcnkpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5ydWxlcyA9IHJ1bGVzOworICAgIHRoaXMuYWNjb3VudEluZm9GYWN0b3J5ID0gaW5mb0ZhY3Rvcnk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShSZXZpc2lvblJlc291cmNlIHJzcmMsIElucHV0IGlucHV0KSB0aHJvd3MgT3JtRXhjZXB0aW9uLAorICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7CisgICAgfQorICAgIGlmIChpbnB1dC5ydWxlICE9IG51bGwgJiYgIXJ1bGVzLmlzUHJvamVjdFJ1bGVzRW5hYmxlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigicHJvamVjdCBydWxlcyBhcmUgZGlzYWJsZWQiKTsKKyAgICB9CisgICAgaW5wdXQuZmlsdGVycyA9IE9iamVjdHMuZmlyc3ROb25OdWxsKGlucHV0LmZpbHRlcnMsIGZpbHRlcnMpOworCisgICAgU3VibWl0UnVsZUV2YWx1YXRvciBldmFsdWF0b3IgPSBuZXcgU3VibWl0UnVsZUV2YWx1YXRvcigKKyAgICAgICAgZGIsCisgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKSwKKyAgICAgICAgcnNyYy5nZXRDb250cm9sKCkuZ2V0UHJvamVjdENvbnRyb2woKSwKKyAgICAgICAgcnNyYy5nZXRDb250cm9sKCksCisgICAgICAgIHJzcmMuZ2V0Q2hhbmdlKCksCisgICAgICAgIG5ldyBDaGFuZ2VEYXRhKHJzcmMuZ2V0Q2hhbmdlKCkpLAorICAgICAgICBmYWxzZSwKKyAgICAgICAgImxvY2F0ZV9zdWJtaXRfcnVsZSIsICJjYW5fc3VibWl0IiwKKyAgICAgICAgImxvY2F0ZV9zdWJtaXRfZmlsdGVyIiwgImZpbHRlcl9zdWJtaXRfcmVzdWx0cyIsCisgICAgICAgIGlucHV0LmZpbHRlcnMgPT0gRmlsdGVycy5TS0lQLAorICAgICAgICBpbnB1dC5ydWxlICE9IG51bGwKKyAgICAgICAgICA/IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5ydWxlLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSkKKyAgICAgICAgICA6IG51bGwpOworCisgICAgTGlzdDxUZXJtPiByZXN1bHRzOworICAgIHRyeSB7CisgICAgICByZXN1bHRzID0gZXZhbChldmFsdWF0b3IpOworICAgIH0gY2F0Y2ggKFJ1bGVFdmFsRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN0cmluZyBtc2cgPSBKb2luZXIub24oIjogIikuc2tpcE51bGxzKCkuam9pbihJdGVyYWJsZXMudHJhbnNmb3JtKAorICAgICAgICAgIFRocm93YWJsZXMuZ2V0Q2F1c2FsQ2hhaW4oZSksCisgICAgICAgICAgbmV3IEZ1bmN0aW9uPFRocm93YWJsZSwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShUaHJvd2FibGUgaW4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGluLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSk7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigicnVsZSBmYWlsZWQ6ICIgKyBtc2cpOworICAgIH0KKyAgICBpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgInJ1bGUgJXMgaGFzIG5vIHNvbHV0aW9ucyIsCisgICAgICAgICAgZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgTGlzdDxTdWJtaXRSZWNvcmQ+IHJlY29yZHMgPSByc3JjLmdldENvbnRyb2woKS5yZXN1bHRzVG9TdWJtaXRSZWNvcmQoCisgICAgICAgIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCksCisgICAgICAgIHJlc3VsdHMpOworICAgIExpc3Q8UmVjb3JkPiBvdXQgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmVjb3Jkcy5zaXplKCkpOworICAgIEFjY291bnRJbmZvLkxvYWRlciBhY2NvdW50cyA9IGFjY291bnRJbmZvRmFjdG9yeS5jcmVhdGUodHJ1ZSk7CisgICAgZm9yIChTdWJtaXRSZWNvcmQgciA6IHJlY29yZHMpIHsKKyAgICAgIG91dC5hZGQobmV3IFJlY29yZChyLCBhY2NvdW50cykpOworICAgIH0KKyAgICBhY2NvdW50cy5maWxsKCk7CisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIExpc3Q8VGVybT4gZXZhbChTdWJtaXRSdWxlRXZhbHVhdG9yIGV2YWx1YXRvcikKKyAgICAgIHRocm93cyBSdWxlRXZhbEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGV2YWx1YXRvci5ldmFsdWF0ZSgpOworICB9CisKKyAgc3RhdGljIGNsYXNzIFJlY29yZCB7CisgICAgU3VibWl0UmVjb3JkLlN0YXR1cyBzdGF0dXM7CisgICAgU3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICBNYXA8U3RyaW5nLCBBY2NvdW50SW5mbz4gb2s7CisgICAgTWFwPFN0cmluZywgQWNjb3VudEluZm8+IHJlamVjdDsKKyAgICBNYXA8U3RyaW5nLCBOb25lPiBuZWVkOworICAgIE1hcDxTdHJpbmcsIEFjY291bnRJbmZvPiBtYXk7CisgICAgTWFwPFN0cmluZywgTm9uZT4gaW1wb3NzaWJsZTsKKworICAgIFJlY29yZChTdWJtaXRSZWNvcmQgciwgQWNjb3VudEluZm8uTG9hZGVyIGFjY291bnRzKSB7CisgICAgICB0aGlzLnN0YXR1cyA9IHIuc3RhdHVzOworICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSByLmVycm9yTWVzc2FnZTsKKworICAgICAgaWYgKHIubGFiZWxzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChTdWJtaXRSZWNvcmQuTGFiZWwgbiA6IHIubGFiZWxzKSB7CisgICAgICAgICAgQWNjb3VudEluZm8gd2hvID0gbi5hcHBsaWVkQnkgIT0gbnVsbAorICAgICAgICAgICAgICA/IGFjY291bnRzLmdldChuLmFwcGxpZWRCeSkKKyAgICAgICAgICAgICAgOiBuZXcgQWNjb3VudEluZm8obnVsbCk7CisgICAgICAgICAgbGFiZWwobiwgd2hvKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsYWJlbChTdWJtaXRSZWNvcmQuTGFiZWwgbiwgQWNjb3VudEluZm8gd2hvKSB7CisgICAgICBzd2l0Y2ggKG4uc3RhdHVzKSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgaWYgKG9rID09IG51bGwpIHsKKyAgICAgICAgICAgIG9rID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9rLnB1dChuLmxhYmVsLCB3aG8pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFSkVDVDoKKyAgICAgICAgICBpZiAocmVqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlamVjdCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZWplY3QucHV0KG4ubGFiZWwsIHdobyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVFRDoKKyAgICAgICAgICBpZiAobmVlZCA9PSBudWxsKSB7CisgICAgICAgICAgICBuZWVkID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG5lZWQucHV0KG4ubGFiZWwsIG5ldyBOb25lKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1BWToKKyAgICAgICAgICBpZiAobWF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1heSA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBtYXkucHV0KG4ubGFiZWwsIHdobyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU1QT1NTSUJMRToKKyAgICAgICAgICBpZiAoaW1wb3NzaWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbXBvc3NpYmxlID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGltcG9zc2libGUucHV0KG4ubGFiZWwsIG5ldyBOb25lKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBOb25lIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvVGVzdFN1Ym1pdFR5cGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Rlc3RTdWJtaXRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Rlc3RTdWJtaXRUeXBlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlJ1bGVzQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5GaWx0ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFJ1bGUuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUnVsZUV2YWxFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuU3VibWl0UnVsZUV2YWx1YXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlRlcm07CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFRlc3RTdWJtaXRUeXBlIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UmV2aXNpb25SZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBSdWxlc0NhY2hlIHJ1bGVzOworCisgIEBPcHRpb24obmFtZSA9ICItLWZpbHRlcnMiLCB1c2FnZSA9ICJpbXBhY3Qgb2YgZmlsdGVycyBpbiBwYXJlbnQgcHJvamVjdHMiKQorICBwcml2YXRlIEZpbHRlcnMgZmlsdGVycyA9IEZpbHRlcnMuUlVOOworCisgIEBJbmplY3QKKyAgVGVzdFN1Ym1pdFR5cGUoUmV2aWV3RGIgZGIsIFJ1bGVzQ2FjaGUgcnVsZXMpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5ydWxlcyA9IHJ1bGVzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOworICAgIH0KKyAgICBpZiAoaW5wdXQucnVsZSAhPSBudWxsICYmICFydWxlcy5pc1Byb2plY3RSdWxlc0VuYWJsZWQoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInByb2plY3QgcnVsZXMgYXJlIGRpc2FibGVkIik7CisgICAgfQorICAgIGlucHV0LmZpbHRlcnMgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbChpbnB1dC5maWx0ZXJzLCBmaWx0ZXJzKTsKKworICAgIFN1Ym1pdFJ1bGVFdmFsdWF0b3IgZXZhbHVhdG9yID0gbmV3IFN1Ym1pdFJ1bGVFdmFsdWF0b3IoCisgICAgICAgIGRiLAorICAgICAgICByc3JjLmdldFBhdGNoU2V0KCksCisgICAgICAgIHJzcmMuZ2V0Q29udHJvbCgpLmdldFByb2plY3RDb250cm9sKCksCisgICAgICAgIHJzcmMuZ2V0Q29udHJvbCgpLAorICAgICAgICByc3JjLmdldENoYW5nZSgpLAorICAgICAgICBuZXcgQ2hhbmdlRGF0YShyc3JjLmdldENoYW5nZSgpKSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgICJsb2NhdGVfc3VibWl0X3R5cGUiLCAiZ2V0X3N1Ym1pdF90eXBlIiwKKyAgICAgICAgImxvY2F0ZV9zdWJtaXRfdHlwZV9maWx0ZXIiLCAiZmlsdGVyX3N1Ym1pdF90eXBlX3Jlc3VsdHMiLAorICAgICAgICBpbnB1dC5maWx0ZXJzID09IEZpbHRlcnMuU0tJUCwKKyAgICAgICAgaW5wdXQucnVsZSAhPSBudWxsCisgICAgICAgICAgPyBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQucnVsZS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpCisgICAgICAgICAgOiBudWxsKTsKKworICAgIExpc3Q8VGVybT4gcmVzdWx0czsKKyAgICB0cnkgeworICAgICAgcmVzdWx0cyA9IGV2YWx1YXRvci5ldmFsdWF0ZSgpOworICAgIH0gY2F0Y2ggKFJ1bGVFdmFsRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgInJ1bGUgZmFpbGVkIHdpdGggZXhjZXB0aW9uOiAlcyIsCisgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdHMuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJydWxlICVzIGhhcyBubyBzb2x1dGlvbiIsCisgICAgICAgICAgZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKSkpOworICAgIH0KKyAgICBUZXJtIHR5cGUgPSByZXN1bHRzLmdldCgwKTsKKyAgICBpZiAoIXR5cGUuaXNTeW1ib2woKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAicnVsZSAlcyBwcm9kdWNlZCBpbnZhbGlkIHJlc3VsdDogJXMiLAorICAgICAgICAgIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICB0eXBlKSk7CisgICAgfQorICAgIHJldHVybiB0eXBlLnRvU3RyaW5nKCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgR2V0IGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFJldmlzaW9uUmVzb3VyY2U+IHsKKyAgICBwcml2YXRlIGZpbmFsIFRlc3RTdWJtaXRUeXBlIHRlc3Q7CisKKyAgICBASW5qZWN0CisgICAgR2V0KFRlc3RTdWJtaXRUeXBlIHRlc3QpIHsKKyAgICAgIHRoaXMudGVzdCA9IHRlc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhcHBseShSZXZpc2lvblJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgICAgT3JtRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICAgIHJldHVybiB0ZXN0LmFwcGx5KHJlc291cmNlLCBudWxsKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhNGE4My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9BYmFuZG9uQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BYmFuZG9uZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci0KLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7Ci1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKLQotcHVibGljIGNsYXNzIEFiYW5kb25DaGFuZ2UgaW1wbGVtZW50cyBDYWxsYWJsZTxSZXZpZXdSZXN1bHQ+IHsKLQotICBwcml2YXRlIGZpbmFsIEFiYW5kb25lZFNlbmRlci5GYWN0b3J5IGFiYW5kb25lZFNlbmRlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOwotCi0gIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgbXVsdGlWYWx1ZWQgPSBmYWxzZSwgdXNhZ2UgPSAiY2hhbmdlIHRvIGFiYW5kb24iKQotICBwcml2YXRlIENoYW5nZS5JZCBjaGFuZ2VJZDsKLQotICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VJZChmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQpIHsKLSAgICB0aGlzLmNoYW5nZUlkID0gY2hhbmdlSWQ7Ci0gIH0KLQotICBAT3B0aW9uKG5hbWUgPSAiLS1tZXNzYWdlIiwgYWxpYXNlcyA9IHsiLW0ifSwKLSAgICAgICAgICB1c2FnZSA9ICJvcHRpb25hbCBtZXNzYWdlIHRvIGFwcGVuZCB0byBjaGFuZ2UiKQotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotCi0gIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICB9Ci0KLSAgQEluamVjdAotICBBYmFuZG9uQ2hhbmdlKGZpbmFsIEFiYW5kb25lZFNlbmRlci5GYWN0b3J5IGFiYW5kb25lZFNlbmRlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksIGZpbmFsIFJldmlld0RiIGRiLAotICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzKSB7Ci0gICAgdGhpcy5hYmFuZG9uZWRTZW5kZXJGYWN0b3J5ID0gYWJhbmRvbmVkU2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLmhvb2tzID0gaG9va3M7Ci0KLSAgICBjaGFuZ2VJZCA9IG51bGw7Ci0gICAgbWVzc2FnZSA9IG51bGw7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFJldmlld1Jlc3VsdCBjYWxsKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uLAotICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24gewotICAgIGlmIChjaGFuZ2VJZCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigiY2hhbmdlSWQgaXMgcmVxdWlyZWQiKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gbmV3IFJldmlld1Jlc3VsdCgpOwotICAgIHJlc3VsdC5zZXRDaGFuZ2VJZChjaGFuZ2VJZCk7Ci0KLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7Ci0gICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOwotICAgIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQgPSBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKTsKLSAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICBpZiAoIWNvbnRyb2wuY2FuQWJhbmRvbigpKSB7Ci0gICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5BQkFORE9OX05PVF9QRVJNSVRURUQpKTsKLSAgICB9IGVsc2UgaWYgKHBhdGNoID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwotICAgIH0gZWxzZSB7Ci0KLSAgICAgIC8vIENyZWF0ZSBhIG1lc3NhZ2UgdG8gYWNjb21wYW55IHRoZSBhYmFuZG9uZWQgY2hhbmdlCi0gICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPSBuZXcgQ2hhbmdlTWVzc2FnZSgKLSAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlSWQsIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGIpKSwKLSAgICAgICAgICBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSwgcGF0Y2hTZXRJZCk7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ0J1ZiA9Ci0gICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIlBhdGNoIFNldCAiICsgcGF0Y2hTZXRJZC5nZXQoKSArICI6IEFiYW5kb25lZCIpOwotICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotICAgICAgICBtc2dCdWYuYXBwZW5kKCJcblxuIik7Ci0gICAgICAgIG1zZ0J1Zi5hcHBlbmQobWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBjbXNnLnNldE1lc3NhZ2UobXNnQnVmLnRvU3RyaW5nKCkpOwotCi0gICAgICAvLyBBYmFuZG9uIHRoZSBjaGFuZ2UKLSAgICAgIGZpbmFsIENoYW5nZSB1cGRhdGVkQ2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwKLSAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgewotICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLkFCQU5ET05FRCk7Ci0gICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIGlmICh1cGRhdGVkQ2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5DSEFOR0VfSVNfQ0xPU0VEKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIENoYW5nZVV0aWwudXBkYXRlZENoYW5nZShkYiwgY3VycmVudFVzZXIsIHVwZGF0ZWRDaGFuZ2UsIGNtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJhbmRvbmVkU2VuZGVyRmFjdG9yeSk7Ci0gICAgICBob29rcy5kb0NoYW5nZUFiYW5kb25lZEhvb2sodXBkYXRlZENoYW5nZSwgY3VycmVudFVzZXIuZ2V0QWNjb3VudCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9EZWxldGVEcmFmdFBhdGNoU2V0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9EZWxldGVEcmFmdFBhdGNoU2V0LmphdmEKaW5kZXggZjQ2NjIzMS4uYWRlYzI5MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvRGVsZXRlRHJhZnRQYXRjaFNldC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0UGF0Y2hTZXQuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKIAogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7CkBAIC01MiwxMiArNTIsMTIgQEAKICAgQEluamVjdAogICBEZWxldGVEcmFmdFBhdGNoU2V0KENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKICAgICAgIFJldmlld0RiIGRiLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkgewogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKICAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OwogCiAgICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKQEAgLTg4LDcgKzg4LDcgQEAKICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gY29udHJvbC5nZXRDaGFuZ2UoKTsKIAogICAgIHRyeSB7Ci0gICAgICBDaGFuZ2VVdGlsLmRlbGV0ZU9ubHlEcmFmdFBhdGNoU2V0KHBhdGNoLCBjaGFuZ2UsIGdpdE1hbmFnZXIsIHJlcGxpY2F0aW9uLCBkYik7CisgICAgICBDaGFuZ2VVdGlsLmRlbGV0ZU9ubHlEcmFmdFBhdGNoU2V0KHBhdGNoLCBjaGFuZ2UsIGdpdE1hbmFnZXIsIGdpdFJlZlVwZGF0ZWQsIGRiKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKICAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5HSVRfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKSk7CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgTGlzdDxQYXRjaFNldD4gcmVzdE9mUGF0Y2hlcyA9IGRiLnBhdGNoU2V0cygpLmJ5Q2hhbmdlKGNoYW5nZUlkKS50b0xpc3QoKTsKICAgICBpZiAocmVzdE9mUGF0Y2hlcy5zaXplKCkgPT0gMCkgewogICAgICAgdHJ5IHsKLSAgICAgICAgQ2hhbmdlVXRpbC5kZWxldGVEcmFmdENoYW5nZShwYXRjaFNldElkLCBnaXRNYW5hZ2VyLCByZXBsaWNhdGlvbiwgZGIpOworICAgICAgICBDaGFuZ2VVdGlsLmRlbGV0ZURyYWZ0Q2hhbmdlKHBhdGNoU2V0SWQsIGdpdE1hbmFnZXIsIGdpdFJlZlVwZGF0ZWQsIGRiKTsKICAgICAgICAgcmVzdWx0LnNldENoYW5nZUlkKG51bGwpOwogICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKQEAgLTExMSw5ICsxMTEsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmVxdWFscyhwYXRjaFNldElkKSkgewotICAgICAgICBjaGFuZ2UucmVtb3ZlTGFzdFBhdGNoU2V0SWQoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBjaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KGRiLCBjaGFuZ2UuY3VyclBhdGNoU2V0SWQoKSkpOworICAgICAgICAgIFBhdGNoU2V0LklkIGlkID0KKyAgICAgICAgICAgICAgbmV3IFBhdGNoU2V0LklkKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCksIHBhdGNoU2V0SWQuZ2V0KCkgLSAxKTsKKyAgICAgICAgICBjaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KGRiLCBpZCkpOwogICAgICAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9QYXRoQ29uZmxpY3RFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1BhdGhDb25mbGljdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmYyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9QYXRoQ29uZmxpY3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbDsKKworLyoqIEluZGljYXRlcyBhIHBhdGggY29uZmxpY3QgZHVyaW5nIHJlYmFzZSBvciBtZXJnZSAqLworcHVibGljIGNsYXNzIFBhdGhDb25mbGljdEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBQYXRoQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1B1Ymxpc2hEcmFmdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUHVibGlzaERyYWZ0LmphdmEKaW5kZXggYTcxZTEyZS4uMjJlYWUyZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUHVibGlzaERyYWZ0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUHVibGlzaERyYWZ0LmphdmEKQEAgLTE1LDEyICsxNSwyOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWw7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWFpbFV0aWwuZ2V0UmVjaXBpZW50c0Zyb21BcHByb3ZhbHM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLmdldFJlY2lwaWVudHNGcm9tRm9vdGVyczsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ3JlYXRlQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLk1haWxSZWNpcGllbnRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlcGxhY2VQYXRjaFNldFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CkBAIC0yOCw5ICs0NSwyMiBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlckxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiAKIHB1YmxpYyBjbGFzcyBQdWJsaXNoRHJhZnQgaW1wbGVtZW50cyBDYWxsYWJsZTxSZXZpZXdSZXN1bHQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CisgICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQdWJsaXNoRHJhZnQuY2xhc3MpOwogCiAgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CiAgICAgUHVibGlzaERyYWZ0IGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkKTsKQEAgLTM5LDI3ICs2OSw0NyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsOworICBwcml2YXRlIGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXI7CisgIHByaXZhdGUgZmluYWwgQ3JlYXRlQ2hhbmdlU2VuZGVyLkZhY3RvcnkgY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5OwogCiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKIAogICBASW5qZWN0Ci0gIFB1Ymxpc2hEcmFmdChDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCi0gICAgICBSZXZpZXdEYiBkYiwgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBDaGFuZ2VIb29rcyBob29rcykgeworICBQdWJsaXNoRHJhZnQoZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAorICAgICAgZmluYWwgUmV2aWV3RGIgZGIsIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLAorICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsCisgICAgICBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCisgICAgICBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWwsCisgICAgICBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAorICAgICAgZmluYWwgQ3JlYXRlQ2hhbmdlU2VuZGVyLkZhY3RvcnkgY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeSwKKyAgICAgIGZpbmFsIFJlcGxhY2VQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlcGxhY2VQYXRjaFNldEZhY3RvcnksCisgICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkgewogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuYXBwcm92YWxzVXRpbCA9IGFwcHJvdmFsc1V0aWw7CisgICAgdGhpcy5hY2NvdW50UmVzb2x2ZXIgPSBhY2NvdW50UmVzb2x2ZXI7CisgICAgdGhpcy5jcmVhdGVDaGFuZ2VTZW5kZXJGYWN0b3J5ID0gY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeTsKKyAgICB0aGlzLnJlcGxhY2VQYXRjaFNldEZhY3RvcnkgPSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5OwogCiAgICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgUmV2aWV3UmVzdWx0IGNhbGwoKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICBwdWJsaWMgUmV2aWV3UmVzdWx0IGNhbGwoKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiwgUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKICAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gbmV3IFJldmlld1Jlc3VsdCgpOwogCiAgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKICAgICByZXN1bHQuc2V0Q2hhbmdlSWQoY2hhbmdlSWQpOwogICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKKyAgICBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBjb250cm9sLmdldExhYmVsVHlwZXMoKTsKICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKICAgICBpZiAocGF0Y2ggPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7CkBAIC03NCw3ICsxMjQsNyBAQAogICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCiAgICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuUFVCTElTSF9OT1RfUEVSTUlUVEVEKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIFBhdGNoU2V0IHVwZGF0ZWRQYXRjaCA9IGRiLnBhdGNoU2V0cygpLmF0b21pY1VwZGF0ZShwYXRjaFNldElkLAorICAgICAgZmluYWwgUGF0Y2hTZXQgdXBkYXRlZFBhdGNoU2V0ID0gZGIucGF0Y2hTZXRzKCkuYXRvbWljVXBkYXRlKHBhdGNoU2V0SWQsCiAgICAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxQYXRjaFNldD4oKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUGF0Y2hTZXQgdXBkYXRlKFBhdGNoU2V0IHBhdGNoc2V0KSB7CkBAIC05NSwxMSArMTQ1LDc3IEBACiAgICAgICAgIH0KICAgICAgIH0pOwogCi0gICAgICBpZiAoIXVwZGF0ZWRQYXRjaC5pc0RyYWZ0KCkgfHwgdXBkYXRlZENoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgewotICAgICAgICBob29rcy5kb0RyYWZ0UHVibGlzaGVkSG9vayh1cGRhdGVkQ2hhbmdlLCB1cGRhdGVkUGF0Y2gsIGRiKTsKKyAgICAgIGlmICghdXBkYXRlZFBhdGNoU2V0LmlzRHJhZnQoKSB8fCB1cGRhdGVkQ2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuTkVXKSB7CisgICAgICAgIGhvb2tzLmRvRHJhZnRQdWJsaXNoZWRIb29rKHVwZGF0ZWRDaGFuZ2UsIHVwZGF0ZWRQYXRjaFNldCwgZGIpOworCisgICAgICAgIHNlbmROb3RpZmljYXRpb25zKGNvbnRyb2wuZ2V0Q2hhbmdlKCkuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5EUkFGVCwKKyAgICAgICAgICAgIChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpLCB1cGRhdGVkQ2hhbmdlLCB1cGRhdGVkUGF0Y2hTZXQsCisgICAgICAgICAgICBsYWJlbFR5cGVzKTsKICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmROb3RpZmljYXRpb25zKGZpbmFsIGJvb2xlYW4gbmV3Q2hhbmdlLAorICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsIGZpbmFsIENoYW5nZSB1cGRhdGVkQ2hhbmdlLAorICAgICAgZmluYWwgUGF0Y2hTZXQgdXBkYXRlZFBhdGNoU2V0LCBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBSZXBvc2l0b3J5IGdpdCA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHVwZGF0ZWRDaGFuZ2UuZ2V0UHJvamVjdCgpKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsoZ2l0KTsKKyAgICAgIGZpbmFsIFJldkNvbW1pdCBjb21taXQ7CisgICAgICB0cnkgeworICAgICAgICBjb21taXQgPSByZXZXYWxrLnBhcnNlQ29tbWl0KE9iamVjdElkLmZyb21TdHJpbmcodXBkYXRlZFBhdGNoU2V0LmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHJldldhbGsucmVsZWFzZSgpOworICAgICAgfQorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvIGluZm8gPSBwYXRjaFNldEluZm9GYWN0b3J5LmdldChjb21taXQsIHVwZGF0ZWRQYXRjaFNldC5nZXRJZCgpKTsKKyAgICAgIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVyTGluZXMgPSBjb21taXQuZ2V0Rm9vdGVyTGluZXMoKTsKKyAgICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKTsKKyAgICAgIGZpbmFsIE1haWxSZWNpcGllbnRzIHJlY2lwaWVudHMgPQorICAgICAgICAgIGdldFJlY2lwaWVudHNGcm9tRm9vdGVycyhhY2NvdW50UmVzb2x2ZXIsIHVwZGF0ZWRQYXRjaFNldCwgZm9vdGVyTGluZXMpOworICAgICAgcmVjaXBpZW50cy5yZW1vdmUobWUpOworCisgICAgICBpZiAobmV3Q2hhbmdlKSB7CisgICAgICAgIGFwcHJvdmFsc1V0aWwuYWRkUmV2aWV3ZXJzKGRiLCBsYWJlbFR5cGVzLCB1cGRhdGVkQ2hhbmdlLCB1cGRhdGVkUGF0Y2hTZXQsIGluZm8sCisgICAgICAgICAgICByZWNpcGllbnRzLmdldFJldmlld2VycygpLCBDb2xsZWN0aW9ucy48QWNjb3VudC5JZD4gZW1wdHlTZXQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgQ3JlYXRlQ2hhbmdlU2VuZGVyIGNtID0gY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeS5jcmVhdGUodXBkYXRlZENoYW5nZSk7CisgICAgICAgICAgY20uc2V0RnJvbShtZSk7CisgICAgICAgICAgY20uc2V0UGF0Y2hTZXQodXBkYXRlZFBhdGNoU2V0LCBpbmZvKTsKKyAgICAgICAgICBjbS5hZGRSZXZpZXdlcnMocmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSk7CisgICAgICAgICAgY20uYWRkRXh0cmFDQyhyZWNpcGllbnRzLmdldENjT25seSgpKTsKKyAgICAgICAgICBjbS5zZW5kKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgc2VuZCBlbWFpbCBmb3IgbmV3IGNoYW5nZSAiICsgdXBkYXRlZENoYW5nZS5nZXRJZCgpLCBlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBwYXRjaFNldEFwcHJvdmFscyA9CisgICAgICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKHVwZGF0ZWRDaGFuZ2UuZ2V0SWQoKSkudG9MaXN0KCk7CisgICAgICAgIGZpbmFsIE1haWxSZWNpcGllbnRzIG9sZFJlY2lwaWVudHMgPQorICAgICAgICAgICAgZ2V0UmVjaXBpZW50c0Zyb21BcHByb3ZhbHMocGF0Y2hTZXRBcHByb3ZhbHMpOworICAgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhkYiwgbGFiZWxUeXBlcywgdXBkYXRlZENoYW5nZSwgdXBkYXRlZFBhdGNoU2V0LCBpbmZvLAorICAgICAgICAgICAgcmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSwgb2xkUmVjaXBpZW50cy5nZXRBbGwoKSk7CisgICAgICAgIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnID0KKyAgICAgICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlKG5ldyBDaGFuZ2VNZXNzYWdlLktleSh1cGRhdGVkQ2hhbmdlLmdldElkKCksCisgICAgICAgICAgICAgICAgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLCBtZSwKKyAgICAgICAgICAgICAgICB1cGRhdGVkUGF0Y2hTZXQuZ2V0Q3JlYXRlZE9uKCksIHVwZGF0ZWRQYXRjaFNldC5nZXRJZCgpKTsKKyAgICAgICAgbXNnLnNldE1lc3NhZ2UoIlVwbG9hZGVkIHBhdGNoIHNldCAiICsgdXBkYXRlZFBhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSArICIuIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgUmVwbGFjZVBhdGNoU2V0U2VuZGVyIGNtID0gcmVwbGFjZVBhdGNoU2V0RmFjdG9yeS5jcmVhdGUodXBkYXRlZENoYW5nZSk7CisgICAgICAgICAgY20uc2V0RnJvbShtZSk7CisgICAgICAgICAgY20uc2V0UGF0Y2hTZXQodXBkYXRlZFBhdGNoU2V0LCBpbmZvKTsKKyAgICAgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKG1zZyk7CisgICAgICAgICAgY20uYWRkUmV2aWV3ZXJzKHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCkpOworICAgICAgICAgIGNtLmFkZEV4dHJhQ0MocmVjaXBpZW50cy5nZXRDY09ubHkoKSk7CisgICAgICAgICAgY20uc2VuZCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHNlbmQgZW1haWwgZm9yIG5ldyBwYXRjaCBzZXQgIiArIHVwZGF0ZWRQYXRjaFNldC5nZXRJZCgpLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUmViYXNlQ2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4OTcxMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhCkBAIC0wLDAgKzEsNDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuU3RhdHVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBbmNlc3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFwcHJvdmFsc1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmViYXNlZFBhdGNoU2V0U2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlcGxhY2VQYXRjaFNldFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuVGhyZWVXYXlNZXJnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgUmViYXNlQ2hhbmdlIHsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgUmViYXNlZFBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rUnVubmVyIGhvb2tzOworICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbDsKKyAgcHJpdmF0ZSBmaW5hbCBNZXJnZVV0aWwuRmFjdG9yeSBtZXJnZVV0aWxGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisKKyAgQEluamVjdAorICBSZWJhc2VDaGFuZ2UoZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LCBmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwKKyAgICAgIGZpbmFsIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnksCisgICAgICBmaW5hbCBDaGFuZ2VIb29rUnVubmVyIGhvb2tzLCBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWwsCisgICAgICBmaW5hbCBNZXJnZVV0aWwuRmFjdG9yeSBtZXJnZVV0aWxGYWN0b3J5LAorICAgICAgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZSkgeworICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmdpdE1hbmFnZXIgPSBnaXRNYW5hZ2VyOworICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKKyAgICB0aGlzLnJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnkgPSByZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5OworICAgIHRoaXMuaG9va3MgPSBob29rczsKKyAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOworICAgIHRoaXMubWVyZ2VVdGlsRmFjdG9yeSA9IG1lcmdlVXRpbEZhY3Rvcnk7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CisgIH0KKworICAvKioKKyAgICogUmViYXNlcyB0aGUgY2hhbmdlIG9mIHRoZSBnaXZlbiBwYXRjaCBzZXQuCisgICAqCisgICAqIEl0IGlzIHZlcmlmaWVkIHRoYXQgdGhlIGN1cnJlbnQgdXNlciBpcyBhbGxvd2VkIHRvIGRvIHRoZSByZWJhc2UuCisgICAqCisgICAqIElmIHRoZSBwYXRjaCBzZXQgaGFzIG5vIGRlcGVuZGVuY3kgdG8gYW4gb3BlbiBjaGFuZ2UsIHRoZW4gdGhlIGNoYW5nZSBpcworICAgKiByZWJhc2VkIG9uIHRoZSB0aXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJyYW5jaC4KKyAgICoKKyAgICogSWYgdGhlIHBhdGNoIHNldCBkZXBlbmRzIG9uIGFuIG9wZW4gY2hhbmdlLCBpdCBpcyByZWJhc2VkIG9uIHRoZSBsYXRlc3QKKyAgICogcGF0Y2ggc2V0IG9mIHRoaXMgY2hhbmdlLgorICAgKgorICAgKiBUaGUgcmViYXNlZCBjb21taXQgaXMgYWRkZWQgYXMgbmV3IHBhdGNoIHNldCB0byB0aGUgY2hhbmdlLgorICAgKgorICAgKiBFLW1haWwgbm90aWZpY2F0aW9uIGFuZCB0cmlnZ2VyaW5nIG9mIGhvb2tzIGhhcHBlbnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUKKyAgICogbmV3IHBhdGNoIHNldC4KKyAgICoKKyAgICogQHBhcmFtIHBhdGNoU2V0SWQgdGhlIGlkIG9mIHRoZSBwYXRjaCBzZXQKKyAgICogQHBhcmFtIHVwbG9hZGVyIHRoZSB1c2VyIHRoYXQgY3JlYXRlcyB0aGUgcmViYXNlZCBwYXRjaCBzZXQKKyAgICogQHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBjaGFuZ2UgdG8gd2hpY2ggdGhlIHBhdGNoIHNldAorICAgKiAgICAgICAgIGJlbG9uZ3MgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHZpc2libGUgdG8gdGhlIHVzZXIKKyAgICogQHRocm93cyBFbWFpbEV4Y2VwdGlvbiB0aHJvd24gaWYgc2VuZGluZyB0aGUgZS1tYWlsIHRvIG5vdGlmeSBhYm91dCB0aGUgbmV3CisgICAqICAgICAgICAgcGF0Y2ggc2V0IGZhaWxzCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UgZmFpbHMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgcmViYXNlIGlzIG5vdCBwb3NzaWJsZSBvciBub3QgbmVlZGVkCisgICAqIEB0aHJvd3MgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB0aHJvd24gaWYgcmViYXNlIGlzIG5vdCBhbGxvd2VkCisgICAqLworICBwdWJsaWMgdm9pZCByZWJhc2UoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgZmluYWwgQWNjb3VudC5JZCB1cGxvYWRlcikKKyAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKKyAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2wgPQorICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7CisgICAgaWYgKCFjaGFuZ2VDb250cm9sLmNhblJlYmFzZSgpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiQ2Fubm90IHJlYmFzZTogTmV3IHBhdGNoIHNldHMgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIGFkZGVkIHRvIGNoYW5nZTogIgorICAgICAgICAgICAgICArIGNoYW5nZUlkLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gY2hhbmdlQ29udHJvbC5nZXRDaGFuZ2UoKTsKKyAgICBSZXBvc2l0b3J5IGdpdCA9IG51bGw7CisgICAgUmV2V2FsayBydyA9IG51bGw7CisgICAgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOworICAgICAgcncgPSBuZXcgUmV2V2FsayhnaXQpOworICAgICAgaW5zZXJ0ZXIgPSBnaXQubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKKworICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBvbGRQYXRjaFNldEFwcHJvdmFscyA9CisgICAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2UuZ2V0SWQoKSkudG9MaXN0KCk7CisKKyAgICAgIGZpbmFsIFN0cmluZyBiYXNlUmV2ID0gZmluZEJhc2VSZXZpc2lvbihwYXRjaFNldElkLCBkYiwKKyAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLCBnaXQsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgZmluYWwgUmV2Q29tbWl0IGJhc2VDb21taXQgPQorICAgICAgICAgIHJ3LnBhcnNlQ29tbWl0KE9iamVjdElkLmZyb21TdHJpbmcoYmFzZVJldikpOworCisgICAgICBmaW5hbCBQYXRjaFNldCBuZXdQYXRjaFNldCA9CisgICAgICAgICAgcmViYXNlKGdpdCwgcncsIGluc2VydGVyLCBwYXRjaFNldElkLCBjaGFuZ2UsIHVwbG9hZGVyLCBiYXNlQ29tbWl0LAorICAgICAgICAgICAgICBtZXJnZVV0aWxGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgIGNoYW5nZUNvbnRyb2wuZ2V0UHJvamVjdENvbnRyb2woKS5nZXRQcm9qZWN0U3RhdGUoKSwgdHJ1ZSkpOworCisgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gb2xkUmV2aWV3ZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gb2xkQ0MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogb2xkUGF0Y2hTZXRBcHByb3ZhbHMpIHsKKyAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSAhPSAwKSB7CisgICAgICAgICAgb2xkUmV2aWV3ZXJzLmFkZChhLmdldEFjY291bnRJZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvbGRDQy5hZGQoYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZpbmFsIFJlcGxhY2VQYXRjaFNldFNlbmRlciBjbSA9CisgICAgICAgICAgcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeS5jcmVhdGUoY2hhbmdlKTsKKyAgICAgIGNtLnNldEZyb20odXBsb2FkZXIpOworICAgICAgY20uc2V0UGF0Y2hTZXQobmV3UGF0Y2hTZXQpOworICAgICAgY20uYWRkUmV2aWV3ZXJzKG9sZFJldmlld2Vycyk7CisgICAgICBjbS5hZGRFeHRyYUNDKG9sZENDKTsKKyAgICAgIGNtLnNlbmQoKTsKKworICAgICAgaG9va3MuZG9QYXRjaHNldENyZWF0ZWRIb29rKGNoYW5nZSwgbmV3UGF0Y2hTZXQsIGRiKTsKKyAgICB9IGNhdGNoIChQYXRoQ29uZmxpY3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGluc2VydGVyICE9IG51bGwpIHsKKyAgICAgICAgaW5zZXJ0ZXIucmVsZWFzZSgpOworICAgICAgfQorICAgICAgaWYgKHJ3ICE9IG51bGwpIHsKKyAgICAgICAgcncucmVsZWFzZSgpOworICAgICAgfQorICAgICAgaWYgKGdpdCAhPSBudWxsKSB7CisgICAgICAgIGdpdC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBGaW5kcyB0aGUgcmV2aXNpb24gb2YgY29tbWl0IG9uIHdoaWNoIHRoZSBnaXZlbiBwYXRjaCBzZXQgc2hvdWxkIGJlIGJhc2VkLgorICAgKgorICAgKiBAcGFyYW0gcGF0Y2hTZXRJZCB0aGUgaWQgb2YgdGhlIHBhdGNoIHNldCBmb3Igd2hpY2ggdGhlIG5ldyBiYXNlIGNvbW1pdAorICAgKiAgICAgICAgc2hvdWxkIGJlIGZvdW5kCisgICAqIEBwYXJhbSBkYiB0aGUgUmV2aWV3RGIKKyAgICogQHBhcmFtIGRlc3RCcmFuY2ggdGhlIGRlc3RpbmF0aW9uIGJyYW5jaAorICAgKiBAcGFyYW0gZ2l0IHRoZSByZXBvc2l0b3J5CisgICAqIEBwYXJhbSBwYXRjaFNldEFuY2VzdG9ycyB0aGUgb3JpZ2luYWwgUGF0Y2hTZXRBbmNlc3RvciBvZiB0aGUgZ2l2ZW4gcGF0Y2gKKyAgICogICAgICAgIHNldCB0aGF0IHNob3VsZCBiZSBiYXNlZAorICAgKiBAcGFyYW0gZGVwUGF0Y2hTZXRMaXN0IHRoZSBvcmlnaW5hbCBwYXRjaCBzZXQgbGlzdCBvbiB3aGljaCB0aGUgcmViYXNlZAorICAgKiAgICAgICAgcGF0Y2ggc2V0IGRlcGVuZHMKKyAgICogQHBhcmFtIGRlcENoYW5nZUxpc3QgdGhlIG9yaWdpbmFsIGNoYW5nZSBsaXN0IG9uIHdob3NlIHBhdGNoIHNldCB0aGUKKyAgICogICAgICAgIHJlYmFzZWQgcGF0Y2ggc2V0IGRlcGVuZHMKKyAgICogQHJldHVybiB0aGUgcmV2aXNpb24gb2YgY29tbWl0IG9uIHdoaWNoIHRoZSBnaXZlbiBwYXRjaCBzZXQgc2hvdWxkIGJlIGJhc2VkCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhyb3duIGlmIHJlYmFzZSBpcyBub3QgcG9zc2libGUgb3Igbm90IG5lZWRlZAorICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbiB0aHJvd24gaW4gY2FzZSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIGZhaWxzCisgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaW5kQmFzZVJldmlzaW9uKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCisgICAgICAgIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoLCBmaW5hbCBSZXBvc2l0b3J5IGdpdCwKKyAgICAgICAgTGlzdDxQYXRjaFNldEFuY2VzdG9yPiBwYXRjaFNldEFuY2VzdG9ycywgTGlzdDxQYXRjaFNldD4gZGVwUGF0Y2hTZXRMaXN0LAorICAgICAgICBMaXN0PENoYW5nZT4gZGVwQ2hhbmdlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworCisgICAgICBTdHJpbmcgYmFzZVJldiA9IG51bGw7CisKKyAgICAgIGlmIChwYXRjaFNldEFuY2VzdG9ycyA9PSBudWxsKSB7CisgICAgICAgIHBhdGNoU2V0QW5jZXN0b3JzID0KKyAgICAgICAgICAgIGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuYW5jZXN0b3JzT2YocGF0Y2hTZXRJZCkudG9MaXN0KCk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXRjaFNldEFuY2VzdG9ycy5zaXplKCkgPiAxKSB7CisgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICJDYW5ub3QgcmViYXNlIGEgY2hhbmdlIHdpdGggbXVsdGlwbGUgcGFyZW50cy4gUGFyZW50cyBjb21taXRzOiAiCisgICAgICAgICAgICAgICAgKyBwYXRjaFNldEFuY2VzdG9ycy50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIGlmIChwYXRjaFNldEFuY2VzdG9ycy5zaXplKCkgPT0gMCkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAiQ2Fubm90IHJlYmFzZSBhIGNoYW5nZSB3aXRob3V0IGFueSBwYXJlbnRzIChpcyB0aGlzIHRoZSBpbml0aWFsIGNvbW1pdD8pLiIpOworICAgICAgfQorCisgICAgICBSZXZJZCBhbmNlc3RvclJldiA9IHBhdGNoU2V0QW5jZXN0b3JzLmdldCgwKS5nZXRBbmNlc3RvclJldmlzaW9uKCk7CisgICAgICBpZiAoZGVwUGF0Y2hTZXRMaXN0ID09IG51bGwgfHwgZGVwUGF0Y2hTZXRMaXN0LnNpemUoKSAhPSAxIHx8CisgICAgICAgICAgIWRlcFBhdGNoU2V0TGlzdC5nZXQoMCkuZ2V0UmV2aXNpb24oKS5lcXVhbHMoYW5jZXN0b3JSZXYpKSB7CisgICAgICAgIGRlcFBhdGNoU2V0TGlzdCA9IGRiLnBhdGNoU2V0cygpLmJ5UmV2aXNpb24oYW5jZXN0b3JSZXYpLnRvTGlzdCgpOworICAgICAgfQorCisgICAgICBpZiAoIWRlcFBhdGNoU2V0TGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgUGF0Y2hTZXQgZGVwUGF0Y2hTZXQgPSBkZXBQYXRjaFNldExpc3QuZ2V0KDApOworCisgICAgICAgIENoYW5nZS5JZCBkZXBDaGFuZ2VJZCA9IGRlcFBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCk7CisgICAgICAgIENoYW5nZSBkZXBDaGFuZ2U7CisgICAgICAgIGlmIChkZXBDaGFuZ2VMaXN0ID09IG51bGwgfHwgZGVwQ2hhbmdlTGlzdC5zaXplKCkgIT0gMSB8fAorICAgICAgICAgICAgIWRlcENoYW5nZUxpc3QuZ2V0KDApLmdldElkKCkuZXF1YWxzKGRlcENoYW5nZUlkKSkgeworICAgICAgICAgIGRlcENoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoZGVwQ2hhbmdlSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlcENoYW5nZSA9IGRlcENoYW5nZUxpc3QuZ2V0KDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlcENoYW5nZS5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuQUJBTkRPTkVEKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgcmViYXNlIGEgY2hhbmdlIHdpdGggYW4gYWJhbmRvbmVkIHBhcmVudDogIgorICAgICAgICAgICAgICArIGRlcENoYW5nZS5nZXRLZXkoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgICAgICBpZiAoZGVwUGF0Y2hTZXQuZ2V0SWQoKS5lcXVhbHMoZGVwQ2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNoYW5nZSBpcyBhbHJlYWR5IGJhc2VkIG9uIHRoZSBsYXRlc3QgcGF0Y2ggc2V0IG9mIHRoZSBkZXBlbmRlbnQgY2hhbmdlLiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBQYXRjaFNldCBsYXRlc3REZXBQYXRjaFNldCA9CisgICAgICAgICAgICAgIGRiLnBhdGNoU2V0cygpLmdldChkZXBDaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICAgICAgYmFzZVJldiA9IGxhdGVzdERlcFBhdGNoU2V0LmdldFJldmlzaW9uKCkuZ2V0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJhc2VSZXYgPT0gbnVsbCkgeworICAgICAgICAvLyBXZSBhcmUgZGVwZW5kZW50IG9uIGEgbWVyZ2VkIFBhdGNoU2V0IG9yIGhhdmUgbm8gUGF0Y2hTZXQKKyAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGF0IGFsbC4KKyAgICAgICAgUmVmIGRlc3RSZWYgPSBnaXQuZ2V0UmVmKGRlc3RCcmFuY2guZ2V0KCkpOworICAgICAgICBpZiAoZGVzdFJlZiA9PSBudWxsKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiVGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBkb2VzIG5vdCBleGlzdDogIgorICAgICAgICAgICAgICAgICAgKyBkZXN0QnJhbmNoLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBiYXNlUmV2ID0gZGVzdFJlZi5nZXRPYmplY3RJZCgpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKGJhc2VSZXYuZXF1YWxzKGFuY2VzdG9yUmV2LmdldCgpKSkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2hhbmdlIGlzIGFscmVhZHkgdXAgdG8gZGF0ZS4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGJhc2VSZXY7CisgICAgfQorCisgIC8qKgorICAgKiBSZWJhc2VzIHRoZSBjaGFuZ2Ugb2YgdGhlIGdpdmVuIHBhdGNoIHNldCBvbiB0aGUgZ2l2ZW4gYmFzZSBjb21taXQuCisgICAqCisgICAqIFRoZSByZWJhc2VkIGNvbW1pdCBpcyBhZGRlZCBhcyBuZXcgcGF0Y2ggc2V0IHRvIHRoZSBjaGFuZ2UuCisgICAqCisgICAqIEUtbWFpbCBub3RpZmljYXRpb24gYW5kIHRyaWdnZXJpbmcgb2YgaG9va3MgaXMgTk9UIGRvbmUgZm9yIHRoZSBjcmVhdGlvbiBvZgorICAgKiB0aGUgbmV3IHBhdGNoIHNldC4KKyAgICoKKyAgICogQHBhcmFtIGdpdCB0aGUgcmVwb3NpdG9yeQorICAgKiBAcGFyYW0gcmV2V2FsayB0aGUgUmV2V2FsaworICAgKiBAcGFyYW0gaW5zZXJ0ZXIgdGhlIG9iamVjdCBpbnNlcnRlcgorICAgKiBAcGFyYW0gcGF0Y2hTZXRJZCB0aGUgaWQgb2YgdGhlIHBhdGNoIHNldAorICAgKiBAcGFyYW0gY2hnIHRoZSBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgcmViYXNlZAorICAgKiBAcGFyYW0gdXBsb2FkZXIgdGhlIHVzZXIgdGhhdCBjcmVhdGVzIHRoZSByZWJhc2VkIHBhdGNoIHNldAorICAgKiBAcGFyYW0gYmFzZUNvbW1pdCB0aGUgY29tbWl0IHRoYXQgc2hvdWxkIGJlIHRoZSBuZXcgYmFzZQorICAgKiBAcGFyYW0gbWVyZ2VVdGlsIG1lcmdlIHV0aWxpdGllcyBmb3IgdGhlIGRlc3RpbmF0aW9uIHByb2plY3QKKyAgICogQHJldHVybiB0aGUgbmV3IHBhdGNoIHNldCB3aGljaCBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gYmFzZSBjb21taXQKKyAgICogQHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBjaGFuZ2UgdG8gd2hpY2ggdGhlIHBhdGNoIHNldAorICAgKiAgICAgICAgIGJlbG9uZ3MgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHZpc2libGUgdG8gdGhlIHVzZXIKKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gdGhyb3duIGluIGNhc2UgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBmYWlscworICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiByZWJhc2UgaXMgbm90IHBvc3NpYmxlIG9yIG5vdCBuZWVkZWQKKyAgICogQHRocm93cyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIHRocm93biBpZiByZWJhc2UgaXMgbm90IGFsbG93ZWQKKyAgICovCisgIHB1YmxpYyBQYXRjaFNldCByZWJhc2UoZmluYWwgUmVwb3NpdG9yeSBnaXQsIGZpbmFsIFJldldhbGsgcmV2V2FsaywKKyAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAorICAgICAgZmluYWwgQ2hhbmdlIGNoZywgZmluYWwgQWNjb3VudC5JZCB1cGxvYWRlciwgZmluYWwgUmV2Q29tbWl0IGJhc2VDb21taXQsCisgICAgICBmaW5hbCBNZXJnZVV0aWwgbWVyZ2VVdGlsKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIFBhdGhDb25mbGljdEV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlIGNoYW5nZSA9IGNoZzsKKyAgICBmaW5hbCBQYXRjaFNldCBvcmlnaW5hbFBhdGNoU2V0ID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBhdGNoU2V0SWQpOworCisgICAgZmluYWwgUmV2Q29tbWl0IHJlYmFzZWRDb21taXQ7CisgICAgT2JqZWN0SWQgb2xkSWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKG9yaWdpbmFsUGF0Y2hTZXQuZ2V0UmV2aXNpb24oKS5nZXQoKSk7CisgICAgT2JqZWN0SWQgbmV3SWQgPSByZWJhc2VDb21taXQoZ2l0LCBpbnNlcnRlciwgcmV2V2Fsay5wYXJzZUNvbW1pdChvbGRJZCksCisgICAgICAgIGJhc2VDb21taXQsIG1lcmdlVXRpbCwgbXlJZGVudCk7CisKKyAgICByZWJhc2VkQ29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChuZXdJZCk7CisKKyAgICBQYXRjaFNldC5JZCBpZCA9IENoYW5nZVV0aWwubmV4dFBhdGNoU2V0SWQoZ2l0LCBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgZmluYWwgUGF0Y2hTZXQgbmV3UGF0Y2hTZXQgPSBuZXcgUGF0Y2hTZXQoaWQpOworICAgIG5ld1BhdGNoU2V0LnNldENyZWF0ZWRPbihuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CisgICAgbmV3UGF0Y2hTZXQuc2V0VXBsb2FkZXIodXBsb2FkZXIpOworICAgIG5ld1BhdGNoU2V0LnNldFJldmlzaW9uKG5ldyBSZXZJZChyZWJhc2VkQ29tbWl0Lm5hbWUoKSkpOworICAgIG5ld1BhdGNoU2V0LnNldERyYWZ0KG9yaWdpbmFsUGF0Y2hTZXQuaXNEcmFmdCgpKTsKKworICAgIGZpbmFsIFBhdGNoU2V0SW5mbyBpbmZvID0KKyAgICAgICAgcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQocmViYXNlZENvbW1pdCwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSk7CisKKyAgICBmaW5hbCBSZWZVcGRhdGUgcnUgPSBnaXQudXBkYXRlUmVmKG5ld1BhdGNoU2V0LmdldFJlZk5hbWUoKSk7CisgICAgcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChPYmplY3RJZC56ZXJvSWQoKSk7CisgICAgcnUuc2V0TmV3T2JqZWN0SWQocmViYXNlZENvbW1pdCk7CisgICAgcnUuZGlzYWJsZVJlZkxvZygpOworICAgIGlmIChydS51cGRhdGUocmV2V2FsaykgIT0gUmVmVXBkYXRlLlJlc3VsdC5ORVcpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLAorICAgICAgICAgIG5ld1BhdGNoU2V0LmdldFJlZk5hbWUoKSwgY2hhbmdlLmdldERlc3QoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSwKKyAgICAgICAgICBydS5nZXRSZXN1bHQoKSkpOworICAgIH0KKyAgICBnaXRSZWZVcGRhdGVkLmZpcmUoY2hhbmdlLmdldFByb2plY3QoKSwgcnUpOworCisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBDaGFuZ2UgdXBkYXRlZENoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlLmdldElkKCkpOworICAgICAgaWYgKHVwZGF0ZWRDaGFuZ2UgIT0gbnVsbCAmJiBjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgICAgY2hhbmdlID0gdXBkYXRlZENoYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiQ2hhbmdlICVzIGlzIGNsb3NlZCIsIGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICB9CisKKyAgICAgIENoYW5nZVV0aWwuaW5zZXJ0QW5jZXN0b3JzKGRiLCBuZXdQYXRjaFNldC5nZXRJZCgpLCByZWJhc2VkQ29tbWl0KTsKKyAgICAgIGRiLnBhdGNoU2V0cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3UGF0Y2hTZXQpKTsKKyAgICAgIHVwZGF0ZWRDaGFuZ2UgPQorICAgICAgICAgIGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlLmdldElkKCksIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgeworICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoIWNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmVxdWFscyhwYXRjaFNldElkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgIT0gQ2hhbmdlLlN0YXR1cy5EUkFGVCkgeworICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5ORVcpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG51bGwpOworICAgICAgICAgICAgICBjaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KGluZm8pOworICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwpIHsKKyAgICAgICAgY2hhbmdlID0gdXBkYXRlZENoYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiQ2hhbmdlICVzIHdhcyBtb2RpZmllZCIsIGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9CisgICAgICAgICAgcHJvamVjdENhY2hlLmdldChjaGFuZ2UuZ2V0UHJvamVjdCgpKS5nZXRMYWJlbFR5cGVzKCk7CisgICAgICBhcHByb3ZhbHNVdGlsLmNvcHlWZXRvc1RvUGF0Y2hTZXQoZGIsIGxhYmVsVHlwZXMsCisgICAgICAgICAgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworCisgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPQorICAgICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlKG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLCB1cGxvYWRlciwgcGF0Y2hTZXRJZCk7CisgICAgICBjbXNnLnNldE1lc3NhZ2UoIlBhdGNoIFNldCAiICsgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkuZ2V0KCkKKyAgICAgICAgICArICI6IFBhdGNoIFNldCAiICsgcGF0Y2hTZXRJZC5nZXQoKSArICIgd2FzIHJlYmFzZWQiKTsKKyAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbXNnKSk7CisgICAgICBkYi5jb21taXQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3UGF0Y2hTZXQ7CisgIH0KKworICAvKioKKyAgICogUmViYXNlcyBhIGNvbW1pdC4KKyAgICoKKyAgICogQHBhcmFtIGdpdCByZXBvc2l0b3J5IHRvIGZpbmQgY29tbWl0cyBpbgorICAgKiBAcGFyYW0gaW5zZXJ0ZXIgaW5zZXJ0ZXIgdG8gaGFuZGxlIG5ldyB0cmVlcyBhbmQgYmxvYnMKKyAgICogQHBhcmFtIG9yaWdpbmFsIFRoZSBjb21taXQgdG8gcmViYXNlCisgICAqIEBwYXJhbSBiYXNlIEJhc2UgdG8gcmViYXNlIGFnYWluc3QKKyAgICogQHBhcmFtIG1lcmdlVXRpbCBtZXJnZSB1dGlsaXRpZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0CisgICAqIEBwYXJhbSBjb21taXR0ZXJJZGVudCBjb21taXR0ZXIgaWRlbnRpdHkKKyAgICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJlYmFzZWQgY29tbWl0CisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gTWVyZ2VkIGZhaWxlZAorICAgKiBAdGhyb3dzIFBhdGhDb25mbGljdEV4Y2VwdGlvbiB0aGUgcmViYXNlIGZhaWxlZCBkdWUgdG8gYSBwYXRoIGNvbmZsaWN0CisgICAqLworICBwcml2YXRlIE9iamVjdElkIHJlYmFzZUNvbW1pdChmaW5hbCBSZXBvc2l0b3J5IGdpdCwKKyAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLCBmaW5hbCBSZXZDb21taXQgb3JpZ2luYWwsCisgICAgICBmaW5hbCBSZXZDb21taXQgYmFzZSwgZmluYWwgTWVyZ2VVdGlsIG1lcmdlVXRpbCwKKyAgICAgIGZpbmFsIFBlcnNvbklkZW50IGNvbW1pdHRlcklkZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICBQYXRoQ29uZmxpY3RFeGNlcHRpb24geworCisgICAgZmluYWwgUmV2Q29tbWl0IHBhcmVudENvbW1pdCA9IG9yaWdpbmFsLmdldFBhcmVudCgwKTsKKworICAgIGlmIChiYXNlLmVxdWFscyhwYXJlbnRDb21taXQpKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNoYW5nZSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUuIik7CisgICAgfQorCisgICAgZmluYWwgVGhyZWVXYXlNZXJnZXIgbWVyZ2VyID0gbWVyZ2VVdGlsLm5ld1RocmVlV2F5TWVyZ2VyKGdpdCwgaW5zZXJ0ZXIpOworICAgIG1lcmdlci5zZXRCYXNlKHBhcmVudENvbW1pdCk7CisgICAgbWVyZ2VyLm1lcmdlKG9yaWdpbmFsLCBiYXNlKTsKKworICAgIGlmIChtZXJnZXIuZ2V0UmVzdWx0VHJlZUlkKCkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFBhdGhDb25mbGljdEV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhlIGNoYW5nZSBjb3VsZCBub3QgYmUgcmViYXNlZCBkdWUgdG8gYSBwYXRoIGNvbmZsaWN0IGR1cmluZyBtZXJnZS4iKTsKKyAgICB9CisKKyAgICBmaW5hbCBDb21taXRCdWlsZGVyIGNiID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKKyAgICBjYi5zZXRUcmVlSWQobWVyZ2VyLmdldFJlc3VsdFRyZWVJZCgpKTsKKyAgICBjYi5zZXRQYXJlbnRJZChiYXNlKTsKKyAgICBjYi5zZXRBdXRob3Iob3JpZ2luYWwuZ2V0QXV0aG9ySWRlbnQoKSk7CisgICAgY2Iuc2V0TWVzc2FnZShvcmlnaW5hbC5nZXRGdWxsTWVzc2FnZSgpKTsKKyAgICBjYi5zZXRDb21taXR0ZXIoY29tbWl0dGVySWRlbnQpOworICAgIGZpbmFsIE9iamVjdElkIG9iamVjdElkID0gaW5zZXJ0ZXIuaW5zZXJ0KGNiKTsKKyAgICBpbnNlcnRlci5mbHVzaCgpOworICAgIHJldHVybiBvYmplY3RJZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Eb1JlYmFzZShmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCisgICAgICBMaXN0PFBhdGNoU2V0QW5jZXN0b3I+IHBhdGNoU2V0QW5jZXN0b3JzLAorICAgICAgTGlzdDxQYXRjaFNldD4gZGVwUGF0Y2hTZXRMaXN0LCBMaXN0PENoYW5nZT4gZGVwQ2hhbmdlTGlzdCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgZmluYWwgUmVwb3NpdG9yeSBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOworCisgICAgdHJ5IHsKKyAgICAgIC8vIElmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gd2UgY2FuIGRvIGEgcmViYXNlLgorICAgICAgZmluZEJhc2VSZXZpc2lvbihjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSwgZGIsIGNoYW5nZS5nZXREZXN0KCksIGdpdCwKKyAgICAgICAgICBwYXRjaFNldEFuY2VzdG9ycywgZGVwUGF0Y2hTZXRMaXN0LCBkZXBDaGFuZ2VMaXN0KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZ2l0LmNsb3NlKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGEyYjYuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUmVzdG9yZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUHJvamVjdFV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5FbWFpbEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXN0b3JlZFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotCi1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXN0b3JlQ2hhbmdlIGltcGxlbWVudHMgQ2FsbGFibGU8UmV2aWV3UmVzdWx0PiB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBSZXN0b3JlZFNlbmRlci5GYWN0b3J5IHJlc3RvcmVkU2VuZGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7Ci0gIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7Ci0KLSAgQEFyZ3VtZW50KGluZGV4ID0gMCwgcmVxdWlyZWQgPSB0cnVlLCBtdWx0aVZhbHVlZCA9IGZhbHNlLAotICAgICAgICAgICAgdXNhZ2UgPSAiY2hhbmdlIHRvIHJlc3RvcmUiLCBtZXRhVmFyID0gIkNIQU5HRSIpCi0gIHByaXZhdGUgQ2hhbmdlLklkIGNoYW5nZUlkOwotICBwdWJsaWMgdm9pZCBzZXRDaGFuZ2VJZChmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQpIHsKLSAgICB0aGlzLmNoYW5nZUlkID0gY2hhbmdlSWQ7Ci0gIH0KLQotICBAT3B0aW9uKG5hbWUgPSAiLS1tZXNzYWdlIiwgYWxpYXNlcyA9IHsiLW0ifSwKLSAgICAgICAgICB1c2FnZSA9ICJvcHRpb25hbCBtZXNzYWdlIHRvIGFwcGVuZCB0byBjaGFuZ2UiKQotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIEBJbmplY3QKLSAgUmVzdG9yZUNoYW5nZShmaW5hbCBSZXN0b3JlZFNlbmRlci5GYWN0b3J5IHJlc3RvcmVkU2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwgZmluYWwgUmV2aWV3RGIgZGIsCi0gICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBDaGFuZ2VIb29rcyBob29rcykgewotICAgIHRoaXMucmVzdG9yZWRTZW5kZXJGYWN0b3J5ID0gcmVzdG9yZWRTZW5kZXJGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmRiID0gZGI7Ci0gICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLmhvb2tzID0gaG9va3M7Ci0KLSAgICBjaGFuZ2VJZCA9IG51bGw7Ci0gICAgbWVzc2FnZSA9IG51bGw7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFJldmlld1Jlc3VsdCBjYWxsKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sCi0gICAgICBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCi0gICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoY2hhbmdlSWQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oImNoYW5nZUlkIGlzIHJlcXVpcmVkIik7Ci0gICAgfQotCi0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IG5ldyBSZXZpZXdSZXN1bHQoKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlSWQoY2hhbmdlSWQpOwotCi0gICAgZmluYWwgQ2hhbmdlQ29udHJvbCBjb250cm9sID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwotICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZUlkKTsKLSAgICBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkID0gY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7Ci0gICAgaWYgKCFjb250cm9sLmNhblJlc3RvcmUoKSkgewotICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuUkVTVE9SRV9OT1RfUEVSTUlUVEVEKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBhdGNoU2V0SWQpOwotICAgIGlmIChwYXRjaCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKGNoYW5nZUlkKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoID0gY29udHJvbC5nZXRDaGFuZ2UoKS5nZXREZXN0KCk7Ci0gICAgaWYgKCFQcm9qZWN0VXRpbC5icmFuY2hFeGlzdHMocmVwb01hbmFnZXIsIGRlc3RCcmFuY2gpKSB7Ci0gICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5ERVNUX0JSQU5DSF9OT1RfRk9VTkQsIGRlc3RCcmFuY2guZ2V0KCkpKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSB0byBhY2NvbXBhbnkgdGhlIHJlc3RvcmVkIGNoYW5nZQotICAgIGZpbmFsIENoYW5nZU1lc3NhZ2UgY21zZyA9Ci0gICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlKG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2VJZCwgQ2hhbmdlVXRpbAotICAgICAgICAgICAgLm1lc3NhZ2VVVUlEKGRiKSksIGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpLCBwYXRjaFNldElkKTsKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ0J1ZiA9Ci0gICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJQYXRjaCBTZXQgIiArIHBhdGNoU2V0SWQuZ2V0KCkgKyAiOiBSZXN0b3JlZCIpOwotICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgIG1zZ0J1Zi5hcHBlbmQoIlxuXG4iKTsKLSAgICAgIG1zZ0J1Zi5hcHBlbmQobWVzc2FnZSk7Ci0gICAgfQotICAgIGNtc2cuc2V0TWVzc2FnZShtc2dCdWYudG9TdHJpbmcoKSk7Ci0KLSAgICAvLyBSZXN0b3JlIHRoZSBjaGFuZ2UKLSAgICBmaW5hbCBDaGFuZ2UgdXBkYXRlZENoYW5nZSA9IGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlSWQsCi0gICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuQUJBTkRPTkVEKSB7Ci0gICAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5ORVcpOwotICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICBpZiAodXBkYXRlZENoYW5nZSA9PSBudWxsKSB7Ci0gICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5DSEFOR0VfTk9UX0FCQU5ET05FRCkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBDaGFuZ2VVdGlsLnVwZGF0ZWRDaGFuZ2UoZGIsIGN1cnJlbnRVc2VyLCB1cGRhdGVkQ2hhbmdlLCBjbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlZFNlbmRlckZhY3RvcnkpOwotICAgIGhvb2tzLmRvQ2hhbmdlUmVzdG9yZWRIb29rKHVwZGF0ZWRDaGFuZ2UsIGN1cnJlbnRVc2VyLmdldEFjY291bnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkYik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9TdWJtaXQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1N1Ym1pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjg3YWExLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1N1Ym1pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5LlNVQk1JVDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUHJvamVjdFV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlT3A7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVF1ZXVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBTdWJtaXQgaW1wbGVtZW50cyBDYWxsYWJsZTxSZXZpZXdSZXN1bHQ+IHsKLQotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFN1Ym1pdCBjcmVhdGUoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBNZXJnZU9wLkZhY3Rvcnkgb3BGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIE1lcmdlUXVldWUgbWVyZ2VyOwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLQotICBASW5qZWN0Ci0gIFN1Ym1pdChmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCi0gICAgICBmaW5hbCBNZXJnZU9wLkZhY3Rvcnkgb3BGYWN0b3J5LCBmaW5hbCBNZXJnZVF1ZXVlIG1lcmdlciwKLSAgICAgIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLCBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkgewotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLm9wRmFjdG9yeSA9IG9wRmFjdG9yeTsKLSAgICB0aGlzLm1lcmdlciA9IG1lcmdlcjsKLSAgICB0aGlzLmRiID0gZGI7Ci0gICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLQotICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFJldmlld1Jlc3VsdCBjYWxsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwKLSAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAotICAgICAgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPSBuZXcgUmV2aWV3UmVzdWx0KCk7Ci0KLSAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlSWQoY2hhbmdlSWQpOwotICAgIGlmIChwYXRjaCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKGNoYW5nZUlkKTsKLSAgICB9Ci0KLSAgICBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVzdWx0ID0gY29udHJvbC5jYW5TdWJtaXQoZGIsIHBhdGNoKTsKLSAgICBpZiAoc3VibWl0UmVzdWx0LmlzRW1wdHkoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAiQ2hhbmdlQ29udHJvbC5jYW5TdWJtaXQgcmV0dXJuZWQgZW1wdHkgbGlzdCIpOwotICAgIH0KLQotICAgIGZvciAoU3VibWl0UmVjb3JkIHN1Ym1pdFJlY29yZCA6IHN1Ym1pdFJlc3VsdCkgewotICAgICAgc3dpdGNoIChzdWJtaXRSZWNvcmQuc3RhdHVzKSB7Ci0gICAgICAgIGNhc2UgT0s6Ci0gICAgICAgICAgaWYgKCFjb250cm9sLmdldFJlZkNvbnRyb2woKS5jYW5TdWJtaXQoKSkgewotICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLlNVQk1JVF9OT1RfUEVSTUlUVEVEKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTk9UX1JFQURZOgotICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyTXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCBsYmwgOiBzdWJtaXRSZWNvcmQubGFiZWxzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGxibC5zdGF0dXMpIHsKLSAgICAgICAgICAgICAgY2FzZSBPSzoKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIFJFSkVDVDoKLSAgICAgICAgICAgICAgICBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgZXJyTXNnLmFwcGVuZCgiOyAiKTsKLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCJjaGFuZ2UgIiArIGNoYW5nZUlkICsgIjogYmxvY2tlZCBieSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxibC5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBORUVEOgotICAgICAgICAgICAgICAgIGlmIChlcnJNc2cubGVuZ3RoKCkgPiAwKSBlcnJNc2cuYXBwZW5kKCI7ICIpOwotICAgICAgICAgICAgICAgIGVyck1zZy5hcHBlbmQoImNoYW5nZSAiICsgY2hhbmdlSWQgKyAiOiBuZWVkcyAiICsgbGJsLmxhYmVsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIE1BWToKLSAgICAgICAgICAgICAgICAvLyBUaGUgTUFZIGxhYmVsIGRpZG4ndCBjYXVzZSB0aGUgTk9UX1JFQURZIHN0YXR1cwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgSU1QT1NTSUJMRToKLSAgICAgICAgICAgICAgICBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgZXJyTXNnLmFwcGVuZCgiOyAiKTsKLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCJjaGFuZ2UgIiArIGNoYW5nZUlkICsgIjogbmVlZHMgIiArIGxibC5sYWJlbAotICAgICAgICAgICAgICAgICAgICArICIgKGNoZWNrIHByb2plY3QgYWNjZXNzKSIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFN1Ym1pdFJlY29yZC5MYWJlbC5zdGF0dXMgKCIgKyBsYmwuc3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICsgIikiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5TVUJNSVRfTk9UX1JFQURZLCBlcnJNc2cudG9TdHJpbmcoKSkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ0xPU0VEOgotICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuQ0hBTkdFX0lTX0NMT1NFRCkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlVMRV9FUlJPUjoKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLlJVTEVfRVJST1IsCi0gICAgICAgICAgICBzdWJtaXRSZXN1bHQuZ2V0KDApLmVycm9yTWVzc2FnZSkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFN1Ym1pdFJlY29yZC5zdGF0dXMgKyAoIiArIHN1Ym1pdFJlY29yZC5zdGF0dXMKLSAgICAgICAgICAgICAgKyAiKSIpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghUHJvamVjdFV0aWwuYnJhbmNoRXhpc3RzKHJlcG9NYW5hZ2VyLCBjb250cm9sLmdldENoYW5nZSgpLmdldERlc3QoKSkpIHsKLSAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLkRFU1RfQlJBTkNIX05PVF9GT1VORCwKLSAgICAgICAgICAiRGVzdGluYXRpb24gYnJhbmNoIFwiIiArIGNvbnRyb2wuZ2V0Q2hhbmdlKCkuZ2V0RGVzdCgpLmdldCgpCi0gICAgICAgICAgICAgICsgIlwiIG5vdCBmb3VuZC4iKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIFN1Ym1pdCB0aGUgY2hhbmdlIGlmIHdlIGNhbgotICAgIGlmIChyZXN1bHQuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGFsbEFwcHJvdmFscyA9Ci0gICAgICAgICAgbmV3IEFycmF5TGlzdDxQYXRjaFNldEFwcHJvdmFsPihkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQoCi0gICAgICAgICAgICAgIHBhdGNoU2V0SWQpLnRvTGlzdCgpKTsKLQotICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbC5LZXkgYWtleSA9Ci0gICAgICAgICAgbmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KHBhdGNoU2V0SWQsIGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJNSVQpOwotCi0gICAgICBQYXRjaFNldEFwcHJvdmFsIGFwcHJvdmFsID0gbmV3IFBhdGNoU2V0QXBwcm92YWwoYWtleSwgKHNob3J0KSAxKTsKLSAgICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYW5kaWRhdGVBcHByb3ZhbCA6IGFsbEFwcHJvdmFscykgewotICAgICAgICBpZiAoYWtleS5lcXVhbHMoY2FuZGlkYXRlQXBwcm92YWwuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgY2FuZGlkYXRlQXBwcm92YWwuc2V0VmFsdWUoKHNob3J0KSAxKTsKLSAgICAgICAgICBjYW5kaWRhdGVBcHByb3ZhbC5zZXRHcmFudGVkKCk7Ci0gICAgICAgICAgYXBwcm92YWwgPSBjYW5kaWRhdGVBcHByb3ZhbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS51cHNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFwcHJvdmFsKSk7Ci0KLSAgICAgIGZpbmFsIENoYW5nZSB1cGRhdGVkQ2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwKLSAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgewotICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLlNVQk1JVFRFRCk7Ci0gICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGNoYW5nZTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIGlmICh1cGRhdGVkQ2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuU1VCTUlUVEVEKSB7Ci0gICAgICAgIG1lcmdlci5tZXJnZShvcEZhY3RvcnksIHVwZGF0ZWRDaGFuZ2UuZ2V0RGVzdCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXBwcm92YWxUeXBlc1Byb3ZpZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9BcHByb3ZhbFR5cGVzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5NDE2ZC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9BcHByb3ZhbFR5cGVzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBcHByb3ZhbFR5cGVzUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxBcHByb3ZhbFR5cGVzPiB7Ci0gIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOwotCi0gIEBJbmplY3QKLSAgQXBwcm92YWxUeXBlc1Byb3ZpZGVyKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmKSB7Ci0gICAgc2NoZW1hID0gc2Y7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEFwcHJvdmFsVHlwZXMgZ2V0KCkgewotICAgIExpc3Q8QXBwcm92YWxUeXBlPiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxUeXBlPigyKTsKLQotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7Ci0gICAgICB0cnkgewotICAgICAgICBmb3IgKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkgYyA6IGRiLmFwcHJvdmFsQ2F0ZWdvcmllcygpLmFsbCgpKSB7Ci0gICAgICAgICAgZmluYWwgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHVlcyA9Ci0gICAgICAgICAgICAgIGRiLmFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZXMoKS5ieUNhdGVnb3J5KGMuZ2V0SWQoKSkudG9MaXN0KCk7Ci0gICAgICAgICAgdHlwZXMuYWRkKG5ldyBBcHByb3ZhbFR5cGUoYywgdmFsdWVzKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGRiLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkNhbm5vdCBxdWVyeSBhcHByb3ZhbCBjYXRlZ29yaWVzIiwgZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBBcHByb3ZhbFR5cGVzKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodHlwZXMpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXV0aENvbmZpZy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXV0aENvbmZpZy5qYXZhCmluZGV4IDk5MTYyNTcuLjlhODA0YzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0F1dGhDb25maWcuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9BdXRoQ29uZmlnLmphdmEKQEAgLTE0LDkgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFByb3ZpZGVyUGF0dGVybjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLm9wZW5pZC5PcGVuSWRQcm92aWRlclBhdHRlcm47CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5TaWduZWRUb2tlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlhzcmZFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC00MCw2ICs0MSw3IEBACiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBnaXRCYXNpY0F1dGg7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvZ291dFVybDsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3BlbklkU3NvVXJsOworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBvcGVuSWREb21haW5zOwogICBwcml2YXRlIGZpbmFsIExpc3Q8T3BlbklkUHJvdmlkZXJQYXR0ZXJuPiB0cnVzdGVkT3BlbklEczsKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9wZW5JZFByb3ZpZGVyUGF0dGVybj4gYWxsb3dlZE9wZW5JRHM7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvb2tpZVBhdGg7CkBAIC01Niw2ICs1OCw3IEBACiAgICAgaHR0cEhlYWRlciA9IGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAiaHR0cGhlYWRlciIpOwogICAgIGxvZ291dFVybCA9IGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAibG9nb3V0dXJsIik7CiAgICAgb3BlbklkU3NvVXJsID0gY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJvcGVuaWRzc291cmwiKTsKKyAgICBvcGVuSWREb21haW5zID0gQXJyYXlzLmFzTGlzdChjZmcuZ2V0U3RyaW5nTGlzdCgiYXV0aCIsIG51bGwsICJvcGVuSWREb21haW4iKSk7CiAgICAgdHJ1c3RlZE9wZW5JRHMgPSB0b1BhdHRlcm5zKGNmZywgInRydXN0ZWRPcGVuSUQiKTsKICAgICBhbGxvd2VkT3BlbklEcyA9IHRvUGF0dGVybnMoY2ZnLCAiYWxsb3dlZE9wZW5JRCIpOwogICAgIGNvb2tpZVBhdGggPSBjZmcuZ2V0U3RyaW5nKCJhdXRoIiwgbnVsbCwgImNvb2tpZXBhdGgiKTsKQEAgLTEyNyw2ICsxMzAsMTAgQEAKICAgICByZXR1cm4gb3BlbklkU3NvVXJsOwogICB9CiAKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRPcGVuSWREb21haW5zKCkgeworICAgIHJldHVybiBvcGVuSWREb21haW5zOworICB9CisKICAgcHVibGljIFN0cmluZyBnZXRDb29raWVQYXRoKCkgewogICAgIHJldHVybiBjb29raWVQYXRoOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdTZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdTZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3Y2U5OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0NvbmZpZ1NlY3Rpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworLyoqIFByb3ZpZGVzIGFjY2VzcyB0byBvbmUgc2VjdGlvbiBmcm9tIHtAbGluayBDb25maWd9ICovCitwdWJsaWMgY2xhc3MgQ29uZmlnU2VjdGlvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBDb25maWcgY2ZnOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZWN0aW9uOworCisgIHB1YmxpYyBDb25maWdTZWN0aW9uKENvbmZpZyBjZmcsIFN0cmluZyBzZWN0aW9uKSB7CisgICAgdGhpcy5jZmcgPSBjZmc7CisgICAgdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgb3B0aW9uYWwoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gY2ZnLmdldFN0cmluZyhzZWN0aW9uLCBudWxsLCBuYW1lKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmVxdWlyZWQoU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gQ29uZmlnVXRpbC5nZXRSZXF1aXJlZChjZmcsIHNlY3Rpb24sIG5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdVdGlsLmphdmEKaW5kZXggY2M1NDA1NC4uOTVjMTUwMCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQ29uZmlnVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0NvbmZpZ1V0aWwuamF2YQpAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICBmaW5hbCBTdHJpbmcgc3Vic2VjdGlvbiwgZmluYWwgU3RyaW5nIHNldHRpbmcsIFN0cmluZyB2YWx1ZVN0cmluZywKICAgICAgIGZpbmFsIFRbXSBhbGwpIHsKIAotICAgIFN0cmluZyBuID0gdmFsdWVTdHJpbmcucmVwbGFjZSgnICcsICdfJyk7CisgICAgU3RyaW5nIG4gPSB2YWx1ZVN0cmluZy5yZXBsYWNlKCcgJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKTsKICAgICBmb3IgKGZpbmFsIFQgZSA6IGFsbCkgewogICAgICAgaWYgKGVxdWFsc0lnbm9yZUNhc2UoZS5uYW1lKCksIG4pKSB7CiAgICAgICAgIHJldHVybiBlOwpAQCAtMjg2LDYgKzI4NiwxNSBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlcXVpcmVkKENvbmZpZyBjZmcsIFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgbmFtZSkgeworICAgIGZpbmFsIFN0cmluZyB2ID0gY2ZnLmdldFN0cmluZyhzZWN0aW9uLCBudWxsLCBuYW1lKTsKKyAgICBpZiAodiA9PSBudWxsIHx8ICIiLmVxdWFscyh2KSkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gIiArIHNlY3Rpb24gKyAiLiIgKyBuYW1lCisgICAgICAgICAgKyAiIGNvbmZpZ3VyZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIHY7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcuLi4gY2FzZXMpIHsKICAgICBmb3IgKGZpbmFsIFN0cmluZyBiIDogY2FzZXMpIHsKICAgICAgIGlmIChlcXVhbHNJZ25vcmVDYXNlKGEsIGIpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRHbG9iYWxNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdEdsb2JhbE1vZHVsZS5qYXZhCmluZGV4IDJhNjY3MDYuLjFkYTYxMWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdEdsb2JhbE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdEdsb2JhbE1vZHVsZS5qYXZhCkBAIC0xOCw5ICsxOCwxMCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQuQXVkaXRNb2R1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLk5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY0l0ZW07CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKQEAgLTMxLDUwICszMiw4MCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSW50ZXJuYWxVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5NaW1lVXRpbEZpbGVUeXBlUmVnaXN0cnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBsdWdpblVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEJ5RW1haWxDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlSW1wbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mb0NhY2hlRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50UmVzb2x2ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFZpc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFZpc2liaWxpdHlQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DaGFuZ2VVc2VyTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5EZWZhdWx0UmVhbG07CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuRW1haWxFeHBhbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwRGV0YWlsRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEluY2x1ZGVDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBJbmZvQ2FjaGVGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwTWVtYmVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5JbmNsdWRpbmdHcm91cE1lbWJlcnNoaXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuSW50ZXJuYWxHcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybUNyZWF0ZUdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1SZW5hbWVHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5SZWFsbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Vbml2ZXJzYWxHcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguSW50ZXJuYWxBdXRoQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5Vbml2ZXJzYWxBdXRoQmFja2VuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5sZGFwLkxkYXBNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF2YXRhci5BdmF0YXJQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2FjaGUuQ2FjaGVSZW1vdmFsTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5FdmVudEZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5DaGFuZ2VDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkNoYW5nZU1lcmdlUXVldWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HYXJiYWdlQ29sbGVjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlUXVldWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Ob3Rlc0JyYW5jaFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZWxvYWRTdWJtaXRRdWV1ZU9wOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVGFnQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5UcmFuc2ZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9ycy5Db21taXRWYWxpZGF0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkFkZFJldmlld2VyU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ3JlYXRlQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkZyb21BZGRyZXNzR2VuZXJhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkZyb21BZGRyZXNzR2VuZXJhdG9yUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWVyZ2VGYWlsU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlZFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWJhc2VkUGF0Y2hTZXRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVwbGFjZVBhdGNoU2V0U2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlZlbG9jaXR5UnVudGltZVByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3RDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQWNjZXNzQ29udHJvbE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlBlcmZvcm1DcmVhdGVQcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlBlcm1pc3Npb25Db2xsZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdE5vZGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlNlY3Rpb25Tb3J0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeVJld3JpdGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoQWRkcmVzc2VzTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci50b29scy5Ub29sc0NhdGFsb2c7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuSWRHZW5lcmF0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuRnVuY3Rpb25TdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CiAKQEAgLTEwNywxMSArMTM4LDEwIEBACiAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIGJpbmQoUmVhbG0uY2xhc3MpLnRvKERlZmF1bHRSZWFsbS5jbGFzcyk7CisgICAgICAgIER5bmFtaWNTZXQuYmluZChiaW5kZXIoKSwgQXV0aEJhY2tlbmQuY2xhc3MpLnRvKEludGVybmFsQXV0aEJhY2tlbmQuY2xhc3MpOwogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBiaW5kKEFwcHJvdmFsVHlwZXMuY2xhc3MpLnRvUHJvdmlkZXIoQXBwcm92YWxUeXBlc1Byb3ZpZGVyLmNsYXNzKS5pbigKLSAgICAgICAgU0lOR0xFVE9OKTsKICAgICBiaW5kKEVtYWlsRXhwYW5kZXIuY2xhc3MpLnRvUHJvdmlkZXIoRW1haWxFeHBhbmRlclByb3ZpZGVyLmNsYXNzKS5pbigKICAgICAgICAgU0lOR0xFVE9OKTsKIApAQCAtMTI1LDI3ICsxNTUsNTUgQEAKICAgICBpbnN0YWxsKFByb2plY3RDYWNoZUltcGwubW9kdWxlKCkpOwogICAgIGluc3RhbGwoU2VjdGlvblNvcnRDYWNoZS5tb2R1bGUoKSk7CiAgICAgaW5zdGFsbChUYWdDYWNoZS5tb2R1bGUoKSk7CisgICAgaW5zdGFsbChDaGFuZ2VDYWNoZS5tb2R1bGUoKSk7CisKICAgICBpbnN0YWxsKG5ldyBBY2Nlc3NDb250cm9sTW9kdWxlKCkpOworICAgIGluc3RhbGwobmV3IEVtYWlsTW9kdWxlKCkpOwogICAgIGluc3RhbGwobmV3IEdpdE1vZHVsZSgpKTsKICAgICBpbnN0YWxsKG5ldyBQcm9sb2dNb2R1bGUoKSk7CisgICAgaW5zdGFsbChuZXcgU3NoQWRkcmVzc2VzTW9kdWxlKCkpOwogICAgIGluc3RhbGwoVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dC5tb2R1bGUoKSk7CiAKKyAgICBiaW5kKEFjY291bnRSZXNvbHZlci5jbGFzcyk7CisgICAgYmluZChDaGFuZ2VRdWVyeVJld3JpdGVyLmNsYXNzKTsKKwogICAgIGZhY3RvcnkoQWNjb3VudEluZm9DYWNoZUZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShBZGRSZXZpZXdlclNlbmRlci5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KENhcGFiaWxpdHlDb250cm9sLkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoQ2hhbmdlUXVlcnlCdWlsZGVyLkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KEdyb3VwRGV0YWlsRmFjdG9yeS5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KEdyb3VwSW5mb0NhY2hlRmFjdG9yeS5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KEdyb3VwTWVtYmVycy5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KEludGVybmFsVXNlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KE1lcmdlZFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KE1lcmdlRmFpbFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KE1lcmdlVXRpbC5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFBlcmZvcm1DcmVhdGVHcm91cC5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFBlcmZvcm1SZW5hbWVHcm91cC5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFBsdWdpblVzZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShQcm9qZWN0Tm9kZS5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KFByb2plY3RTdGF0ZS5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFJlcGxhY2VQYXRjaFNldFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFBlcmZvcm1DcmVhdGVQcm9qZWN0LkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoR2FyYmFnZUNvbGxlY3Rpb24uRmFjdG9yeS5jbGFzcyk7CiAgICAgYmluZChQZXJtaXNzaW9uQ29sbGVjdGlvbi5GYWN0b3J5LmNsYXNzKTsKICAgICBiaW5kKEFjY291bnRWaXNpYmlsaXR5LmNsYXNzKQogICAgICAgICAudG9Qcm92aWRlcihBY2NvdW50VmlzaWJpbGl0eVByb3ZpZGVyLmNsYXNzKQogICAgICAgICAuaW4oU0lOR0xFVE9OKTsKIAorICAgIGJpbmQoQXV0aEJhY2tlbmQuY2xhc3MpLnRvKFVuaXZlcnNhbEF1dGhCYWNrZW5kLmNsYXNzKS5pbihTSU5HTEVUT04pOworICAgIER5bmFtaWNTZXQuc2V0T2YoYmluZGVyKCksIEF1dGhCYWNrZW5kLmNsYXNzKTsKKwogICAgIGJpbmQoR3JvdXBDb250cm9sLkZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7CisgICAgYmluZChHcm91cENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAgICAgZmFjdG9yeShJbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAuRmFjdG9yeS5jbGFzcyk7Ci0gICAgYmluZChJbnRlcm5hbEdyb3VwQmFja2VuZC5jbGFzcykuaW4oU0lOR0xFVE9OKTsKICAgICBiaW5kKEdyb3VwQmFja2VuZC5jbGFzcykudG8oVW5pdmVyc2FsR3JvdXBCYWNrZW5kLmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIER5bmFtaWNTZXQuc2V0T2YoYmluZGVyKCksIEdyb3VwQmFja2VuZC5jbGFzcyk7CisKKyAgICBiaW5kKEludGVybmFsR3JvdXBCYWNrZW5kLmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIER5bmFtaWNTZXQuYmluZChiaW5kZXIoKSwgR3JvdXBCYWNrZW5kLmNsYXNzKS50byhJbnRlcm5hbEdyb3VwQmFja2VuZC5jbGFzcyk7CiAKICAgICBiaW5kKEZpbGVUeXBlUmVnaXN0cnkuY2xhc3MpLnRvKE1pbWVVdGlsRmlsZVR5cGVSZWdpc3RyeS5jbGFzcyk7CkBAIC0xNjcsMTYgKzIyNSwzMSBAQAogICAgIGJpbmQoSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAgICAgYmluZChDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5LmNsYXNzKTsKICAgICBiaW5kKFByb2plY3RDb250cm9sLkdlbmVyaWNGYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KEZ1bmN0aW9uU3RhdGUuRmFjdG9yeS5jbGFzcyk7CisgICAgYmluZChBY2NvdW50Q29udHJvbC5GYWN0b3J5LmNsYXNzKTsKIAogICAgIGluc3RhbGwobmV3IEF1ZGl0TW9kdWxlKCkpOworICAgIGluc3RhbGwobmV3IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lk1vZHVsZSgpKTsKKyAgICBpbnN0YWxsKG5ldyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLk1vZHVsZSgpKTsKKyAgICBpbnN0YWxsKG5ldyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuTW9kdWxlKCkpOworICAgIGluc3RhbGwobmV3IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk1vZHVsZSgpKTsKIAogICAgIGJpbmQoR2l0UmVmZXJlbmNlVXBkYXRlZC5jbGFzcyk7CiAgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgbmV3IFR5cGVMaXRlcmFsPENhY2hlPD8sID8+PigpIHt9KTsKICAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBDYWNoZVJlbW92YWxMaXN0ZW5lci5jbGFzcyk7CiAgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLmNsYXNzKTsKICAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyLmNsYXNzKTsKKyAgICBEeW5hbWljU2V0LmJpbmQoYmluZGVyKCksIEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5jbGFzcykudG8oQ2hhbmdlQ2FjaGUuY2xhc3MpOworICAgIER5bmFtaWNTZXQuc2V0T2YoYmluZGVyKCksIENoYW5nZUxpc3RlbmVyLmNsYXNzKTsKKyAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIuY2xhc3MpOworICAgIER5bmFtaWNJdGVtLml0ZW1PZihiaW5kZXIoKSwgQXZhdGFyUHJvdmlkZXIuY2xhc3MpOwogCiAgICAgYmluZChBbm9ueW1vdXNVc2VyLmNsYXNzKTsKKworICAgIGZhY3RvcnkoQ29tbWl0VmFsaWRhdG9ycy5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KE5vdGVzQnJhbmNoVXRpbC5GYWN0b3J5LmNsYXNzKTsKKworICAgIGJpbmQoQWNjb3VudE1hbmFnZXIuY2xhc3MpOworICAgIGJpbmQoQ2hhbmdlVXNlck5hbWUuQ3VycmVudFVzZXIuY2xhc3MpOworICAgIGZhY3RvcnkoQ2hhbmdlVXNlck5hbWUuRmFjdG9yeS5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdFJlcXVlc3RNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdFJlcXVlc3RNb2R1bGUuamF2YQppbmRleCBiYTU0YzU2Li5lYzE0ODgzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRSZXF1ZXN0TW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvR2Vycml0UmVxdWVzdE1vZHVsZS5qYXZhCkBAIC0xNiw0OCArMTYsMjAgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmluamVjdC5TY29wZXMuU0lOR0xFVE9OOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BcHByb3ZhbHNVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVxdWVzdENsZWFudXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cE1lbWJlcnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybUNyZWF0ZUdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1SZW5hbWVHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5WaXNpYmxlR3JvdXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlSW5zZXJ0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5EZWxldGVEcmFmdFBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUHVibGlzaERyYWZ0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuU3VibWl0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQXN5bmNSZWNlaXZlQ29tbWl0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkJhbkNvbW1pdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkNyZWF0ZUNvZGVSZXZpZXdOb3RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlT3A7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk5vdGVzQnJhbmNoVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlN1Ym1vZHVsZU9wOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkFiYW5kb25lZFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BZGRSZXZpZXdlclNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Db21tZW50U2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNyZWF0ZUNoYW5nZVNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NZXJnZUZhaWxTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWVyZ2VkU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlYmFzZWRQYXRjaFNldFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVzdG9yZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmV2ZXJ0ZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkFkZFJldmlld2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QdWJsaXNoQ29tbWVudHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlJlbW92ZVJldmlld2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5MaXN0UHJvamVjdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUGVyUmVxdWVzdFByb2plY3RDb250cm9sQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuU3VnZ2VzdFBhcmVudENhbmRpZGF0ZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeUJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeVJld3JpdGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuUmVxdWVzdFNjb3BlZDsKIAogLyoqIEJpbmRpbmdzIGZvciB7QGxpbmsgUmVxdWVzdFNjb3BlZH0gZW50aXRpZXMuICovCkBAIC02NSw1MiArMzcsMjQgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICBiaW5kKFJlcXVlc3RDbGVhbnVwLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKLSAgICBiaW5kKFJldmlld0RiLmNsYXNzKS50b1Byb3ZpZGVyKFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyLmNsYXNzKS5pbigKLSAgICAgICAgUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgYmluZChSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5jbGFzcyk7CiAgICAgYmluZChJZGVudGlmaWVkVXNlci5SZXF1ZXN0RmFjdG9yeS5jbGFzcykuaW4oU0lOR0xFVE9OKTsKLSAgICBiaW5kKE1ldGFEYXRhVXBkYXRlLlVzZXIuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOwotICAgIGJpbmQoQWNjb3VudFJlc29sdmVyLmNsYXNzKTsKLSAgICBiaW5kKENoYW5nZVF1ZXJ5UmV3cml0ZXIuY2xhc3MpOwotICAgIGJpbmQoTGlzdFByb2plY3RzLmNsYXNzKTsKICAgICBiaW5kKEFwcHJvdmFsc1V0aWwuY2xhc3MpOworICAgIGJpbmQoQ2hhbmdlSW5zZXJ0ZXIuY2xhc3MpOwogCiAgICAgYmluZChQZXJSZXF1ZXN0UHJvamVjdENvbnRyb2xDYWNoZS5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CiAgICAgYmluZChDaGFuZ2VDb250cm9sLkZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAgICAgYmluZChQcm9qZWN0Q29udHJvbC5GYWN0b3J5LmNsYXNzKS5pbihTSU5HTEVUT04pOwotICAgIGJpbmQoQWNjb3VudENvbnRyb2wuRmFjdG9yeS5jbGFzcykuaW4oU0lOR0xFVE9OKTsKIAotICAgIGZhY3RvcnkoQ2hhbmdlUXVlcnlCdWlsZGVyLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoU3VibW9kdWxlT3AuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShNZXJnZU9wLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoQ3JlYXRlQ29kZVJldmlld05vdGVzLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoTm90ZXNCcmFuY2hVdGlsLkZhY3RvcnkuY2xhc3MpOwotICAgIGluc3RhbGwobmV3IEFzeW5jUmVjZWl2ZUNvbW1pdHMuTW9kdWxlKCkpOwogCiAgICAgLy8gTm90IHJlYWxseSBwZXItcmVxdWVzdCwgYnV0IGRhbW1pdCwgSSBkb24ndCBrbm93IHdoZXJlIGVsc2UgdG8KICAgICAvLyBlYXNpbHkgcGFyayB0aGlzIHN0dWZmLgogICAgIC8vCi0gICAgZmFjdG9yeShBZGRSZXZpZXdlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KEFkZFJldmlld2VyU2VuZGVyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoQ3JlYXRlQ2hhbmdlU2VuZGVyLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoRGVsZXRlRHJhZnRQYXRjaFNldC5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KFB1Ymxpc2hDb21tZW50cy5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KFB1Ymxpc2hEcmFmdC5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KFJlcGxhY2VQYXRjaFNldFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KEFiYW5kb25lZFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KFJlbW92ZVJldmlld2VyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoUmVzdG9yZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShSZXZlcnRlZFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KENvbW1lbnRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShNZXJnZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShNZXJnZUZhaWxTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShQZXJmb3JtQ3JlYXRlR3JvdXAuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShQZXJmb3JtUmVuYW1lR3JvdXAuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShWaXNpYmxlR3JvdXBzLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoR3JvdXBEZXRhaWxGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoR3JvdXBNZW1iZXJzLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoQ3JlYXRlUHJvamVjdC5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KFN1Ym1pdC5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KFN1Z2dlc3RQYXJlbnRDYW5kaWRhdGVzLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoQmFuQ29tbWl0LkZhY3RvcnkuY2xhc3MpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9NYXN0ZXJOb2RlU3RhcnR1cC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvTWFzdGVyTm9kZVN0YXJ0dXAuamF2YQppbmRleCBiYjk1ZGNhLi5iZjk2YTIyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9NYXN0ZXJOb2RlU3RhcnR1cC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL01hc3Rlck5vZGVTdGFydHVwLmphdmEKQEAgLTE0LDM1ICsxNCw2MCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWc7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmxpZmVjeWNsZS5MaWZlY3ljbGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZWxvYWRTdWJtaXRRdWV1ZU9wOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CiAKIC8qKiBDb25maWd1cmF0aW9uIGZvciBhIG1hc3RlciBub2RlIGluIGEgY2x1c3RlciBvZiBzZXJ2ZXJzLiAqLwogcHVibGljIGNsYXNzIE1hc3Rlck5vZGVTdGFydHVwIGV4dGVuZHMgTGlmZWN5Y2xlTW9kdWxlIHsKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICBsaXN0ZW5lcigpLnRvKE9uU3RhcnQuY2xhc3MpOworICAgIGxpc3RlbmVyKCkudG8oTGlmZWN5Y2xlLmNsYXNzKTsKICAgfQogCi0gIHN0YXRpYyBjbGFzcyBPblN0YXJ0IGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworICBAU2luZ2xldG9uCisgIHN0YXRpYyBjbGFzcyBMaWZlY3ljbGUgaW1wbGVtZW50cyBMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfREVMQVlfUyA9IDE1OworCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWxvYWRTdWJtaXRRdWV1ZU9wLkZhY3Rvcnkgc3VibWl0OworICAgIHByaXZhdGUgZmluYWwgbG9uZyBkZWxheTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVkdWxlZEZ1dHVyZTw/PiBoYW5kbGU7CiAKICAgICBASW5qZWN0Ci0gICAgT25TdGFydChmaW5hbCBSZWxvYWRTdWJtaXRRdWV1ZU9wLkZhY3Rvcnkgc3VibWl0KSB7CisgICAgTGlmZWN5Y2xlKFJlbG9hZFN1Ym1pdFF1ZXVlT3AuRmFjdG9yeSBzdWJtaXQsCisgICAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNvbmZpZykgewogICAgICAgdGhpcy5zdWJtaXQgPSBzdWJtaXQ7CisgICAgICB0aGlzLmRlbGF5ID0gQ29uZmlnVXRpbC5nZXRUaW1lVW5pdChjb25maWcsCisgICAgICAgICAgImNoYW5nZU1lcmdlIiwgbnVsbCwgImNoZWNrRnJlcXVlbmN5IiwKKyAgICAgICAgICBTRUNPTkRTLmNvbnZlcnQoNSwgTUlOVVRFUyksIFNFQ09ORFMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgc3VibWl0LmNyZWF0ZSgpLnN0YXJ0KDE1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGlmIChkZWxheSA+IDApIHsKKyAgICAgICAgaGFuZGxlID0gc3VibWl0LmNyZWF0ZSgpCisgICAgICAgICAgICAuc3RhcnRXaXRoRml4ZWREZWxheShJTklUSUFMX0RFTEFZX1MsIGRlbGF5LCBTRUNPTkRTKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZSA9IHN1Ym1pdC5jcmVhdGUoKS5zdGFydChJTklUSUFMX0RFTEFZX1MsIFNFQ09ORFMpOworICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICBTY2hlZHVsZWRGdXR1cmU8Pz4gZiA9IGhhbmRsZTsKKyAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgaGFuZGxlID0gbnVsbDsKKyAgICAgICAgZi5jYW5jZWwodHJ1ZSk7CisgICAgICB9CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIuamF2YQppbmRleCA0NTE4YTJlLi40YWRhN2IxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL1JlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyLmphdmEKQEAgLTIxLDE2ICsyMSwxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuUmVxdWVzdFNjb3BlZDsKIAogLyoqIFByb3ZpZGVzIHtAbGluayBSZXZpZXdEYn0gZGF0YWJhc2UgaGFuZGxlIGxpdmUgb25seSBmb3IgdGhpcyByZXF1ZXN0LiAqLwotQFNpbmdsZXRvbgotZmluYWwgY2xhc3MgUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxSZXZpZXdEYj4geworQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFJldmlld0RiPiB7CiAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJlcXVlc3RDbGVhbnVwPiBjbGVhbnVwOworICBwcml2YXRlIFJldmlld0RiIGRiOwogCiAgIEBJbmplY3QKLSAgUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hLAorICBwdWJsaWMgUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hLAogICAgICAgZmluYWwgUHJvdmlkZXI8UmVxdWVzdENsZWFudXA+IGNsZWFudXApIHsKICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKICAgICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwOwpAQCAtMzgsMjYgKzM5LDI3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBSZXZpZXdEYiBnZXQoKSB7Ci0gICAgZmluYWwgUmV2aWV3RGIgYzsKLSAgICB0cnkgewotICAgICAgYyA9IHNjaGVtYS5vcGVuKCk7Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkNhbm5vdCBvcGVuIFJldmlld0RiIiwgZSk7CisgICAgaWYgKGRiID09IG51bGwpIHsKKyAgICAgIGZpbmFsIFJldmlld0RiIGM7CisgICAgICB0cnkgeworICAgICAgICBjID0gc2NoZW1hLm9wZW4oKTsKKyAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkNhbm5vdCBvcGVuIFJldmlld0RiIiwgZSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBjbGVhbnVwLmdldCgpLmFkZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgZGIgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIkNhbm5vdCBkZWZlciBjbGVhbnVwIG9mIFJldmlld0RiIiwgZSk7CisgICAgICB9CisgICAgICBkYiA9IGM7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBjbGVhbnVwLmdldCgpLmFkZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgYy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIHJldHVybiBjOwotICAgIH0gY2F0Y2ggKEVycm9yIGUpIHsKLSAgICAgIGMuY2xvc2UoKTsKLSAgICAgIHRocm93IGU7Ci0gICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBjLmNsb3NlKCk7Ci0gICAgICB0aHJvdyBlOwotICAgIH0KKyAgICByZXR1cm4gZGI7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29udGFjdC9FbmNyeXB0ZWRDb250YWN0U3RvcmUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29udGFjdC9FbmNyeXB0ZWRDb250YWN0U3RvcmUuamF2YQppbmRleCBiYzg4Y2QyLi5iZDFjMGQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbnRhY3QvRW5jcnlwdGVkQ29udGFjdFN0b3JlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb250YWN0L0VuY3J5cHRlZENvbnRhY3RTdG9yZS5qYXZhCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAgIHByaXZhdGUgc3RhdGljIFBHUFB1YmxpY0tleVJpbmdDb2xsZWN0aW9uIHJlYWRQdWJSaW5nKGZpbmFsIEZpbGUgcHViKSB7CiAgICAgdHJ5IHsKICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwdWIpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9kb2N1bWVudGF0aW9uL01hcmtkb3duRm9ybWF0dGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2RvY3VtZW50YXRpb24vTWFya2Rvd25Gb3JtYXR0ZXIuamF2YQppbmRleCA2YmI3YmE4Li5hZjA4ZDFlIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2RvY3VtZW50YXRpb24vTWFya2Rvd25Gb3JtYXR0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2RvY3VtZW50YXRpb24vTWFya2Rvd25Gb3JtYXR0ZXIuamF2YQpAQCAtMTM2LDggKzEzNiwxMiBAQAogICAgIElucHV0U3RyZWFtIGluID0gdXJsLm9wZW5TdHJlYW0oKTsKICAgICB0cnkgewogICAgICAgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgdG1wID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKDEyOCAqIDEwMjQpOwotICAgICAgdG1wLmNvcHkoaW4pOwotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodG1wLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpOworICAgICAgdHJ5IHsKKyAgICAgICAgdG1wLmNvcHkoaW4pOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyh0bXAudG9CeXRlQXJyYXkoKSwgIlVURi04Iik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0bXAuY2xvc2UoKTsKKyAgICAgIH0KICAgICB9IGZpbmFsbHkgewogICAgICAgaW4uY2xvc2UoKTsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9Db21taXRSZWNlaXZlZEV2ZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9Db21taXRSZWNlaXZlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMTA4NAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL0NvbW1pdFJlY2VpdmVkRXZlbnQuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50czsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQ7CisKK3B1YmxpYyBjbGFzcyBDb21taXRSZWNlaXZlZEV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgeworICBwdWJsaWMgZmluYWwgUmVjZWl2ZUNvbW1hbmQgY29tbWFuZDsKKyAgcHVibGljIGZpbmFsIFByb2plY3QgcHJvamVjdDsKKyAgcHVibGljIGZpbmFsIFN0cmluZyByZWZOYW1lOworICBwdWJsaWMgZmluYWwgUmV2Q29tbWl0IGNvbW1pdDsKKyAgcHVibGljIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CisKKyAgcHVibGljIENvbW1pdFJlY2VpdmVkRXZlbnQoUmVjZWl2ZUNvbW1hbmQgY29tbWFuZCwgUHJvamVjdCBwcm9qZWN0LAorICAgICAgU3RyaW5nIHJlZk5hbWUsIFJldkNvbW1pdCBjb21taXQsIElkZW50aWZpZWRVc2VyIHVzZXIpIHsKKyAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgdGhpcy5yZWZOYW1lID0gcmVmTmFtZTsKKyAgICB0aGlzLmNvbW1pdCA9IGNvbW1pdDsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9FdmVudEZhY3RvcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL0V2ZW50RmFjdG9yeS5qYXZhCmluZGV4IGYwN2FlMGMuLmQ1NTZlNzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL0V2ZW50RmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL0V2ZW50RmFjdG9yeS5qYXZhCkBAIC0xNCwxOSArMTQsMjEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFuY2VzdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuVHJhY2tpbmdJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuVXNlcklkZW50aXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwpAQCAtMzUsNiArMzcsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3RDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0RW50cnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNDgsOCArNTIsOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCkBAIC01OCwyMiArNjIsMjIgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEV2ZW50RmFjdG9yeS5jbGFzcyk7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaExpc3RDYWNoZSBwYXRjaExpc3RDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWE7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwc0luZm9GYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7CiAKICAgQEluamVjdAogICBFdmVudEZhY3RvcnkoQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCi0gICAgICBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCisgICAgICBQYXRjaFNldEluZm9GYWN0b3J5IHBzaWYsCiAgICAgICBQYXRjaExpc3RDYWNoZSBwYXRjaExpc3RDYWNoZSwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hLAogICAgICAgQEdlcnJpdFBlcnNvbklkZW50IFBlcnNvbklkZW50IG15SWRlbnQpIHsKICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKICAgICB0aGlzLnVybFByb3ZpZGVyID0gdXJsUHJvdmlkZXI7Ci0gICAgdGhpcy5hcHByb3ZhbFR5cGVzID0gYXBwcm92YWxUeXBlczsKICAgICB0aGlzLnBhdGNoTGlzdENhY2hlID0gcGF0Y2hMaXN0Q2FjaGU7CiAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CisgICAgdGhpcy5wc0luZm9GYWN0b3J5ID0gcHNpZjsKICAgICB0aGlzLm15SWRlbnQgPSBteUlkZW50OwogICB9CiAKQEAgLTE4NCwxMSArMTg4LDI0IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgUmV2SWQgcmV2SWQgPSBkYi5wYXRjaFNldHMoKS5nZXQocHNJZCkuZ2V0UmV2aXNpb24oKTsKLSAgICAgICAgZm9yIChQYXRjaFNldEFuY2VzdG9yIGEgOiBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmRlc2NlbmRhbnRzT2YocmV2SWQpKSB7Ci0gICAgICAgICAgZmluYWwgUGF0Y2hTZXQgcCA9IGRiLnBhdGNoU2V0cygpLmdldChhLmdldFBhdGNoU2V0KCkpOwotICAgICAgICAgIGZpbmFsIENoYW5nZSBjID0gZGIuY2hhbmdlcygpLmdldChwLmdldElkKCkuZ2V0UGFyZW50S2V5KCkpOwotICAgICAgICAgIGNhLm5lZWRlZEJ5LmFkZChuZXdOZWVkZWRCeShjLCBwKSk7CisgICAgICAgIGZpbmFsIFBhdGNoU2V0IHBzID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBzSWQpOworICAgICAgICBpZiAocHMgPT0gbnVsbCkgeworICAgICAgICAgIGxvZy5lcnJvcigiRXJyb3Igd2hpbGUgZ2VuZXJhdGluZyB0aGUgbGlzdCBvZiBkZXNjZW5kYW50cyBmb3IiCisgICAgICAgICAgICAgICsgIiBQYXRjaFNldCAiICsgcHNJZCArICI6IENhbm5vdCBmaW5kIFBhdGNoU2V0IGVudHJ5IGluIgorICAgICAgICAgICAgICArICIgZGF0YWJhc2UuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmluYWwgUmV2SWQgcmV2SWQgPSBwcy5nZXRSZXZpc2lvbigpOworICAgICAgICAgIGZvciAoUGF0Y2hTZXRBbmNlc3RvciBhIDogZGIucGF0Y2hTZXRBbmNlc3RvcnMoKS5kZXNjZW5kYW50c09mKHJldklkKSkgeworICAgICAgICAgICAgZmluYWwgUGF0Y2hTZXQgcCA9IGRiLnBhdGNoU2V0cygpLmdldChhLmdldFBhdGNoU2V0KCkpOworICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGxpc3Qgb2YgZGVzY2VuZGFudHMgZm9yIgorICAgICAgICAgICAgICAgICAgKyAiIHJldmlzaW9uICIgKyByZXZJZC5nZXQoKSArICI6IENhbm5vdCBmaW5kIFBhdGNoU2V0IGVudHJ5IGluIgorICAgICAgICAgICAgICAgICAgKyAiIGRhdGFiYXNlIGZvciAiICsgYS5nZXRQYXRjaFNldCgpKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBDaGFuZ2UgYyA9IGRiLmNoYW5nZXMoKS5nZXQocC5nZXRJZCgpLmdldFBhcmVudEtleSgpKTsKKyAgICAgICAgICAgIGNhLm5lZWRlZEJ5LmFkZChuZXdOZWVkZWRCeShjLCBwKSk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBkYi5jbG9zZSgpOwpAQCAtMjA3LDcgKzIyNCw3IEBACiAKICAgcHJpdmF0ZSBEZXBlbmRlbmN5QXR0cmlidXRlIG5ld0RlcGVuZHNPbihDaGFuZ2UgYywgUGF0Y2hTZXQgcHMpIHsKICAgICBEZXBlbmRlbmN5QXR0cmlidXRlIGQgPSBuZXdEZXBlbmRlbmN5QXR0cmlidXRlKGMsIHBzKTsKLSAgICBkLmlzQ3VycmVudFBhdGNoU2V0ID0gYy5jdXJyUGF0Y2hTZXRJZCgpLmVxdWFscyhwcy5nZXRJZCgpKTsKKyAgICBkLmlzQ3VycmVudFBhdGNoU2V0ID0gcHMuZ2V0SWQoKS5lcXVhbHMoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKICAgICByZXR1cm4gZDsKICAgfQogCkBAIC0yMzcsMjUgKzI1NCwyNiBAQAogICAgIGEuY29tbWl0TWVzc2FnZSA9IGNvbW1pdE1lc3NhZ2U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBhZGRQYXRjaFNldHMoQ2hhbmdlQXR0cmlidXRlIGEsIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHBzKSB7Ci0gICAgYWRkUGF0Y2hTZXRzKGEsIHBzLCBudWxsLCBmYWxzZSwgbnVsbCk7CisgIHB1YmxpYyB2b2lkIGFkZFBhdGNoU2V0cyhDaGFuZ2VBdHRyaWJ1dGUgYSwgQ29sbGVjdGlvbjxQYXRjaFNldD4gcHMsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHsKKyAgICBhZGRQYXRjaFNldHMoYSwgcHMsIG51bGwsIGZhbHNlLCBudWxsLCBsYWJlbFR5cGVzKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZFBhdGNoU2V0cyhDaGFuZ2VBdHRyaWJ1dGUgY2EsIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHBzLAotICAgICAgTWFwPFBhdGNoU2V0LklkLENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFscykgewotICAgIGFkZFBhdGNoU2V0cyhjYSwgcHMsIGFwcHJvdmFscywgZmFsc2UsIG51bGwpOworICAgICAgTWFwPFBhdGNoU2V0LklkLCBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhcHByb3ZhbHMsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHsKKyAgICBhZGRQYXRjaFNldHMoY2EsIHBzLCBhcHByb3ZhbHMsIGZhbHNlLCBudWxsLCBsYWJlbFR5cGVzKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZFBhdGNoU2V0cyhDaGFuZ2VBdHRyaWJ1dGUgY2EsIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHBzLAotICAgICAgTWFwPFBhdGNoU2V0LklkLENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFscywKLSAgICAgIGJvb2xlYW4gaW5jbHVkZUZpbGVzLCBDaGFuZ2UgY2hhbmdlKSB7Ci0KKyAgICAgIE1hcDxQYXRjaFNldC5JZCwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gYXBwcm92YWxzLAorICAgICAgYm9vbGVhbiBpbmNsdWRlRmlsZXMsIENoYW5nZSBjaGFuZ2UsIExhYmVsVHlwZXMgbGFiZWxUeXBlcykgewogICAgIGlmICghcHMuaXNFbXB0eSgpKSB7CiAgICAgICBjYS5wYXRjaFNldHMgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0QXR0cmlidXRlPihwcy5zaXplKCkpOwogICAgICAgZm9yIChQYXRjaFNldCBwIDogcHMpIHsKICAgICAgICAgUGF0Y2hTZXRBdHRyaWJ1dGUgcHNhID0gYXNQYXRjaFNldEF0dHJpYnV0ZShwKTsKICAgICAgICAgaWYgKGFwcHJvdmFscyAhPSBudWxsKSB7Ci0gICAgICAgICAgYWRkQXBwcm92YWxzKHBzYSwgcC5nZXRJZCgpLCBhcHByb3ZhbHMpOworICAgICAgICAgIGFkZEFwcHJvdmFscyhwc2EsIHAuZ2V0SWQoKSwgYXBwcm92YWxzLCBsYWJlbFR5cGVzKTsKICAgICAgICAgfQogICAgICAgICBjYS5wYXRjaFNldHMuYWRkKHBzYSk7CiAgICAgICAgIGlmIChpbmNsdWRlRmlsZXMgJiYgY2hhbmdlICE9IG51bGwpIHsKQEAgLTI5MCw3ICszMDgsMTAgQEAKIAogICAgICAgICBQYXRjaEF0dHJpYnV0ZSBwID0gbmV3IFBhdGNoQXR0cmlidXRlKCk7CiAgICAgICAgIHAuZmlsZSA9IHBhdGNoLmdldE5ld05hbWUoKTsKKyAgICAgICAgcC5maWxlT2xkID0gcGF0Y2guZ2V0T2xkTmFtZSgpOwogICAgICAgICBwLnR5cGUgPSBwYXRjaC5nZXRDaGFuZ2VUeXBlKCk7CisgICAgICAgIHAuZGVsZXRpb25zIC09IHBhdGNoLmdldERlbGV0aW9ucygpOworICAgICAgICBwLmluc2VydGlvbnMgPSBwYXRjaC5nZXRJbnNlcnRpb25zKCk7CiAgICAgICAgIHBhdGNoU2V0QXR0cmlidXRlLmZpbGVzLmFkZChwKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChQYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewpAQCAtMzI4LDYgKzM0OSw3IEBACiAgICAgcC5yZWYgPSBwYXRjaFNldC5nZXRSZWZOYW1lKCk7CiAgICAgcC51cGxvYWRlciA9IGFzQWNjb3VudEF0dHJpYnV0ZShwYXRjaFNldC5nZXRVcGxvYWRlcigpKTsKICAgICBwLmNyZWF0ZWRPbiA9IHBhdGNoU2V0LmdldENyZWF0ZWRPbigpLmdldFRpbWUoKSAvIDEwMDBMOworICAgIGZpbmFsIFBhdGNoU2V0LklkIHBJZCA9IHBhdGNoU2V0LmdldElkKCk7CiAgICAgdHJ5IHsKICAgICAgIGZpbmFsIFJldmlld0RiIGRiID0gc2NoZW1hLm9wZW4oKTsKICAgICAgIHRyeSB7CkBAIC0zMzYsMzAgKzM1OCw1NSBAQAogICAgICAgICAgICAgcGF0Y2hTZXQuZ2V0SWQoKSkpIHsKICAgICAgICAgICBwLnBhcmVudHMuYWRkKGEuZ2V0QW5jZXN0b3JSZXZpc2lvbigpLmdldCgpKTsKICAgICAgICAgfQorCisgICAgICAgIFVzZXJJZGVudGl0eSBhdXRob3IgPSBwc0luZm9GYWN0b3J5LmdldChkYiwgcElkKS5nZXRBdXRob3IoKTsKKyAgICAgICAgaWYgKGF1dGhvci5nZXRBY2NvdW50KCkgPT0gbnVsbCkgeworICAgICAgICAgIHAuYXV0aG9yID0gbmV3IEFjY291bnRBdHRyaWJ1dGUoKTsKKyAgICAgICAgICBwLmF1dGhvci5lbWFpbCA9IGF1dGhvci5nZXRFbWFpbCgpOworICAgICAgICAgIHAuYXV0aG9yLm5hbWUgPSBhdXRob3IuZ2V0TmFtZSgpOworICAgICAgICAgIHAuYXV0aG9yLnVzZXJuYW1lID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcC5hdXRob3IgPSBhc0FjY291bnRBdHRyaWJ1dGUoYXV0aG9yLmdldEFjY291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICBDaGFuZ2UgY2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChwSWQuZ2V0UGFyZW50S2V5KCkpOworICAgICAgICBMaXN0PFBhdGNoPiBsaXN0ID0KKyAgICAgICAgICAgIHBhdGNoTGlzdENhY2hlLmdldChjaGFuZ2UsIHBhdGNoU2V0KS50b1BhdGNoTGlzdChwSWQpOworICAgICAgICBmb3IgKFBhdGNoIHBlIDogbGlzdCkgeworICAgICAgICAgIGlmICghUGF0Y2guQ09NTUlUX01TRy5lcXVhbHMocGUuZ2V0RmlsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgIHAuc2l6ZURlbGV0aW9ucyAtPSBwZS5nZXREZWxldGlvbnMoKTsKKyAgICAgICAgICAgIHAuc2l6ZUluc2VydGlvbnMgKz0gcGUuZ2V0SW5zZXJ0aW9ucygpOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgZGIuY2xvc2UoKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewogICAgICAgbG9nLmVycm9yKCJDYW5ub3QgbG9hZCBwYXRjaCBzZXQgZGF0YSBmb3IgIiArIHBhdGNoU2V0LmdldElkKCksIGUpOworICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGdldCBhdXRob3JFbWFpbCBmb3IgJXMuIiwgcElkKSwgZSk7CisgICAgfSBjYXRjaCAoUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgZ2V0IHNpemUgaW5mb3JtYXRpb24gZm9yICVzLiIsIHBJZCksIGUpOwogICAgIH0KICAgICByZXR1cm4gcDsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZEFwcHJvdmFscyhQYXRjaFNldEF0dHJpYnV0ZSBwLCBQYXRjaFNldC5JZCBpZCwKLSAgICAgIE1hcDxQYXRjaFNldC5JZCxDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhbGwpIHsKKyAgICAgIE1hcDxQYXRjaFNldC5JZCwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gYWxsLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CiAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBsaXN0ID0gYWxsLmdldChpZCk7CiAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgYWRkQXBwcm92YWxzKHAsIGxpc3QpOworICAgICAgYWRkQXBwcm92YWxzKHAsIGxpc3QsIGxhYmVsVHlwZXMpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZEFwcHJvdmFscyhQYXRjaFNldEF0dHJpYnV0ZSBwLAotICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBsaXN0KSB7CisgICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGxpc3QsIExhYmVsVHlwZXMgbGFiZWxUeXBlcykgewogICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKICAgICAgIHAuYXBwcm92YWxzID0gbmV3IEFycmF5TGlzdDxBcHByb3ZhbEF0dHJpYnV0ZT4obGlzdC5zaXplKCkpOwogICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBsaXN0KSB7CiAgICAgICAgIGlmIChhLmdldFZhbHVlKCkgIT0gMCkgewotICAgICAgICAgIHAuYXBwcm92YWxzLmFkZChhc0FwcHJvdmFsQXR0cmlidXRlKGEpKTsKKyAgICAgICAgICBwLmFwcHJvdmFscy5hZGQoYXNBcHByb3ZhbEF0dHJpYnV0ZShhLCBsYWJlbFR5cGVzKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChwLmFwcHJvdmFscy5pc0VtcHR5KCkpIHsKQEAgLTM3Niw2ICs0MjMsOSBAQAogICAgKiBAcmV0dXJuIG9iamVjdCBzdWl0YWJsZSBmb3Igc2VyaWFsaXphdGlvbiB0byBKU09OCiAgICAqLwogICBwdWJsaWMgQWNjb3VudEF0dHJpYnV0ZSBhc0FjY291bnRBdHRyaWJ1dGUoQWNjb3VudC5JZCBpZCkgeworICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAgICAgcmV0dXJuIGFzQWNjb3VudEF0dHJpYnV0ZShhY2NvdW50Q2FjaGUuZ2V0KGlkKS5nZXRBY2NvdW50KCkpOwogICB9CiAKQEAgLTQxMywxOCArNDYzLDIwIEBACiAgICAqIHNlcmlhbGl6YXRpb24gdG8gSlNPTi4KICAgICoKICAgICogQHBhcmFtIGFwcHJvdmFsCisgICAqIEBwYXJhbSBsYWJlbFR5cGVzIGxhYmVsIHR5cGVzIGZvciB0aGUgY29udGFpbmluZyBwcm9qZWN0CiAgICAqIEByZXR1cm4gb2JqZWN0IHN1aXRhYmxlIGZvciBzZXJpYWxpemF0aW9uIHRvIEpTT04KICAgICovCi0gIHB1YmxpYyBBcHByb3ZhbEF0dHJpYnV0ZSBhc0FwcHJvdmFsQXR0cmlidXRlKFBhdGNoU2V0QXBwcm92YWwgYXBwcm92YWwpIHsKKyAgcHVibGljIEFwcHJvdmFsQXR0cmlidXRlIGFzQXBwcm92YWxBdHRyaWJ1dGUoUGF0Y2hTZXRBcHByb3ZhbCBhcHByb3ZhbCwKKyAgICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcykgewogICAgIEFwcHJvdmFsQXR0cmlidXRlIGEgPSBuZXcgQXBwcm92YWxBdHRyaWJ1dGUoKTsKLSAgICBhLnR5cGUgPSBhcHByb3ZhbC5nZXRDYXRlZ29yeUlkKCkuZ2V0KCk7CisgICAgYS50eXBlID0gYXBwcm92YWwuZ2V0TGFiZWxJZCgpLmdldCgpOwogICAgIGEudmFsdWUgPSBTaG9ydC50b1N0cmluZyhhcHByb3ZhbC5nZXRWYWx1ZSgpKTsKICAgICBhLmJ5ID0gYXNBY2NvdW50QXR0cmlidXRlKGFwcHJvdmFsLmdldEFjY291bnRJZCgpKTsKICAgICBhLmdyYW50ZWRPbiA9IGFwcHJvdmFsLmdldEdyYW50ZWQoKS5nZXRUaW1lKCkgLyAxMDAwTDsKIAotICAgIEFwcHJvdmFsVHlwZSBhdCA9IGFwcHJvdmFsVHlwZXMuYnlJZChhcHByb3ZhbC5nZXRDYXRlZ29yeUlkKCkpOwotICAgIGlmIChhdCAhPSBudWxsKSB7Ci0gICAgICBhLmRlc2NyaXB0aW9uID0gYXQuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCk7CisgICAgTGFiZWxUeXBlIGx0ID0gbGFiZWxUeXBlcy5ieUxhYmVsKGFwcHJvdmFsLmdldExhYmVsSWQoKSk7CisgICAgaWYgKGx0ICE9IG51bGwpIHsKKyAgICAgIGEuZGVzY3JpcHRpb24gPSBsdC5nZXROYW1lKCk7CiAgICAgfQogICAgIHJldHVybiBhOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9NZXJnZUZhaWxlZEV2ZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9NZXJnZUZhaWxlZEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmZjUyNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL01lcmdlRmFpbGVkRXZlbnQuamF2YQpAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50czsKKworcHVibGljIGNsYXNzIE1lcmdlRmFpbGVkRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0eXBlID0gIm1lcmdlLWZhaWxlZCI7CisgICAgcHVibGljIENoYW5nZUF0dHJpYnV0ZSBjaGFuZ2U7CisgICAgcHVibGljIFBhdGNoU2V0QXR0cmlidXRlIHBhdGNoU2V0OworICAgIHB1YmxpYyBBY2NvdW50QXR0cmlidXRlIHN1Ym1pdHRlcjsKKyAgICBwdWJsaWMgU3RyaW5nIHJlYXNvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1BhdGNoQXR0cmlidXRlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaEF0dHJpYnV0ZS5qYXZhCmluZGV4IDM4MDJmZGQuLjgyZjQ0YTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1BhdGNoQXR0cmlidXRlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUGF0Y2hBdHRyaWJ1dGUuamF2YQpAQCAtMTgsNSArMTgsOCBAQAogCiBwdWJsaWMgY2xhc3MgUGF0Y2hBdHRyaWJ1dGUgewogICAgIHB1YmxpYyBTdHJpbmcgZmlsZTsKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVPbGQ7CiAgICAgcHVibGljIENoYW5nZVR5cGUgdHlwZTsKKyAgICBwdWJsaWMgaW50IGluc2VydGlvbnM7CisgICAgcHVibGljIGludCBkZWxldGlvbnM7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaFNldEF0dHJpYnV0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUGF0Y2hTZXRBdHRyaWJ1dGUuamF2YQppbmRleCBmNzI2Y2UzLi4xMTIzZTVmIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaFNldEF0dHJpYnV0ZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1BhdGNoU2V0QXR0cmlidXRlLmphdmEKQEAgLTIzLDggKzIzLDExIEBACiAgIHB1YmxpYyBTdHJpbmcgcmVmOwogICBwdWJsaWMgQWNjb3VudEF0dHJpYnV0ZSB1cGxvYWRlcjsKICAgcHVibGljIExvbmcgY3JlYXRlZE9uOworICBwdWJsaWMgQWNjb3VudEF0dHJpYnV0ZSBhdXRob3I7CiAKICAgcHVibGljIExpc3Q8QXBwcm92YWxBdHRyaWJ1dGU+IGFwcHJvdmFsczsKICAgcHVibGljIExpc3Q8UGF0Y2hTZXRDb21tZW50QXR0cmlidXRlPiBjb21tZW50czsKICAgcHVibGljIExpc3Q8UGF0Y2hBdHRyaWJ1dGU+IGZpbGVzOworICBwdWJsaWMgaW50IHNpemVJbnNlcnRpb25zOworICBwdWJsaWMgaW50IHNpemVEZWxldGlvbnM7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9RdWVyeVN0YXRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9RdWVyeVN0YXRzLmphdmEKaW5kZXggMWM1ZTdkNy4uZWNmMmI5YSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUXVlcnlTdGF0cy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1F1ZXJ5U3RhdHMuamF2YQpAQCAtMTgsNCArMTgsNSBAQAogICBwdWJsaWMgZmluYWwgU3RyaW5nIHR5cGUgPSAic3RhdHMiOwogICBwdWJsaWMgaW50IHJvd0NvdW50OwogICBwdWJsaWMgbG9uZyBydW5UaW1lTWlsbGlzZWNvbmRzOworICBwdWJsaWMgU3RyaW5nIHJlc3VtZVNvcnRLZXk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9SZXZpZXdlckFkZGVkRXZlbnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1Jldmlld2VyQWRkZWRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9SZXZpZXdlckFkZGVkRXZlbnQuamF2YQpAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50czsKKworcHVibGljIGNsYXNzIFJldmlld2VyQWRkZWRFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHR5cGUgPSAicmV2aWV3ZXItYWRkZWQiOworICAgIHB1YmxpYyBDaGFuZ2VBdHRyaWJ1dGUgY2hhbmdlOworICAgIHB1YmxpYyBQYXRjaFNldEF0dHJpYnV0ZSBwYXRjaFNldDsKKyAgICBwdWJsaWMgQWNjb3VudEF0dHJpYnV0ZSByZXZpZXdlcjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9leHRlbnNpb25zL2V2ZW50cy9HaXRSZWZlcmVuY2VVcGRhdGVkLmphdmEKaW5kZXggODMzYjYxMS4uNDljOTBiZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9leHRlbnNpb25zL2V2ZW50cy9HaXRSZWZlcmVuY2VVcGRhdGVkLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9leHRlbnNpb25zL2V2ZW50cy9HaXRSZWZlcmVuY2VVcGRhdGVkLmphdmEKQEAgLTIwLDYgKzIwLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CisKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTM4LDggKzQxLDE2IEBACiAgICAgdGhpcy5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBmaXJlKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcmVmKSB7Ci0gICAgRXZlbnQgZXZlbnQgPSBuZXcgRXZlbnQocHJvamVjdCwgcmVmKTsKKyAgcHVibGljIHZvaWQgZmlyZShQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgUmVmVXBkYXRlIHJlZlVwZGF0ZSkgeworICAgIGZpcmUocHJvamVjdCwgcmVmVXBkYXRlLmdldE5hbWUoKSwgcmVmVXBkYXRlLmdldE9sZE9iamVjdElkKCksCisgICAgICAgIHJlZlVwZGF0ZS5nZXROZXdPYmplY3RJZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGZpcmUoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyByZWYsCisgICAgICBPYmplY3RJZCBvbGRPYmplY3RJZCwgT2JqZWN0SWQgbmV3T2JqZWN0SWQpIHsKKyAgICBPYmplY3RJZCBvID0gb2xkT2JqZWN0SWQgIT0gbnVsbCA/IG9sZE9iamVjdElkIDogT2JqZWN0SWQuemVyb0lkKCk7CisgICAgT2JqZWN0SWQgbiA9IG5ld09iamVjdElkICE9IG51bGwgPyBuZXdPYmplY3RJZCA6IE9iamVjdElkLnplcm9JZCgpOworICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KHByb2plY3QsIHJlZiwgby5uYW1lKCksIG4ubmFtZSgpKTsKICAgICBmb3IgKEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lciBsIDogbGlzdGVuZXJzKSB7CiAgICAgICBsLm9uR2l0UmVmZXJlbmNlVXBkYXRlZChldmVudCk7CiAgICAgfQpAQCAtNDgsMTAgKzU5LDE1IEBACiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV2ZW50IGltcGxlbWVudHMgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLkV2ZW50IHsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWY7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb2xkT2JqZWN0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmV3T2JqZWN0SWQ7CiAKLSAgICBFdmVudChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgIEV2ZW50KFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcmVmLAorICAgICAgICBTdHJpbmcgb2xkT2JqZWN0SWQsIFN0cmluZyBuZXdPYmplY3RJZCkgewogICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3QuZ2V0KCk7CiAgICAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICAgIHRoaXMub2xkT2JqZWN0SWQgPSBvbGRPYmplY3RJZDsKKyAgICAgIHRoaXMubmV3T2JqZWN0SWQgPSBuZXdPYmplY3RJZDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTYzLDkgKzc5LDIwIEBACiAgICAgcHVibGljIExpc3Q8R2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLlVwZGF0ZT4gZ2V0VXBkYXRlcygpIHsKICAgICAgIEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5VcGRhdGUgdXBkYXRlID0KICAgICAgICAgICBuZXcgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLlVwZGF0ZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWZOYW1lKCkgewogICAgICAgICAgICAgICByZXR1cm4gcmVmOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2xkT2JqZWN0SWQoKSB7CisgICAgICAgICAgICAgIHJldHVybiBvbGRPYmplY3RJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5ld09iamVjdElkKCkgeworICAgICAgICAgICAgICByZXR1cm4gbmV3T2JqZWN0SWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfTsKICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKHVwZGF0ZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQXN5bmNSZWNlaXZlQ29tbWl0cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQXN5bmNSZWNlaXZlQ29tbWl0cy5qYXZhCmluZGV4IGM4ZDc0MWIuLmFhZjAyNzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0FzeW5jUmVjZWl2ZUNvbW1pdHMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Bc3luY1JlY2VpdmVDb21taXRzLmphdmEKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAgIHRpbWVvdXRNaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy53YXJuKCJFcnJvciBpbiBSZWNlaXZlQ29tbWl0cyIsIGUpOwotICAgICAgcmMuYWRkRXJyb3IoImludGVybmFsIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcgY2hhbmdlcyIpOworICAgICAgcmMuYWRkRXJyb3IoImludGVybmFsIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcgY2hhbmdlcyAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgLy8gUmVjZWl2ZUNvbW1pdHMgaGFzIHRyaWVkIGl0cyBiZXN0IHRvIGNhdGNoIGVycm9ycywgc28gYW55dGhpbmcgYXQgdGhpcwogICAgICAgLy8gcG9pbnQgaXMgdmVyeSBiYWQuCiAgICAgICBmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGMgOiBjb21tYW5kcykgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQmFuQ29tbWl0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9CYW5Db21taXQuamF2YQppbmRleCBjMGUwMGFhLi42ODU5MjYyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9CYW5Db21taXQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9CYW5Db21taXQuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9SRUpFQ1RfQ09NTUlUUzsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwpAQCAtNzQsOCArNzUsOCBAQAogICAgIGZpbmFsIEJhbkNvbW1pdFJlc3VsdCByZXN1bHQgPSBuZXcgQmFuQ29tbWl0UmVzdWx0KCk7CiAgICAgTm90ZU1hcCBiYW5Db21taXROb3RlcyA9IE5vdGVNYXAubmV3RW1wdHlNYXAoKTsKICAgICAvLyBhZGQgYSBub3RlIGZvciBlYWNoIGJhbm5lZCBjb21taXQgdG8gbm90ZXMKLSAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8gPQotICAgICAgICByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCA9IHByb2plY3RDb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CisgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocHJvamVjdCk7CiAgICAgdHJ5IHsKICAgICAgIGZpbmFsIFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pOwogICAgICAgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCk7CkBAIC05Miw3ICs5Myw4IEBACiAgICAgICAgICAgYmFuQ29tbWl0Tm90ZXMuc2V0KGNvbW1pdFRvQmFuLCBjcmVhdGVOb3RlQ29udGVudChyZWFzb24sIGluc2VydGVyKSk7CiAgICAgICAgIH0KICAgICAgICAgaW5zZXJ0ZXIuZmx1c2goKTsKLSAgICAgICAgTm90ZXNCcmFuY2hVdGlsIG5vdGVzQnJhbmNoVXRpbCA9IG5vdGVzQnJhbmNoVXRpbEZhY3RvcnkuY3JlYXRlKHJlcG8pOworICAgICAgICBOb3Rlc0JyYW5jaFV0aWwgbm90ZXNCcmFuY2hVdGlsID0gbm90ZXNCcmFuY2hVdGlsRmFjdG9yeS5jcmVhdGUocHJvamVjdCwKKyAgICAgICAgICAgIHJlcG8sIGluc2VydGVyKTsKICAgICAgICAgTm90ZU1hcCBuZXdseUNyZWF0ZWQgPQogICAgICAgICAgICAgbm90ZXNCcmFuY2hVdGlsLmNvbW1pdE5ld05vdGVzKGJhbkNvbW1pdE5vdGVzLCBSRUZfUkVKRUNUX0NPTU1JVFMsCiAgICAgICAgICAgICAgICAgY3JlYXRlUGVyc29uSWRlbnQoKSwgYnVpbGRDb21taXRNZXNzYWdlKGNvbW1pdHNUb0JhbiwgcmVhc29uKSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjcxOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlQ2FjaGUuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLnBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGVMb2FkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuTG9hZGluZ0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2FjaGUuQ2FjaGVNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lZDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ2hhbmdlQ2FjaGUgaW1wbGVtZW50cyBHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KKyAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENoYW5nZUNhY2hlLmNsYXNzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NBQ0hFID0gImNoYW5nZXMiOworCisgIHB1YmxpYyBzdGF0aWMgTW9kdWxlIG1vZHVsZSgpIHsKKyAgICByZXR1cm4gbmV3IENhY2hlTW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGNhY2hlKElEX0NBQ0hFLAorICAgICAgICAgICAgUHJvamVjdC5OYW1lS2V5LmNsYXNzLAorICAgICAgICAgICAgbmV3IFR5cGVMaXRlcmFsPExpc3Q8Q2hhbmdlPj4oKSB7fSkKKyAgICAgICAgICAubWF4aW11bVdlaWdodCgwKQorICAgICAgICAgIC5sb2FkZXIoTG9hZGVyLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBMb2FkaW5nQ2FjaGU8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IGNhY2hlOworCisgIEBJbmplY3QKKyAgQ2hhbmdlQ2FjaGUoQE5hbWVkKElEX0NBQ0hFKSBMb2FkaW5nQ2FjaGU8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IGNhY2hlKSB7CisgICAgdGhpcy5jYWNoZSA9IGNhY2hlOworICB9CisKKyAgTGlzdDxDaGFuZ2U+IGdldChQcm9qZWN0Lk5hbWVLZXkgbmFtZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gY2FjaGUuZ2V0KG5hbWUpOworICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cud2FybigiQ2Fubm90IGZldGNoIGNoYW5nZXMgZm9yICIgKyBuYW1lLCBlKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25HaXRSZWZlcmVuY2VVcGRhdGVkKEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5FdmVudCBldmVudCkgeworICAgIGZvciAoR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLlVwZGF0ZSB1IDogZXZlbnQuZ2V0VXBkYXRlcygpKSB7CisgICAgICBpZiAodS5nZXRSZWZOYW1lKCkuc3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpKSB7CisgICAgICAgIGNhY2hlLmludmFsaWRhdGUobmV3IFByb2plY3QuTmFtZUtleShldmVudC5nZXRQcm9qZWN0TmFtZSgpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBMb2FkZXIgZXh0ZW5kcyBDYWNoZUxvYWRlcjxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4geworICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOworCisgICAgQEluamVjdAorICAgIExvYWRlcihTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWEpIHsKKyAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENoYW5nZT4gbG9hZChQcm9qZWN0Lk5hbWVLZXkga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFJldmlld0RiIGRiID0gc2NoZW1hLm9wZW4oKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGRiLmNoYW5nZXMoKS5ieVByb2plY3Qoa2V5KS50b0xpc3QoKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlTWVyZ2VRdWV1ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlTWVyZ2VRdWV1ZS5qYXZhCmluZGV4IDZkMWIxNTUuLjEyMjE5ZTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZU1lcmdlUXVldWUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VNZXJnZVF1ZXVlLmphdmEKQEAgLTE5LDkgKzE5LDExIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlJlbW90ZVBlZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRSZXF1ZXN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RTY29wZVByb3BhZ2F0b3I7CkBAIC05MSwxMiArOTMsMTggQEAKIAogICAgICAgQFByb3ZpZGVzCiAgICAgICBwdWJsaWMgUGVyVGhyZWFkUmVxdWVzdFNjb3BlLlNjb3BlciBwcm92aWRlU2NvcGVyKAotICAgICAgICAgIGZpbmFsIFBlclRocmVhZFJlcXVlc3RTY29wZS5Qcm9wYWdhdG9yIHByb3BhZ2F0b3IpIHsKKyAgICAgICAgICBmaW5hbCBQZXJUaHJlYWRSZXF1ZXN0U2NvcGUuUHJvcGFnYXRvciBwcm9wYWdhdG9yLAorICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyPiBkYlByb3ZpZGVyKSB7CiAgICAgICAgIGZpbmFsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0ID0gbmV3IFJlcXVlc3RDb250ZXh0KCkgewogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHB1YmxpYyBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBPdXRPZlNjb3BlRXhjZXB0aW9uKCJObyB1c2VyIG9uIG1lcmdlIHRocmVhZCIpOwogICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBQcm92aWRlcjxSZXZpZXdEYj4gZ2V0UmV2aWV3RGJQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBkYlByb3ZpZGVyLmdldCgpOworICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgcmV0dXJuIG5ldyBQZXJUaHJlYWRSZXF1ZXN0U2NvcGUuU2NvcGVyKCkgewogICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTExLDkgKzExOSw5IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgbWVyZ2UoTWVyZ2VPcC5GYWN0b3J5IG1vZiwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoKSB7CisgIHB1YmxpYyB2b2lkIG1lcmdlKEJyYW5jaC5OYW1lS2V5IGJyYW5jaCkgewogICAgIGlmIChzdGFydChicmFuY2gpKSB7Ci0gICAgICBtZXJnZUltcGwobW9mLCBicmFuY2gpOworICAgICAgbWVyZ2VJbXBsKGJyYW5jaCk7CiAgICAgfQogICB9CiAKQEAgLTE5MSwxNiArMTk5LDYgQEAKICAgICBlLm5lZWRNZXJnZSA9IGZhbHNlOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbChNZXJnZU9wLkZhY3Rvcnkgb3BGYWN0b3J5LCBCcmFuY2guTmFtZUtleSBicmFuY2gpIHsKLSAgICB0cnkgewotICAgICAgb3BGYWN0b3J5LmNyZWF0ZShicmFuY2gpLm1lcmdlKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgIGxvZy5lcnJvcigiTWVyZ2UgYXR0ZW1wdCBmb3IgIiArIGJyYW5jaCArICIgZmFpbGVkIiwgZSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGZpbmlzaChicmFuY2gpOwotICAgIH0KLSAgfQotCiAgIHByaXZhdGUgdm9pZCBtZXJnZUltcGwoZmluYWwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoKSB7CiAgICAgdHJ5IHsKICAgICAgIHRocmVhZFNjb3Blci5zY29wZShuZXcgQ2FsbGFibGU8Vm9pZD4oKXsKQEAgLTI0Myw2ICsyNDEsNyBAQAogICAgICAgZGVzdCA9IGQ7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgdW5zY2hlZHVsZSh0aGlzKTsKICAgICAgIG1lcmdlSW1wbChkZXN0KTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZVVwZGF0ZUV4ZWN1dG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VVcGRhdGVFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTJiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VVcGRhdGVFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmluZ0V4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kaW5nQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKKworLyoqCisgKiBNYXJrZXIgb24gdGhlIGdsb2JhbCB7QGxpbmsgTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlfSB1c2VkIGJ5CisgKiB7QGxpbmsgUmVjZWl2ZUNvbW1pdHN9IHRvIGNyZWF0ZSBvciByZXBsYWNlIGNoYW5nZXMuCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BCaW5kaW5nQW5ub3RhdGlvbgorcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVXBkYXRlRXhlY3V0b3IgeworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hlcnJ5UGljay5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hlcnJ5UGljay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNTMwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGVycnlQaWNrLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBbmNlc3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBDaGVycnlQaWNrIGV4dGVuZHMgU3VibWl0U3RyYXRlZ3kgeworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gbmV3Q29tbWl0czsKKworICBDaGVycnlQaWNrKGZpbmFsIFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyBhcmdzLAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkKSB7CisgICAgc3VwZXIoYXJncyk7CisKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5uZXdDb21taXRzID0gbmV3IEhhc2hNYXA8Q2hhbmdlLklkLCBDb2RlUmV2aWV3Q29tbWl0PigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBDb2RlUmV2aWV3Q29tbWl0IF9ydW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBDb2RlUmV2aWV3Q29tbWl0IG5ld01lcmdlVGlwID0gbWVyZ2VUaXA7CisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gdG9NZXJnZS5yZW1vdmUoMCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChuZXdNZXJnZVRpcCA9PSBudWxsKSB7CisgICAgICAgICAgLy8gVGhlIGJyYW5jaCBpcyB1bmJvcm4uIFRha2UgYSBmYXN0LWZvcndhcmQgcmVzb2x1dGlvbiB0bworICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYnJhbmNoLgorICAgICAgICAgIC8vCisgICAgICAgICAgbmV3TWVyZ2VUaXAgPSBuOworICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX01FUkdFOworCisgICAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgICAvLyBSZWZ1c2UgdG8gbWVyZ2UgYSByb290IGNvbW1pdCBpbnRvIGFuIGV4aXN0aW5nIGJyYW5jaCwKKyAgICAgICAgICAvLyB3ZSBjYW5ub3Qgb2J0YWluIGEgZGVsdGEgZm9yIHRoZSBjaGVycnktcGljayB0byBhcHBseS4KKyAgICAgICAgICAvLworICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNBTk5PVF9DSEVSUllfUElDS19ST09UOworCisgICAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDEpIHsKKyAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJlbnQsIGEgY2hlcnJ5LXBpY2sgY2FuIGJlIGRvbmUgYnkKKyAgICAgICAgICAvLyB0YWtpbmcgdGhlIGRlbHRhIHJlbGF0aXZlIHRvIHRoYXQgb25lIHBhcmVudCBhbmQgcmVkb2luZworICAgICAgICAgIC8vIHRoYXQgb24gdGhlIGN1cnJlbnQgbWVyZ2UgdGlwLgorICAgICAgICAgIC8vCisKKyAgICAgICAgICBuZXdNZXJnZVRpcCA9IHdyaXRlQ2hlcnJ5UGlja0NvbW1pdChtZXJnZVRpcCwgbik7CisKKyAgICAgICAgICBpZiAobmV3TWVyZ2VUaXAgIT0gbnVsbCkgeworICAgICAgICAgICAgbmV3Q29tbWl0cy5wdXQobmV3TWVyZ2VUaXAucGF0Y2hzZXRJZC5nZXRQYXJlbnRLZXkoKSwgbmV3TWVyZ2VUaXApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5QQVRIX0NPTkZMSUNUOworICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFRoZXJlIGFyZSBtdWx0aXBsZSBwYXJlbnRzLCBzbyB0aGlzIGlzIGEgbWVyZ2UgY29tbWl0LiBXZQorICAgICAgICAgIC8vIGRvbid0IHdhbnQgdG8gY2hlcnJ5LXBpY2sgdGhlIG1lcmdlIGFzIGNsaWVudHMgY2FuJ3QgZWFzaWx5CisgICAgICAgICAgLy8gcmViYXNlIHRoZWlyIGhpc3Rvcnkgd2l0aCB0aGF0IG1lcmdlIHByZXNlbnQgYW5kIHJlcGxhY2VkCisgICAgICAgICAgLy8gYnkgYW4gZXF1aXZhbGVudCBtZXJnZSB3aXRoIGEgZGlmZmVyZW50IGZpcnN0IHBhcmVudC4gU28KKyAgICAgICAgICAvLyBpbnN0ZWFkIGJlaGF2ZSBhcyB0aG91Z2ggTUVSR0VfSUZfTkVDRVNTQVJZIHdhcyBjb25maWd1cmVkLgorICAgICAgICAgIC8vCisgICAgICAgICAgaWYgKCFhcmdzLm1lcmdlVXRpbC5oYXNNaXNzaW5nRGVwZW5kZW5jaWVzKGFyZ3MubWVyZ2VTb3J0ZXIsIG4pKSB7CisgICAgICAgICAgICBpZiAoYXJncy5ydy5pc01lcmdlZEludG8obmV3TWVyZ2VUaXAsIG4pKSB7CisgICAgICAgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5ld01lcmdlVGlwID0KKyAgICAgICAgICAgICAgICAgIGFyZ3MubWVyZ2VVdGlsLm1lcmdlT25lQ29tbWl0KGFyZ3MubXlJZGVudCwgYXJncy5yZXBvLAorICAgICAgICAgICAgICAgICAgICAgIGFyZ3MucncsIGFyZ3MuaW5zZXJ0ZXIsIGFyZ3MuY2FuTWVyZ2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZGVzdEJyYW5jaCwgbmV3TWVyZ2VUaXAsIG4pOworICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0KKyAgICAgICAgICAgICAgICBhcmdzLm1lcmdlVXRpbC5tYXJrQ2xlYW5NZXJnZXMoYXJncy5ydywgYXJncy5jYW5NZXJnZUZsYWcsCisgICAgICAgICAgICAgICAgICAgIG5ld01lcmdlVGlwLCBhcmdzLmFscmVhZHlBY2NlcHRlZCk7CisgICAgICAgICAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBcHByb3ZhbCk7CisKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzIHdlcmUgbm90IG1ldC4gVGhlIHN0YXR1cyB3YXMKKyAgICAgICAgICAgIC8vIGFscmVhZHkgbWFya2VkIG9uIHRoZSBjb21taXQgc28gd2UgaGF2ZSBub3RoaW5nIGZ1cnRoZXIKKyAgICAgICAgICAgIC8vIHRvIHBlcmZvcm0gYXQgdGhpcyB0aW1lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ld01lcmdlVGlwOworICB9CisKKyAgcHJpdmF0ZSBDb2RlUmV2aWV3Q29tbWl0IHdyaXRlQ2hlcnJ5UGlja0NvbW1pdChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisKKyAgICBhcmdzLnJ3LnBhcnNlQm9keShuKTsKKworICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXVkaXQgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5nZXRTdWJtaXR0ZXIobi5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisKKyAgICBQZXJzb25JZGVudCBjaGVycnlQaWNrQ29tbWl0dGVySWRlbnQgPSBudWxsOworICAgIGlmIChzdWJtaXRBdWRpdCAhPSBudWxsKSB7CisgICAgICBjaGVycnlQaWNrQ29tbWl0dGVySWRlbnQgPQorICAgICAgICAgIGFyZ3MuaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShzdWJtaXRBdWRpdC5nZXRBY2NvdW50SWQoKSkKKyAgICAgICAgICAgICAgLm5ld0NvbW1pdHRlcklkZW50KHN1Ym1pdEF1ZGl0LmdldEdyYW50ZWQoKSwKKyAgICAgICAgICAgICAgICAgIGFyZ3MubXlJZGVudC5nZXRUaW1lWm9uZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50ID0gYXJncy5teUlkZW50OworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBjaGVycnlQaWNrQ210TXNnID0gYXJncy5tZXJnZVV0aWwuY3JlYXRlQ2hlcnJ5UGlja0NvbW1pdE1lc3NhZ2Uobik7CisKKyAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG5ld0NvbW1pdCA9CisgICAgICAgIGFyZ3MubWVyZ2VVdGlsLmNyZWF0ZUNoZXJyeVBpY2tGcm9tQ29tbWl0KGFyZ3MucmVwbywgYXJncy5pbnNlcnRlciwgbWVyZ2VUaXAsIG4sCisgICAgICAgICAgICBjaGVycnlQaWNrQ29tbWl0dGVySWRlbnQsIGNoZXJyeVBpY2tDbXRNc2csIGFyZ3MucncpOworCisgICAgaWYgKG5ld0NvbW1pdCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIFBhdGNoU2V0LklkIGlkID0KKyAgICAgICAgQ2hhbmdlVXRpbC5uZXh0UGF0Y2hTZXRJZChhcmdzLnJlcG8sIG4uY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgIGZpbmFsIFBhdGNoU2V0IHBzID0gbmV3IFBhdGNoU2V0KGlkKTsKKyAgICBwcy5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgIHBzLnNldFVwbG9hZGVyKHN1Ym1pdEF1ZGl0LmdldEFjY291bnRJZCgpKTsKKyAgICBwcy5zZXRSZXZpc2lvbihuZXcgUmV2SWQobmV3Q29tbWl0LmdldElkKCkuZ2V0TmFtZSgpKSk7CisgICAgaW5zZXJ0QW5jZXN0b3JzKGFyZ3MuZGIsIHBzLmdldElkKCksIG5ld0NvbW1pdCk7CisgICAgYXJncy5kYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBzKSk7CisKKyAgICBuLmNoYW5nZS5zZXRDdXJyZW50UGF0Y2hTZXQocGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQobmV3Q29tbWl0LCBwcy5nZXRJZCgpKSk7CisgICAgYXJncy5kYi5jaGFuZ2VzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qobi5jaGFuZ2UpKTsKKworICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcmdzLm1lcmdlVXRpbC5nZXRBcHByb3ZhbHNGb3JDb21taXQobikpIHsKKyAgICAgIGFwcHJvdmFscy5hZGQobmV3IFBhdGNoU2V0QXBwcm92YWwocHMuZ2V0SWQoKSwgYSkpOworICAgIH0KKyAgICBhcmdzLmRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KGFwcHJvdmFscyk7CisKKyAgICBmaW5hbCBSZWZVcGRhdGUgcnUgPSBhcmdzLnJlcG8udXBkYXRlUmVmKHBzLmdldFJlZk5hbWUoKSk7CisgICAgcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChPYmplY3RJZC56ZXJvSWQoKSk7CisgICAgcnUuc2V0TmV3T2JqZWN0SWQobmV3Q29tbWl0KTsKKyAgICBydS5kaXNhYmxlUmVmTG9nKCk7CisgICAgaWYgKHJ1LnVwZGF0ZShhcmdzLnJ3KSAhPSBSZWZVcGRhdGUuUmVzdWx0Lk5FVykgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBjcmVhdGUgcmVmICVzIGluICVzOiAlcyIsCisgICAgICAgICAgcHMuZ2V0UmVmTmFtZSgpLCBuLmNoYW5nZS5nZXREZXN0KCkuZ2V0UGFyZW50S2V5KCkuZ2V0KCksCisgICAgICAgICAgcnUuZ2V0UmVzdWx0KCkpKTsKKyAgICB9CisKKyAgICBnaXRSZWZVcGRhdGVkLmZpcmUobi5jaGFuZ2UuZ2V0UHJvamVjdCgpLCBydSk7CisKKyAgICBuZXdDb21taXQuY29weUZyb20obik7CisgICAgbmV3Q29tbWl0LnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9QSUNLOworICAgIG5ld0NvbW1pdHMucHV0KG5ld0NvbW1pdC5wYXRjaHNldElkLmdldFBhcmVudEtleSgpLCBuZXdDb21taXQpOworICAgIHNldFJlZkxvZ0lkZW50KHN1Ym1pdEF1ZGl0KTsKKyAgICByZXR1cm4gbmV3Q29tbWl0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnRBbmNlc3RvcnMoUmV2aWV3RGIgZGIsIFBhdGNoU2V0LklkIGlkLCBSZXZDb21taXQgc3JjKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IGNudCA9IHNyYy5nZXRQYXJlbnRDb3VudCgpOworICAgIExpc3Q8UGF0Y2hTZXRBbmNlc3Rvcj4gdG9JbnNlcnQgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0QW5jZXN0b3I+KGNudCk7CisgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBjbnQ7IHArKykgeworICAgICAgUGF0Y2hTZXRBbmNlc3RvciBhOworCisgICAgICBhID0gbmV3IFBhdGNoU2V0QW5jZXN0b3IobmV3IFBhdGNoU2V0QW5jZXN0b3IuSWQoaWQsIHAgKyAxKSk7CisgICAgICBhLnNldEFuY2VzdG9yUmV2aXNpb24obmV3IFJldklkKHNyYy5nZXRQYXJlbnQocCkuZ2V0SWQoKS5uYW1lKCkpKTsKKyAgICAgIHRvSW5zZXJ0LmFkZChhKTsKKyAgICB9CisgICAgZGIucGF0Y2hTZXRBbmNlc3RvcnMoKS5pbnNlcnQodG9JbnNlcnQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8Q2hhbmdlLklkLCBDb2RlUmV2aWV3Q29tbWl0PiBnZXROZXdDb21taXRzKCkgeworICAgIHJldHVybiBuZXdDb21taXRzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGRyeVJ1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIHJldHVybiBhcmdzLm1lcmdlVXRpbC5jYW5DaGVycnlQaWNrKGFyZ3MubWVyZ2VTb3J0ZXIsIGFyZ3MucmVwbywKKyAgICAgICAgbWVyZ2VUaXAsIGFyZ3MucncsIHRvTWVyZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Db2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Db2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2VkNTYuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBjcmVhdGlvbiBvZiBhIGNvZGUgcmV2aWV3IG5vdGUgZmFpbHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgcHVibGljIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24oZmluYWwgU3RyaW5nIG1zZykgewotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLQotICBwdWJsaWMgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgd2h5KSB7Ci0gICAgc3VwZXIod2h5KTsKLSAgfQotCi0gIHB1YmxpYyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uKGZpbmFsIFJldkNvbW1pdCBjb21taXQsCi0gICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICBzdXBlcigiQ291bGRuJ3QgY3JlYXRlIGNvZGUgcmV2aWV3IG5vdGUgZm9yIHRoZSBmb2xsb3dpbmcgY29tbWl0OiAiCi0gICAgICAgICsgY29tbWl0Lm5hbWUoKSwgY2F1c2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Db21taXRNZXJnZVN0YXR1cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29tbWl0TWVyZ2VTdGF0dXMuamF2YQppbmRleCA2YjUzMTIxLi42OWRjYjE1IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Db21taXRNZXJnZVN0YXR1cy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NvbW1pdE1lcmdlU3RhdHVzLmphdmEKQEAgLTIyLDEyICsyMiwxNSBAQAogICBDTEVBTl9QSUNLKCJDaGFuZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNoZXJyeS1waWNrZWQiKSwKIAogICAvKiogKi8KKyAgQ0xFQU5fUkVCQVNFKCJDaGFuZ2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlYmFzZWQiKSwKKworICAvKiogKi8KICAgQUxSRUFEWV9NRVJHRUQoIiIpLAogCiAgIC8qKiAqLwotICBQQVRIX0NPTkZMSUNUKCJZb3VyIGNoYW5nZSBjb3VsZCBub3QgYmUgbWVyZ2VkIGR1ZSB0byBhIHBhdGggY29uZmxpY3QuXG4iCisgIFBBVEhfQ09ORkxJQ1QoIlRoZSBjaGFuZ2UgY291bGQgbm90IGJlIG1lcmdlZCBkdWUgdG8gYSBwYXRoIGNvbmZsaWN0LlxuIgogICAgICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgICArICJQbGVhc2UgbWVyZ2UgKG9yIHJlYmFzZSkgdGhlIGNoYW5nZSBsb2NhbGx5IGFuZCB1cGxvYWQgdGhlIHJlc29sdXRpb24gZm9yIHJldmlldy4iKSwKKyAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSByZWJhc2UgdGhlIGNoYW5nZSBsb2NhbGx5IGFuZCB1cGxvYWQgdGhlIHJlYmFzZWQgY29tbWl0IGZvciByZXZpZXcuIiksCiAKICAgLyoqICovCiAgIE1JU1NJTkdfREVQRU5ERU5DWSgiIiksCkBAIC0zOSw5ICs0MiwxMiBAQAogICBSRVZJU0lPTl9HT05FKCIiKSwKIAogICAvKiogKi8KLSAgQ1JJU1NfQ1JPU1NfTUVSR0UoIllvdXIgY2hhbmdlIHJlcXVpcmVzIGEgcmVjdXJzaXZlIG1lcmdlIHRvIHJlc29sdmUuXG4iCi0gICAgICAgICAgICAgICAgICArICJcbiIKLSAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtZXJnZSAob3IgcmViYXNlKSB0aGUgY2hhbmdlIGxvY2FsbHkgYW5kIHVwbG9hZCB0aGUgcmVzb2x1dGlvbiBmb3IgcmV2aWV3LiIpLAorICBOT19TVUJNSVRfVFlQRSgiIiksCisKKyAgLyoqICovCisgIE1BTlVBTF9SRUNVUlNJVkVfTUVSR0UoIlRoZSBjaGFuZ2UgcmVxdWlyZXMgYSBsb2NhbCBtZXJnZSB0byByZXNvbHZlLlxuIgorICAgICAgICAgICAgICAgICAgICAgICArICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiUGxlYXNlIG1lcmdlIChvciByZWJhc2UpIHRoZSBjaGFuZ2UgbG9jYWxseSBhbmQgdXBsb2FkIHRoZSByZXNvbHV0aW9uIGZvciByZXZpZXcuIiksCiAKICAgLyoqICovCiAgIENBTk5PVF9DSEVSUllfUElDS19ST09UKCJDYW5ub3QgY2hlcnJ5LXBpY2sgYW4gaW5pdGlhbCBjb21taXQgb250byBhbiBleGlzdGluZyBicmFuY2guXG4iCkBAIC00OSw2ICs1NSwxMSBAQAogICAgICAgICAgICAgICAgICAgKyAiUGxlYXNlIG1lcmdlIHRoZSBjaGFuZ2UgbG9jYWxseSBhbmQgdXBsb2FkIHRoZSBtZXJnZSBjb21taXQgZm9yIHJldmlldy4iKSwKIAogICAvKiogKi8KKyAgQ0FOTk9UX1JFQkFTRV9ST09UKCJDYW5ub3QgcmViYXNlIGFuIGluaXRpYWwgY29tbWl0IG9udG8gYW4gZXhpc3RpbmcgYnJhbmNoLlxuIgorICAgICAgICAgICAgICAgICAgICsgIlxuIgorICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtZXJnZSB0aGUgY2hhbmdlIGxvY2FsbHkgYW5kIHVwbG9hZCB0aGUgbWVyZ2UgY29tbWl0IGZvciByZXZpZXcuIiksCisKKyAgLyoqICovCiAgIE5PVF9GQVNUX0ZPUldBUkQoIlByb2plY3QgcG9saWN5IHJlcXVpcmVzIGFsbCBzdWJtaXNzaW9ucyB0byBiZSBhIGZhc3QtZm9yd2FyZC5cbiIKICAgICAgICAgICAgICAgICAgICsgIlxuIgogICAgICAgICAgICAgICAgICAgKyAiUGxlYXNlIHJlYmFzZSB0aGUgY2hhbmdlIGxvY2FsbHkgYW5kIHVwbG9hZCBhZ2FpbiBmb3IgcmV2aWV3LiIpLApAQCAtODEsNCArOTIsNCBAQAogICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKXsKICAgICByZXR1cm4gbWVzc2FnZTsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NyZWF0ZUNvZGVSZXZpZXdOb3Rlcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ3JlYXRlQ29kZVJldmlld05vdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGZlMTcuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ3JlYXRlQ29kZVJldmlld05vdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZTX05PVEVTX1JFVklFVzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ub3Rlcy5Ob3RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY3JlYXRlIGNvZGUgcmV2aWV3IG5vdGVzIGZvciBnaXZlbiB7QGxpbmsgQ29kZVJldmlld0NvbW1pdH1zLgotICogPHA+Ci0gKiBBZnRlciB0aGUge0BsaW5rICNjcmVhdGUoTGlzdCwgUGVyc29uSWRlbnQpfSBtZXRob2QgaXMgaW52b2tlZCBvbmNlIHRoaXMKLSAqIGluc3RhbmNlIG11c3Qgbm90IGJlIHJldXNlZC4gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaWYgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQ29kZVJldmlld05vdGVzIHsKLSAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBDcmVhdGVDb2RlUmV2aWV3Tm90ZXMgY3JlYXRlKFJldmlld0RiIHJldmlld0RiLCBSZXBvc2l0b3J5IGRiKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBDSEFOR0VfSUQgPSBuZXcgRm9vdGVyS2V5KCJDaGFuZ2UtSWQiKTsKLQotICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmw7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWU7Ci0gIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgc2NoZW1hOwotICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgZGI7Ci0KLSAgcHJpdmF0ZSBQZXJzb25JZGVudCBhdXRob3I7Ci0KLSAgcHJpdmF0ZSBSZXZXYWxrIHJldldhbGs7Ci0gIHByaXZhdGUgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXI7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBOb3Rlc0JyYW5jaFV0aWwuRmFjdG9yeSBub3Rlc0JyYW5jaFV0aWxGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgQ3JlYXRlQ29kZVJldmlld05vdGVzKAotICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50LAotICAgICAgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKLSAgICAgIGZpbmFsIEBOdWxsYWJsZSBAQ2Fub25pY2FsV2ViVXJsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwsCi0gICAgICBmaW5hbCBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIGZpbmFsIE5vdGVzQnJhbmNoVXRpbC5GYWN0b3J5IG5vdGVzQnJhbmNoVXRpbEZhY3RvcnksCi0gICAgICBmaW5hbCBAQXNzaXN0ZWQgIFJldmlld0RiIHJldmlld0RiLAotICAgICAgZmluYWwgQEFzc2lzdGVkICBSZXBvc2l0b3J5IGRiKSB7Ci0gICAgdGhpcy5hdXRob3IgPSBnZXJyaXRJZGVudDsKLSAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwotICAgIHRoaXMuY2Fub25pY2FsV2ViVXJsID0gY2Fub25pY2FsV2ViVXJsOwotICAgIHRoaXMuYW5vbnltb3VzQ293YXJkTmFtZSA9IGFub255bW91c0Nvd2FyZE5hbWU7Ci0gICAgdGhpcy5ub3Rlc0JyYW5jaFV0aWxGYWN0b3J5ID0gbm90ZXNCcmFuY2hVdGlsRmFjdG9yeTsKLSAgICBzY2hlbWEgPSByZXZpZXdEYjsKLSAgICB0aGlzLmRiID0gZGI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGUoTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBjb21taXRzLCBQZXJzb25JZGVudCBhdXRob3IpCi0gICAgICB0aHJvd3MgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldldhbGsgPSBuZXcgUmV2V2FsayhkYik7Ci0gICAgICBpbnNlcnRlciA9IGRiLm5ld09iamVjdEluc2VydGVyKCk7Ci0gICAgICBpZiAoYXV0aG9yICE9IG51bGwpIHsKLSAgICAgICAgdGhpcy5hdXRob3IgPSBhdXRob3I7Ci0gICAgICB9Ci0KLSAgICAgIE5vdGVNYXAgbm90ZXMgPSBOb3RlTWFwLm5ld0VtcHR5TWFwKCk7Ci0gICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPQotICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJVcGRhdGUgbm90ZXMgZm9yIHN1Ym1pdHRlZCBjaGFuZ2VzXG5cbiIpOwotICAgICAgZm9yIChDb2RlUmV2aWV3Q29tbWl0IGMgOiBjb21taXRzKSB7Ci0gICAgICAgIG5vdGVzLnNldChjLCBjcmVhdGVOb3RlQ29udGVudChjLmNoYW5nZSwgYykpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKiAiKS5hcHBlbmQoYy5nZXRTaG9ydE1lc3NhZ2UoKSkuYXBwZW5kKCJcbiIpOwotICAgICAgfQotCi0gICAgICBOb3Rlc0JyYW5jaFV0aWwgbm90ZXNCcmFuY2hVdGlsID0gbm90ZXNCcmFuY2hVdGlsRmFjdG9yeS5jcmVhdGUoZGIpOwotICAgICAgbm90ZXNCcmFuY2hVdGlsLmNvbW1pdEFsbE5vdGVzKG5vdGVzLCBSRUZTX05PVEVTX1JFVklFVywgYXV0aG9yLAotICAgICAgICAgIG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gICAgICBpbnNlcnRlci5mbHVzaCgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uKGUpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHJldldhbGsucmVsZWFzZSgpOwotICAgICAgaW5zZXJ0ZXIucmVsZWFzZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZShMaXN0PENoYW5nZT4gY2hhbmdlcywgUGVyc29uSWRlbnQgYXV0aG9yLAotICAgICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2UsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgSU9FeGNlcHRpb24sIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXZXYWxrID0gbmV3IFJldldhbGsoZGIpOwotICAgICAgaW5zZXJ0ZXIgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpOwotICAgICAgaWYgKGF1dGhvciAhPSBudWxsKSB7Ci0gICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOwotICAgICAgfQotICAgICAgaWYgKG1vbml0b3IgPT0gbnVsbCkgewotICAgICAgICBtb25pdG9yID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKLSAgICAgIH0KLQotICAgICAgTm90ZU1hcCBub3RlcyA9IE5vdGVNYXAubmV3RW1wdHlNYXAoKTsKLSAgICAgIGZvciAoQ2hhbmdlIGMgOiBjaGFuZ2VzKSB7Ci0gICAgICAgIG1vbml0b3IudXBkYXRlKDEpOwotICAgICAgICBQYXRjaFNldCBwcyA9IHNjaGVtYS5wYXRjaFNldHMoKS5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgT2JqZWN0SWQgY29tbWl0SWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKHBzLmdldFJldmlzaW9uKCkuZ2V0KCkpOwotICAgICAgICBub3Rlcy5zZXQoY29tbWl0SWQsIGNyZWF0ZU5vdGVDb250ZW50KGMsIGNvbW1pdElkKSk7Ci0gICAgICB9Ci0KLSAgICAgIE5vdGVzQnJhbmNoVXRpbCBub3Rlc0JyYW5jaFV0aWwgPSBub3Rlc0JyYW5jaFV0aWxGYWN0b3J5LmNyZWF0ZShkYik7Ci0gICAgICBub3Rlc0JyYW5jaFV0aWwuY29tbWl0QWxsTm90ZXMobm90ZXMsIFJFRlNfTk9URVNfUkVWSUVXLCBhdXRob3IsCi0gICAgICAgICAgY29tbWl0TWVzc2FnZSk7Ci0gICAgICBpbnNlcnRlci5mbHVzaCgpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24oZSk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIHJldldhbGsucmVsZWFzZSgpOwotICAgICAgaW5zZXJ0ZXIucmVsZWFzZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0SWQgY3JlYXRlTm90ZUNvbnRlbnQoQ2hhbmdlIGNoYW5nZSwgT2JqZWN0SWQgY29tbWl0KQotICAgICAgdGhyb3dzIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uICB7Ci0gICAgaWYgKCEoY29tbWl0IGluc3RhbmNlb2YgUmV2Q29tbWl0KSkgewotICAgICAgY29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChjb21taXQpOwotICAgIH0KLSAgICByZXR1cm4gY3JlYXRlTm90ZUNvbnRlbnQoY2hhbmdlLCAoUmV2Q29tbWl0KSBjb21taXQpOwotICB9Ci0KLSAgcHJpdmF0ZSBPYmplY3RJZCBjcmVhdGVOb3RlQ29udGVudChDaGFuZ2UgY2hhbmdlLCBSZXZDb21taXQgY29tbWl0KQotICAgICAgdGhyb3dzIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlciBmb3JtYXR0ZXIgPQotICAgICAgICAgIG5ldyBSZXZpZXdOb3RlSGVhZGVyRm9ybWF0dGVyKGF1dGhvci5nZXRUaW1lWm9uZSgpLAotICAgICAgICAgICAgICBhbm9ueW1vdXNDb3dhcmROYW1lKTsKLSAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpZExpc3QgPSBjb21taXQuZ2V0Rm9vdGVyTGluZXMoQ0hBTkdFX0lEKTsKLSAgICAgIGlmIChpZExpc3QuaXNFbXB0eSgpKQotICAgICAgICBmb3JtYXR0ZXIuYXBwZW5kQ2hhbmdlSWQoY2hhbmdlLmdldEtleSgpKTsKLSAgICAgIFJlc3VsdFNldDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPQotICAgICAgICBzY2hlbWEucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0ID0gbnVsbDsKLSAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKSB7Ci0gICAgICAgIGlmIChhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICAgIC8vIElnbm9yZSAwIHZhbHVlcy4KLSAgICAgICAgfSBlbHNlIGlmIChBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoYS5nZXRDYXRlZ29yeUlkKCkpKSB7Ci0gICAgICAgICAgc3VibWl0ID0gYTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBcHByb3ZhbFR5cGUgdHlwZSA9IGFwcHJvdmFsVHlwZXMuYnlJZChhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9ybWF0dGVyLmFwcGVuZEFwcHJvdmFsKAotICAgICAgICAgICAgICAgIHR5cGUuZ2V0Q2F0ZWdvcnkoKSwKLSAgICAgICAgICAgICAgICBhLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgYWNjb3VudENhY2hlLmdldChhLmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoc3VibWl0ICE9IG51bGwpIHsKLSAgICAgICAgZm9ybWF0dGVyLmFwcGVuZFN1Ym1pdHRlZEJ5KGFjY291bnRDYWNoZS5nZXQoc3VibWl0LmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCkpOwotICAgICAgICBmb3JtYXR0ZXIuYXBwZW5kU3VibWl0dGVkQXQoc3VibWl0LmdldEdyYW50ZWQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2Fub25pY2FsV2ViVXJsICE9IG51bGwpIHsKLSAgICAgICAgZm9ybWF0dGVyLmFwcGVuZFJldmlld2VkT24oY2Fub25pY2FsV2ViVXJsLCBjaGFuZ2UuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgICBmb3JtYXR0ZXIuYXBwZW5kUHJvamVjdChjaGFuZ2UuZ2V0UHJvamVjdCgpLmdldCgpKTsKLSAgICAgIGZvcm1hdHRlci5hcHBlbmRCcmFuY2goY2hhbmdlLmdldERlc3QoKSk7Ci0gICAgICByZXR1cm4gaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgZm9ybWF0dGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbihjb21taXQsIGUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvRGVmYXVsdFF1ZXVlT3AuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0RlZmF1bHRRdWV1ZU9wLmphdmEKaW5kZXggODJkMDQ5My4uY2ZmNjljNiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvRGVmYXVsdFF1ZXVlT3AuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9EZWZhdWx0UXVldWVPcC5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRRdWV1ZU9wIGltcGxlbWVudHMgUnVubmFibGUgewpAQCAtMjMsNyArMjQsMTMgQEAKICAgICB3b3JrUXVldWUgPSB3cTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIGludCBkZWxheSwgZmluYWwgVGltZVVuaXQgdW5pdCkgewotICAgIHdvcmtRdWV1ZS5nZXREZWZhdWx0UXVldWUoKS5zY2hlZHVsZSh0aGlzLCBkZWxheSwgdW5pdCk7CisgIHB1YmxpYyBTY2hlZHVsZWRGdXR1cmU8Pz4gc3RhcnQobG9uZyBkZWxheSwgVGltZVVuaXQgdW5pdCkgeworICAgIHJldHVybiB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkuc2NoZWR1bGUodGhpcywgZGVsYXksIHVuaXQpOworICB9CisKKyAgcHVibGljIFNjaGVkdWxlZEZ1dHVyZTw/PiBzdGFydFdpdGhGaXhlZERlbGF5KGxvbmcgaW5pdGlhbERlbGF5LCBsb25nIGRlbGF5LAorICAgICAgVGltZVVuaXQgdW5pdCkgeworICAgIHJldHVybiB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkKKyAgICAgICAgLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkodGhpcywgaW5pdGlhbERlbGF5LCBkZWxheSwgdW5pdCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0Zhc3RGb3J3YXJkT25seS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvRmFzdEZvcndhcmRPbmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkZjRkNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0Zhc3RGb3J3YXJkT25seS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEZhc3RGb3J3YXJkT25seSBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKworICBGYXN0Rm9yd2FyZE9ubHkoZmluYWwgU3VibWl0U3RyYXRlZ3kuQXJndW1lbnRzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgQ29kZVJldmlld0NvbW1pdCBfcnVuKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgYXJncy5tZXJnZVV0aWwucmVkdWNlVG9NaW5pbWFsTWVyZ2UoYXJncy5tZXJnZVNvcnRlciwgdG9NZXJnZSk7CisgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuZXdNZXJnZVRpcCA9CisgICAgICAgIGFyZ3MubWVyZ2VVdGlsLmdldEZpcnN0RmFzdEZvcndhcmQobWVyZ2VUaXAsIGFyZ3MucncsIHRvTWVyZ2UpOworCisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gdG9NZXJnZS5yZW1vdmUoMCk7CisgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5OT1RfRkFTVF9GT1JXQVJEOworICAgIH0KKworICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXBwcm92YWwgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5tYXJrQ2xlYW5NZXJnZXMoYXJncy5ydywgYXJncy5jYW5NZXJnZUZsYWcsIG5ld01lcmdlVGlwLAorICAgICAgICAgICAgYXJncy5hbHJlYWR5QWNjZXB0ZWQpOworICAgIHNldFJlZkxvZ0lkZW50KHN1Ym1pdEFwcHJvdmFsKTsKKworICAgIHJldHVybiBuZXdNZXJnZVRpcDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiByZXRyeU9uTG9ja0ZhaWx1cmUoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZHJ5UnVuKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFyZ3MubWVyZ2VVdGlsLmNhbkZhc3RGb3J3YXJkKGFyZ3MubWVyZ2VTb3J0ZXIsIG1lcmdlVGlwLCBhcmdzLnJ3LAorICAgICAgICB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2FyYmFnZUNvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1ZTg3YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdhcmJhZ2VDb2xsZWN0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UZXh0UHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLlBhY2tDb25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3Rpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihHYXJiYWdlQ29sbGVjdGlvbi5jbGFzcyk7CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX05BTUUgPSAiZ2NfbG9nIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGdjTG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTE9HX05BTUUpOworCisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBHYXJiYWdlQ29sbGVjdGlvblF1ZXVlIGdjUXVldWU7CisKKyAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBHYXJiYWdlQ29sbGVjdGlvbiBjcmVhdGUoKTsKKyAgfQorCisgIEBJbmplY3QKKyAgR2FyYmFnZUNvbGxlY3Rpb24oR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIEdhcmJhZ2VDb2xsZWN0aW9uUXVldWUgZ2NRdWV1ZSkgeworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgICB0aGlzLmdjUXVldWUgPSBnY1F1ZXVlOworICB9CisKKyAgcHVibGljIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0IHJ1bihMaXN0PFByb2plY3QuTmFtZUtleT4gcHJvamVjdE5hbWVzKSB7CisgICAgcmV0dXJuIHJ1bihwcm9qZWN0TmFtZXMsIG51bGwpOworICB9CisKKyAgcHVibGljIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0IHJ1bihMaXN0PFByb2plY3QuTmFtZUtleT4gcHJvamVjdE5hbWVzLAorICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyKSB7CisgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQgcmVzdWx0ID0gbmV3IEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0KCk7CisgICAgU2V0PFByb2plY3QuTmFtZUtleT4gcHJvamVjdHNUb0djID0gZ2NRdWV1ZS5hZGRBbGwocHJvamVjdE5hbWVzKTsKKyAgICBmb3IgKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSA6IFNldHMuZGlmZmVyZW5jZSgKKyAgICAgICAgU2V0cy5uZXdIYXNoU2V0KHByb2plY3ROYW1lcyksIHByb2plY3RzVG9HYykpIHsKKyAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IoCisgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IuVHlwZS5HQ19BTFJFQURZX1NDSEVEVUxFRCwgcHJvamVjdE5hbWUpKTsKKyAgICB9CisgICAgZm9yIChQcm9qZWN0Lk5hbWVLZXkgcCA6IHByb2plY3RzVG9HYykgeworICAgICAgUmVwb3NpdG9yeSByZXBvID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlcG8gPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShwKTsKKyAgICAgICAgbG9nR2NDb25maWd1cmF0aW9uKHAsIHJlcG8pOworICAgICAgICBwcmludCh3cml0ZXIsICJjb2xsZWN0aW5nIGdhcmJhZ2UgZm9yIFwiIiArIHAgKyAiXCI6XG4iKTsKKyAgICAgICAgR2FyYmFnZUNvbGxlY3RDb21tYW5kIGdjID0gR2l0LndyYXAocmVwbykuZ2MoKTsKKyAgICAgICAgbG9nR2NJbmZvKHAsICJiZWZvcmU6IiwgZ2MuZ2V0U3RhdGlzdGljcygpKTsKKyAgICAgICAgZ2Muc2V0UHJvZ3Jlc3NNb25pdG9yKHdyaXRlciAhPSBudWxsID8gbmV3IFRleHRQcm9ncmVzc01vbml0b3Iod3JpdGVyKQorICAgICAgICAgICAgOiBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFKTsKKyAgICAgICAgUHJvcGVydGllcyBzdGF0aXN0aWNzID0gZ2MuY2FsbCgpOworICAgICAgICBsb2dHY0luZm8ocCwgImFmdGVyOiAiLCBzdGF0aXN0aWNzKTsKKyAgICAgICAgcHJpbnQod3JpdGVyLCAiZG9uZS5cblxuIik7CisgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dHY0Vycm9yKHdyaXRlciwgcCwgZSk7CisgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IoCisgICAgICAgICAgICBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvci5UeXBlLlJFUE9TSVRPUllfTk9UX0ZPVU5ELAorICAgICAgICAgICAgcCkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBsb2dHY0Vycm9yKHdyaXRlciwgcCwgZSk7CisgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IoCisgICAgICAgICAgICBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvci5UeXBlLkdDX0ZBSUxFRCwgcCkpOworICAgICAgfSBjYXRjaCAoR2l0QVBJRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nR2NFcnJvcih3cml0ZXIsIHAsIGUpOworICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yKAorICAgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IuVHlwZS5HQ19GQUlMRUQsIHApKTsKKyAgICAgIH0gY2F0Y2ggKEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0djRXJyb3Iod3JpdGVyLCBwLCBlKTsKKyAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvcigKKyAgICAgICAgICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yLlR5cGUuR0NfRkFJTEVELCBwKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAocmVwbyAhPSBudWxsKSB7CisgICAgICAgICAgcmVwby5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGdjUXVldWUuZ2NGaW5pc2hlZChwKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nR2NJbmZvKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwgU3RyaW5nIG1zZykgeworICAgIGxvZ0djSW5mbyhwcm9qZWN0TmFtZSwgbXNnLCBudWxsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nR2NJbmZvKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwgU3RyaW5nIG1zZywKKyAgICAgIFByb3BlcnRpZXMgc3RhdGlzdGljcykgeworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgYi5hcHBlbmQoIlsiKS5hcHBlbmQocHJvamVjdE5hbWUuZ2V0KCkpLmFwcGVuZCgiXSAiKTsKKyAgICBiLmFwcGVuZChtc2cpOworICAgIGlmIChzdGF0aXN0aWNzICE9IG51bGwpIHsKKyAgICAgIGIuYXBwZW5kKCIgIik7CisgICAgICBTdHJpbmcgcyA9IHN0YXRpc3RpY3MudG9TdHJpbmcoKTsKKyAgICAgIGlmIChzLnN0YXJ0c1dpdGgoInsiKSAmJiBzLmVuZHNXaXRoKCJ9IikpIHsKKyAgICAgICAgcyA9IHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKKyAgICAgIH0KKyAgICAgIGIuYXBwZW5kKHMpOworICAgIH0KKyAgICBnY0xvZy5pbmZvKGIudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0djQ29uZmlndXJhdGlvbihQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsCisgICAgICBSZXBvc2l0b3J5IHJlcG8pIHsKKyAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIENvbmZpZyBjZmcgPSByZXBvLmdldENvbmZpZygpOworICAgIGIuYXBwZW5kKGZvcm1hdENvbmZpZ1ZhbHVlcyhjZmcsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfR0NfU0VDVElPTiwgbnVsbCkpOworICAgIGZvciAoU3RyaW5nIHN1YnNlY3Rpb24gOiBjZmcuZ2V0U3Vic2VjdGlvbnMoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19HQ19TRUNUSU9OKSkgeworICAgICAgYi5hcHBlbmQoZm9ybWF0Q29uZmlnVmFsdWVzKGNmZywgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19HQ19TRUNUSU9OLAorICAgICAgICAgIHN1YnNlY3Rpb24pKTsKKyAgICB9CisgICAgaWYgKGIubGVuZ3RoKCkgPT0gMCkgeworICAgICAgYi5hcHBlbmQoIm5vIHNldCIpOworICAgIH0KKworICAgIGxvZ0djSW5mbyhwcm9qZWN0TmFtZSwgImdjIGNvbmZpZzogIiArIGIudG9TdHJpbmcoKSk7CisgICAgbG9nR2NJbmZvKHByb2plY3ROYW1lLCAicGFjayBjb25maWc6ICIgKyAobmV3IFBhY2tDb25maWcocmVwbykpLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdENvbmZpZ1ZhbHVlcyhDb25maWcgY29uZmlnLCBTdHJpbmcgc2VjdGlvbiwKKyAgICAgIFN0cmluZyBzdWJzZWN0aW9uKSB7CisgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBTZXQ8U3RyaW5nPiBuYW1lcyA9IGNvbmZpZy5nZXROYW1lcyhzZWN0aW9uLCBzdWJzZWN0aW9uKTsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKKyAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CisgICAgICBiLmFwcGVuZChzZWN0aW9uKTsKKyAgICAgIGlmIChzdWJzZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgYi5hcHBlbmQoIi4iKS5hcHBlbmQoc3Vic2VjdGlvbik7CisgICAgICB9CisgICAgICBiLmFwcGVuZCgiLiIpOworICAgICAgYi5hcHBlbmQobmFtZSkuYXBwZW5kKCI9IikuYXBwZW5kKHZhbHVlKTsKKyAgICAgIGIuYXBwZW5kKCI7ICIpOworICAgIH0KKyAgICByZXR1cm4gYi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dHY0Vycm9yKFByaW50V3JpdGVyIHdyaXRlciwKKyAgICAgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwgRXhjZXB0aW9uIGUpIHsKKyAgICBwcmludCh3cml0ZXIsICJmYWlsZWQuXG5cbiIpOworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgYi5hcHBlbmQoIlsiKS5hcHBlbmQocHJvamVjdE5hbWUuZ2V0KCkpLmFwcGVuZCgiXSIpOworICAgIGdjTG9nLmVycm9yKGIudG9TdHJpbmcoKSwgZSk7CisgICAgbG9nLmVycm9yKGIudG9TdHJpbmcoKSwgZSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHdyaXRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgIHdyaXRlci5wcmludChtZXNzYWdlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uUXVldWUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmRjNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdGlvblF1ZXVlIHsKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0c1NjaGVkdWxlZEZvckdjID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8UHJvamVjdC5OYW1lS2V5PiBhZGRBbGwoQ29sbGVjdGlvbjxQcm9qZWN0Lk5hbWVLZXk+IHByb2plY3RzKSB7CisgICAgU2V0PFByb2plY3QuTmFtZUtleT4gYWRkZWQgPQorICAgICAgICBTZXRzLm5ld0xpbmtlZEhhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKHByb2plY3RzLnNpemUoKSk7CisgICAgZm9yIChQcm9qZWN0Lk5hbWVLZXkgcCA6IHByb2plY3RzKSB7CisgICAgICBpZiAocHJvamVjdHNTY2hlZHVsZWRGb3JHYy5hZGQocCkpIHsKKyAgICAgICAgYWRkZWQuYWRkKHApOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRkZWQ7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZ2NGaW5pc2hlZChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkgeworICAgIHByb2plY3RzU2NoZWR1bGVkRm9yR2MucmVtb3ZlKHByb2plY3QpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdE1vZHVsZS5qYXZhCmluZGV4IDc5NDdkMzAuLjllZjcyNTYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdE1vZHVsZS5qYXZhCkBAIC0yMyw1ICsyMyw2IEBACiAgICAgZmFjdG9yeShSZW5hbWVHcm91cE9wLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoTWV0YURhdGFVcGRhdGUuSW50ZXJuYWxGYWN0b3J5LmNsYXNzKTsKICAgICBiaW5kKE1ldGFEYXRhVXBkYXRlLlNlcnZlci5jbGFzcyk7CisgICAgYmluZChSZWNlaXZlQ29uZmlnLmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2l0UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKaW5kZXggMWJmMTU3Yi4uMDExODQwNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2l0UmVwb3NpdG9yeU1hbmFnZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRSZXBvc2l0b3J5TWFuYWdlci5qYXZhCkBAIC0zMSwxNSArMzEsMTUgQEAKICAqIGVudmlyb25tZW50LgogICovCiBwdWJsaWMgaW50ZXJmYWNlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHsKLSAgLyoqIE5vdGVzIGJyYW5jaCBzdWNjZXNzZnVsIHJldmlld3MgYXJlIHdyaXR0ZW4gdG8gYWZ0ZXIgYmVpbmcgbWVyZ2VkLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZTX05PVEVTX1JFVklFVyA9ICJyZWZzL25vdGVzL3JldmlldyI7Ci0KICAgLyoqIE5vdGUgdHJlZSBsaXN0aW5nIGNvbW1pdHMgd2UgcmVmdXNlIHtAY29kZSByZWZzL21ldGEvcmVqZWN0LWNvbW1pdHN9ICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9SRUpFQ1RfQ09NTUlUUyA9ICJyZWZzL21ldGEvcmVqZWN0LWNvbW1pdHMiOwogCiAgIC8qKiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBhIHByb2plY3Qge0Bjb2RlIHJlZnMvbWV0YS9jb25maWd9ICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9DT05GSUcgPSAicmVmcy9tZXRhL2NvbmZpZyI7CiAKKyAgLyoqIENvbmZpZ3VyYXRpb25zIG9mIHByb2plY3Qtc3BlY2lmaWMgZGFzaGJvYXJkcyAoY2FubmVkIHNlYXJjaCBxdWVyaWVzKS4gKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVGU19EQVNIQk9BUkRTID0gInJlZnMvbWV0YS9kYXNoYm9hcmRzLyI7CisKICAgLyoqCiAgICAqIFByZWZpeCBhcHBsaWVkIHRvIG1lcmdlIGNvbW1pdCBiYXNlIG5vZGVzLgogICAgKiA8cD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xhYmVsTm9ybWFsaXplci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTGFiZWxOb3JtYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwOTkxNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xhYmVsTm9ybWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIExhYmVsTm9ybWFsaXplciB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OworCisgIEBJbmplY3QKKyAgTGFiZWxOb3JtYWxpemVyKENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlRmFjdG9yeSwKKyAgICAgIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5KSB7CisgICAgdGhpcy5jaGFuZ2VGYWN0b3J5ID0gY2hhbmdlRmFjdG9yeTsKKyAgICB0aGlzLnVzZXJGYWN0b3J5ID0gdXNlckZhY3Rvcnk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGNoYW5nZSBjaGFuZ2UgY29udGFpbmluZyB0aGUgZ2l2ZW4gYXBwcm92YWxzLgorICAgKiBAcGFyYW0gYXBwcm92YWxzIGxpc3Qgb2YgYXBwcm92YWxzLgorICAgKiBAcmV0dXJuIGNvcGllcyBvZiBhcHByb3ZhbHMgbm9ybWFsaXplZCB0byB0aGUgZGVmaW5lZCByYW5nZXMgZm9yIHRoZSBsYWJlbAorICAgKiAgICAgdHlwZSBhbmQgcGVybWlzc2lvbnMgZm9yIHRoZSB1c2VyLiBBcHByb3ZhbHMgZm9yIHVua25vd24gbGFiZWxzIGFyZSBub3QKKyAgICogICAgIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQsIG5vciBhcmUgYXBwcm92YWxzIHdoZXJlIHRoZSB1c2VyIGhhcyBubworICAgKiAgICAgcGVybWlzc2lvbnMgZm9yIHRoYXQgbGFiZWwuCisgICAqIEB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBub3JtYWxpemUoQ2hhbmdlIGNoYW5nZSwKKyAgICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbm9ybWFsaXplKAorICAgICAgICBjaGFuZ2VGYWN0b3J5LmNvbnRyb2xGb3IoY2hhbmdlLCB1c2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlLmdldE93bmVyKCkpKSwKKyAgICAgICAgYXBwcm92YWxzKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3RsIGNoYW5nZSBjb250cm9sIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFwcHJvdmFscy4KKyAgICogQHBhcmFtIGFwcHJvdmFscyBsaXN0IG9mIGFwcHJvdmFscy4KKyAgICogQHJldHVybiBjb3BpZXMgb2YgYXBwcm92YWxzIG5vcm1hbGl6ZWQgdG8gdGhlIGRlZmluZWQgcmFuZ2VzIGZvciB0aGUgbGFiZWwKKyAgICogICAgIHR5cGUgYW5kIHBlcm1pc3Npb25zIGZvciB0aGUgdXNlci4gQXBwcm92YWxzIGZvciB1bmtub3duIGxhYmVscyBhcmUgbm90CisgICAqICAgICBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LCBub3IgYXJlIGFwcHJvdmFscyB3aGVyZSB0aGUgdXNlciBoYXMgbm8KKyAgICogICAgIHBlcm1pc3Npb25zIGZvciB0aGF0IGxhYmVsLgorICAgKi8KKyAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gbm9ybWFsaXplKENoYW5nZUNvbnRyb2wgY3RsLAorICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMpIHsKKyAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHJlc3VsdCA9CisgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShhcHByb3ZhbHMuc2l6ZSgpKTsKKyAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBjdGwuZ2V0TGFiZWxUeXBlcygpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBhcHByb3ZhbHMpIHsKKyAgICAgIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHBzYS5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRQYXJlbnRLZXkoKTsKKyAgICAgIGNoZWNrQXJndW1lbnQoY2hhbmdlSWQuZXF1YWxzKGN0bC5nZXRDaGFuZ2UoKS5nZXRJZCgpKSwKKyAgICAgICAgICAiQXBwcm92YWwgJXMgZG9lcyBub3QgbWF0Y2ggY2hhbmdlICVzIiwKKyAgICAgICAgICBwc2EuZ2V0S2V5KCksIGN0bC5nZXRDaGFuZ2UoKS5nZXRLZXkoKSk7CisgICAgICBpZiAocHNhLmlzU3VibWl0KCkpIHsKKyAgICAgICAgcmVzdWx0LmFkZChjb3B5KHBzYSwgY3RsKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgTGFiZWxUeXBlIGxhYmVsID0gbGFiZWxUeXBlcy5ieUxhYmVsKHBzYS5nZXRMYWJlbElkKCkpOworICAgICAgaWYgKGxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgcHNhID0gY29weShwc2EsIGN0bCk7CisgICAgICAgIGFwcGx5VHlwZUZsb29yKGxhYmVsLCBwc2EpOworICAgICAgICBpZiAoYXBwbHlSaWdodEZsb29yKGN0bCwgbGFiZWwsIHBzYSkpIHsKKyAgICAgICAgICByZXN1bHQuYWRkKHBzYSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gY3RsIGNoYW5nZSBjb250cm9sIChmb3IgYW55IHVzZXIpLgorICAgKiBAcGFyYW0gbHQgbGFiZWwgdHlwZS4KKyAgICogQHBhcmFtIGlkIGFjY291bnQgSUQuCisgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYWNjb3VudCBJRCBoYXMgYW55IHBlcm1pc3Npb25zIHRvIHZvdGUgb24gdGhpcworICAgKiAgICAgbGFiZWwgZm9yIHRoaXMgY2hhbmdlLgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuVm90ZShDaGFuZ2VDb250cm9sIGN0bCwgTGFiZWxUeXBlIGx0LCBBY2NvdW50LklkIGlkKSB7CisgICAgcmV0dXJuICFnZXRSYW5nZShjdGwsIGx0LCBpZCkuaXNFbXB0eSgpOworICB9CisKKyAgcHJpdmF0ZSBQYXRjaFNldEFwcHJvdmFsIGNvcHkoUGF0Y2hTZXRBcHByb3ZhbCBzcmMsIENoYW5nZUNvbnRyb2wgY3RsKSB7CisgICAgUGF0Y2hTZXRBcHByb3ZhbCBkZXN0ID0gbmV3IFBhdGNoU2V0QXBwcm92YWwoc3JjLmdldFBhdGNoU2V0SWQoKSwgc3JjKTsKKyAgICBkZXN0LmNhY2hlKGN0bC5nZXRDaGFuZ2UoKSk7CisgICAgcmV0dXJuIGRlc3Q7CisgIH0KKworICBwcml2YXRlIFBlcm1pc3Npb25SYW5nZSBnZXRSYW5nZShDaGFuZ2VDb250cm9sIGN0bCwgTGFiZWxUeXBlIGx0LAorICAgICAgQWNjb3VudC5JZCBpZCkgeworICAgIFN0cmluZyBwZXJtaXNzaW9uID0gUGVybWlzc2lvbi5mb3JMYWJlbChsdC5nZXROYW1lKCkpOworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSB1c2VyRmFjdG9yeS5jcmVhdGUoaWQpOworICAgIHJldHVybiBjdGwuZm9yVXNlcih1c2VyKS5nZXRSYW5nZShwZXJtaXNzaW9uKTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBhcHBseVJpZ2h0Rmxvb3IoQ2hhbmdlQ29udHJvbCBjdGwsIExhYmVsVHlwZSBsdCwKKyAgICAgIFBhdGNoU2V0QXBwcm92YWwgYSkgeworICAgIFBlcm1pc3Npb25SYW5nZSByYW5nZSA9IGdldFJhbmdlKGN0bCwgbHQsIGEuZ2V0QWNjb3VudElkKCkpOworICAgIGlmIChyYW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYS5zZXRWYWx1ZSgoc2hvcnQpIHJhbmdlLnNxdWFzaChhLmdldFZhbHVlKCkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHBseVR5cGVGbG9vcihMYWJlbFR5cGUgbHQsIFBhdGNoU2V0QXBwcm92YWwgYSkgeworICAgIExhYmVsVmFsdWUgYXRNaW4gPSBsdC5nZXRNaW4oKTsKKyAgICBpZiAoYXRNaW4gIT0gbnVsbCAmJiBhLmdldFZhbHVlKCkgPCBhdE1pbi5nZXRWYWx1ZSgpKSB7CisgICAgICBhLnNldFZhbHVlKGF0TWluLmdldFZhbHVlKCkpOworICAgIH0KKyAgICBMYWJlbFZhbHVlIGF0TWF4ID0gbHQuZ2V0TWF4KCk7CisgICAgaWYgKGF0TWF4ICE9IG51bGwgJiYgYS5nZXRWYWx1ZSgpID4gYXRNYXguZ2V0VmFsdWUoKSkgeworICAgICAgYS5zZXRWYWx1ZShhdE1heC5nZXRWYWx1ZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xvY2FsRGlza1JlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmluZGV4IDRlM2YzMjQuLjFjYTc0YjEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xvY2FsRGlza1JlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZXNzaW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkxvY2tGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWdDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwpAQCAtMzMsOCArMzQsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnlDYWNoZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Q2FjaGUuRmlsZUtleTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuV2luZG93Q2FjaGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuV2luZG93Q2FjaGVDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lk9wZW5Tc2hDb25maWc7CkBAIC03OCwxMSArNzcsMTEgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlmZWN5Y2xlIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29uZmlnIGNmZzsKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZyBzZXJ2ZXJDb25maWc7CiAKICAgICBASW5qZWN0CiAgICAgTGlmZWN5Y2xlKEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZykgewotICAgICAgdGhpcy5jZmcgPSBjZmc7CisgICAgICB0aGlzLnNlcnZlckNvbmZpZyA9IGNmZzsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTk2LDkgKzk1LDM0IEBACiAgICAgICAgIH0KICAgICAgIH0pOwogCi0gICAgICBmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjID0gbmV3IFdpbmRvd0NhY2hlQ29uZmlnKCk7Ci0gICAgICBjLmZyb21Db25maWcoY2ZnKTsKLSAgICAgIFdpbmRvd0NhY2hlLnJlY29uZmlndXJlKGMpOworICAgICAgV2luZG93Q2FjaGVDb25maWcgY2ZnID0gbmV3IFdpbmRvd0NhY2hlQ29uZmlnKCk7CisgICAgICBjZmcuZnJvbUNvbmZpZyhzZXJ2ZXJDb25maWcpOworICAgICAgaWYgKHNlcnZlckNvbmZpZy5nZXRTdHJpbmcoImNvcmUiLCBudWxsLCAic3RyZWFtRmlsZVRocmVzaG9sZCIpID09IG51bGwpIHsKKyAgICAgICAgbG9uZyBteCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpOworICAgICAgICBpbnQgbGltaXQgPSAoaW50KSBNYXRoLm1pbigKKyAgICAgICAgICAgIG14IC8gNCwgLy8gZG9uJ3QgdXNlIG1vcmUgdGhhbiAxLzQgb2YgdGhlIGhlYXAuCisgICAgICAgICAgICAyMDQ3IDw8IDIwKTsgLy8gY2Fubm90IGV4Y2VlZCBhcnJheSBsZW5ndGgKKyAgICAgICAgaWYgKCg1IDw8IDIwKSA8IGxpbWl0ICYmIGxpbWl0ICUgKDEgPDwgMjApICE9IDApIHsKKyAgICAgICAgICAvLyBJZiB0aGUgbGltaXQgaXMgYXQgbGVhc3QgNSBNaUIgYnV0IGlzIG5vdCBhIHdob2xlIG11bHRpcGxlCisgICAgICAgICAgLy8gb2YgTWlCIHJvdW5kIHVwIHRvIHRoZSBuZXh0IG9uZSBmdWxsIG1lZ2FieXRlLiBUaGlzIGlzIGEgdmVyeQorICAgICAgICAgIC8vIHRpbnkgbWVtb3J5IGluY3JlYXNlIGluIGV4Y2hhbmdlIGZvciBuaWNlIHJvdW5kIHVuaXRzLgorICAgICAgICAgIGxpbWl0ID0gKChsaW1pdCAvICgxIDw8IDIwKSkgKyAxKSA8PCAyMDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkZXNjOworICAgICAgICBpZiAobGltaXQgJSAoMSA8PCAyMCkgPT0gMCkgeworICAgICAgICAgIGRlc2MgPSBTdHJpbmcuZm9ybWF0KCIlZG0iLCBsaW1pdCAvICgxIDw8IDIwKSk7CisgICAgICAgIH0gZWxzZSBpZiAobGltaXQgJSAoMSA8PCAxMCkgPT0gMCkgeworICAgICAgICAgIGRlc2MgPSBTdHJpbmcuZm9ybWF0KCIlZGsiLCBsaW1pdCAvICgxIDw8IDEwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzYyA9IFN0cmluZy5mb3JtYXQoIiVkIiwgbGltaXQpOworICAgICAgICB9CisgICAgICAgIGxvZy5pbmZvKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiRGVmYXVsdGluZyBjb3JlLnN0cmVhbUZpbGVUaHJlc2hvbGQgdG8gJXMiLAorICAgICAgICAgICAgZGVzYykpOworICAgICAgICBjZmcuc2V0U3RyZWFtRmlsZVRocmVzaG9sZChsaW1pdCk7CisgICAgICB9CisgICAgICBjZmcuaW5zdGFsbCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTc3LDEwICsyMDEsNyBAQAogICAgICAgLy8gSXQgZG9lc24ndCBleGlzdCB1bmRlciBhbnkgb2YgdGhlIHN0YW5kYXJkIHBlcm11dGF0aW9ucwogICAgICAgLy8gb2YgdGhlIHJlcG9zaXRvcnkgbmFtZSwgc28gcHJlZmVyIHRoZSBzdGFuZGFyZCBiYXJlIG5hbWUuCiAgICAgICAvLwotICAgICAgU3RyaW5nIG4gPSBuYW1lLmdldCgpOwotICAgICAgaWYgKCFuLmVuZHNXaXRoKENvbnN0YW50cy5ET1RfR0lUX0VYVCkpIHsKLSAgICAgICAgbiA9IG4gKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7Ci0gICAgICB9CisgICAgICBTdHJpbmcgbiA9IG5hbWUuZ2V0KCkgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7CiAgICAgICBsb2MgPSBGaWxlS2V5LmV4YWN0KG5ldyBGaWxlKGJhc2VQYXRoLCBuKSwgRlMuREVURUNURUQpOwogICAgIH0KIApAQCAtMjkwLDcgKzMxMSw3IEBACiAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgcmV0dXJuIHRydWU7IC8vIG5vIGVtcHR5IHBhdGhzCiAgICAgaWYgKG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoKCkgLTEpID09ICcvJykgcmV0dXJuIHRydWU7IC8vIG5vIHN1ZmZpeAogCi0gICAgaWYgKG5hbWUuaW5kZXhPZignXFwnKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gbm8gd2luZG93cy9kb3Mgc3RseWUgcGF0aHMKKyAgICBpZiAobmFtZS5pbmRleE9mKCdcXCcpID49IDApIHJldHVybiB0cnVlOyAvLyBubyB3aW5kb3dzL2RvcyBzdHlsZSBwYXRocwogICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnLycpIHJldHVybiB0cnVlOyAvLyBubyBhYnNvbHV0ZSBwYXRocwogICAgIGlmIChuZXcgRmlsZShuYW1lKS5pc0Fic29sdXRlKCkpIHJldHVybiB0cnVlOyAvLyBubyBhYnNvbHV0ZSBwYXRocwogCkBAIC0yOTgsNiArMzE5LDE1IEBACiAgICAgaWYgKG5hbWUuY29udGFpbnMoIi8uLi8iKSkgcmV0dXJuIHRydWU7IC8vIG5vICJmb28vLi4vZXRjL3Bhc3N3ZCIKICAgICBpZiAobmFtZS5jb250YWlucygiLy4vIikpIHJldHVybiB0cnVlOyAvLyAiZm9vLy4vZm9vIiBpcyBpbnNhbmUgdG8gYXNrCiAgICAgaWYgKG5hbWUuY29udGFpbnMoIi8vIikpIHJldHVybiB0cnVlOyAvLyB3aW5kb3dzIFVOQyBwYXRoIGNhbiBiZSAiLy8uLi4iCisgICAgaWYgKG5hbWUuY29udGFpbnMoIj8iKSkgcmV0dXJuIHRydWU7IC8vIGNvbW1vbiB1bml4IHdpbGRjYXJkCisgICAgaWYgKG5hbWUuY29udGFpbnMoIiUiKSkgcmV0dXJuIHRydWU7IC8vIHdpbGRjYXJkIG9yIHN0cmluZyBwYXJhbWV0ZXIKKyAgICBpZiAobmFtZS5jb250YWlucygiKiIpKSByZXR1cm4gdHJ1ZTsgLy8gd2lsZGNhcmQKKyAgICBpZiAobmFtZS5jb250YWlucygiOiIpKSByZXR1cm4gdHJ1ZTsgLy8gQ291bGQgYmUgdXNlZCBmb3IgYWJzb2x1dGUgcGF0aHMgaW4gd2luZG93cz8KKyAgICBpZiAobmFtZS5jb250YWlucygiPCIpKSByZXR1cm4gdHJ1ZTsgLy8gcmVkaXJlY3QgaW5wdXQKKyAgICBpZiAobmFtZS5jb250YWlucygiPiIpKSByZXR1cm4gdHJ1ZTsgLy8gcmVkaXJlY3Qgb3V0cHV0CisgICAgaWYgKG5hbWUuY29udGFpbnMoInwiKSkgcmV0dXJuIHRydWU7IC8vIHBpcGUKKyAgICBpZiAobmFtZS5jb250YWlucygiJCIpKSByZXR1cm4gdHJ1ZTsgLy8gZG9sbGFyIHNpZ24KKyAgICBpZiAobmFtZS5jb250YWlucygiXHIiKSkgcmV0dXJuIHRydWU7IC8vIGNhcnJpYWdlIHJldHVybgogCiAgICAgcmV0dXJuIGZhbHNlOyAvLyBpcyBhIHJlYXNvbmFibGUgbmFtZQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZUFsd2F5cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VBbHdheXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNhNDBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VBbHdheXMuamF2YQpAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNZXJnZUFsd2F5cyBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKworICBNZXJnZUFsd2F5cyhmaW5hbCBTdWJtaXRTdHJhdGVneS5Bcmd1bWVudHMgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBDb2RlUmV2aWV3Q29tbWl0IF9ydW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBhcmdzLm1lcmdlVXRpbC5yZWR1Y2VUb01pbmltYWxNZXJnZShhcmdzLm1lcmdlU29ydGVyLCB0b01lcmdlKTsKKworICAgIENvZGVSZXZpZXdDb21taXQgbmV3TWVyZ2VUaXAgPSBtZXJnZVRpcDsKKyAgICB3aGlsZSAoIXRvTWVyZ2UuaXNFbXB0eSgpKSB7CisgICAgICBuZXdNZXJnZVRpcCA9CisgICAgICAgICAgYXJncy5tZXJnZVV0aWwubWVyZ2VPbmVDb21taXQoYXJncy5teUlkZW50LCBhcmdzLnJlcG8sIGFyZ3MucncsCisgICAgICAgICAgICAgIGFyZ3MuaW5zZXJ0ZXIsIGFyZ3MuY2FuTWVyZ2VGbGFnLCBhcmdzLmRlc3RCcmFuY2gsIG1lcmdlVGlwLAorICAgICAgICAgICAgICB0b01lcmdlLnJlbW92ZSgwKSk7CisgICAgfQorCisgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBcHByb3ZhbCA9CisgICAgICAgIGFyZ3MubWVyZ2VVdGlsLm1hcmtDbGVhbk1lcmdlcyhhcmdzLnJ3LCBhcmdzLmNhbk1lcmdlRmxhZywgbmV3TWVyZ2VUaXAsCisgICAgICAgICAgICBhcmdzLmFscmVhZHlBY2NlcHRlZCk7CisgICAgc2V0UmVmTG9nSWRlbnQoc3VibWl0QXBwcm92YWwpOworCisgICAgcmV0dXJuIG5ld01lcmdlVGlwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGRyeVJ1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIHJldHVybiBhcmdzLm1lcmdlVXRpbC5jYW5NZXJnZShhcmdzLm1lcmdlU29ydGVyLCBhcmdzLnJlcG8sIG1lcmdlVGlwLAorICAgICAgICB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlRXhjZXB0aW9uLmphdmEKaW5kZXggMTk5N2MxMy4uNTRjZDMyOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VFeGNlcHRpb24uamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZUV4Y2VwdGlvbi5qYXZhCkBAIC0xOCwxMSArMTgsMTEgQEAKIHB1YmxpYyBjbGFzcyBNZXJnZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0gIE1lcmdlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgcHVibGljIE1lcmdlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2cpIHsKICAgICBzdXBlcihtc2csIG51bGwpOwogICB9CiAKLSAgTWVyZ2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1zZywgZmluYWwgVGhyb3dhYmxlIHdoeSkgeworICBwdWJsaWMgTWVyZ2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1zZywgZmluYWwgVGhyb3dhYmxlIHdoeSkgewogICAgIHN1cGVyKG1zZywgd2h5KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VJZk5lY2Vzc2FyeS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VJZk5lY2Vzc2FyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWVkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZUlmTmVjZXNzYXJ5LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWVyZ2VJZk5lY2Vzc2FyeSBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKworICBNZXJnZUlmTmVjZXNzYXJ5KGZpbmFsIFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyBhcmdzKSB7CisgICAgc3VwZXIoYXJncyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIENvZGVSZXZpZXdDb21taXQgX3J1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGFyZ3MubWVyZ2VVdGlsLnJlZHVjZVRvTWluaW1hbE1lcmdlKGFyZ3MubWVyZ2VTb3J0ZXIsIHRvTWVyZ2UpOworICAgIENvZGVSZXZpZXdDb21taXQgbmV3TWVyZ2VUaXAgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5nZXRGaXJzdEZhc3RGb3J3YXJkKG1lcmdlVGlwLCBhcmdzLnJ3LCB0b01lcmdlKTsKKworICAgIC8vIEZvciBldmVyeSBvdGhlciBjb21taXQgZG8gYSBwYWlyLXdpc2UgbWVyZ2UuCisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgbmV3TWVyZ2VUaXAgPQorICAgICAgICAgIGFyZ3MubWVyZ2VVdGlsLm1lcmdlT25lQ29tbWl0KGFyZ3MubXlJZGVudCwgYXJncy5yZXBvLCBhcmdzLnJ3LAorICAgICAgICAgICAgICBhcmdzLmluc2VydGVyLCBhcmdzLmNhbk1lcmdlRmxhZywgYXJncy5kZXN0QnJhbmNoLCBtZXJnZVRpcCwKKyAgICAgICAgICAgICAgdG9NZXJnZS5yZW1vdmUoMCkpOworICAgIH0KKworICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXBwcm92YWwgPSBhcmdzLm1lcmdlVXRpbC5tYXJrQ2xlYW5NZXJnZXMoCisgICAgICAgIGFyZ3MucncsIGFyZ3MuY2FuTWVyZ2VGbGFnLCBuZXdNZXJnZVRpcCwgYXJncy5hbHJlYWR5QWNjZXB0ZWQpOworICAgIHNldFJlZkxvZ0lkZW50KHN1Ym1pdEFwcHJvdmFsKTsKKworICAgIHJldHVybiBuZXdNZXJnZVRpcDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBkcnlSdW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYXJncy5tZXJnZVV0aWwuY2FuRmFzdEZvcndhcmQoCisgICAgICAgICAgYXJncy5tZXJnZVNvcnRlciwgbWVyZ2VUaXAsIGFyZ3MucncsIHRvTWVyZ2UpCisgICAgICAgIHx8IGFyZ3MubWVyZ2VVdGlsLmNhbk1lcmdlKAorICAgICAgICAgIGFyZ3MubWVyZ2VTb3J0ZXIsIGFyZ3MucmVwbywgbWVyZ2VUaXAsIHRvTWVyZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZU9wLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZU9wLmphdmEKaW5kZXggMmU4ZjE4My4uZGFjZTBhZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VPcC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlT3AuamF2YQpAQCAtMTQsMzAgKzE0LDM1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlVXRpbC5nZXRTdWJtaXR0ZXI7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LkRBWVM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2FwYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFR5cGVSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBbmNlc3RvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWVyZ2VGYWlsU2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlZFNlbmRlcjsKQEAgLTQ1LDI0ICs1MCwyMCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RTY29wZVByb3BhZ2F0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkNhdGVnb3J5RnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkZ1bmN0aW9uU3RhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtQ29uY3VycmVuY3lFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOwpAQCAtNzAsMTEgKzcxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5NZXJnZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuTWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuVGhyZWVXYXlNZXJnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlcktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyTGluZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZGbGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZTb3J0OwpAQCAtODMsMjEgKzc5LDE1IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIC8qKgogICogTWVyZ2VzIGNoYW5nZXMgaW4gc3VibWlzc2lvbiBvcmRlciBpbnRvIGEgc2luZ2xlIGJyYW5jaC4KQEAgLTExOSw1MyArMTA5LDQ3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWVyZ2VPcC5jbGFzcyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSX0hFQURTX01BU1RFUiA9Ci0gICAgICBDb25zdGFudHMuUl9IRUFEUyArIENvbnN0YW50cy5NQVNURVI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgQ1JWVyA9Ci0gICAgICBuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgiQ1JWVyIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIFZSSUYgPQotICAgICAgbmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIlZSSUYiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFJFVklFV0VEX09OID0gbmV3IEZvb3RlcktleSgiUmV2aWV3ZWQtb24iKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IENIQU5HRV9JRCA9IG5ldyBGb290ZXJLZXkoIkNoYW5nZS1JZCIpOwogCiAgIC8qKiBBbW91bnQgb2YgdGltZSB0byB3YWl0IGJldHdlZW4gc3VibWl0IGFuZCBjaGVja2luZyBmb3IgbWlzc2luZyBkZXBzLiAqLwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFUEVOREVOQ1lfREVMQVkgPQogICAgICAgTUlMTElTRUNPTkRTLmNvbnZlcnQoMTUsIE1JTlVURVMpOwogCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTE9DS19GQUlMVVJFX1JFVFJZX0RFTEFZID0KKyAgICAgIE1JTExJU0VDT05EUy5jb252ZXJ0KDE1LCBTRUNPTkRTKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERVUExJQ0FURV9NRVNTQUdFX0lOVEVSVkFMID0KKyAgICAgIE1JTExJU0VDT05EUy5jb252ZXJ0KDEsIERBWVMpOworCiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CiAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOwotICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uU3RhdGUuRmFjdG9yeSBmdW5jdGlvblN0YXRlOwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgTGFiZWxOb3JtYWxpemVyIGxhYmVsTm9ybWFsaXplcjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CiAgIHByaXZhdGUgZmluYWwgTWVyZ2VkU2VuZGVyLkZhY3RvcnkgbWVyZ2VkU2VuZGVyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBNZXJnZUZhaWxTZW5kZXIuRmFjdG9yeSBtZXJnZUZhaWxTZW5kZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBNZXJnZVF1ZXVlIG1lcmdlUXVldWU7CiAKLSAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50OwogICBwcml2YXRlIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGRlc3RCcmFuY2g7Ci0gIHByaXZhdGUgUHJvamVjdCBkZXN0UHJvamVjdDsKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2U7Ci0gIHByaXZhdGUgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZDsKKyAgcHJpdmF0ZSBQcm9qZWN0U3RhdGUgZGVzdFByb2plY3Q7CisgIHByaXZhdGUgZmluYWwgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2U7CisgIHByaXZhdGUgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGU7CiAgIHByaXZhdGUgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gY29tbWl0czsKICAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKICAgcHJpdmF0ZSBSZXBvc2l0b3J5IHJlcG87CiAgIHByaXZhdGUgUmV2V2FsayBydzsKLSAgcHJpdmF0ZSBSZXZGbGFnIENBTl9NRVJHRTsKKyAgcHJpdmF0ZSBSZXZGbGFnIGNhbk1lcmdlRmxhZzsKICAgcHJpdmF0ZSBDb2RlUmV2aWV3Q29tbWl0IGJyYW5jaFRpcDsKICAgcHJpdmF0ZSBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwOwotICBwcml2YXRlIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZDsKLSAgcHJpdmF0ZSBSZWZVcGRhdGUgYnJhbmNoVXBkYXRlOwogICBwcml2YXRlIE9iamVjdEluc2VydGVyIGluc2VydGVyOworICBwcml2YXRlIFBlcnNvbklkZW50IHJlZkxvZ0lkZW50OwogCiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBDcmVhdGVDb2RlUmV2aWV3Tm90ZXMuRmFjdG9yeSBjb2RlUmV2aWV3Tm90ZXNGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSBzdWJtaXRTdHJhdGVneUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgU3VibW9kdWxlT3AuRmFjdG9yeSBzdWJPcEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZTsKICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yIHJlcXVlc3RTY29wZVByb3BhZ2F0b3I7CkBAIC0xNzMsMzAgKzE1NywyNyBAQAogCiAgIEBJbmplY3QKICAgTWVyZ2VPcChmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBncm0sIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmLAotICAgICAgZmluYWwgUHJvamVjdENhY2hlIHBjLCBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnMsCi0gICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJxLCBmaW5hbCBNZXJnZWRTZW5kZXIuRmFjdG9yeSBtc2YsCisgICAgICBmaW5hbCBQcm9qZWN0Q2FjaGUgcGMsIGZpbmFsIExhYmVsTm9ybWFsaXplciBmcywKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ3J1LCBmaW5hbCBNZXJnZWRTZW5kZXIuRmFjdG9yeSBtc2YsCiAgICAgICBmaW5hbCBNZXJnZUZhaWxTZW5kZXIuRmFjdG9yeSBtZnNmLAotICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiBjd3UsCi0gICAgICBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcHNpZiwKKyAgICAgIGZpbmFsIExhYmVsVHlwZXMgbGFiZWxUeXBlcywgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwc2lmLAogICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaXVmLAogICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAogICAgICAgZmluYWwgTWVyZ2VRdWV1ZSBtZXJnZVF1ZXVlLCBAQXNzaXN0ZWQgZmluYWwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoLAogICAgICAgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MsIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCi0gICAgICBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZSwgZmluYWwgQ3JlYXRlQ29kZVJldmlld05vdGVzLkZhY3RvcnkgY3JuZiwKKyAgICAgIGZpbmFsIFRhZ0NhY2hlIHRhZ0NhY2hlLAorICAgICAgZmluYWwgU3VibWl0U3RyYXRlZ3lGYWN0b3J5IHN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSwKICAgICAgIGZpbmFsIFN1Ym1vZHVsZU9wLkZhY3Rvcnkgc3ViT3BGYWN0b3J5LAogICAgICAgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZSwKICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZVByb3BhZ2F0b3IgcmVxdWVzdFNjb3BlUHJvcGFnYXRvciwKICAgICAgIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWUpIHsKICAgICByZXBvTWFuYWdlciA9IGdybTsKICAgICBzY2hlbWFGYWN0b3J5ID0gc2Y7Ci0gICAgZnVuY3Rpb25TdGF0ZSA9IGZzOworICAgIGxhYmVsTm9ybWFsaXplciA9IGZzOwogICAgIHByb2plY3RDYWNoZSA9IHBjOwotICAgIHJlcGxpY2F0aW9uID0gcnE7CisgICAgZ2l0UmVmVXBkYXRlZCA9IGdydTsKICAgICBtZXJnZWRTZW5kZXJGYWN0b3J5ID0gbXNmOwogICAgIG1lcmdlRmFpbFNlbmRlckZhY3RvcnkgPSBtZnNmOwotICAgIHVybFByb3ZpZGVyID0gY3d1OwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAgICAgcGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBzaWY7CiAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5ID0gaXVmOwogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKQEAgLTIwNCwyNCArMTg1LDIyIEBACiAgICAgdGhpcy5ob29rcyA9IGhvb2tzOwogICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOwogICAgIHRoaXMudGFnQ2FjaGUgPSB0YWdDYWNoZTsKLSAgICBjb2RlUmV2aWV3Tm90ZXNGYWN0b3J5ID0gY3JuZjsKKyAgICB0aGlzLnN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSA9IHN1Ym1pdFN0cmF0ZWd5RmFjdG9yeTsKICAgICB0aGlzLnN1Yk9wRmFjdG9yeSA9IHN1Yk9wRmFjdG9yeTsKICAgICB0aGlzLndvcmtRdWV1ZSA9IHdvcmtRdWV1ZTsKICAgICB0aGlzLnJlcXVlc3RTY29wZVByb3BhZ2F0b3IgPSByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwogICAgIHRoaXMuYWxsUHJvamVjdHNOYW1lID0gYWxsUHJvamVjdHNOYW1lOwotICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CiAgICAgZGVzdEJyYW5jaCA9IGJyYW5jaDsKLSAgICB0b01lcmdlID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgIHRvTWVyZ2UgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGUgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7CiAgICAgY29tbWl0cyA9IG5ldyBIYXNoTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4oKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHZlcmlmeU1lcmdlYWJpbGl0eShDaGFuZ2UgY2hhbmdlKSB7CisgIHB1YmxpYyB2b2lkIHZlcmlmeU1lcmdlYWJpbGl0eShDaGFuZ2UgY2hhbmdlKSB0aHJvd3MgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKICAgICAgIHNldERlc3RQcm9qZWN0KCk7CiAgICAgICBvcGVuUmVwb3NpdG9yeSgpOwogICAgICAgZmluYWwgUmVmIGRlc3RCcmFuY2hSZWYgPSByZXBvLmdldFJlZihkZXN0QnJhbmNoLmdldCgpKTsKLSAgICAgIHN1Ym1pdHRlZCA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOwotICAgICAgc3VibWl0dGVkLmFkZChjaGFuZ2UpOwogCiAgICAgICAvLyBUZXN0IG1lcmdlYWJpbGl0eSBvZiB0aGUgY2hhbmdlIGlmIHRoZSBsYXN0IG1lcmdlZCBzaGExCiAgICAgICAvLyBpbiB0aGUgYnJhbmNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHNoYTEKQEAgLTIzMSwxNyArMjEwLDI3IEBACiAgICAgICAgICAgfHwgKGRlc3RCcmFuY2hSZWYgIT0gbnVsbCAmJiAhZGVzdEJyYW5jaFJlZi5nZXRPYmplY3RJZCgpLmdldE5hbWUoKQogICAgICAgICAgICAgICAuZXF1YWxzKGNoYW5nZS5nZXRMYXN0U2hhMU1lcmdlVGVzdGVkKCkuZ2V0KCkpKSkgewogICAgICAgICBvcGVuU2NoZW1hKCk7Ci0gICAgICAgIHByZU1lcmdlKCk7CisgICAgICAgIG9wZW5CcmFuY2goKTsKKyAgICAgICAgdmFsaWRhdGVDaGFuZ2VMaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY2hhbmdlKSk7CisgICAgICAgIGlmICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBmaW5hbCBFbnRyeTxTdWJtaXRUeXBlLCBDb2RlUmV2aWV3Q29tbWl0PiBlID0KKyAgICAgICAgICAgICAgdG9NZXJnZS5lbnRyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc01lcmdlYWJsZSA9CisgICAgICAgICAgICAgIGNyZWF0ZVN0cmF0ZWd5KGUuZ2V0S2V5KCkpLmRyeVJ1bihicmFuY2hUaXAsIGUuZ2V0VmFsdWUoKSk7CiAKLSAgICAgICAgLy8gdXBkYXRlIHNoYTEgdGVzdGVkIG1lcmdlLgotICAgICAgICBpZiAoZGVzdEJyYW5jaFJlZiAhPSBudWxsKSB7Ci0gICAgICAgICAgY2hhbmdlLnNldExhc3RTaGExTWVyZ2VUZXN0ZWQobmV3IFJldklkKGRlc3RCcmFuY2hSZWYKLSAgICAgICAgICAgICAgLmdldE9iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgLy8gdXBkYXRlIHNoYTEgdGVzdGVkIG1lcmdlLgorICAgICAgICAgIGlmIChkZXN0QnJhbmNoUmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG5ldyBSZXZJZChkZXN0QnJhbmNoUmVmCisgICAgICAgICAgICAgICAgLmdldE9iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG5ldyBSZXZJZCgiIikpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaGFuZ2Uuc2V0TWVyZ2VhYmxlKGlzTWVyZ2VhYmxlKTsKKyAgICAgICAgICBkYi5jaGFuZ2VzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChuZXcgUmV2SWQoIiIpKTsKKyAgICAgICAgICBsb2cuZXJyb3IoIlRlc3QgbWVyZ2UgYXR0ZW1wdCBmb3IgY2hhbmdlOiAiICsgY2hhbmdlLmdldElkKCkKKyAgICAgICAgICAgICAgKyAiIGZhaWxlZCIpOwogICAgICAgICB9Ci0gICAgICAgIGNoYW5nZS5zZXRNZXJnZWFibGUoaXNNZXJnZWFibGUoY2hhbmdlKSk7Ci0gICAgICAgIGRiLmNoYW5nZXMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNoYW5nZSkpOwogICAgICAgfQogICAgIH0gY2F0Y2ggKE1lcmdlRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy5lcnJvcigiVGVzdCBtZXJnZSBhdHRlbXB0IGZvciBjaGFuZ2U6ICIgKyBjaGFuZ2UuZ2V0SWQoKQpAQCAtMjYzLDExICsyNTIsMTAgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBzZXREZXN0UHJvamVjdCgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgUHJvamVjdFN0YXRlIHBlID0gcHJvamVjdENhY2hlLmdldChkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpKTsKLSAgICBpZiAocGUgPT0gbnVsbCkgeworICAgIGRlc3RQcm9qZWN0ID0gcHJvamVjdENhY2hlLmdldChkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpKTsKKyAgICBpZiAoZGVzdFByb2plY3QgPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJObyBzdWNoIHByb2plY3Q6ICIgKyBkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpKTsKICAgICB9Ci0gICAgZGVzdFByb2plY3QgPSBwZS5nZXRQcm9qZWN0KCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgb3BlblNjaGVtYSgpIHRocm93cyBPcm1FeGNlcHRpb24gewpAQCAtMjc2LDE2ICsyNjQsNTkgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCBtZXJnZSgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgIHB1YmxpYyB2b2lkIG1lcmdlKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uLCBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKICAgICBzZXREZXN0UHJvamVjdCgpOwogICAgIHRyeSB7CiAgICAgICBvcGVuU2NoZW1hKCk7CiAgICAgICBvcGVuUmVwb3NpdG9yeSgpOwotICAgICAgc3VibWl0dGVkID0gZGIuY2hhbmdlcygpLnN1Ym1pdHRlZChkZXN0QnJhbmNoKS50b0xpc3QoKTsKLSAgICAgIHByZU1lcmdlKCk7Ci0gICAgICB1cGRhdGVCcmFuY2goKTsKLSAgICAgIHVwZGF0ZUNoYW5nZVN0YXR1cygpOwotICAgICAgdXBkYXRlU3Vic2NyaXB0aW9ucygpOworICAgICAgb3BlbkJyYW5jaCgpOworICAgICAgZmluYWwgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENoYW5nZT4gdG9TdWJtaXQgPQorICAgICAgICAgIHZhbGlkYXRlQ2hhbmdlTGlzdChkYi5jaGFuZ2VzKCkuc3VibWl0dGVkKGRlc3RCcmFuY2gpLnRvTGlzdCgpKTsKKworICAgICAgZmluYWwgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2VOZXh0VHVybiA9CisgICAgICAgICAgQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZU9uTmV4dFJ1biA9CisgICAgICAgICAgbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgICB0b01lcmdlTmV4dFR1cm4uY2xlYXIoKTsKKyAgICAgICAgZmluYWwgU2V0PFN1Ym1pdFR5cGU+IHN1Ym1pdFR5cGVzID0KKyAgICAgICAgICAgIG5ldyBIYXNoU2V0PFByb2plY3QuU3VibWl0VHlwZT4odG9NZXJnZS5rZXlTZXQoKSk7CisgICAgICAgIGZvciAoZmluYWwgU3VibWl0VHlwZSBzdWJtaXRUeXBlIDogc3VibWl0VHlwZXMpIHsKKyAgICAgICAgICBmaW5hbCBSZWZVcGRhdGUgYnJhbmNoVXBkYXRlID0gb3BlbkJyYW5jaCgpOworICAgICAgICAgIGZpbmFsIFN1Ym1pdFN0cmF0ZWd5IHN0cmF0ZWd5ID0gY3JlYXRlU3RyYXRlZ3koc3VibWl0VHlwZSk7CisgICAgICAgICAgcHJlTWVyZ2Uoc3RyYXRlZ3ksIHRvTWVyZ2UuZ2V0KHN1Ym1pdFR5cGUpKTsKKyAgICAgICAgICB1cGRhdGVCcmFuY2goc3RyYXRlZ3ksIGJyYW5jaFVwZGF0ZSk7CisgICAgICAgICAgdXBkYXRlQ2hhbmdlU3RhdHVzKHRvU3VibWl0LmdldChzdWJtaXRUeXBlKSk7CisgICAgICAgICAgdXBkYXRlU3Vic2NyaXB0aW9ucyh0b1N1Ym1pdC5nZXQoc3VibWl0VHlwZSkpOworCisgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PiBpdCA9CisgICAgICAgICAgICAgIHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGlmIChjb250YWluc01pc3NpbmdDb21taXRzKHRvTWVyZ2UsIGNvbW1pdCkKKyAgICAgICAgICAgICAgICB8fCBjb250YWluc01pc3NpbmdDb21taXRzKHRvTWVyZ2VOZXh0VHVybiwgY29tbWl0KSkgeworICAgICAgICAgICAgICAvLyBjaGFuZ2UgaGFzIG1pc3NpbmcgZGVwZW5kZW5jaWVzLCBidXQgYWxsIGNvbW1pdHMgd2hpY2ggYXJlCisgICAgICAgICAgICAgIC8vIG1pc3NpbmcgYXJlIHN0aWxsIGF0dGVtcHRlZCB0byBiZSBtZXJnZWQgd2l0aCBhbm90aGVyIHN1Ym1pdAorICAgICAgICAgICAgICAvLyBzdHJhdGVneSwgcmV0cnkgdG8gbWVyZ2UgdGhpcyBjb21taXQgaW4gdGhlIG5leHQgdHVybgorICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgY29tbWl0LnN0YXR1c0NvZGUgPSBudWxsOworICAgICAgICAgICAgICBjb21taXQubWlzc2luZyA9IG51bGw7CisgICAgICAgICAgICAgIHRvTWVyZ2VOZXh0VHVybi5wdXQoc3VibWl0VHlwZSwgY29tbWl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcG90ZW50aWFsbHlTdGlsbFN1Ym1pdHRhYmxlT25OZXh0UnVuLmFkZEFsbChwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGUpOworICAgICAgICAgIHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRvTWVyZ2UuY2xlYXIoKTsKKyAgICAgICAgdG9NZXJnZS5wdXRBbGwodG9NZXJnZU5leHRUdXJuKTsKKyAgICAgIH0KKworICAgICAgZm9yIChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCA6IHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZU9uTmV4dFJ1bikgeworICAgICAgICBmaW5hbCBDYXBhYmxlIGNhcGFibGUgPSBpc1N1Ym1pdFN0aWxsUG9zc2libGUoY29tbWl0KTsKKyAgICAgICAgaWYgKGNhcGFibGUgIT0gQ2FwYWJsZS5PSykgeworICAgICAgICAgIHNlbmRNZXJnZUZhaWwoY29tbWl0LmNoYW5nZSwKKyAgICAgICAgICAgICAgbWVzc2FnZShjb21taXQuY2hhbmdlLCBjYXBhYmxlLmdldE1lc3NhZ2UoKSksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBxdWVyeSB0aGUgZGF0YWJhc2UiLCBlKTsKICAgICB9IGZpbmFsbHkgewpAQCAtMzA0LDI0ICszMzUsNTkgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHZvaWQgcHJlTWVyZ2UoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7Ci0gICAgb3BlbkJyYW5jaCgpOwotICAgIHZhbGlkYXRlQ2hhbmdlTGlzdCgpOwotICAgIG1lcmdlVGlwID0gYnJhbmNoVGlwOwotICAgIHN3aXRjaCAoZGVzdFByb2plY3QuZ2V0U3VibWl0VHlwZSgpKSB7Ci0gICAgICBjYXNlIENIRVJSWV9QSUNLOgotICAgICAgICBjaGVycnlQaWNrQ2hhbmdlcygpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGQVNUX0ZPUldBUkRfT05MWToKLSAgICAgIGNhc2UgTUVSR0VfQUxXQVlTOgotICAgICAgY2FzZSBNRVJHRV9JRl9ORUNFU1NBUlk6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZWR1Y2VUb01pbmltYWxNZXJnZSgpOwotICAgICAgICBtZXJnZVRvcGljcygpOwotICAgICAgICBtYXJrQ2xlYW5NZXJnZXMoKTsKLSAgICAgICAgYnJlYWs7CisgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc01pc3NpbmdDb21taXRzKAorICAgICAgZmluYWwgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENvZGVSZXZpZXdDb21taXQ+IG1hcCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29tbWl0KSB7CisgICAgaWYgKCFpc1N1Ym1pdEZvck1pc3NpbmdDb21taXRzU3RpbGxQb3NzaWJsZShjb21taXQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgZm9yIChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1pc3NpbmdDb21taXQgOiBjb21taXQubWlzc2luZykgeworICAgICAgaWYgKCFtYXAuY29udGFpbnNWYWx1ZShtaXNzaW5nQ29tbWl0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzU3VibWl0Rm9yTWlzc2luZ0NvbW1pdHNTdGlsbFBvc3NpYmxlKGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29tbWl0KSB7CisgICAgaWYgKGNvbW1pdC5taXNzaW5nID09IG51bGwgfHwgY29tbWl0Lm1pc3NpbmcuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDb2RlUmV2aWV3Q29tbWl0IG1pc3NpbmdDb21taXQgOiBjb21taXQubWlzc2luZykgeworICAgICAgbG9hZENoYW5nZUluZm8obWlzc2luZ0NvbW1pdCk7CisKKyAgICAgIGlmIChtaXNzaW5nQ29tbWl0LnBhdGNoc2V0SWQgPT0gbnVsbCkgeworICAgICAgICAvLyBUaGUgY29tbWl0IGRvZXNuJ3QgaGF2ZSBhIHBhdGNoIHNldCwgc28gaXQgY2Fubm90IGJlCisgICAgICAgIC8vIHN1Ym1pdHRlZCB0byB0aGUgYnJhbmNoLgorICAgICAgICAvLworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmICghbWlzc2luZ0NvbW1pdC5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMoCisgICAgICAgICAgbWlzc2luZ0NvbW1pdC5wYXRjaHNldElkKSkgeworICAgICAgICAvLyBJZiB0aGUgbWlzc2luZyBjb21taXQgaXMgbm90IHRoZSBjdXJyZW50IHBhdGNoIHNldCwKKyAgICAgICAgLy8gdGhlIGNoYW5nZSBtdXN0IGJlIHJlYmFzZWQgdG8gdXNlIHRoZSBwcm9wZXIgcGFyZW50LgorICAgICAgICAvLworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwcml2YXRlIHZvaWQgcHJlTWVyZ2UoZmluYWwgU3VibWl0U3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgbWVyZ2VUaXAgPSBzdHJhdGVneS5ydW4oYnJhbmNoVGlwLCB0b01lcmdlKTsKKyAgICByZWZMb2dJZGVudCA9IHN0cmF0ZWd5LmdldFJlZkxvZ0lkZW50KCk7CisgICAgY29tbWl0cy5wdXRBbGwoc3RyYXRlZ3kuZ2V0TmV3Q29tbWl0cygpKTsKKyAgfQorCisgIHByaXZhdGUgU3VibWl0U3RyYXRlZ3kgY3JlYXRlU3RyYXRlZ3koZmluYWwgU3VibWl0VHlwZSBzdWJtaXRUeXBlKQorICAgICAgdGhyb3dzIE1lcmdlRXhjZXB0aW9uLCBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc3VibWl0U3RyYXRlZ3lGYWN0b3J5LmNyZWF0ZShzdWJtaXRUeXBlLCBkYiwgcmVwbywgcncsIGluc2VydGVyLAorICAgICAgICBjYW5NZXJnZUZsYWcsIGdldEFscmVhZHlBY2NlcHRlZChicmFuY2hUaXApLCBkZXN0QnJhbmNoKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBvcGVuUmVwb3NpdG9yeSgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CkBAIC0zNDQsMjAgKzQxMCwxNyBAQAogICAgIH07CiAgICAgcncuc29ydChSZXZTb3J0LlRPUE8pOwogICAgIHJ3LnNvcnQoUmV2U29ydC5DT01NSVRfVElNRV9ERVNDLCB0cnVlKTsKLSAgICBDQU5fTUVSR0UgPSBydy5uZXdGbGFnKCJDQU5fTUVSR0UiKTsKKyAgICBjYW5NZXJnZUZsYWcgPSBydy5uZXdGbGFnKCJDQU5fTUVSR0UiKTsKIAogICAgIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIG9wZW5CcmFuY2goKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewotICAgIGFscmVhZHlBY2NlcHRlZCA9IG5ldyBIYXNoU2V0PFJldkNvbW1pdD4oKTsKLQorICBwcml2YXRlIFJlZlVwZGF0ZSBvcGVuQnJhbmNoKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICBicmFuY2hVcGRhdGUgPSByZXBvLnVwZGF0ZVJlZihkZXN0QnJhbmNoLmdldCgpKTsKKyAgICAgIGZpbmFsIFJlZlVwZGF0ZSBicmFuY2hVcGRhdGUgPSByZXBvLnVwZGF0ZVJlZihkZXN0QnJhbmNoLmdldCgpKTsKICAgICAgIGlmIChicmFuY2hVcGRhdGUuZ2V0T2xkT2JqZWN0SWQoKSAhPSBudWxsKSB7CiAgICAgICAgIGJyYW5jaFRpcCA9CiAgICAgICAgICAgICAoQ29kZVJldmlld0NvbW1pdCkgcncucGFyc2VDb21taXQoYnJhbmNoVXBkYXRlLmdldE9sZE9iamVjdElkKCkpOwotICAgICAgICBhbHJlYWR5QWNjZXB0ZWQuYWRkKGJyYW5jaFRpcCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBicmFuY2hUaXAgPSBudWxsOwogICAgICAgfQpAQCAtMzY5LDE0ICs0MzIsMzEgQEAKICAgICAgICAgfSBlbHNlIGlmIChyZXBvLmdldEZ1bGxCcmFuY2goKS5lcXVhbHMoZGVzdEJyYW5jaC5nZXQoKSkpIHsKICAgICAgICAgICBicmFuY2hVcGRhdGUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChPYmplY3RJZC56ZXJvSWQoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBicmFuY2ggXCIiCi0gICAgICAgICAgICAgICsgYnJhbmNoVXBkYXRlLmdldFJlZigpLmdldE5hbWUoKSArICJcIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICAgIGZvciAoZmluYWwgQ2hhbmdlIGMgOiBkYi5jaGFuZ2VzKCkuc3VibWl0dGVkKGRlc3RCcmFuY2gpLnRvTGlzdCgpKSB7CisgICAgICAgICAgICBzZXROZXcoYywgbWVzc2FnZShjLCAiWW91ciBjaGFuZ2UgY291bGQgbm90IGJlIG1lcmdlZCwgIgorICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiIpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKAogICAgICAgICAgICAgIkZhaWxlZCB0byBjaGVjayBleGlzdGVuY2Ugb2YgZGVzdGluYXRpb24gYnJhbmNoIiwgZSk7CiAgICAgICB9CiAKKyAgICAgIHJldHVybiBicmFuY2hVcGRhdGU7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBicmFuY2giLCBlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFNldDxSZXZDb21taXQ+IGdldEFscmVhZHlBY2NlcHRlZChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGJyYW5jaFRpcCkKKyAgICAgIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkID0gbmV3IEhhc2hTZXQ8UmV2Q29tbWl0PigpOworCisgICAgaWYgKGJyYW5jaFRpcCAhPSBudWxsKSB7CisgICAgICBhbHJlYWR5QWNjZXB0ZWQuYWRkKGJyYW5jaFRpcCk7CisgICAgfQorCisgICAgdHJ5IHsKICAgICAgIGZvciAoZmluYWwgUmVmIHIgOiByZXBvLmdldEFsbFJlZnMoKS52YWx1ZXMoKSkgewogICAgICAgICBpZiAoci5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykKICAgICAgICAgICAgIHx8IHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfVEFHUykpIHsKQEAgLTM4OCwxMSArNDY4LDE3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBvcGVuIGJyYW5jaCIsIGUpOworICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJGYWlsZWQgdG8gZGV0ZXJtaW5lIGFscmVhZHkgYWNjZXB0ZWQgY29tbWl0cy4iLCBlKTsKICAgICB9CisKKyAgICByZXR1cm4gYWxyZWFkeUFjY2VwdGVkOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2hhbmdlTGlzdCgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENoYW5nZT4gdmFsaWRhdGVDaGFuZ2VMaXN0KAorICAgICAgZmluYWwgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBMaXN0TXVsdGltYXA8U3VibWl0VHlwZSwgQ2hhbmdlPiB0b1N1Ym1pdCA9CisgICAgICAgIEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworCiAgICAgZmluYWwgU2V0PE9iamVjdElkPiB0aXBzID0gbmV3IEhhc2hTZXQ8T2JqZWN0SWQ+KCk7CiAgICAgZm9yIChmaW5hbCBSZWYgciA6IHJlcG8uZ2V0QWxsUmVmcygpLnZhbHVlcygpKSB7CiAgICAgICB0aXBzLmFkZChyLmdldE9iamVjdElkKCkpOwpAQCAtNDU1LDEwICs1NDEsMTEgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKLSAgICAgIGlmIChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhicmFuY2hVcGRhdGUuZ2V0TmFtZSgpKSkgeworICAgICAgaWYgKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcuZXF1YWxzKGRlc3RCcmFuY2guZ2V0KCkpKSB7CiAgICAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBuZXdQYXJlbnQ7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgUHJvamVjdENvbmZpZyBjZmcgPSBuZXcgUHJvamVjdENvbmZpZyhkZXN0UHJvamVjdC5nZXROYW1lS2V5KCkpOworICAgICAgICAgIFByb2plY3RDb25maWcgY2ZnID0KKyAgICAgICAgICAgICAgbmV3IFByb2plY3RDb25maWcoZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CiAgICAgICAgICAgY2ZnLmxvYWQocmVwbywgY29tbWl0KTsKICAgICAgICAgICBuZXdQYXJlbnQgPSBjZmcuZ2V0UHJvamVjdCgpLmdldFBhcmVudChhbGxQcm9qZWN0c05hbWUpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtNDY2LDcgKzU1Myw4IEBACiAgICAgICAgICAgICAgIC5lcnJvcihDb21taXRNZXJnZVN0YXR1cy5JTlZBTElEX1BST0pFQ1RfQ09ORklHVVJBVElPTikpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBvbGRQYXJlbnQgPSBkZXN0UHJvamVjdC5nZXRQYXJlbnQoYWxsUHJvamVjdHNOYW1lKTsKKyAgICAgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IG9sZFBhcmVudCA9CisgICAgICAgICAgICBkZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0UGFyZW50KGFsbFByb2plY3RzTmFtZSk7CiAgICAgICAgIGlmIChvbGRQYXJlbnQgPT0gbnVsbCkgewogICAgICAgICAgIC8vIHVwZGF0ZSBvZiB0aGUgJ0FsbC1Qcm9qZWN0cycgcHJvamVjdAogICAgICAgICAgIGlmIChuZXdQYXJlbnQgIT0gbnVsbCkgewpAQCAtNTA2LDcgKzU5NCw3IEBACiAKICAgICAgIGlmIChicmFuY2hUaXAgIT0gbnVsbCkgewogICAgICAgICAvLyBJZiB0aGlzIGNvbW1pdCBpcyBhbHJlYWR5IG1lcmdlZCBpdHMgYSBidWcgaW4gdGhlIHF1ZXVpbmcgY29kZQotICAgICAgICAvLyB0aGF0IHdlIGdvdCBiYWNrIGhlcmUuIEp1c3QgbWFyayBpdCBjb21wbGV0ZSBhbmQgbW92ZSBvbi4gSXRzCisgICAgICAgIC8vIHRoYXQgd2UgZ290IGJhY2sgaGVyZS4gSnVzdCBtYXJrIGl0IGNvbXBsZXRlIGFuZCBtb3ZlIG9uLiBJdCdzCiAgICAgICAgIC8vIG1lcmdlZCBhbmQgdGhhdCBpcyBhbGwgdGhhdCBtYXR0ZXJlZCB0byB0aGUgcmVxdWVzdG9yLgogICAgICAgICAvLwogICAgICAgICB0cnkgewpAQCAtNTE5LDU5MyArNjA3LDU4IEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgY29tbWl0LmFkZChDQU5fTUVSR0UpOwotICAgICAgdG9NZXJnZS5hZGQoY29tbWl0KTsKKyAgICAgIGZpbmFsIFN1Ym1pdFR5cGUgc3VibWl0VHlwZSA9IGdldFN1Ym1pdFR5cGUoY2hnLCBwcyk7CisgICAgICBpZiAoc3VibWl0VHlwZSA9PSBudWxsKSB7CisgICAgICAgIGNvbW1pdHMucHV0KGNoYW5nZUlkLAorICAgICAgICAgICAgQ29kZVJldmlld0NvbW1pdC5lcnJvcihDb21taXRNZXJnZVN0YXR1cy5OT19TVUJNSVRfVFlQRSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgY29tbWl0LmFkZChjYW5NZXJnZUZsYWcpOworICAgICAgdG9NZXJnZS5wdXQoc3VibWl0VHlwZSwgY29tbWl0KTsKKyAgICAgIHRvU3VibWl0LnB1dChzdWJtaXRUeXBlLCBjaGcpOwogICAgIH0KKyAgICByZXR1cm4gdG9TdWJtaXQ7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgcmVkdWNlVG9NaW5pbWFsTWVyZ2UoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewotICAgIGZpbmFsIENvbGxlY3Rpb248Q29kZVJldmlld0NvbW1pdD4gaGVhZHM7CisgIHByaXZhdGUgU3VibWl0VHlwZSBnZXRTdWJtaXRUeXBlKGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIFBhdGNoU2V0IHBzKSB7CiAgICAgdHJ5IHsKLSAgICAgIGhlYWRzID0gbmV3IE1lcmdlU29ydGVyKHJ3LCBhbHJlYWR5QWNjZXB0ZWQsIENBTl9NRVJHRSkuc29ydCh0b01lcmdlKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkJyYW5jaCBoZWFkIHNvcnRpbmcgZmFpbGVkIiwgZSk7Ci0gICAgfQotCi0gICAgdG9NZXJnZS5jbGVhcigpOwotICAgIHRvTWVyZ2UuYWRkQWxsKGhlYWRzKTsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KHRvTWVyZ2UsIG5ldyBDb21wYXJhdG9yPENvZGVSZXZpZXdDb21taXQ+KCkgewotICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIENvZGVSZXZpZXdDb21taXQgYSwgZmluYWwgQ29kZVJldmlld0NvbW1pdCBiKSB7Ci0gICAgICAgIHJldHVybiBhLm9yaWdpbmFsT3JkZXIgLSBiLm9yaWdpbmFsT3JkZXI7CisgICAgICBmaW5hbCBTdWJtaXRUeXBlUmVjb3JkIHIgPQorICAgICAgICAgIGNoYW5nZUNvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoY2hhbmdlLAorICAgICAgICAgICAgICBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGNoYW5nZS5nZXRPd25lcigpKSkKKyAgICAgICAgICAgICAgLmdldFN1Ym1pdFR5cGVSZWNvcmQoZGIsIHBzKTsKKyAgICAgIGlmIChyLnN0YXR1cyAhPSBTdWJtaXRUeXBlUmVjb3JkLlN0YXR1cy5PSykgeworICAgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBnZXQgc3VibWl0IHR5cGUgZm9yICIgKyBjaGFuZ2UuZ2V0S2V5KCkpOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtZXJnZVRvcGljcygpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7Ci0gICAgLy8gVGFrZSB0aGUgZmlyc3QgZmFzdC1mb3J3YXJkIGF2YWlsYWJsZSwgaWYgYW55IGlzIGF2YWlsYWJsZSBpbiB0aGUgc2V0LgotICAgIC8vCi0gICAgaWYgKGRlc3RQcm9qZWN0LmdldFN1Ym1pdFR5cGUoKSAhPSBQcm9qZWN0LlN1Ym1pdFR5cGUuTUVSR0VfQUxXQVlTKSB7Ci0gICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPENvZGVSZXZpZXdDb21taXQ+IGkgPSB0b01lcmdlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICB0cnkgewotICAgICAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiA9IGkubmV4dCgpOwotICAgICAgICAgIGlmIChtZXJnZVRpcCA9PSBudWxsIHx8IHJ3LmlzTWVyZ2VkSW50byhtZXJnZVRpcCwgbikpIHsKLSAgICAgICAgICAgIG1lcmdlVGlwID0gbjsKLSAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBmYXN0LWZvcndhcmQgdGVzdCBkdXJpbmcgbWVyZ2UiLCBlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChkZXN0UHJvamVjdC5nZXRTdWJtaXRUeXBlKCkgPT0gUHJvamVjdC5TdWJtaXRUeXBlLkZBU1RfRk9SV0FSRF9PTkxZKSB7Ci0gICAgICAvLyBJZiB0aGlzIHByb2plY3Qgb25seSBwZXJtaXRzIGZhc3QtZm9yd2FyZHMsIGFib3J0IGV2ZXJ5dGhpbmcgZWxzZS4KLSAgICAgIC8vCi0gICAgICB3aGlsZSAoIXRvTWVyZ2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiA9IHRvTWVyZ2UucmVtb3ZlKDApOwotICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5OT1RfRkFTVF9GT1JXQVJEOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEZvciBldmVyeSBvdGhlciBjb21taXQgZG8gYSBwYWlyLXdpc2UgbWVyZ2UuCi0gICAgICAvLwotICAgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgewotICAgICAgICBtZXJnZU9uZUNvbW1pdCh0b01lcmdlLnJlbW92ZSgwKSk7Ci0gICAgICB9CisgICAgICByZXR1cm4gci50eXBlOworICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkZhaWxlZCB0byBnZXQgc3VibWl0IHR5cGUgZm9yICIgKyBjaGFuZ2UuZ2V0S2V5KCksIGUpOworICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIG1lcmdlT25lQ29tbWl0KGZpbmFsIENvZGVSZXZpZXdDb21taXQgbikgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBUaHJlZVdheU1lcmdlciBtID0gbmV3VGhyZWVXYXlNZXJnZXIoKTsKLSAgICB0cnkgewotICAgICAgaWYgKG0ubWVyZ2UobmV3IEFueU9iamVjdElkW10ge21lcmdlVGlwLCBufSkpIHsKLSAgICAgICAgd3JpdGVNZXJnZUNvbW1pdChtLmdldFJlc3VsdFRyZWVJZCgpLCBuKTsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmFpbGVkKG4sIENvbW1pdE1lcmdlU3RhdHVzLlBBVEhfQ09ORkxJQ1QpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGlmIChlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJNdWx0aXBsZSBtZXJnZSBiYXNlcyBmb3IiKSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGZhaWxlZChuLCBDb21taXRNZXJnZVN0YXR1cy5DUklTU19DUk9TU19NRVJHRSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFRocmVlV2F5TWVyZ2VyIG5ld1RocmVlV2F5TWVyZ2VyKCkgewotICAgIFRocmVlV2F5TWVyZ2VyIG07Ci0gICAgaWYgKGRlc3RQcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpIHsKLSAgICAgIC8vIFNldHRpbmdzIGZvciB0aGlzIHByb2plY3QgYWxsb3cgdXMgdG8gdHJ5IGFuZAotICAgICAgLy8gYXV0b21hdGljYWxseSByZXNvbHZlIGNvbmZsaWN0cyB3aXRoaW4gZmlsZXMgaWYgbmVlZGVkLgotICAgICAgLy8gVXNlIFJlc29sdmVNZXJnZSBhbmQgaW5zdHJ1Y3QgdG8gb3BlcmF0ZSBpbiBjb3JlLgotICAgICAgbSA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRS5uZXdNZXJnZXIocmVwbywgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vIGF1dG8gY29uZmxpY3QgcmVzb2x2aW5nIGFsbG93ZWQuIElmIGFueSBvZiB0aGUKLSAgICAgIC8vIGFmZmVjdGVkIGZpbGVzIHdhcyBtb2RpZmllZCwgbWVyZ2Ugd2lsbCBmYWlsLgotICAgICAgbSA9IE1lcmdlU3RyYXRlZ3kuU0lNUExFX1RXT19XQVlfSU5fQ09SRS5uZXdNZXJnZXIocmVwbyk7Ci0gICAgfQotICAgIG0uc2V0T2JqZWN0SW5zZXJ0ZXIobmV3IE9iamVjdEluc2VydGVyLkZpbHRlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIE9iamVjdEluc2VydGVyIGRlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gaW5zZXJ0ZXI7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gbTsKLSAgfQotCi0gIHByaXZhdGUgQ29kZVJldmlld0NvbW1pdCBmYWlsZWQoZmluYWwgQ29kZVJldmlld0NvbW1pdCBuLAotICAgICAgZmluYWwgQ29tbWl0TWVyZ2VTdGF0dXMgZmFpbHVyZSkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCi0gICAgICBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgcncucmVzZXQoKTsKLSAgICBydy5tYXJrU3RhcnQobik7Ci0gICAgcncubWFya1VuaW50ZXJlc3RpbmcobWVyZ2VUaXApOwotICAgIENvZGVSZXZpZXdDb21taXQgZmFpbGVkOwotICAgIHdoaWxlICgoZmFpbGVkID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgewotICAgICAgZmFpbGVkLnN0YXR1c0NvZGUgPSBmYWlsdXJlOwotICAgIH0KLSAgICByZXR1cm4gZmFpbGVkOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlTWVyZ2VDb21taXQoT2JqZWN0SWQgdHJlZUlkLCBDb2RlUmV2aWV3Q29tbWl0IG4pCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24gewotICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gbWVyZ2VkID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOwotICAgIHJ3LnJlc2V0KCk7Ci0gICAgcncubWFya1N0YXJ0KG4pOwotICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKG1lcmdlVGlwKTsKLSAgICBmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogcncpIHsKLSAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY3JjID0gKENvZGVSZXZpZXdDb21taXQpIGM7Ci0gICAgICBpZiAoY3JjLnBhdGNoc2V0SWQgIT0gbnVsbCkgewotICAgICAgICBtZXJnZWQuYWRkKGNyYyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2didWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGlmIChtZXJnZWQuc2l6ZSgpID09IDEpIHsKLSAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgYyA9IG1lcmdlZC5nZXQoMCk7Ci0gICAgICBydy5wYXJzZUJvZHkoYyk7Ci0gICAgICBtc2didWYuYXBwZW5kKCJNZXJnZSBcIiIpOwotICAgICAgbXNnYnVmLmFwcGVuZChjLmdldFNob3J0TWVzc2FnZSgpKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIlwiIik7Ci0KLSAgICB9IGVsc2UgewotICAgICAgbXNnYnVmLmFwcGVuZCgiTWVyZ2UgY2hhbmdlcyAiKTsKLSAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q29kZVJldmlld0NvbW1pdD4gaSA9IG1lcmdlZC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgbXNnYnVmLmFwcGVuZChpLm5leHQoKS5jaGFuZ2UuZ2V0S2V5KCkuYWJicmV2aWF0ZSgpKTsKLSAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgbXNnYnVmLmFwcGVuZCgnLCcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFSX0hFQURTX01BU1RFUi5lcXVhbHMoZGVzdEJyYW5jaC5nZXQoKSkpIHsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIiBpbnRvICIpOwotICAgICAgbXNnYnVmLmFwcGVuZChkZXN0QnJhbmNoLmdldFNob3J0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAobWVyZ2VkLnNpemUoKSA+IDEpIHsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIlxuXG4qIGNoYW5nZXM6XG4iKTsKLSAgICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjIDogbWVyZ2VkKSB7Ci0gICAgICAgIHJ3LnBhcnNlQm9keShjKTsKLSAgICAgICAgbXNnYnVmLmFwcGVuZCgiICAiKTsKLSAgICAgICAgbXNnYnVmLmFwcGVuZChjLmdldFNob3J0TWVzc2FnZSgpKTsKLSAgICAgICAgbXNnYnVmLmFwcGVuZCgiXG4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBQZXJzb25JZGVudCBhdXRob3JJZGVudCA9IGNvbXB1dGVBdXRob3IobWVyZ2VkKTsKLQotICAgIGZpbmFsIENvbW1pdEJ1aWxkZXIgbWVyZ2VDb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOwotICAgIG1lcmdlQ29tbWl0LnNldFRyZWVJZCh0cmVlSWQpOwotICAgIG1lcmdlQ29tbWl0LnNldFBhcmVudElkcyhtZXJnZVRpcCwgbik7Ci0gICAgbWVyZ2VDb21taXQuc2V0QXV0aG9yKGF1dGhvcklkZW50KTsKLSAgICBtZXJnZUNvbW1pdC5zZXRDb21taXR0ZXIobXlJZGVudCk7Ci0gICAgbWVyZ2VDb21taXQuc2V0TWVzc2FnZShtc2didWYudG9TdHJpbmcoKSk7Ci0KLSAgICBtZXJnZVRpcCA9IChDb2RlUmV2aWV3Q29tbWl0KSBydy5wYXJzZUNvbW1pdChjb21taXQobWVyZ2VDb21taXQpKTsKLSAgfQotCi0gIHByaXZhdGUgUGVyc29uSWRlbnQgY29tcHV0ZUF1dGhvcigKLSAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gY29kZVJldmlld0NvbW1pdHMpIHsKLSAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IG51bGw7Ci0gICAgZm9yIChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGMgOiBjb2RlUmV2aWV3Q29tbWl0cykgewotICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBzID0gZ2V0U3VibWl0dGVyKGRiLCBjLnBhdGNoc2V0SWQpOwotICAgICAgaWYgKHN1Ym1pdHRlciA9PSBudWxsCi0gICAgICAgICAgfHwgKHMgIT0gbnVsbCAmJiBzLmdldEdyYW50ZWQoKS5jb21wYXJlVG8oc3VibWl0dGVyLmdldEdyYW50ZWQoKSkgPiAwKSkgewotICAgICAgICBzdWJtaXR0ZXIgPSBzOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRyeSB0byB1c2UgdGhlIHN1Ym1pdHRlcidzIGlkZW50aXR5IGZvciB0aGUgbWVyZ2UgY29tbWl0IGF1dGhvci4KLSAgICAvLyBJZiBhbGwgb2YgdGhlIGNvbW1pdHMgYmVpbmcgbWVyZ2VkIGFyZSBjcmVhdGVkIGJ5IHRoZSBzdWJtaXR0ZXIsCi0gICAgLy8gcHJlZmVyIHRoZSBpZGVudGl0eSBsaW5lIHRoZXkgdXNlZCBpbiB0aGUgY29tbWl0cyByYXRoZXIgdGhhbiB0aGUKLSAgICAvLyBwcmVmZXJyZWQgaWRlbnRpdHkgc3RvcmVkIGluIHRoZSB1c2VyIGFjY291bnQuIFRoaXMgd2F5IHRoZSBHaXQKLSAgICAvLyBjb21taXQgcmVjb3JkcyBhcmUgbW9yZSBjb25zaXN0ZW50IGludGVybmFsbHkuCi0gICAgLy8KLSAgICBQZXJzb25JZGVudCBhdXRob3JJZGVudDsKLSAgICBpZiAoc3VibWl0dGVyICE9IG51bGwpIHsKLSAgICAgIElkZW50aWZpZWRVc2VyIHdobyA9Ci0gICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShzdWJtaXR0ZXIuZ2V0QWNjb3VudElkKCkpOwotICAgICAgU2V0PFN0cmluZz4gZW1haWxzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgZm9yIChSZXZDb21taXQgYyA6IGNvZGVSZXZpZXdDb21taXRzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcncucGFyc2VCb2R5KGMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBwYXJzZSBjb21taXQgIiArIGMubmFtZSgpICsgIiBpbiAiICsgZGVzdEJyYW5jaCwgZSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZW1haWxzLmFkZChjLmdldEF1dGhvcklkZW50KCkuZ2V0RW1haWxBZGRyZXNzKCkpOwotICAgICAgfQotCi0gICAgICBmaW5hbCBUaW1lc3RhbXAgZHQgPSBzdWJtaXR0ZXIuZ2V0R3JhbnRlZCgpOwotICAgICAgZmluYWwgVGltZVpvbmUgdHogPSBteUlkZW50LmdldFRpbWVab25lKCk7Ci0gICAgICBpZiAoZW1haWxzLnNpemUoKSA9PSAxCi0gICAgICAgICAgJiYgd2hvLmdldEVtYWlsQWRkcmVzc2VzKCkuY29udGFpbnMoZW1haWxzLml0ZXJhdG9yKCkubmV4dCgpKSkgewotICAgICAgICBhdXRob3JJZGVudCA9Ci0gICAgICAgICAgICBuZXcgUGVyc29uSWRlbnQoY29kZVJldmlld0NvbW1pdHMuZ2V0KDApLmdldEF1dGhvcklkZW50KCksIGR0LCB0eik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhdXRob3JJZGVudCA9IHdoby5uZXdDb21taXR0ZXJJZGVudChkdCwgdHopOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBhdXRob3JJZGVudCA9IG15SWRlbnQ7Ci0gICAgfQotICAgIHJldHVybiBhdXRob3JJZGVudDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtYXJrQ2xlYW5NZXJnZXMoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewotICAgIGlmIChtZXJnZVRpcCA9PSBudWxsKSB7Ci0gICAgICAvLyBJZiBtZXJnZVRpcCBpcyBudWxsIGhlcmUsIGJyYW5jaFRpcCB3YXMgbnVsbCwgaW5kaWNhdGluZyBhIG5ldyBicmFuY2gKLSAgICAgIC8vIGF0IHRoZSBzdGFydCBvZiB0aGUgbWVyZ2UgcHJvY2Vzcy4gV2UgYWxzbyBlbGVjdGVkIHRvIG1lcmdlIG5vdGhpbmcsCi0gICAgICAvLyBwcm9iYWJseSBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMuIE5vdGhpbmcgd2FzIGNsZWFubHkgbWVyZ2VkLgotICAgICAgLy8KKyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJyYW5jaChmaW5hbCBTdWJtaXRTdHJhdGVneSBzdHJhdGVneSwKKyAgICAgIGZpbmFsIFJlZlVwZGF0ZSBicmFuY2hVcGRhdGUpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgaWYgKChicmFuY2hUaXAgPT0gbnVsbCAmJiBtZXJnZVRpcCA9PSBudWxsKSB8fCBicmFuY2hUaXAgPT0gbWVyZ2VUaXApIHsKKyAgICAgIC8vIG5vdGhpbmcgdG8gZG8KICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICB0cnkgewotICAgICAgcncucmVzZXQoKTsKLSAgICAgIHJ3LnNvcnQoUmV2U29ydC5UT1BPKTsKLSAgICAgIHJ3LnNvcnQoUmV2U29ydC5SRVZFUlNFLCB0cnVlKTsKLSAgICAgIHJ3Lm1hcmtTdGFydChtZXJnZVRpcCk7Ci0gICAgICBmb3IgKFJldkNvbW1pdCBjIDogYWxyZWFkeUFjY2VwdGVkKSB7Ci0gICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKGMpOwotICAgICAgfQotCi0gICAgICBDb2RlUmV2aWV3Q29tbWl0IGM7Ci0gICAgICB3aGlsZSAoKGMgPSAoQ29kZVJldmlld0NvbW1pdCkgcncubmV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChjLnBhdGNoc2V0SWQgIT0gbnVsbCkgewotICAgICAgICAgIGMuc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX01FUkdFOwotICAgICAgICAgIGlmIChicmFuY2hVcGRhdGUuZ2V0UmVmTG9nSWRlbnQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRSZWZMb2dJZGVudChnZXRTdWJtaXR0ZXIoZGIsIGMucGF0Y2hzZXRJZCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1hcmsgY2xlYW4gbWVyZ2VzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldFJlZkxvZ0lkZW50KGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXVkaXQpIHsKLSAgICBpZiAoc3VibWl0QXVkaXQgIT0gbnVsbCkgewotICAgICAgYnJhbmNoVXBkYXRlLnNldFJlZkxvZ0lkZW50KGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoCi0gICAgICAgICAgc3VibWl0QXVkaXQuZ2V0QWNjb3VudElkKCkpLm5ld1JlZkxvZ0lkZW50KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVycnlQaWNrQ2hhbmdlcygpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKLSAgICB3aGlsZSAoIXRvTWVyZ2UuaXNFbXB0eSgpKSB7Ci0gICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4gPSB0b01lcmdlLnJlbW92ZSgwKTsKLSAgICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG0gPSBuZXdUaHJlZVdheU1lcmdlcigpOwotICAgICAgdHJ5IHsKLSAgICAgICAgaWYgKG1lcmdlVGlwID09IG51bGwpIHsKLSAgICAgICAgICAvLyBUaGUgYnJhbmNoIGlzIHVuYm9ybi4gVGFrZSBhIGZhc3QtZm9yd2FyZCByZXNvbHV0aW9uIHRvCi0gICAgICAgICAgLy8gY3JlYXRlIHRoZSBicmFuY2guCi0gICAgICAgICAgLy8KLSAgICAgICAgICBtZXJnZVRpcCA9IG47Ci0gICAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0U7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChuLmdldFBhcmVudENvdW50KCkgPT0gMCkgewotICAgICAgICAgIC8vIFJlZnVzZSB0byBtZXJnZSBhIHJvb3QgY29tbWl0IGludG8gYW4gZXhpc3RpbmcgYnJhbmNoLAotICAgICAgICAgIC8vIHdlIGNhbm5vdCBvYnRhaW4gYSBkZWx0YSBmb3IgdGhlIGNoZXJyeS1waWNrIHRvIGFwcGx5LgotICAgICAgICAgIC8vCi0gICAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0FOTk9UX0NIRVJSWV9QSUNLX1JPT1Q7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChuLmdldFBhcmVudENvdW50KCkgPT0gMSkgewotICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcmVudCwgYSBjaGVycnktcGljayBjYW4gYmUgZG9uZSBieQotICAgICAgICAgIC8vIHRha2luZyB0aGUgZGVsdGEgcmVsYXRpdmUgdG8gdGhhdCBvbmUgcGFyZW50IGFuZCByZWRvaW5nCi0gICAgICAgICAgLy8gdGhhdCBvbiB0aGUgY3VycmVudCBtZXJnZSB0aXAuCi0gICAgICAgICAgLy8KLSAgICAgICAgICBtLnNldEJhc2Uobi5nZXRQYXJlbnQoMCkpOwotICAgICAgICAgIGlmIChtLm1lcmdlKG1lcmdlVGlwLCBuKSkgewotICAgICAgICAgICAgd3JpdGVDaGVycnlQaWNrQ29tbWl0KG0sIG4pOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLlBBVEhfQ09ORkxJQ1Q7Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHBhcmVudHMsIHNvIHRoaXMgaXMgYSBtZXJnZSBjb21taXQuIFdlCi0gICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0byBjaGVycnktcGljayB0aGUgbWVyZ2UgYXMgY2xpZW50cyBjYW4ndCBlYXNpbHkKLSAgICAgICAgICAvLyByZWJhc2UgdGhlaXIgaGlzdG9yeSB3aXRoIHRoYXQgbWVyZ2UgcHJlc2VudCBhbmQgcmVwbGFjZWQKLSAgICAgICAgICAvLyBieSBhbiBlcXVpdmFsZW50IG1lcmdlIHdpdGggYSBkaWZmZXJlbnQgZmlyc3QgcGFyZW50LiBTbwotICAgICAgICAgIC8vIGluc3RlYWQgYmVoYXZlIGFzIHRob3VnaCBNRVJHRV9JRl9ORUNFU1NBUlkgd2FzIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoaGFzRGVwZW5kZW5jaWVzTWV0KG4pKSB7Ci0gICAgICAgICAgICBpZiAocncuaXNNZXJnZWRJbnRvKG1lcmdlVGlwLCBuKSkgewotICAgICAgICAgICAgICBtZXJnZVRpcCA9IG47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBtZXJnZU9uZUNvbW1pdChuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hcmtDbGVhbk1lcmdlcygpOwotCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCBtZXQuIFRoZSBzdGF0dXMgd2FzCi0gICAgICAgICAgICAvLyBhbHJlYWR5IG1hcmtlZCBvbiB0aGUgY29tbWl0IHNvIHdlIGhhdmUgbm90aGluZyBmdXJ0aGVyCi0gICAgICAgICAgICAvLyB0byBwZXJmb3JtIGF0IHRoaXMgdGltZS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaGFzRGVwZW5kZW5jaWVzTWV0KGZpbmFsIENvZGVSZXZpZXdDb21taXQgbikKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy8gT2RkbHkgd2UgY2FuIGRldGVybWluZSB0aGlzIGJ5IHJ1bm5pbmcgdGhlIG1lcmdlIHNvcnRlciBhbmQKLSAgICAvLyBsb29rIGZvciB0aGUgb25lIGNvbW1pdCB0byBjb21lIG91dCBhcyBhIHJlc3VsdC4gVGhpcyB3b3JrcwotICAgIC8vIGFzIHRoZSBtZXJnZSBzb3J0ZXIgY2hlY2tzIHRoZSBkZXBlbmRlbmN5IGNoYWluIGFzIHBhcnQgb2YKLSAgICAvLyBpdHMgbG9naWMgdHJ5aW5nIHRvIGZpbmQgYSBtaW5pbWFsIG1lcmdlIHBhdGguCi0gICAgLy8KLSAgICByZXR1cm4gbmV3IE1lcmdlU29ydGVyKHJ3LCBhbHJlYWR5QWNjZXB0ZWQsIENBTl9NRVJHRSkuc29ydCgKLSAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG4pKS5jb250YWlucyhuKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNoZXJyeVBpY2tDb21taXQoZmluYWwgTWVyZ2VyIG0sIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbikKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKLSAgICBydy5wYXJzZUJvZHkobik7Ci0KLSAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlcnMgPSBuLmdldEZvb3RlckxpbmVzKCk7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2didWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIG1zZ2J1Zi5hcHBlbmQobi5nZXRGdWxsTWVzc2FnZSgpKTsKLQotICAgIGlmIChtc2didWYubGVuZ3RoKCkgPT0gMCkgewotICAgICAgLy8gV1RGLCBhbiBlbXB0eSBjb21taXQgbWVzc2FnZT8KLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIjxubyBjb21taXQgbWVzc2FnZSBwcm92aWRlZD4iKTsKLSAgICB9Ci0gICAgaWYgKG1zZ2J1Zi5jaGFyQXQobXNnYnVmLmxlbmd0aCgpIC0gMSkgIT0gJ1xuJykgewotICAgICAgLy8gTWlzc2luZyBhIHRyYWlsaW5nIExGPyBDb3JyZWN0IGl0IChwZXJoYXBzIHRoZSBlZGl0b3Igd2FzIGJyb2tlbikuCi0gICAgICBtc2didWYuYXBwZW5kKCdcbicpOwotICAgIH0KLSAgICBpZiAoZm9vdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgIC8vIERvZXNuJ3QgZW5kIGluIGEgIlNpZ25lZC1vZmYtYnk6IC4uLiIgc3R5bGUgbGluZT8gQWRkIGFub3RoZXIgbGluZQotICAgICAgLy8gYnJlYWsgdG8gc3RhcnQgYSBuZXcgcGFyYWdyYXBoIGZvciB0aGUgcmV2aWV3ZWQtYnkgdGFnIGxpbmVzLgotICAgICAgLy8KLSAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgfQotCi0gICAgaWYgKCFjb250YWlucyhmb290ZXJzLCBDSEFOR0VfSUQsIG4uY2hhbmdlLmdldEtleSgpLmdldCgpKSkgewotICAgICAgbXNnYnVmLmFwcGVuZChDSEFOR0VfSUQuZ2V0TmFtZSgpKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIjogIik7Ci0gICAgICBtc2didWYuYXBwZW5kKG4uY2hhbmdlLmdldEtleSgpLmdldCgpKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIHNpdGVVcmwgPSB1cmxQcm92aWRlci5nZXQoKTsKLSAgICBpZiAoc2l0ZVVybCAhPSBudWxsKSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgdXJsID0gc2l0ZVVybCArIG4ucGF0Y2hzZXRJZC5nZXRQYXJlbnRLZXkoKS5nZXQoKTsKLSAgICAgIGlmICghY29udGFpbnMoZm9vdGVycywgUkVWSUVXRURfT04sIHVybCkpIHsKLSAgICAgICAgbXNnYnVmLmFwcGVuZChSRVZJRVdFRF9PTi5nZXROYW1lKCkpOwotICAgICAgICBtc2didWYuYXBwZW5kKCI6ICIpOwotICAgICAgICBtc2didWYuYXBwZW5kKHVybCk7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBdWRpdCA9IG51bGw7Ci0gICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbExpc3QgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBhcHByb3ZhbExpc3QgPQotICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChuLnBhdGNoc2V0SWQpLnRvTGlzdCgpOwotICAgICAgQ29sbGVjdGlvbnMuc29ydChhcHByb3ZhbExpc3QsIG5ldyBDb21wYXJhdG9yPFBhdGNoU2V0QXBwcm92YWw+KCkgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhLCBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGIpIHsKLSAgICAgICAgICByZXR1cm4gYS5nZXRHcmFudGVkKCkuY29tcGFyZVRvKGIuZ2V0R3JhbnRlZCgpKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxMaXN0KSB7Ci0gICAgICAgIGlmIChhLmdldFZhbHVlKCkgPD0gMCkgewotICAgICAgICAgIC8vIE5lZ2F0aXZlIHZvdGVzIGFyZW4ndCBjb3VudGVkLgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEFwcHJvdmFsQ2F0ZWdvcnkuU1VCTUlULmVxdWFscyhhLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgICAvLyBTdWJtaXQgaXMgdHJlYXRlZCBzcGVjaWFsbHksIGJlbG93IChiZWNvbWVzIGNvbW1pdHRlcikKLSAgICAgICAgICAvLwotICAgICAgICAgIGlmIChzdWJtaXRBdWRpdCA9PSBudWxsCi0gICAgICAgICAgICAgIHx8IGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhzdWJtaXRBdWRpdC5nZXRHcmFudGVkKCkpID4gMCkgewotICAgICAgICAgICAgc3VibWl0QXVkaXQgPSBhOwotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFjY291bnQgYWNjID0KLSAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYS5nZXRBY2NvdW50SWQoKSkuZ2V0QWNjb3VudCgpOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGlkZW50YnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgaWYgKGFjYy5nZXRGdWxsTmFtZSgpICE9IG51bGwgJiYgYWNjLmdldEZ1bGxOYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgaWYgKGlkZW50YnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWRlbnRidWYuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlkZW50YnVmLmFwcGVuZChhY2MuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwKLSAgICAgICAgICAgICYmIGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgIGlmIChpc1NpZ25lZE9mZkJ5KGZvb3RlcnMsIGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlkZW50YnVmLmFwcGVuZCgnICcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJzwnKTsKLSAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoYWNjLmdldFByZWZlcnJlZEVtYWlsKCkpOwotICAgICAgICAgIGlkZW50YnVmLmFwcGVuZCgnPicpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgLy8gTm90aGluZyByZWFzb25hYmxlIHRvIGRlc2NyaWJlIHRoZW0gYnk/IElnbm9yZSB0aGVtLgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHRhZzsKLSAgICAgICAgaWYgKENSVlcuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKSkgewotICAgICAgICAgIHRhZyA9ICJSZXZpZXdlZC1ieSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoVlJJRi5lcXVhbHMoYS5nZXRDYXRlZ29yeUlkKCkpKSB7Ci0gICAgICAgICAgdGFnID0gIlRlc3RlZC1ieSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZmluYWwgQXBwcm92YWxUeXBlIGF0ID0KLSAgICAgICAgICAgICAgYXBwcm92YWxUeXBlcy5ieUlkKGEuZ2V0Q2F0ZWdvcnlJZCgpKTsKLSAgICAgICAgICBpZiAoYXQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQSBkZXByZWNhdGVkL2RlbGV0ZWQgYXBwcm92YWwgdHlwZSwgaWdub3JlIGl0LgotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRhZyA9IGF0LmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpLnJlcGxhY2UoJyAnLCAnLScpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb250YWlucyhmb290ZXJzLCBuZXcgRm9vdGVyS2V5KHRhZyksIGlkZW50YnVmLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgbXNnYnVmLmFwcGVuZCh0YWcpOwotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgbXNnYnVmLmFwcGVuZChpZGVudGJ1Zik7Ci0gICAgICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuZXJyb3IoIkNhbid0IHJlYWQgYXBwcm92YWwgcmVjb3JkcyBmb3IgIiArIG4ucGF0Y2hzZXRJZCwgZSk7Ci0gICAgfQotCi0gICAgZmluYWwgQ29tbWl0QnVpbGRlciBtZXJnZUNvbW1pdCA9IG5ldyBDb21taXRCdWlsZGVyKCk7Ci0gICAgbWVyZ2VDb21taXQuc2V0VHJlZUlkKG0uZ2V0UmVzdWx0VHJlZUlkKCkpOwotICAgIG1lcmdlQ29tbWl0LnNldFBhcmVudElkKG1lcmdlVGlwKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRBdXRob3Iobi5nZXRBdXRob3JJZGVudCgpKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRDb21taXR0ZXIodG9Db21taXR0ZXJJZGVudChzdWJtaXRBdWRpdCkpOwotICAgIG1lcmdlQ29tbWl0LnNldE1lc3NhZ2UobXNnYnVmLnRvU3RyaW5nKCkpOwotCi0gICAgZmluYWwgT2JqZWN0SWQgaWQgPSBjb21taXQobWVyZ2VDb21taXQpOwotICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbmV3Q29tbWl0ID0gKENvZGVSZXZpZXdDb21taXQpIHJ3LnBhcnNlQ29tbWl0KGlkKTsKLQotICAgIGlmIChzdWJtaXRBdWRpdCAhPSBudWxsKSB7Ci0gICAgICBmaW5hbCBDaGFuZ2Ugb2xkQ2hhbmdlID0gbi5jaGFuZ2U7Ci0KLSAgICAgIG4uY2hhbmdlID0KLSAgICAgICAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKG4uY2hhbmdlLmdldElkKCksCi0gICAgICAgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICBjaGFuZ2UubmV4dFBhdGNoU2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9KTsKLQotICAgICAgZmluYWwgUGF0Y2hTZXQgcHMgPSBuZXcgUGF0Y2hTZXQobi5jaGFuZ2UuY3VyclBhdGNoU2V0SWQoKSk7Ci0gICAgICBwcy5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwotICAgICAgcHMuc2V0VXBsb2FkZXIoc3VibWl0QXVkaXQuZ2V0QWNjb3VudElkKCkpOwotICAgICAgcHMuc2V0UmV2aXNpb24obmV3IFJldklkKGlkLmdldE5hbWUoKSkpOwotICAgICAgaW5zZXJ0QW5jZXN0b3JzKHBzLmdldElkKCksIG5ld0NvbW1pdCk7Ci0gICAgICBkYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBzKSk7Ci0KLSAgICAgIG4uY2hhbmdlID0KLSAgICAgICAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKG4uY2hhbmdlLmdldElkKCksCi0gICAgICAgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KG5ld0NvbW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICBwcy5nZXRJZCgpKSk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgIHRoaXMuc3VibWl0dGVkLnJlbW92ZShvbGRDaGFuZ2UpOwotICAgICAgdGhpcy5zdWJtaXR0ZWQuYWRkKG4uY2hhbmdlKTsKLQotICAgICAgaWYgKGFwcHJvdmFsTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxMaXN0KSB7Ci0gICAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5pbnNlcnQoCi0gICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgUGF0Y2hTZXRBcHByb3ZhbChwcy5nZXRJZCgpLCBhKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIFJlZlVwZGF0ZSBydSA9IHJlcG8udXBkYXRlUmVmKHBzLmdldFJlZk5hbWUoKSk7Ci0gICAgICBydS5zZXRFeHBlY3RlZE9sZE9iamVjdElkKE9iamVjdElkLnplcm9JZCgpKTsKLSAgICAgIHJ1LnNldE5ld09iamVjdElkKG5ld0NvbW1pdCk7Ci0gICAgICBydS5kaXNhYmxlUmVmTG9nKCk7Ci0gICAgICBpZiAocnUudXBkYXRlKHJ3KSAhPSBSZWZVcGRhdGUuUmVzdWx0Lk5FVykgewotICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLCBwcy5nZXRSZWZOYW1lKCksIG4uY2hhbmdlCi0gICAgICAgICAgICAgICAgLmdldERlc3QoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSwgcnUuZ2V0UmVzdWx0KCkpKTsKLSAgICAgIH0KLSAgICAgIHJlcGxpY2F0aW9uLmZpcmUobi5jaGFuZ2UuZ2V0UHJvamVjdCgpLCBydS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIG5ld0NvbW1pdC5jb3B5RnJvbShuKTsKLSAgICBuZXdDb21taXQuc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX1BJQ0s7Ci0gICAgY29tbWl0cy5wdXQobmV3Q29tbWl0LnBhdGNoc2V0SWQuZ2V0UGFyZW50S2V5KCksIG5ld0NvbW1pdCk7Ci0gICAgbWVyZ2VUaXAgPSBuZXdDb21taXQ7Ci0gICAgc2V0UmVmTG9nSWRlbnQoc3VibWl0QXVkaXQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluc2VydEFuY2VzdG9ycyhQYXRjaFNldC5JZCBpZCwgUmV2Q29tbWl0IHNyYykKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBjbnQgPSBzcmMuZ2V0UGFyZW50Q291bnQoKTsKLSAgICBMaXN0PFBhdGNoU2V0QW5jZXN0b3I+IHRvSW5zZXJ0ID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFuY2VzdG9yPihjbnQpOwotICAgIGZvciAoaW50IHAgPSAwOyBwIDwgY250OyBwKyspIHsKLSAgICAgIFBhdGNoU2V0QW5jZXN0b3IgYTsKLQotICAgICAgYSA9IG5ldyBQYXRjaFNldEFuY2VzdG9yKG5ldyBQYXRjaFNldEFuY2VzdG9yLklkKGlkLCBwICsgMSkpOwotICAgICAgYS5zZXRBbmNlc3RvclJldmlzaW9uKG5ldyBSZXZJZChzcmMuZ2V0UGFyZW50KHApLmdldElkKCkubmFtZSgpKSk7Ci0gICAgICB0b0luc2VydC5hZGQoYSk7Ci0gICAgfQotICAgIGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuaW5zZXJ0KHRvSW5zZXJ0KTsKLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0SWQgY29tbWl0KENvbW1pdEJ1aWxkZXIgbWVyZ2VDb21taXQpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIE9iamVjdElkIGlkID0gaW5zZXJ0ZXIuaW5zZXJ0KG1lcmdlQ29tbWl0KTsKLSAgICBpbnNlcnRlci5mbHVzaCgpOwotICAgIHJldHVybiBpZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyhMaXN0PEZvb3RlckxpbmU+IGZvb3RlcnMsIEZvb3RlcktleSBrZXksIFN0cmluZyB2YWwpIHsKLSAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgbGluZSA6IGZvb3RlcnMpIHsKLSAgICAgIGlmIChsaW5lLm1hdGNoZXMoa2V5KSAmJiB2YWwuZXF1YWxzKGxpbmUuZ2V0VmFsdWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1NpZ25lZE9mZkJ5KExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVycywgU3RyaW5nIGVtYWlsKSB7Ci0gICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGxpbmUgOiBmb290ZXJzKSB7Ci0gICAgICBpZiAobGluZS5tYXRjaGVzKEZvb3RlcktleS5TSUdORURfT0ZGX0JZKQotICAgICAgICAgICYmIGVtYWlsLmVxdWFscyhsaW5lLmdldEVtYWlsQWRkcmVzcygpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBQZXJzb25JZGVudCB0b0NvbW1pdHRlcklkZW50KGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYXVkaXQpIHsKLSAgICBpZiAoYXVkaXQgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYXVkaXQuZ2V0QWNjb3VudElkKCkpCi0gICAgICAgICAgLm5ld0NvbW1pdHRlcklkZW50KGF1ZGl0LmdldEdyYW50ZWQoKSwgbXlJZGVudC5nZXRUaW1lWm9uZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG15SWRlbnQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlQnJhbmNoKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKICAgICBpZiAobWVyZ2VUaXAgIT0gbnVsbCAmJiAoYnJhbmNoVGlwID09IG51bGwgfHwgYnJhbmNoVGlwICE9IG1lcmdlVGlwKSkgewogICAgICAgaWYgKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcuZXF1YWxzKGJyYW5jaFVwZGF0ZS5nZXROYW1lKCkpKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgUHJvamVjdENvbmZpZyBjZmcgPSBuZXcgUHJvamVjdENvbmZpZyhkZXN0UHJvamVjdC5nZXROYW1lS2V5KCkpOworICAgICAgICAgIFByb2plY3RDb25maWcgY2ZnID0KKyAgICAgICAgICAgICAgbmV3IFByb2plY3RDb25maWcoZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CiAgICAgICAgICAgY2ZnLmxvYWQocmVwbywgbWVyZ2VUaXApOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiU3VibWl0IHdvdWxkIHN0b3JlIGludmFsaWQiCiAgICAgICAgICAgICAgICsgIiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gIiArIG1lcmdlVGlwLm5hbWUoKSArICIgZm9yICIKLSAgICAgICAgICAgICAgKyBkZXN0UHJvamVjdC5nZXROYW1lKCksIGUpOworICAgICAgICAgICAgICArIGRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGUpOwogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIGJyYW5jaFVwZGF0ZS5zZXRSZWZMb2dJZGVudChyZWZMb2dJZGVudCk7CiAgICAgICBicmFuY2hVcGRhdGUuc2V0Rm9yY2VVcGRhdGUoZmFsc2UpOwogICAgICAgYnJhbmNoVXBkYXRlLnNldE5ld09iamVjdElkKG1lcmdlVGlwKTsKICAgICAgIGJyYW5jaFVwZGF0ZS5zZXRSZWZMb2dNZXNzYWdlKCJtZXJnZWQiLCB0cnVlKTsKQEAgLTExMjEsMTMgKzY3NCwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRy5lcXVhbHMoYnJhbmNoVXBkYXRlLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgcHJvamVjdENhY2hlLmV2aWN0KGRlc3RQcm9qZWN0KTsKLSAgICAgICAgICAgICAgUHJvamVjdFN0YXRlIHBzID0gcHJvamVjdENhY2hlLmdldChkZXN0UHJvamVjdC5nZXROYW1lS2V5KCkpOwotICAgICAgICAgICAgICByZXBvTWFuYWdlci5zZXRQcm9qZWN0RGVzY3JpcHRpb24oZGVzdFByb2plY3QuZ2V0TmFtZUtleSgpLCAvLwotICAgICAgICAgICAgICAgICAgcHMuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgICBwcm9qZWN0Q2FjaGUuZXZpY3QoZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgZGVzdFByb2plY3QgPSBwcm9qZWN0Q2FjaGUuZ2V0KGRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgICAgICAgICAgICByZXBvTWFuYWdlci5zZXRQcm9qZWN0RGVzY3JpcHRpb24oCisgICAgICAgICAgICAgICAgICBkZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpLAorICAgICAgICAgICAgICAgICAgZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXBsaWNhdGlvbi5maXJlKGRlc3RCcmFuY2guZ2V0UGFyZW50S2V5KCksIGJyYW5jaFVwZGF0ZS5nZXROYW1lKCkpOworICAgICAgICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGRlc3RCcmFuY2guZ2V0UGFyZW50S2V5KCksIGJyYW5jaFVwZGF0ZSk7CiAKICAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCA9IG51bGw7CiAgICAgICAgICAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IGdldFN1Ym1pdHRlcihkYiwgbWVyZ2VUaXAucGF0Y2hzZXRJZCk7CkBAIC0xMTM3LDYgKzY5MSwxNiBAQAogICAgICAgICAgICAgaG9va3MuZG9SZWZVcGRhdGVkSG9vayhkZXN0QnJhbmNoLCBicmFuY2hVcGRhdGUsIGFjY291bnQpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICBjYXNlIExPQ0tfRkFJTFVSRToKKyAgICAgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgICAgICBpZiAoc3RyYXRlZ3kucmV0cnlPbkxvY2tGYWlsdXJlKCkpIHsKKyAgICAgICAgICAgICAgbWVyZ2VRdWV1ZS5yZWNoZWNrQWZ0ZXIoZGVzdEJyYW5jaCwgTE9DS19GQUlMVVJFX1JFVFJZX0RFTEFZLAorICAgICAgICAgICAgICAgICAgTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgbXNnID0gIndpbGwgcmV0cnkiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbXNnID0gIndpbGwgbm90IHJldHJ5IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihicmFuY2hVcGRhdGUuZ2V0UmVzdWx0KCkubmFtZSgpICsgIiwgIiArIG1zZyk7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihicmFuY2hVcGRhdGUuZ2V0UmVzdWx0KCkubmFtZSgpKTsKICAgICAgICAgfQpAQCAtMTE0NiwyMyArNzEwLDcgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIGJvb2xlYW4gaXNNZXJnZWFibGUoQ2hhbmdlIGMpIHsKLSAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCA9IGNvbW1pdHMuZ2V0KGMuZ2V0SWQoKSk7Ci0gICAgZmluYWwgQ29tbWl0TWVyZ2VTdGF0dXMgcyA9IGNvbW1pdCAhPSBudWxsID8gY29tbWl0LnN0YXR1c0NvZGUgOiBudWxsOwotICAgIGJvb2xlYW4gaXNNZXJnZWFibGUgPSBmYWxzZTsKLSAgICBpZiAocyAhPSBudWxsCi0gICAgICAgICYmIChzLmVxdWFscyhDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRSkKLSAgICAgICAgICAgIHx8IHMuZXF1YWxzKENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX1BJQ0spIHx8IHMKLSAgICAgICAgICAgIC5lcXVhbHMoQ29tbWl0TWVyZ2VTdGF0dXMuQUxSRUFEWV9NRVJHRUQpKSkgewotICAgICAgaXNNZXJnZWFibGUgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBpc01lcmdlYWJsZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVDaGFuZ2VTdGF0dXMoKSB7Ci0gICAgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBtZXJnZWQgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7Ci0KKyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoYW5nZVN0YXR1cyhmaW5hbCBMaXN0PENoYW5nZT4gc3VibWl0dGVkKSB7CiAgICAgZm9yIChmaW5hbCBDaGFuZ2UgYyA6IHN1Ym1pdHRlZCkgewogICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQgPSBjb21taXRzLmdldChjLmdldElkKCkpOwogICAgICAgZmluYWwgQ29tbWl0TWVyZ2VTdGF0dXMgcyA9IGNvbW1pdCAhPSBudWxsID8gY29tbWl0LnN0YXR1c0NvZGUgOiBudWxsOwpAQCAtMTE3NSw2NiArNzIzLDUxIEBACiAKICAgICAgIGZpbmFsIFN0cmluZyB0eHQgPSBzLmdldE1lc3NhZ2UoKTsKIAotICAgICAgc3dpdGNoIChzKSB7Ci0gICAgICAgIGNhc2UgQ0xFQU5fTUVSR0U6IHsKLSAgICAgICAgICBzZXRNZXJnZWQoYywgbWVzc2FnZShjLCB0eHQpKTsKLSAgICAgICAgICBtZXJnZWQuYWRkKGNvbW1pdCk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICB0cnkgeworICAgICAgICBzd2l0Y2ggKHMpIHsKKyAgICAgICAgICBjYXNlIENMRUFOX01FUkdFOgorICAgICAgICAgICAgc2V0TWVyZ2VkKGMsIG1lc3NhZ2UoYywgdHh0KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQ0xFQU5fUkVCQVNFOgorICAgICAgICAgIGNhc2UgQ0xFQU5fUElDSzoKKyAgICAgICAgICAgIHNldE1lcmdlZChjLCBtZXNzYWdlKGMsIHR4dCArICIgYXMgIiArIGNvbW1pdC5uYW1lKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBBTFJFQURZX01FUkdFRDoKKyAgICAgICAgICAgIHNldE1lcmdlZChjLCBudWxsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBQQVRIX0NPTkZMSUNUOgorICAgICAgICAgIGNhc2UgTUFOVUFMX1JFQ1VSU0lWRV9NRVJHRToKKyAgICAgICAgICBjYXNlIENBTk5PVF9DSEVSUllfUElDS19ST09UOgorICAgICAgICAgIGNhc2UgTk9UX0ZBU1RfRk9SV0FSRDoKKyAgICAgICAgICBjYXNlIElOVkFMSURfUFJPSkVDVF9DT05GSUdVUkFUSU9OOgorICAgICAgICAgIGNhc2UgSU5WQUxJRF9QUk9KRUNUX0NPTkZJR1VSQVRJT05fUEFSRU5UX1BST0pFQ1RfTk9UX0ZPVU5EOgorICAgICAgICAgIGNhc2UgSU5WQUxJRF9QUk9KRUNUX0NPTkZJR1VSQVRJT05fUk9PVF9QUk9KRUNUX0NBTk5PVF9IQVZFX1BBUkVOVDoKKyAgICAgICAgICBjYXNlIFNFVFRJTkdfUEFSRU5UX1BST0pFQ1RfT05MWV9BTExPV0VEX0JZX0FETUlOOgorICAgICAgICAgICAgc2V0TmV3KGMsIG1lc3NhZ2UoYywgdHh0KSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgTUlTU0lOR19ERVBFTkRFTkNZOgorICAgICAgICAgICAgcG90ZW50aWFsbHlTdGlsbFN1Ym1pdHRhYmxlLmFkZChjb21taXQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2V0TmV3KGMsIG1lc3NhZ2UoYywgIlVuc3BlY2lmaWVkIG1lcmdlIGZhaWx1cmU6ICIgKyBzLm5hbWUoKSkpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQotICAgICAgICBjYXNlIENMRUFOX1BJQ0s6IHsKLSAgICAgICAgICBzZXRNZXJnZWQoYywgbWVzc2FnZShjLCB0eHQgKyAiIGFzICIgKyBjb21taXQubmFtZSgpKSk7Ci0gICAgICAgICAgbWVyZ2VkLmFkZChjb21taXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBTFJFQURZX01FUkdFRDoKLSAgICAgICAgICBzZXRNZXJnZWQoYywgbnVsbCk7Ci0gICAgICAgICAgbWVyZ2VkLmFkZChjb21taXQpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUEFUSF9DT05GTElDVDoKLSAgICAgICAgY2FzZSBDUklTU19DUk9TU19NRVJHRToKLSAgICAgICAgY2FzZSBDQU5OT1RfQ0hFUlJZX1BJQ0tfUk9PVDoKLSAgICAgICAgY2FzZSBOT1RfRkFTVF9GT1JXQVJEOgotICAgICAgICBjYXNlIElOVkFMSURfUFJPSkVDVF9DT05GSUdVUkFUSU9OOgotICAgICAgICBjYXNlIElOVkFMSURfUFJPSkVDVF9DT05GSUdVUkFUSU9OX1BBUkVOVF9QUk9KRUNUX05PVF9GT1VORDoKLSAgICAgICAgY2FzZSBJTlZBTElEX1BST0pFQ1RfQ09ORklHVVJBVElPTl9ST09UX1BST0pFQ1RfQ0FOTk9UX0hBVkVfUEFSRU5UOgotICAgICAgICBjYXNlIFNFVFRJTkdfUEFSRU5UX1BST0pFQ1RfT05MWV9BTExPV0VEX0JZX0FETUlOOiB7Ci0gICAgICAgICAgc2V0TmV3KGMsIG1lc3NhZ2UoYywgdHh0KSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE1JU1NJTkdfREVQRU5ERU5DWTogewotICAgICAgICAgIGZpbmFsIENhcGFibGUgY2FwYWJsZSA9IGlzU3VibWl0U3RpbGxQb3NzaWJsZShjb21taXQpOwotICAgICAgICAgIGlmIChjYXBhYmxlICE9IENhcGFibGUuT0spIHsKLSAgICAgICAgICAgIHNlbmRNZXJnZUZhaWwoYywgbWVzc2FnZShjLCBjYXBhYmxlLmdldE1lc3NhZ2UoKSksIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHNldE5ldyhjLCBtZXNzYWdlKGMsICJVbnNwZWNpZmllZCBtZXJnZSBmYWlsdXJlOiAiICsgcy5uYW1lKCkpKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgbG9nLndhcm4oIkVycm9yIHVwZGF0aW5nIGNoYW5nZSBzdGF0dXMgZm9yICIgKyBjLmdldElkKCksIGVycik7CiAgICAgICB9CiAgICAgfQotCi0gICAgQ3JlYXRlQ29kZVJldmlld05vdGVzIGNvZGVSZXZpZXdOb3RlcyA9Ci0gICAgICAgIGNvZGVSZXZpZXdOb3Rlc0ZhY3RvcnkuY3JlYXRlKGRiLCByZXBvKTsKLSAgICB0cnkgewotICAgICAgY29kZVJldmlld05vdGVzLmNyZWF0ZShtZXJnZWQsIGNvbXB1dGVBdXRob3IobWVyZ2VkKSk7Ci0gICAgfSBjYXRjaCAoQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICByZXBsaWNhdGlvbi5maXJlKGRlc3RCcmFuY2guZ2V0UGFyZW50S2V5KCksCi0gICAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRlNfTk9URVNfUkVWSUVXKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVTdWJzY3JpcHRpb25zKCkgeworICBwcml2YXRlIHZvaWQgdXBkYXRlU3Vic2NyaXB0aW9ucyhmaW5hbCBMaXN0PENoYW5nZT4gc3VibWl0dGVkKSB7CiAgICAgaWYgKG1lcmdlVGlwICE9IG51bGwgJiYgKGJyYW5jaFRpcCA9PSBudWxsIHx8IGJyYW5jaFRpcCAhPSBtZXJnZVRpcCkpIHsKICAgICAgIFN1Ym1vZHVsZU9wIHN1Yk9wID0KLSAgICAgICAgICBzdWJPcEZhY3RvcnkuY3JlYXRlKGRlc3RCcmFuY2gsIG1lcmdlVGlwLCBydywgcmVwbywgZGVzdFByb2plY3QsCi0gICAgICAgICAgICAgIHN1Ym1pdHRlZCwgY29tbWl0cyk7CisgICAgICAgICAgc3ViT3BGYWN0b3J5LmNyZWF0ZShkZXN0QnJhbmNoLCBtZXJnZVRpcCwgcncsIHJlcG8sCisgICAgICAgICAgICAgIGRlc3RQcm9qZWN0LmdldFByb2plY3QoKSwgc3VibWl0dGVkLCBjb21taXRzKTsKICAgICAgIHRyeSB7CiAgICAgICAgIHN1Yk9wLnVwZGF0ZSgpOwogICAgICAgfSBjYXRjaCAoU3VibW9kdWxlRXhjZXB0aW9uIGUpIHsKQEAgLTEyNDgsMzIgKzc4MSw3IEBACiAgIHByaXZhdGUgQ2FwYWJsZSBpc1N1Ym1pdFN0aWxsUG9zc2libGUoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQpIHsKICAgICBmaW5hbCBDYXBhYmxlIGNhcGFibGU7CiAgICAgZmluYWwgQ2hhbmdlIGMgPSBjb21taXQuY2hhbmdlOwotICAgIGlmIChjb21taXQubWlzc2luZyA9PSBudWxsKSB7Ci0gICAgICBjb21taXQubWlzc2luZyA9IG5ldyBBcnJheUxpc3Q8Q29kZVJldmlld0NvbW1pdD4oKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIHN1Ym1pdFN0aWxsUG9zc2libGUgPSBjb21taXQubWlzc2luZy5zaXplKCkgPiAwOwotICAgIGZvciAoQ29kZVJldmlld0NvbW1pdCBtaXNzaW5nQ29tbWl0IDogY29tbWl0Lm1pc3NpbmcpIHsKLSAgICAgIGxvYWRDaGFuZ2VJbmZvKG1pc3NpbmdDb21taXQpOwotCi0gICAgICBpZiAobWlzc2luZ0NvbW1pdC5wYXRjaHNldElkID09IG51bGwpIHsKLSAgICAgICAgLy8gVGhlIGNvbW1pdCBkb2Vzbid0IGhhdmUgYSBwYXRjaCBzZXQsIHNvIGl0IGNhbm5vdCBiZQotICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gdGhlIGJyYW5jaC4KLSAgICAgICAgLy8KLSAgICAgICAgc3VibWl0U3RpbGxQb3NzaWJsZSA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCFtaXNzaW5nQ29tbWl0LmNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmVxdWFscygKLSAgICAgICAgICBtaXNzaW5nQ29tbWl0LnBhdGNoc2V0SWQpKSB7Ci0gICAgICAgIC8vIElmIHRoZSBtaXNzaW5nIGNvbW1pdCBpcyBub3QgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0LAotICAgICAgICAvLyB0aGUgY2hhbmdlIG11c3QgYmUgcmViYXNlZCB0byB1c2UgdGhlIHByb3BlciBwYXJlbnQuCi0gICAgICAgIC8vCi0gICAgICAgIHN1Ym1pdFN0aWxsUG9zc2libGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCisgICAgZmluYWwgYm9vbGVhbiBzdWJtaXRTdGlsbFBvc3NpYmxlID0gaXNTdWJtaXRGb3JNaXNzaW5nQ29tbWl0c1N0aWxsUG9zc2libGUoY29tbWl0KTsKICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIGZpbmFsIGxvbmcgd2FpdFVudGlsID0gYy5nZXRMYXN0VXBkYXRlZE9uKCkuZ2V0VGltZSgpICsgREVQRU5ERU5DWV9ERUxBWTsKICAgICBpZiAoc3VibWl0U3RpbGxQb3NzaWJsZSAmJiBub3cgPCB3YWl0VW50aWwpIHsKQEAgLTEyODcsMjUgKzc5NSwyMCBAQAogICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBhbHNvIHN1Ym1pdHRlZC4gUGVyaGFwcyB0aGUgdXNlciBqdXN0CiAgICAgICAvLyBmb3Jnb3QgdG8gc3VibWl0IHRob3NlLgogICAgICAgLy8KLSAgICAgIFN0cmluZyB0eHQgPQotICAgICAgICAgICJDaGFuZ2UgY291bGQgbm90IGJlIG1lcmdlZCBiZWNhdXNlIG9mIGEgbWlzc2luZyBkZXBlbmRlbmN5LiI7Ci0gICAgICBpZiAoIWlzQWxyZWFkeVNlbnQoYywgdHh0KSkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtLmFwcGVuZCh0eHQpOwotICAgICAgICBtLmFwcGVuZCgiXG4iKTsKKyAgICAgIFN0cmluZ0J1aWxkZXIgbSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBtLmFwcGVuZCgiQ2hhbmdlIGNvdWxkIG5vdCBiZSBtZXJnZWQgYmVjYXVzZSBvZiBhIG1pc3NpbmcgZGVwZW5kZW5jeS4iKTsKKyAgICAgIG0uYXBwZW5kKCJcbiIpOwogCi0gICAgICAgIG0uYXBwZW5kKCJcbiIpOworICAgICAgbS5hcHBlbmQoIlxuIik7CiAKLSAgICAgICAgbS5hcHBlbmQoIlRoZSBmb2xsb3dpbmcgY2hhbmdlcyBtdXN0IGFsc28gYmUgc3VibWl0dGVkOlxuIik7CisgICAgICBtLmFwcGVuZCgiVGhlIGZvbGxvd2luZyBjaGFuZ2VzIG11c3QgYWxzbyBiZSBzdWJtaXR0ZWQ6XG4iKTsKKyAgICAgIG0uYXBwZW5kKCJcbiIpOworICAgICAgZm9yIChDb2RlUmV2aWV3Q29tbWl0IG1pc3NpbmdDb21taXQgOiBjb21taXQubWlzc2luZykgeworICAgICAgICBtLmFwcGVuZCgiKiAiKTsKKyAgICAgICAgbS5hcHBlbmQobWlzc2luZ0NvbW1pdC5jaGFuZ2UuZ2V0S2V5KCkuZ2V0KCkpOwogICAgICAgICBtLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgZm9yIChDb2RlUmV2aWV3Q29tbWl0IG1pc3NpbmdDb21taXQgOiBjb21taXQubWlzc2luZykgewotICAgICAgICAgIG0uYXBwZW5kKCIqICIpOwotICAgICAgICAgIG0uYXBwZW5kKG1pc3NpbmdDb21taXQuY2hhbmdlLmdldEtleSgpLmdldCgpKTsKLSAgICAgICAgICBtLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgICAgICB0eHQgPSBtLnRvU3RyaW5nKCk7CiAgICAgICB9Ci0gICAgICBjYXBhYmxlID0gbmV3IENhcGFibGUodHh0KTsKKyAgICAgIGNhcGFibGUgPSBuZXcgQ2FwYWJsZShtLnRvU3RyaW5nKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHN1Ym1pdCB0aGlzIGNoYW5nZSBhcy1pcy4gVGhlIGF1dGhvcgogICAgICAgLy8gbmVlZHMgdG8gcmViYXNlIGl0IGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHRoZSBtaXNzaW5nCkBAIC0xMzIzLDggKzgyNiwxMCBAQAogICAgICAgICAgIG0uYXBwZW5kKG1pc3NpbmdDb21taXQucGF0Y2hzZXRJZC5nZXQoKSk7CiAgICAgICAgICAgbS5hcHBlbmQoIiBvZiAiKTsKICAgICAgICAgICBtLmFwcGVuZChtaXNzaW5nQ29tbWl0LmNoYW5nZS5nZXRLZXkoKS5hYmJyZXZpYXRlKCkpOwotICAgICAgICAgIG0uYXBwZW5kKCIsIGhvd2V2ZXIgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IGlzICIpOwotICAgICAgICAgIG0uYXBwZW5kKG1pc3NpbmdDb21taXQuY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkuZ2V0KCkpOworICAgICAgICAgIGlmIChtaXNzaW5nQ29tbWl0LnBhdGNoc2V0SWQuZ2V0KCkgIT0gbWlzc2luZ0NvbW1pdC5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5nZXQoKSkgeworICAgICAgICAgICAgbS5hcHBlbmQoIiwgaG93ZXZlciB0aGUgY3VycmVudCBwYXRjaCBzZXQgaXMgIik7CisgICAgICAgICAgICBtLmFwcGVuZChtaXNzaW5nQ29tbWl0LmNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmdldCgpKTsKKyAgICAgICAgICB9CiAgICAgICAgICAgbS5hcHBlbmQoIi5cbiIpOwogCiAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzU2LDMwICs4NjEsNiBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBpc0FscmVhZHlTZW50KGZpbmFsIENoYW5nZSBjLCBmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIExpc3Q8Q2hhbmdlTWVzc2FnZT4gbXNnTGlzdCA9Ci0gICAgICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5ieUNoYW5nZShjLmdldElkKCkpLnRvTGlzdCgpOwotICAgICAgaWYgKG1zZ0xpc3Quc2l6ZSgpID4gMCkgewotICAgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGxhc3QgPSBtc2dMaXN0LmdldChtc2dMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICBpZiAobGFzdC5nZXRBdXRob3IoKSA9PSBudWxsICYmIGxhc3QuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgIC8vIFRoZSBsYXN0IG1lc3NhZ2Ugd2FzIHdyaXR0ZW4gYnkgdXMsIGFuZCBpdCBzYWlkIHRoaXMKLSAgICAgICAgICAvLyBzYW1lIG1lc3NhZ2UgYWxyZWFkeS4gSXRzIHVubGlrZWx5IGFueXRoaW5nIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgLy8gdGhhdCB3b3VsZCBjYXVzZSB1cyB0byBuZWVkIHRvIHJlcGVhdCBvdXJzZWx2ZXMuCi0gICAgICAgICAgLy8KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUaGUgbGFzdCBtZXNzYWdlIHdhcyBub3Qgc2VudCBieSB1cywgb3IgZG9lc24ndCBtYXRjaCB0aGUgdGV4dAotICAgICAgLy8gd2UgYXJlIGFib3V0IHRvIHNlbmQuCi0gICAgICAvLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQogICBwcml2YXRlIENoYW5nZU1lc3NhZ2UgbWVzc2FnZShmaW5hbCBDaGFuZ2UgYywgZmluYWwgU3RyaW5nIGJvZHkpIHsKICAgICBmaW5hbCBTdHJpbmcgdXVpZDsKICAgICB0cnkgewpAQCAtMTM5NCw4NyArODc1LDg3IEBACiAgICAgcmV0dXJuIG07CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBQYXRjaFNldEFwcHJvdmFsIGdldFN1Ym1pdHRlcihSZXZpZXdEYiByZXZpZXdEYiwKLSAgICAgIFBhdGNoU2V0LklkIGMpIHsKLSAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBudWxsOworICBwcml2YXRlIHZvaWQgc2V0TWVyZ2VkKGZpbmFsIENoYW5nZSBjLCBmaW5hbCBDaGFuZ2VNZXNzYWdlIG1zZykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyA9Ci0gICAgICAgICAgcmV2aWV3RGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KGMpLnRvTGlzdCgpOwotICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSA+IDAKLSAgICAgICAgICAgICYmIEFwcHJvdmFsQ2F0ZWdvcnkuU1VCTUlULmVxdWFscyhhLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgICBpZiAoc3VibWl0dGVyID09IG51bGwKLSAgICAgICAgICAgICAgfHwgYS5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdHRlci5nZXRHcmFudGVkKCkpID4gMCkgewotICAgICAgICAgICAgc3VibWl0dGVyID0gYTsKLSAgICAgICAgICB9CisgICAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjLmdldElkKCkpOworCisgICAgICAvLyBXZSBtdXN0IHB1bGwgdGhlIHBhdGNoc2V0IG91dCBvZiBjb21taXRzLCBiZWNhdXNlIHRoZSBwYXRjaHNldCBJRCBpcworICAgICAgLy8gbW9kaWZpZWQgd2hlbiB1c2luZyB0aGUgY2hlcnJ5LXBpY2sgbWVyZ2Ugc3RyYXRlZ3kuCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCA9IGNvbW1pdHMuZ2V0KGMuZ2V0SWQoKSk7CisgICAgICBQYXRjaFNldC5JZCBtZXJnZWQgPSBjb21taXQuY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7CisgICAgICBzZXRNZXJnZWRQYXRjaFNldChjLmdldElkKCksIG1lcmdlZCk7CisgICAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IHNhdmVBcHByb3ZhbHMoYywgbWVyZ2VkKTsKKyAgICAgIGFkZE1lcmdlZE1lc3NhZ2Uoc3VibWl0dGVyLCBtc2cpOworCisgICAgICBkYi5jb21taXQoKTsKKworICAgICAgc2VuZE1lcmdlZEVtYWlsKGMsIHN1Ym1pdHRlcik7CisgICAgICBpZiAoc3VibWl0dGVyICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBob29rcy5kb0NoYW5nZU1lcmdlZEhvb2soYywKKyAgICAgICAgICAgICAgYWNjb3VudENhY2hlLmdldChzdWJtaXR0ZXIuZ2V0QWNjb3VudElkKCkpLmdldEFjY291bnQoKSwKKyAgICAgICAgICAgICAgZGIucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSksIGRiKTsKKyAgICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcnVuIGhvb2sgZm9yIHN1Ym1pdHRlZCBwYXRjaCBzZXQgIiArIGMuZ2V0SWQoKSwgZXgpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKICAgICB9Ci0gICAgcmV0dXJuIHN1Ym1pdHRlcjsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBzZXRNZXJnZWQoZmluYWwgQ2hhbmdlIGMsIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnKSB7Ci0gICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gYy5nZXRJZCgpOwotICAgIC8vIFdlIG11c3QgcHVsbCB0aGUgcGF0Y2hzZXQgb3V0IG9mIGNvbW1pdHMsIGJlY2F1c2UgdGhlIHBhdGNoc2V0IElEIGlzCi0gICAgLy8gbW9kaWZpZWQgd2hlbiB1c2luZyB0aGUgY2hlcnJ5LXBpY2sgbWVyZ2Ugc3RyYXRlZ3kuCi0gICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQgPSBjb21taXRzLmdldChjLmdldElkKCkpOwotICAgIGZpbmFsIFBhdGNoU2V0LklkIG1lcmdlZCA9IGNvbW1pdC5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKTsKLQotICAgIHRyeSB7Ci0gICAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZUlkLCBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgYykgewotICAgICAgICAgIGMuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuTUVSR0VEKTsKLSAgICAgICAgICAvLyBJdCBjb3VsZCBiZSBwb3NzaWJsZSB0aGF0IHRoZSBjaGFuZ2UgYmVpbmcgbWVyZ2VkCi0gICAgICAgICAgLy8gaGFzIG5ldmVyIGhhZCBpdHMgbWVyZ2VhYmlsaXR5IHRlc3RlZC4gU28gd2UgaW5zdXJlCi0gICAgICAgICAgLy8gbWVyZ2VkIGNoYW5nZXMgaGFzIG1lcmdlYWJsZSBmaWVsZCB0cnVlLgotICAgICAgICAgIGMuc2V0TWVyZ2VhYmxlKHRydWUpOwotICAgICAgICAgIGlmICghbWVyZ2VkLmVxdWFscyhjLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7Ci0gICAgICAgICAgICAvLyBVbmNvb2w7IHRoZSBwYXRjaCBzZXQgY2hhbmdlZCBhZnRlciB3ZSBtZXJnZWQgaXQuCi0gICAgICAgICAgICAvLyBHbyBiYWNrIHRvIHRoZSBwYXRjaCBzZXQgdGhhdCB3YXMgYWN0dWFsbHkgbWVyZ2VkLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGMuc2V0Q3VycmVudFBhdGNoU2V0KHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KGRiLCBtZXJnZWQpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCByZWFkIG1lcmdlZCBwYXRjaCBzZXQgIiArIG1lcmdlZCwgZTEpOwotICAgICAgICAgICAgfQorICBwcml2YXRlIHZvaWQgc2V0TWVyZ2VkUGF0Y2hTZXQoQ2hhbmdlLklkIGNoYW5nZUlkLCBmaW5hbCBQYXRjaFNldC5JZCBtZXJnZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZUlkLCBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjKSB7CisgICAgICAgIGMuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuTUVSR0VEKTsKKyAgICAgICAgLy8gSXQgY291bGQgYmUgcG9zc2libGUgdGhhdCB0aGUgY2hhbmdlIGJlaW5nIG1lcmdlZAorICAgICAgICAvLyBoYXMgbmV2ZXIgaGFkIGl0cyBtZXJnZWFiaWxpdHkgdGVzdGVkLiBTbyB3ZSBpbnN1cmUKKyAgICAgICAgLy8gbWVyZ2VkIGNoYW5nZXMgaGFzIG1lcmdlYWJsZSBmaWVsZCB0cnVlLgorICAgICAgICBjLnNldE1lcmdlYWJsZSh0cnVlKTsKKyAgICAgICAgaWYgKCFtZXJnZWQuZXF1YWxzKGMuY3VycmVudFBhdGNoU2V0SWQoKSkpIHsKKyAgICAgICAgICAvLyBVbmNvb2w7IHRoZSBwYXRjaCBzZXQgY2hhbmdlZCBhZnRlciB3ZSBtZXJnZWQgaXQuCisgICAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcGF0Y2ggc2V0IHRoYXQgd2FzIGFjdHVhbGx5IG1lcmdlZC4KKyAgICAgICAgICAvLworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYiwgbWVyZ2VkKSk7CisgICAgICAgICAgfSBjYXRjaCAoUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCByZWFkIG1lcmdlZCBwYXRjaCBzZXQgIiArIG1lcmdlZCwgZTEpOwogICAgICAgICAgIH0KLSAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoYyk7Ci0gICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0gY2F0Y2ggKE9ybUNvbmN1cnJlbmN5RXhjZXB0aW9uIGVycikgewotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIGxvZy53YXJuKCJDYW5ub3QgdXBkYXRlIGNoYW5nZSBzdGF0dXMiLCBlcnIpOwotICAgIH0KKyAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGMpOworICAgICAgICByZXR1cm4gYzsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQogCi0gICAgLy8gRmxhdHRlbiBvdXQgYWxsIGV4aXN0aW5nIGFwcHJvdmFscyBiYXNlZCB1cG9uIHRoZSBjdXJyZW50Ci0gICAgLy8gcGVybWlzc2lvbnMuIE9uY2UgdGhlIGNoYW5nZSBpcyBjbG9zZWQgdGhlIGFwcHJvdmFscyBhcmUKLSAgICAvLyBub3QgdXBkYXRlZCBhdCBwcmVzZW50YXRpb24gdmlldyB0aW1lLCBzbyB3ZSBuZWVkIHRvIG1ha2UuCi0gICAgLy8gc3VyZSB0aGV5IGFyZSBhY2N1cmF0ZSBub3cuIFRoaXMgd2F5IGlmIHBlcm1pc3Npb25zIGdldAotICAgIC8vIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUsIGhpc3RvcmljYWwgcmVjb3JkcyBzdGF5IGFjY3VyYXRlLgotICAgIC8vCisgIHByaXZhdGUgUGF0Y2hTZXRBcHByb3ZhbCBzYXZlQXBwcm92YWxzKENoYW5nZSBjLCBQYXRjaFNldC5JZCBtZXJnZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAvLyBGbGF0dGVuIG91dCBleGlzdGluZyBhcHByb3ZhbHMgZm9yIHRoaXMgcGF0Y2ggc2V0IGJhc2VkIHVwb24gdGhlIGN1cnJlbnQKKyAgICAvLyBwZXJtaXNzaW9ucy4gT25jZSB0aGUgY2hhbmdlIGlzIGNsb3NlZCB0aGUgYXBwcm92YWxzIGFyZSBub3QgdXBkYXRlZCBhdAorICAgIC8vIHByZXNlbnRhdGlvbiB2aWV3IHRpbWUsIGV4Y2VwdCBmb3IgemVybyB2b3RlcyB1c2VkIHRvIGluZGljYXRlIGEgcmV2aWV3ZXIKKyAgICAvLyB3YXMgYWRkZWQuIFNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHZvdGVzIGFyZSBhY2N1cmF0ZSBub3cuIFRoaXMgd2F5IGlmCisgICAgLy8gcGVybWlzc2lvbnMgZ2V0IG1vZGlmaWVkIGluIHRoZSBmdXR1cmUsIGhpc3RvcmljYWwgcmVjb3JkcyBzdGF5IGFjY3VyYXRlLgogICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0dGVyID0gbnVsbDsKICAgICB0cnkgewogICAgICAgYy5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5NRVJHRUQpOwotICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPQotICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UoY2hhbmdlSWQpLnRvTGlzdCgpOwotICAgICAgZmluYWwgRnVuY3Rpb25TdGF0ZSBmcyA9IGZ1bmN0aW9uU3RhdGUuY3JlYXRlKAotICAgICAgICAgIGNoYW5nZUNvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoCi0gICAgICAgICAgICAgIGMsCi0gICAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYy5nZXRPd25lcigpKSksCi0gICAgICAgICAgICAgIG1lcmdlZCwgYXBwcm92YWxzKTsKLSAgICAgIGZvciAoQXBwcm92YWxUeXBlIGF0IDogYXBwcm92YWxUeXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgICAgQ2F0ZWdvcnlGdW5jdGlvbi5mb3JDYXRlZ29yeShhdC5nZXRDYXRlZ29yeSgpKS5ydW4oYXQsIGZzKTsKLSAgICAgIH0KKworICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPQorICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChtZXJnZWQpLnRvTGlzdCgpOworICAgICAgU2V0PFBhdGNoU2V0QXBwcm92YWwuS2V5PiB0b0RlbGV0ZSA9CisgICAgICAgICAgU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShhcHByb3ZhbHMuc2l6ZSgpKTsKICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKSB7Ci0gICAgICAgIGlmIChhLmdldFZhbHVlKCkgPiAwCi0gICAgICAgICAgICAmJiBBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoYS5nZXRDYXRlZ29yeUlkKCkpCi0gICAgICAgICAgICAmJiBhLmdldFBhdGNoU2V0SWQoKS5lcXVhbHMobWVyZ2VkKSkgeworICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKKyAgICAgICAgICB0b0RlbGV0ZS5hZGQoYS5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYXBwcm92YWxzID0gbGFiZWxOb3JtYWxpemVyLm5vcm1hbGl6ZShjLCBhcHByb3ZhbHMpOworICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMpIHsKKyAgICAgICAgdG9EZWxldGUucmVtb3ZlKGEuZ2V0S2V5KCkpOworICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpID4gMCAmJiBhLmlzU3VibWl0KCkpIHsKICAgICAgICAgICBpZiAoc3VibWl0dGVyID09IG51bGwKICAgICAgICAgICAgICAgfHwgYS5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdHRlci5nZXRHcmFudGVkKCkpID4gMCkgewogICAgICAgICAgICAgc3VibWl0dGVyID0gYTsKQEAgLTE0ODMsMjQgKzk2NCwyNCBAQAogICAgICAgICBhLmNhY2hlKGMpOwogICAgICAgfQogICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS51cGRhdGUoYXBwcm92YWxzKTsKKyAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuZGVsZXRlS2V5cyh0b0RlbGV0ZSk7CiAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGVycikgewotICAgICAgbG9nLndhcm4oIkNhbm5vdCBub3JtYWxpemUgYXBwcm92YWxzIGZvciBjaGFuZ2UgIiArIGNoYW5nZUlkLCBlcnIpOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIGxvZy53YXJuKCJDYW5ub3Qgbm9ybWFsaXplIGFwcHJvdmFscyBmb3IgY2hhbmdlICIgKyBjaGFuZ2VJZCwgZXJyKTsKKyAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oZXJyKTsKICAgICB9CisgICAgcmV0dXJuIHN1Ym1pdHRlcjsKKyAgfQogCisgIHByaXZhdGUgdm9pZCBhZGRNZXJnZWRNZXNzYWdlKFBhdGNoU2V0QXBwcm92YWwgc3VibWl0dGVyLCBDaGFuZ2VNZXNzYWdlIG1zZykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIGlmIChtc2cgIT0gbnVsbCkgewogICAgICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsICYmIG1zZy5nZXRBdXRob3IoKSA9PSBudWxsKSB7CiAgICAgICAgIG1zZy5zZXRBdXRob3Ioc3VibWl0dGVyLmdldEFjY291bnRJZCgpKTsKICAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtc2cpKTsKLSAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBzdG9yZSBtZXNzYWdlIG9uIGNoYW5nZSIsIGVycik7Ci0gICAgICB9CisgICAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obXNnKSk7CiAgICAgfQorICB9CiAKLSAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGZyb20gPSBzdWJtaXR0ZXI7CisgIHByaXZhdGUgdm9pZCBzZW5kTWVyZ2VkRW1haWwoZmluYWwgQ2hhbmdlIGMsIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgZnJvbSkgewogICAgIHdvcmtRdWV1ZS5nZXREZWZhdWx0UXVldWUoKQogICAgICAgICAuc3VibWl0KHJlcXVlc3RTY29wZVByb3BhZ2F0b3Iud3JhcChuZXcgUnVubmFibGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTE1MTksNyArMTAwMCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgIGZpbmFsIE1lcmdlZFNlbmRlciBjbSA9IG1lcmdlZFNlbmRlckZhY3RvcnkuY3JlYXRlKGMpOworICAgICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoYywKKyAgICAgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShjLmdldE93bmVyKCkpKTsKKyAgICAgICAgICBmaW5hbCBNZXJnZWRTZW5kZXIgY20gPSBtZXJnZWRTZW5kZXJGYWN0b3J5LmNyZWF0ZShjb250cm9sKTsKICAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjbS5zZXRGcm9tKGZyb20uZ2V0QWNjb3VudElkKCkpOwogICAgICAgICAgIH0KQEAgLTE1MzUsMjMgKzEwMTgsMzcgQEAKICAgICAgICAgcmV0dXJuICJzZW5kLWVtYWlsIG1lcmdlZCI7CiAgICAgICB9CiAgICAgfSkpOwotCi0KLSAgICB0cnkgewotICAgICAgaG9va3MuZG9DaGFuZ2VNZXJnZWRIb29rKGMsIC8vCi0gICAgICAgICAgYWNjb3VudENhY2hlLmdldChzdWJtaXR0ZXIuZ2V0QWNjb3VudElkKCkpLmdldEFjY291bnQoKSwgLy8KLSAgICAgICAgICBkYi5wYXRjaFNldHMoKS5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKSwgZGIpOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBleCkgewotICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcnVuIGhvb2sgZm9yIHN1Ym1pdHRlZCBwYXRjaCBzZXQgIiArIGMuZ2V0SWQoKSwgZXgpOwotICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCBzZXROZXcoQ2hhbmdlIGMsIENoYW5nZU1lc3NhZ2UgbXNnKSB7CiAgICAgc2VuZE1lcmdlRmFpbChjLCBtc2csIHRydWUpOwogICB9CiAKKyAgcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlKENoYW5nZU1lc3NhZ2UgbXNnKSB7CisgICAgdHJ5IHsKKyAgICAgIENoYW5nZU1lc3NhZ2UgbGFzdCA9IEl0ZXJhYmxlcy5nZXRMYXN0KGRiLmNoYW5nZU1lc3NhZ2VzKCkuYnlDaGFuZ2UoCisgICAgICAgICAgbXNnLmdldFBhdGNoU2V0SWQoKS5nZXRQYXJlbnRLZXkoKSksIG51bGwpOworICAgICAgaWYgKGxhc3QgIT0gbnVsbCkgeworICAgICAgICBsb25nIGxhc3RNcyA9IGxhc3QuZ2V0V3JpdHRlbk9uKCkuZ2V0VGltZSgpOworICAgICAgICBsb25nIG1zZ01zID0gbXNnLmdldFdyaXR0ZW5PbigpLmdldFRpbWUoKTsKKyAgICAgICAgaWYgKE9iamVjdHMuZXF1YWwobGFzdC5nZXRBdXRob3IoKSwgbXNnLmdldEF1dGhvcigpKQorICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbChsYXN0LmdldE1lc3NhZ2UoKSwgbXNnLmdldE1lc3NhZ2UoKSkKKyAgICAgICAgICAgICYmIG1zZ01zIC0gbGFzdE1zIDwgRFVQTElDQVRFX01FU1NBR0VfSU5URVJWQUwpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3QgY2hlY2sgcHJldmlvdXMgbWVyZ2UgZmFpbHVyZSBtZXNzYWdlIiwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgcHJpdmF0ZSB2b2lkIHNlbmRNZXJnZUZhaWwoZmluYWwgQ2hhbmdlIGMsIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnLAogICAgICAgZmluYWwgYm9vbGVhbiBtYWtlTmV3KSB7CisgICAgaWYgKGlzRHVwbGljYXRlKG1zZykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICB0cnkgewogICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1zZykpOwogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKQEAgLTE1ODIsMTcgKzEwNzksMjMgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHN1Ym1pdHRlciA9IGdldFN1Ym1pdHRlcihkYiwgYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZ2V0IHN1Ym1pdHRlciIsIGUpOworICAgIH0KKworICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgZnJvbSA9IHN1Ym1pdHRlcjsKICAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkKICAgICAgICAgLnN1Ym1pdChyZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLndyYXAobmV3IFJ1bm5hYmxlKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIFBhdGNoU2V0IHBhdGNoU2V0OwotICAgICAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlcjsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBSZXZpZXdEYiByZXZpZXdEYiA9IHNjaGVtYUZhY3Rvcnkub3BlbigpOwogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBwYXRjaFNldCA9IHJldmlld0RiLnBhdGNoU2V0cygpLmdldChjLmN1cnJlbnRQYXRjaFNldElkKCkpOwotICAgICAgICAgICAgc3VibWl0dGVyID0gZ2V0U3VibWl0dGVyKHJldmlld0RiLCBjLmN1cnJlbnRQYXRjaFNldElkKCkpOwogICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXZpZXdEYi5jbG9zZSgpOwogICAgICAgICAgIH0KQEAgLTE2MDMsOCArMTEwNiw4IEBACiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBmaW5hbCBNZXJnZUZhaWxTZW5kZXIgY20gPSBtZXJnZUZhaWxTZW5kZXJGYWN0b3J5LmNyZWF0ZShjKTsKLSAgICAgICAgICBpZiAoc3VibWl0dGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtLnNldEZyb20oc3VibWl0dGVyLmdldEFjY291bnRJZCgpKTsKKyAgICAgICAgICBpZiAoZnJvbSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbS5zZXRGcm9tKGZyb20uZ2V0QWNjb3VudElkKCkpOwogICAgICAgICAgIH0KICAgICAgICAgICBjbS5zZXRQYXRjaFNldChwYXRjaFNldCk7CiAgICAgICAgICAgY20uc2V0Q2hhbmdlTWVzc2FnZShtc2cpOwpAQCAtMTYxOSw1ICsxMTIyLDE1IEBACiAgICAgICAgIHJldHVybiAic2VuZC1lbWFpbCBtZXJnZS1mYWlsZWQiOwogICAgICAgfQogICAgIH0pKTsKKworICAgIGlmIChzdWJtaXR0ZXIgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaG9va3MuZG9NZXJnZUZhaWxlZEhvb2soYywKKyAgICAgICAgICAgIGFjY291bnRDYWNoZS5nZXQoc3VibWl0dGVyLmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCksCisgICAgICAgICAgICBkYi5wYXRjaFNldHMoKS5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKSwgbXNnLmdldE1lc3NhZ2UoKSwgZGIpOworICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJ1biBob29rIGZvciBtZXJnZSBmYWlsZWQgIiArIGMuZ2V0SWQoKSwgZXgpOworICAgICAgfQorICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VRdWV1ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VRdWV1ZS5qYXZhCmluZGV4IDEwNzE3NjguLmE1M2IwNGMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlUXVldWUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVF1ZXVlLmphdmEKQEAgLTE5LDkgKzE5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogcHVibGljIGludGVyZmFjZSBNZXJnZVF1ZXVlIHsKLSAgdm9pZCBtZXJnZShNZXJnZU9wLkZhY3RvcnkgbW9mLCBCcmFuY2guTmFtZUtleSBicmFuY2gpOwotCisgIHZvaWQgbWVyZ2UoQnJhbmNoLk5hbWVLZXkgYnJhbmNoKTsKICAgdm9pZCBzY2hlZHVsZShCcmFuY2guTmFtZUtleSBicmFuY2gpOwotCiAgIHZvaWQgcmVjaGVja0FmdGVyKEJyYW5jaC5OYW1lS2V5IGJyYW5jaCwgbG9uZyBkZWxheSwgVGltZVVuaXQgZGVsYXlVbml0KTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlU29ydGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVNvcnRlci5qYXZhCmluZGV4IGZlODc0ODAuLjM5MTFkOTYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlU29ydGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VTb3J0ZXIuamF2YQpAQCAtMjgsMTQgKzI4LDE0IEBACiAKIGNsYXNzIE1lcmdlU29ydGVyIHsKICAgcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHJ3OwotICBwcml2YXRlIGZpbmFsIFJldkZsYWcgQ0FOX01FUkdFOworICBwcml2YXRlIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnOwogICBwcml2YXRlIGZpbmFsIFNldDxSZXZDb21taXQ+IGFjY2VwdGVkOwogCi0gIE1lcmdlU29ydGVyKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkLAotICAgICAgZmluYWwgUmV2RmxhZyBmbGFnQ0FOX01FUkdFKSB7Ci0gICAgcncgPSB3YWxrOwotICAgIENBTl9NRVJHRSA9IGZsYWdDQU5fTUVSR0U7Ci0gICAgYWNjZXB0ZWQgPSBhbHJlYWR5QWNjZXB0ZWQ7CisgIE1lcmdlU29ydGVyKGZpbmFsIFJldldhbGsgcncsIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCwKKyAgICAgIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnKSB7CisgICAgdGhpcy5ydyA9IHJ3OworICAgIHRoaXMuY2FuTWVyZ2VGbGFnID0gY2FuTWVyZ2VGbGFnOworICAgIHRoaXMuYWNjZXB0ZWQgPSBhbHJlYWR5QWNjZXB0ZWQ7CiAgIH0KIAogICBDb2xsZWN0aW9uPENvZGVSZXZpZXdDb21taXQ+IHNvcnQoZmluYWwgQ29sbGVjdGlvbjxDb2RlUmV2aWV3Q29tbWl0PiBpbmNvbWluZykKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB3aGlsZSAoIXNvcnQuaXNFbXB0eSgpKSB7CiAgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4gPSByZW1vdmVPbmUoc29ydCk7CiAKLSAgICAgIHJ3LnJlc2V0UmV0YWluKENBTl9NRVJHRSk7CisgICAgICBydy5yZXNldFJldGFpbihjYW5NZXJnZUZsYWcpOwogICAgICAgcncubWFya1N0YXJ0KG4pOwogICAgICAgZm9yIChSZXZDb21taXQgYyA6IGFjY2VwdGVkKSB7CiAgICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKGMpOwpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgUmV2Q29tbWl0IGM7CiAgICAgICBmaW5hbCBSZXZDb21taXRMaXN0PFJldkNvbW1pdD4gY29udGVudHMgPSBuZXcgUmV2Q29tbWl0TGlzdDxSZXZDb21taXQ+KCk7CiAgICAgICB3aGlsZSAoKGMgPSBydy5uZXh0KCkpICE9IG51bGwpIHsKLSAgICAgICAgaWYgKCFjLmhhcyhDQU5fTUVSR0UpKSB7CisgICAgICAgIGlmICghYy5oYXMoY2FuTWVyZ2VGbGFnKSB8fCAhaW5jb21pbmcuY29udGFpbnMoYykpIHsKICAgICAgICAgICAvLyBXZSBjYW5ub3QgbWVyZ2UgbiBhcyBpdCB3b3VsZCBicmluZyBzb21ldGhpbmcgd2UKICAgICAgICAgICAvLyBhcmVuJ3QgcGVybWl0dGVkIHRvIG1lcmdlIGF0IHRoaXMgdGltZS4gRHJvcCBuLgogICAgICAgICAgIC8vCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVV0aWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MmViMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVV0aWwuamF2YQpAQCAtMCwwICsxLDcxMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vTWVyZ2VCYXNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk5vTWVyZ2VCYXNlRXhjZXB0aW9uLk1lcmdlQmFzZUZhaWx1cmVSZWFzb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk11dGFibGVPYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuTWVyZ2VTdHJhdGVneTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlRocmVlV2F5TWVyZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJLZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlckxpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2RmxhZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2U29ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5QYWNrUGFyc2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgTWVyZ2VVdGlsIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lcmdlVXRpbC5jbGFzcyk7CisKKyAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgTWVyZ2VVdGlsIGNyZWF0ZShQcm9qZWN0U3RhdGUgcHJvamVjdCk7CisgICAgTWVyZ2VVdGlsIGNyZWF0ZShQcm9qZWN0U3RhdGUgcHJvamVjdCwgYm9vbGVhbiB1c2VDb250ZW50TWVyZ2UpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJfSEVBRFNfTUFTVEVSID0KKyAgICAgIENvbnN0YW50cy5SX0hFQURTICsgQ29uc3RhbnRzLk1BU1RFUjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb290ZXJLZXkgUkVWSUVXRURfT04gPSBuZXcgRm9vdGVyS2V5KCJSZXZpZXdlZC1vbiIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb290ZXJLZXkgQ0hBTkdFX0lEID0gbmV3IEZvb3RlcktleSgiQ2hhbmdlLUlkIik7CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdFN0YXRlIHByb2plY3Q7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VDb250ZW50TWVyZ2U7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VSZWN1cnNpdmVNZXJnZTsKKworICBAQXNzaXN0ZWRJbmplY3QKKyAgTWVyZ2VVdGlsKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIHNlcnZlckNvbmZpZywKKyAgICAgIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCisgICAgICBAQXNzaXN0ZWQgZmluYWwgUHJvamVjdFN0YXRlIHByb2plY3QpIHsKKyAgICB0aGlzKHNlcnZlckNvbmZpZywgZGIsIGlkZW50aWZpZWRVc2VyRmFjdG9yeSwgdXJsUHJvdmlkZXIsIHByb2plY3QsCisgICAgICAgIHByb2plY3QuaXNVc2VDb250ZW50TWVyZ2UoKSk7CisgIH0KKworICBAQXNzaXN0ZWRJbmplY3QKKyAgTWVyZ2VVdGlsKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIHNlcnZlckNvbmZpZywKKyAgICAgIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCisgICAgICBAQXNzaXN0ZWQgZmluYWwgUHJvamVjdFN0YXRlIHByb2plY3QsCisgICAgICBAQXNzaXN0ZWQgYm9vbGVhbiB1c2VDb250ZW50TWVyZ2UpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5pZGVudGlmaWVkVXNlckZhY3RvcnkgPSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CisgICAgdGhpcy51cmxQcm92aWRlciA9IHVybFByb3ZpZGVyOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgdGhpcy51c2VDb250ZW50TWVyZ2UgPSB1c2VDb250ZW50TWVyZ2U7CisgICAgdGhpcy51c2VSZWN1cnNpdmVNZXJnZSA9CisgICAgICAgIHNlcnZlckNvbmZpZy5nZXRCb29sZWFuKCJjb3JlIiwgbnVsbCwgInVzZVJlY3Vyc2l2ZU1lcmdlIiwgZmFsc2UpOworICB9CisKKyAgcHVibGljIENvZGVSZXZpZXdDb21taXQgZ2V0Rmlyc3RGYXN0Rm9yd2FyZCgKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsIGZpbmFsIFJldldhbGsgcncsCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PiBpID0gdG9NZXJnZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiA9IGkubmV4dCgpOworICAgICAgICBpZiAobWVyZ2VUaXAgPT0gbnVsbCB8fCBydy5pc01lcmdlZEludG8obWVyZ2VUaXAsIG4pKSB7CisgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBmYXN0LWZvcndhcmQgdGVzdCBkdXJpbmcgbWVyZ2UiLCBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1lcmdlVGlwOworICB9CisKKyAgcHVibGljIHZvaWQgcmVkdWNlVG9NaW5pbWFsTWVyZ2UoZmluYWwgTWVyZ2VTb3J0ZXIgbWVyZ2VTb3J0ZXIsCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvU29ydCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDb2xsZWN0aW9uPENvZGVSZXZpZXdDb21taXQ+IGhlYWRzOworICAgIHRyeSB7CisgICAgICBoZWFkcyA9IG1lcmdlU29ydGVyLnNvcnQodG9Tb3J0KTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkJyYW5jaCBoZWFkIHNvcnRpbmcgZmFpbGVkIiwgZSk7CisgICAgfQorCisgICAgdG9Tb3J0LmNsZWFyKCk7CisgICAgdG9Tb3J0LmFkZEFsbChoZWFkcyk7CisgICAgQ29sbGVjdGlvbnMuc29ydCh0b1NvcnQsIG5ldyBDb21wYXJhdG9yPENvZGVSZXZpZXdDb21taXQ+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgQ29kZVJldmlld0NvbW1pdCBhLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGIpIHsKKyAgICAgICAgcmV0dXJuIGEub3JpZ2luYWxPcmRlciAtIGIub3JpZ2luYWxPcmRlcjsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBQYXRjaFNldEFwcHJvdmFsIGdldFN1Ym1pdHRlcihmaW5hbCBQYXRjaFNldC5JZCBjKSB7CisgICAgcmV0dXJuIGdldFN1Ym1pdHRlcihkYi5nZXQoKSwgYyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFBhdGNoU2V0QXBwcm92YWwgZ2V0U3VibWl0dGVyKGZpbmFsIFJldmlld0RiIHJldmlld0RiLAorICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgYykgeworICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0KKyAgICAgICAgICByZXZpZXdEYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQoYykudG9MaXN0KCk7CisgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFscykgeworICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpID4gMCAmJiBhLmlzU3VibWl0KCkpIHsKKyAgICAgICAgICBpZiAoc3VibWl0dGVyID09IG51bGwKKyAgICAgICAgICAgICAgfHwgYS5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdHRlci5nZXRHcmFudGVkKCkpID4gMCkgeworICAgICAgICAgICAgc3VibWl0dGVyID0gYTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgeworICAgIH0KKyAgICByZXR1cm4gc3VibWl0dGVyOworICB9CisKKyAgcHVibGljIENvZGVSZXZpZXdDb21taXQgY3JlYXRlQ2hlcnJ5UGlja0Zyb21Db21taXQoUmVwb3NpdG9yeSByZXBvLAorICAgICAgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsIENvZGVSZXZpZXdDb21taXQgb3JpZ2luYWxDb21taXQsCisgICAgICBQZXJzb25JZGVudCBjaGVycnlQaWNrQ29tbWl0dGVySWRlbnQsIFN0cmluZyBjb21taXRNc2csIFJldldhbGsgcncpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgZmluYWwgVGhyZWVXYXlNZXJnZXIgbSA9IG5ld1RocmVlV2F5TWVyZ2VyKHJlcG8sIGluc2VydGVyKTsKKworICAgIG0uc2V0QmFzZShvcmlnaW5hbENvbW1pdC5nZXRQYXJlbnQoMCkpOworICAgIGlmIChtLm1lcmdlKG1lcmdlVGlwLCBvcmlnaW5hbENvbW1pdCkpIHsKKworICAgICAgZmluYWwgQ29tbWl0QnVpbGRlciBtZXJnZUNvbW1pdCA9IG5ldyBDb21taXRCdWlsZGVyKCk7CisKKyAgICAgIG1lcmdlQ29tbWl0LnNldFRyZWVJZChtLmdldFJlc3VsdFRyZWVJZCgpKTsKKyAgICAgIG1lcmdlQ29tbWl0LnNldFBhcmVudElkKG1lcmdlVGlwKTsKKyAgICAgIG1lcmdlQ29tbWl0LnNldEF1dGhvcihvcmlnaW5hbENvbW1pdC5nZXRBdXRob3JJZGVudCgpKTsKKyAgICAgIG1lcmdlQ29tbWl0LnNldENvbW1pdHRlcihjaGVycnlQaWNrQ29tbWl0dGVySWRlbnQpOworICAgICAgbWVyZ2VDb21taXQuc2V0TWVzc2FnZShjb21taXRNc2cpOworCisgICAgICBmaW5hbCBPYmplY3RJZCBpZCA9IGNvbW1pdChpbnNlcnRlciwgbWVyZ2VDb21taXQpOworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuZXdDb21taXQgPQorICAgICAgICAgIChDb2RlUmV2aWV3Q29tbWl0KSBydy5wYXJzZUNvbW1pdChpZCk7CisKKyAgICAgIHJldHVybiBuZXdDb21taXQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlQ2hlcnJ5UGlja0NvbW1pdE1lc3NhZ2UoZmluYWwgQ29kZVJldmlld0NvbW1pdCBuKSB7CisgICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJzID0gbi5nZXRGb290ZXJMaW5lcygpOworICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBtc2didWYuYXBwZW5kKG4uZ2V0RnVsbE1lc3NhZ2UoKSk7CisKKyAgICBpZiAobXNnYnVmLmxlbmd0aCgpID09IDApIHsKKyAgICAgIC8vIFdURiwgYW4gZW1wdHkgY29tbWl0IG1lc3NhZ2U/CisgICAgICBtc2didWYuYXBwZW5kKCI8bm8gY29tbWl0IG1lc3NhZ2UgcHJvdmlkZWQ+Iik7CisgICAgfQorICAgIGlmIChtc2didWYuY2hhckF0KG1zZ2J1Zi5sZW5ndGgoKSAtIDEpICE9ICdcbicpIHsKKyAgICAgIC8vIE1pc3NpbmcgYSB0cmFpbGluZyBMRj8gQ29ycmVjdCBpdCAocGVyaGFwcyB0aGUgZWRpdG9yIHdhcyBicm9rZW4pLgorICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKKyAgICB9CisgICAgaWYgKGZvb3RlcnMuaXNFbXB0eSgpKSB7CisgICAgICAvLyBEb2Vzbid0IGVuZCBpbiBhICJTaWduZWQtb2ZmLWJ5OiAuLi4iIHN0eWxlIGxpbmU/IEFkZCBhbm90aGVyIGxpbmUKKyAgICAgIC8vIGJyZWFrIHRvIHN0YXJ0IGEgbmV3IHBhcmFncmFwaCBmb3IgdGhlIHJldmlld2VkLWJ5IHRhZyBsaW5lcy4KKyAgICAgIC8vCisgICAgICBtc2didWYuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIGlmICghY29udGFpbnMoZm9vdGVycywgQ0hBTkdFX0lELCBuLmNoYW5nZS5nZXRLZXkoKS5nZXQoKSkpIHsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQoQ0hBTkdFX0lELmdldE5hbWUoKSk7CisgICAgICBtc2didWYuYXBwZW5kKCI6ICIpOworICAgICAgbXNnYnVmLmFwcGVuZChuLmNoYW5nZS5nZXRLZXkoKS5nZXQoKSk7CisgICAgICBtc2didWYuYXBwZW5kKCdcbicpOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBzaXRlVXJsID0gdXJsUHJvdmlkZXIuZ2V0KCk7CisgICAgaWYgKHNpdGVVcmwgIT0gbnVsbCkgeworICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHNpdGVVcmwgKyBuLnBhdGNoc2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCk7CisgICAgICBpZiAoIWNvbnRhaW5zKGZvb3RlcnMsIFJFVklFV0VEX09OLCB1cmwpKSB7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQoUkVWSUVXRURfT04uZ2V0TmFtZSgpKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCh1cmwpOworICAgICAgICBtc2didWYuYXBwZW5kKCdcbicpOworICAgICAgfQorICAgIH0KKworICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXVkaXQgPSBudWxsOworCisgICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEgOiBnZXRBcHByb3ZhbHNGb3JDb21taXQobikpIHsKKyAgICAgIGlmIChhLmdldFZhbHVlKCkgPD0gMCkgeworICAgICAgICAvLyBOZWdhdGl2ZSB2b3RlcyBhcmVuJ3QgY291bnRlZC4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChhLmlzU3VibWl0KCkpIHsKKyAgICAgICAgLy8gU3VibWl0IGlzIHRyZWF0ZWQgc3BlY2lhbGx5LCBiZWxvdyAoYmVjb21lcyBjb21taXR0ZXIpCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdWJtaXRBdWRpdCA9PSBudWxsCisgICAgICAgICAgICB8fCBhLmdldEdyYW50ZWQoKS5jb21wYXJlVG8oc3VibWl0QXVkaXQuZ2V0R3JhbnRlZCgpKSA+IDApIHsKKyAgICAgICAgICBzdWJtaXRBdWRpdCA9IGE7CisgICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZpbmFsIEFjY291bnQgYWNjID0KKyAgICAgICAgICBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGEuZ2V0QWNjb3VudElkKCkpLmdldEFjY291bnQoKTsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgaWRlbnRidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgaWYgKGFjYy5nZXRGdWxsTmFtZSgpICE9IG51bGwgJiYgYWNjLmdldEZ1bGxOYW1lKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoYWNjLmdldEZ1bGxOYW1lKCkpOworICAgICAgfQorICAgICAgaWYgKGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwKKyAgICAgICAgICAmJiBhY2MuZ2V0UHJlZmVycmVkRW1haWwoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGlzU2lnbmVkT2ZmQnkoZm9vdGVycywgYWNjLmdldFByZWZlcnJlZEVtYWlsKCkpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkZW50YnVmLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgIGlkZW50YnVmLmFwcGVuZCgnICcpOworICAgICAgICB9CisgICAgICAgIGlkZW50YnVmLmFwcGVuZCgnPCcpOworICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoYWNjLmdldFByZWZlcnJlZEVtYWlsKCkpOworICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJz4nKTsKKyAgICAgIH0KKyAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIC8vIE5vdGhpbmcgcmVhc29uYWJsZSB0byBkZXNjcmliZSB0aGVtIGJ5PyBJZ25vcmUgdGhlbS4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZpbmFsIFN0cmluZyB0YWc7CisgICAgICBpZiAoaXNDb2RlUmV2aWV3KGEuZ2V0TGFiZWxJZCgpKSkgeworICAgICAgICB0YWcgPSAiUmV2aWV3ZWQtYnkiOworICAgICAgfSBlbHNlIGlmIChpc1ZlcmlmaWVkKGEuZ2V0TGFiZWxJZCgpKSkgeworICAgICAgICB0YWcgPSAiVGVzdGVkLWJ5IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIExhYmVsVHlwZSBsdCA9IHByb2plY3QuZ2V0TGFiZWxUeXBlcygpLmJ5TGFiZWwoYS5nZXRMYWJlbElkKCkpOworICAgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRhZyA9IGx0LmdldE5hbWUoKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFjb250YWlucyhmb290ZXJzLCBuZXcgRm9vdGVyS2V5KHRhZyksIGlkZW50YnVmLnRvU3RyaW5nKCkpKSB7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQodGFnKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZChpZGVudGJ1Zik7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1zZ2J1Zi50b1N0cmluZygpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvZGVSZXZpZXcoTGFiZWxJZCBpZCkgeworICAgIHJldHVybiAiQ29kZS1SZXZpZXciLmVxdWFsc0lnbm9yZUNhc2UoaWQuZ2V0KCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZlcmlmaWVkKExhYmVsSWQgaWQpIHsKKyAgICByZXR1cm4gIlZlcmlmaWVkIi5lcXVhbHNJZ25vcmVDYXNlKGlkLmdldCgpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGdldEFwcHJvdmFsc0ZvckNvbW1pdChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pIHsKKyAgICB0cnkgeworICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbExpc3QgPQorICAgICAgICAgIGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChuLnBhdGNoc2V0SWQpLnRvTGlzdCgpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChhcHByb3ZhbExpc3QsIG5ldyBDb21wYXJhdG9yPFBhdGNoU2V0QXBwcm92YWw+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSwgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBiKSB7CisgICAgICAgICAgcmV0dXJuIGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhiLmdldEdyYW50ZWQoKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgcmV0dXJuIGFwcHJvdmFsTGlzdDsKKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW4ndCByZWFkIGFwcHJvdmFsIHJlY29yZHMgZm9yICIgKyBuLnBhdGNoc2V0SWQsIGUpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoTGlzdDxGb290ZXJMaW5lPiBmb290ZXJzLCBGb290ZXJLZXkga2V5LCBTdHJpbmcgdmFsKSB7CisgICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGxpbmUgOiBmb290ZXJzKSB7CisgICAgICBpZiAobGluZS5tYXRjaGVzKGtleSkgJiYgdmFsLmVxdWFscyhsaW5lLmdldFZhbHVlKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2lnbmVkT2ZmQnkoTGlzdDxGb290ZXJMaW5lPiBmb290ZXJzLCBTdHJpbmcgZW1haWwpIHsKKyAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgbGluZSA6IGZvb3RlcnMpIHsKKyAgICAgIGlmIChsaW5lLm1hdGNoZXMoRm9vdGVyS2V5LlNJR05FRF9PRkZfQlkpCisgICAgICAgICAgJiYgZW1haWwuZXF1YWxzKGxpbmUuZ2V0RW1haWxBZGRyZXNzKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGVyc29uSWRlbnQgY29tcHV0ZU1lcmdlQ29tbWl0QXV0aG9yKGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsCisgICAgICBmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IGNvZGVSZXZpZXdDb21taXRzKSB7CisgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBudWxsOworICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjIDogY29kZVJldmlld0NvbW1pdHMpIHsKKyAgICAgIFBhdGNoU2V0QXBwcm92YWwgcyA9IGdldFN1Ym1pdHRlcihjLnBhdGNoc2V0SWQpOworICAgICAgaWYgKHN1Ym1pdHRlciA9PSBudWxsCisgICAgICAgICAgfHwgKHMgIT0gbnVsbCAmJiBzLmdldEdyYW50ZWQoKS5jb21wYXJlVG8oc3VibWl0dGVyLmdldEdyYW50ZWQoKSkgPiAwKSkgeworICAgICAgICBzdWJtaXR0ZXIgPSBzOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRyeSB0byB1c2UgdGhlIHN1Ym1pdHRlcidzIGlkZW50aXR5IGZvciB0aGUgbWVyZ2UgY29tbWl0IGF1dGhvci4KKyAgICAvLyBJZiBhbGwgb2YgdGhlIGNvbW1pdHMgYmVpbmcgbWVyZ2VkIGFyZSBjcmVhdGVkIGJ5IHRoZSBzdWJtaXR0ZXIsCisgICAgLy8gcHJlZmVyIHRoZSBpZGVudGl0eSBsaW5lIHRoZXkgdXNlZCBpbiB0aGUgY29tbWl0cyByYXRoZXIgdGhhbiB0aGUKKyAgICAvLyBwcmVmZXJyZWQgaWRlbnRpdHkgc3RvcmVkIGluIHRoZSB1c2VyIGFjY291bnQuIFRoaXMgd2F5IHRoZSBHaXQKKyAgICAvLyBjb21taXQgcmVjb3JkcyBhcmUgbW9yZSBjb25zaXN0ZW50IGludGVybmFsbHkuCisgICAgLy8KKyAgICBQZXJzb25JZGVudCBhdXRob3JJZGVudDsKKyAgICBpZiAoc3VibWl0dGVyICE9IG51bGwpIHsKKyAgICAgIElkZW50aWZpZWRVc2VyIHdobyA9CisgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShzdWJtaXR0ZXIuZ2V0QWNjb3VudElkKCkpOworICAgICAgU2V0PFN0cmluZz4gZW1haWxzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgZm9yIChSZXZDb21taXQgYyA6IGNvZGVSZXZpZXdDb21taXRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcncucGFyc2VCb2R5KGMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBwYXJzZSBjb21taXQgIiArIGMubmFtZSgpLCBlKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlbWFpbHMuYWRkKGMuZ2V0QXV0aG9ySWRlbnQoKS5nZXRFbWFpbEFkZHJlc3MoKSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIFRpbWVzdGFtcCBkdCA9IHN1Ym1pdHRlci5nZXRHcmFudGVkKCk7CisgICAgICBmaW5hbCBUaW1lWm9uZSB0eiA9IG15SWRlbnQuZ2V0VGltZVpvbmUoKTsKKyAgICAgIGlmIChlbWFpbHMuc2l6ZSgpID09IDEKKyAgICAgICAgICAmJiB3aG8uZ2V0RW1haWxBZGRyZXNzZXMoKS5jb250YWlucyhlbWFpbHMuaXRlcmF0b3IoKS5uZXh0KCkpKSB7CisgICAgICAgIGF1dGhvcklkZW50ID0KKyAgICAgICAgICAgIG5ldyBQZXJzb25JZGVudChjb2RlUmV2aWV3Q29tbWl0cy5nZXQoMCkuZ2V0QXV0aG9ySWRlbnQoKSwgZHQsIHR6KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF1dGhvcklkZW50ID0gd2hvLm5ld0NvbW1pdHRlcklkZW50KGR0LCB0eik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGF1dGhvcklkZW50ID0gbXlJZGVudDsKKyAgICB9CisgICAgcmV0dXJuIGF1dGhvcklkZW50OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY2FuTWVyZ2UoZmluYWwgTWVyZ2VTb3J0ZXIgbWVyZ2VTb3J0ZXIsCisgICAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpCisgICAgICB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGlmIChoYXNNaXNzaW5nRGVwZW5kZW5jaWVzKG1lcmdlU29ydGVyLCB0b01lcmdlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG0gPSBuZXdUaHJlZVdheU1lcmdlcihyZXBvLCBjcmVhdGVEcnlSdW5JbnNlcnRlcigpKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG0ubWVyZ2UobmV3IEFueU9iamVjdElkW10ge21lcmdlVGlwLCB0b01lcmdlfSk7CisgICAgfSBjYXRjaCAoTm9NZXJnZUJhc2VFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyB0b01lcmdlLm5hbWUoKSwgZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gY2FuRmFzdEZvcndhcmQoZmluYWwgTWVyZ2VTb3J0ZXIgbWVyZ2VTb3J0ZXIsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBSZXZXYWxrIHJ3LAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGlmIChoYXNNaXNzaW5nRGVwZW5kZW5jaWVzKG1lcmdlU29ydGVyLCB0b01lcmdlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRyeSB7CisgICAgICByZXR1cm4gbWVyZ2VUaXAgPT0gbnVsbCB8fCBydy5pc01lcmdlZEludG8obWVyZ2VUaXAsIHRvTWVyZ2UpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IGZhc3QtZm9yd2FyZCB0ZXN0IGR1cmluZyBtZXJnZSIsIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNhbkNoZXJyeVBpY2soZmluYWwgTWVyZ2VTb3J0ZXIgbWVyZ2VTb3J0ZXIsCisgICAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsIGZpbmFsIFJldldhbGsgcncsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgaWYgKG1lcmdlVGlwID09IG51bGwpIHsKKyAgICAgIC8vIFRoZSBicmFuY2ggaXMgdW5ib3JuLiBGYXN0LWZvcndhcmQgaXMgcG9zc2libGUuCisgICAgICAvLworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHRvTWVyZ2UuZ2V0UGFyZW50Q291bnQoKSA9PSAwKSB7CisgICAgICAvLyBSZWZ1c2UgdG8gbWVyZ2UgYSByb290IGNvbW1pdCBpbnRvIGFuIGV4aXN0aW5nIGJyYW5jaCwKKyAgICAgIC8vIHdlIGNhbm5vdCBvYnRhaW4gYSBkZWx0YSBmb3IgdGhlIGNoZXJyeS1waWNrIHRvIGFwcGx5LgorICAgICAgLy8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodG9NZXJnZS5nZXRQYXJlbnRDb3VudCgpID09IDEpIHsKKyAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhcmVudCwgYSBjaGVycnktcGljayBjYW4gYmUgZG9uZSBieQorICAgICAgLy8gdGFraW5nIHRoZSBkZWx0YSByZWxhdGl2ZSB0byB0aGF0IG9uZSBwYXJlbnQgYW5kIHJlZG9pbmcKKyAgICAgIC8vIHRoYXQgb24gdGhlIGN1cnJlbnQgbWVyZ2UgdGlwLgorICAgICAgLy8KKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG0gPQorICAgICAgICAgICAgbmV3VGhyZWVXYXlNZXJnZXIocmVwbywgY3JlYXRlRHJ5UnVuSW5zZXJ0ZXIoKSk7CisgICAgICAgIG0uc2V0QmFzZSh0b01lcmdlLmdldFBhcmVudCgwKSk7CisgICAgICAgIHJldHVybiBtLm1lcmdlKG1lcmdlVGlwLCB0b01lcmdlKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIHRvTWVyZ2UubmFtZSgpLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUgcGFyZW50cywgc28gdGhpcyBpcyBhIG1lcmdlIGNvbW1pdC4gV2UKKyAgICAvLyBkb24ndCB3YW50IHRvIGNoZXJyeS1waWNrIHRoZSBtZXJnZSBhcyBjbGllbnRzIGNhbid0IGVhc2lseQorICAgIC8vIHJlYmFzZSB0aGVpciBoaXN0b3J5IHdpdGggdGhhdCBtZXJnZSBwcmVzZW50IGFuZCByZXBsYWNlZAorICAgIC8vIGJ5IGFuIGVxdWl2YWxlbnQgbWVyZ2Ugd2l0aCBhIGRpZmZlcmVudCBmaXJzdCBwYXJlbnQuIFNvCisgICAgLy8gaW5zdGVhZCBiZWhhdmUgYXMgdGhvdWdoIE1FUkdFX0lGX05FQ0VTU0FSWSB3YXMgY29uZmlndXJlZC4KKyAgICAvLworICAgIHJldHVybiBjYW5GYXN0Rm9yd2FyZChtZXJnZVNvcnRlciwgbWVyZ2VUaXAsIHJ3LCB0b01lcmdlKQorICAgICAgICB8fCBjYW5NZXJnZShtZXJnZVNvcnRlciwgcmVwbywgbWVyZ2VUaXAsIHRvTWVyZ2UpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhmaW5hbCBNZXJnZVNvcnRlciBtZXJnZVNvcnRlciwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuICFtZXJnZVNvcnRlci5zb3J0KENvbGxlY3Rpb25zLnNpbmdsZXRvbih0b01lcmdlKSkuY29udGFpbnModG9NZXJnZSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJCcmFuY2ggaGVhZCBzb3J0aW5nIGZhaWxlZCIsIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3RJbnNlcnRlciBjcmVhdGVEcnlSdW5JbnNlcnRlcigpIHsKKyAgICByZXR1cm4gbmV3IE9iamVjdEluc2VydGVyKCkgeworICAgICAgcHJpdmF0ZSBmaW5hbCBNdXRhYmxlT2JqZWN0SWQgYnVmID0gbmV3IE11dGFibGVPYmplY3RJZCgpOworICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IExBU1RfQllURSA9IENvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIIC0gMTsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCBvYmplY3RUeXBlLCBsb25nIGxlbmd0aCwgSW5wdXRTdHJlYW0gaW4pCisgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIG5vbi1leGlzdGluZyBkdW1teSBJRAorICAgICAgICBidWYuc2V0Qnl0ZShMQVNUX0JZVEUsIGJ1Zi5nZXRCeXRlKExBU1RfQllURSkgKyAxKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi5jb3B5KCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFBhY2tQYXJzZXIgbmV3UGFja1BhcnNlcihJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHB1YmxpYyBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlT25lQ29tbWl0KGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsCisgICAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJldldhbGsgcncsIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLAorICAgICAgZmluYWwgUmV2RmxhZyBjYW5NZXJnZUZsYWcsIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGRlc3RCcmFuY2gsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pCisgICAgICB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG0gPSBuZXdUaHJlZVdheU1lcmdlcihyZXBvLCBpbnNlcnRlcik7CisgICAgdHJ5IHsKKyAgICAgIGlmIChtLm1lcmdlKG5ldyBBbnlPYmplY3RJZFtdIHttZXJnZVRpcCwgbn0pKSB7CisgICAgICAgIHJldHVybiB3cml0ZU1lcmdlQ29tbWl0KG15SWRlbnQsIHJ3LCBpbnNlcnRlciwgY2FuTWVyZ2VGbGFnLCBkZXN0QnJhbmNoLAorICAgICAgICAgICAgbWVyZ2VUaXAsIG0uZ2V0UmVzdWx0VHJlZUlkKCksIG4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmFpbGVkKHJ3LCBjYW5NZXJnZUZsYWcsIG1lcmdlVGlwLCBuLCBDb21taXRNZXJnZVN0YXR1cy5QQVRIX0NPTkZMSUNUKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChOb01lcmdlQmFzZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0cnkgeworICAgICAgICBmYWlsZWQocncsIGNhbk1lcmdlRmxhZywgbWVyZ2VUaXAsIG4sCisgICAgICAgICAgICBnZXRDb21taXRNZXJnZVN0YXR1cyhlLmdldFJlYXNvbigpKSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgeworICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgfQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyBuLm5hbWUoKSwgZSk7CisgICAgfQorICAgIHJldHVybiBtZXJnZVRpcDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENvbW1pdE1lcmdlU3RhdHVzIGdldENvbW1pdE1lcmdlU3RhdHVzKAorICAgICAgTWVyZ2VCYXNlRmFpbHVyZVJlYXNvbiByZWFzb24pIHsKKyAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgICAgY2FzZSBNVUxUSVBMRV9NRVJHRV9CQVNFU19OT1RfU1VQUE9SVEVEOgorICAgICAgY2FzZSBUT09fTUFOWV9NRVJHRV9CQVNFUzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBDb21taXRNZXJnZVN0YXR1cy5NQU5VQUxfUkVDVVJTSVZFX01FUkdFOworICAgICAgY2FzZSBDT05GTElDVFNfRFVSSU5HX01FUkdFX0JBU0VfQ0FMQ1VMQVRJT046CisgICAgICAgIHJldHVybiBDb21taXRNZXJnZVN0YXR1cy5QQVRIX0NPTkZMSUNUOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENvZGVSZXZpZXdDb21taXQgZmFpbGVkKGZpbmFsIFJldldhbGsgcncsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiwgZmluYWwgQ29tbWl0TWVyZ2VTdGF0dXMgZmFpbHVyZSkKKyAgICAgIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcncucmVzZXRSZXRhaW4oY2FuTWVyZ2VGbGFnKTsKKyAgICBydy5tYXJrU3RhcnQobik7CisgICAgcncubWFya1VuaW50ZXJlc3RpbmcobWVyZ2VUaXApOworICAgIENvZGVSZXZpZXdDb21taXQgZmFpbGVkOworICAgIHdoaWxlICgoZmFpbGVkID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgeworICAgICAgZmFpbGVkLnN0YXR1c0NvZGUgPSBmYWlsdXJlOworICAgIH0KKyAgICByZXR1cm4gZmFpbGVkOworICB9CisKKyAgcHVibGljIENvZGVSZXZpZXdDb21taXQgd3JpdGVNZXJnZUNvbW1pdChmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgUmV2V2FsayBydywgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsIGZpbmFsIE9iamVjdElkIHRyZWVJZCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbikgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBtZXJnZWQgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7CisgICAgcncucmVzZXRSZXRhaW4oY2FuTWVyZ2VGbGFnKTsKKyAgICBydy5tYXJrU3RhcnQobik7CisgICAgcncubWFya1VuaW50ZXJlc3RpbmcobWVyZ2VUaXApOworICAgIGZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiBydykgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjcmMgPSAoQ29kZVJldmlld0NvbW1pdCkgYzsKKyAgICAgIGlmIChjcmMucGF0Y2hzZXRJZCAhPSBudWxsKSB7CisgICAgICAgIG1lcmdlZC5hZGQoY3JjKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ2J1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgaWYgKG1lcmdlZC5zaXplKCkgPT0gMSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjID0gbWVyZ2VkLmdldCgwKTsKKyAgICAgIHJ3LnBhcnNlQm9keShjKTsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQoIk1lcmdlIFwiIik7CisgICAgICBtc2didWYuYXBwZW5kKGMuZ2V0U2hvcnRNZXNzYWdlKCkpOworICAgICAgbXNnYnVmLmFwcGVuZCgiXCIiKTsKKworICAgIH0gZWxzZSB7CisgICAgICBtc2didWYuYXBwZW5kKCJNZXJnZSBjaGFuZ2VzICIpOworICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PiBpID0gbWVyZ2VkLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgeworICAgICAgICBtc2didWYuYXBwZW5kKGkubmV4dCgpLmNoYW5nZS5nZXRLZXkoKS5hYmJyZXZpYXRlKCkpOworICAgICAgICBpZiAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBtc2didWYuYXBwZW5kKCcsJyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIVJfSEVBRFNfTUFTVEVSLmVxdWFscyhkZXN0QnJhbmNoLmdldCgpKSkgeworICAgICAgbXNnYnVmLmFwcGVuZCgiIGludG8gIik7CisgICAgICBtc2didWYuYXBwZW5kKGRlc3RCcmFuY2guZ2V0U2hvcnROYW1lKCkpOworICAgIH0KKworICAgIGlmIChtZXJnZWQuc2l6ZSgpID4gMSkgeworICAgICAgbXNnYnVmLmFwcGVuZCgiXG5cbiogY2hhbmdlczpcbiIpOworICAgICAgZm9yIChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGMgOiBtZXJnZWQpIHsKKyAgICAgICAgcncucGFyc2VCb2R5KGMpOworICAgICAgICBtc2didWYuYXBwZW5kKCIgICIpOworICAgICAgICBtc2didWYuYXBwZW5kKGMuZ2V0U2hvcnRNZXNzYWdlKCkpOworICAgICAgICBtc2didWYuYXBwZW5kKCJcbiIpOworICAgICAgfQorICAgIH0KKworICAgIFBlcnNvbklkZW50IGF1dGhvcklkZW50ID0gY29tcHV0ZU1lcmdlQ29tbWl0QXV0aG9yKG15SWRlbnQsIHJ3LCBtZXJnZWQpOworCisgICAgZmluYWwgQ29tbWl0QnVpbGRlciBtZXJnZUNvbW1pdCA9IG5ldyBDb21taXRCdWlsZGVyKCk7CisgICAgbWVyZ2VDb21taXQuc2V0VHJlZUlkKHRyZWVJZCk7CisgICAgbWVyZ2VDb21taXQuc2V0UGFyZW50SWRzKG1lcmdlVGlwLCBuKTsKKyAgICBtZXJnZUNvbW1pdC5zZXRBdXRob3IoYXV0aG9ySWRlbnQpOworICAgIG1lcmdlQ29tbWl0LnNldENvbW1pdHRlcihteUlkZW50KTsKKyAgICBtZXJnZUNvbW1pdC5zZXRNZXNzYWdlKG1zZ2J1Zi50b1N0cmluZygpKTsKKworICAgIHJldHVybiAoQ29kZVJldmlld0NvbW1pdCkgcncucGFyc2VDb21taXQoY29tbWl0KGluc2VydGVyLCBtZXJnZUNvbW1pdCkpOworICB9CisKKyAgcHVibGljIFRocmVlV2F5TWVyZ2VyIG5ld1RocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywKKyAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyKSB7CisgICAgVGhyZWVXYXlNZXJnZXIgbTsKKyAgICBpZiAodXNlQ29udGVudE1lcmdlKSB7CisgICAgICAvLyBTZXR0aW5ncyBmb3IgdGhpcyBwcm9qZWN0IGFsbG93IHVzIHRvIHRyeSBhbmQgYXV0b21hdGljYWxseSByZXNvbHZlCisgICAgICAvLyBjb25mbGljdHMgd2l0aGluIGZpbGVzIGlmIG5lZWRlZC4gVXNlIGVpdGhlciB0aGUgb2xkIHJlc29sdmUgbWVyZ2VyIG9yCisgICAgICAvLyBuZXcgcmVjdXJzaXZlIG1lcmdlciwgYW5kIGluc3RydWN0IHRvIG9wZXJhdGUgaW4gY29yZS4KKyAgICAgIGlmICh1c2VSZWN1cnNpdmVNZXJnZSkgeworICAgICAgICBtID0gTWVyZ2VTdHJhdGVneS5SRUNVUlNJVkUubmV3TWVyZ2VyKHJlcG8sIHRydWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbSA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRS5uZXdNZXJnZXIocmVwbywgdHJ1ZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vIGF1dG8gY29uZmxpY3QgcmVzb2x2aW5nIGFsbG93ZWQuIElmIGFueSBvZiB0aGUKKyAgICAgIC8vIGFmZmVjdGVkIGZpbGVzIHdhcyBtb2RpZmllZCwgbWVyZ2Ugd2lsbCBmYWlsLgorICAgICAgbSA9IE1lcmdlU3RyYXRlZ3kuU0lNUExFX1RXT19XQVlfSU5fQ09SRS5uZXdNZXJnZXIocmVwbyk7CisgICAgfQorICAgIG0uc2V0T2JqZWN0SW5zZXJ0ZXIobmV3IE9iamVjdEluc2VydGVyLkZpbHRlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIE9iamVjdEluc2VydGVyIGRlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gaW5zZXJ0ZXI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gbTsKKyAgfQorCisgIHB1YmxpYyBPYmplY3RJZCBjb21taXQoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisgICAgICBmaW5hbCBDb21taXRCdWlsZGVyIG1lcmdlQ29tbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBpZCA9IGluc2VydGVyLmluc2VydChtZXJnZUNvbW1pdCk7CisgICAgaW5zZXJ0ZXIuZmx1c2goKTsKKyAgICByZXR1cm4gaWQ7CisgIH0KKworICBwdWJsaWMgUGF0Y2hTZXRBcHByb3ZhbCBtYXJrQ2xlYW5NZXJnZXMoZmluYWwgUmV2V2FsayBydywKKyAgICAgIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGlmIChtZXJnZVRpcCA9PSBudWxsKSB7CisgICAgICAvLyBJZiBtZXJnZVRpcCBpcyBudWxsIGhlcmUsIGJyYW5jaFRpcCB3YXMgbnVsbCwgaW5kaWNhdGluZyBhIG5ldyBicmFuY2gKKyAgICAgIC8vIGF0IHRoZSBzdGFydCBvZiB0aGUgbWVyZ2UgcHJvY2Vzcy4gV2UgYWxzbyBlbGVjdGVkIHRvIG1lcmdlIG5vdGhpbmcsCisgICAgICAvLyBwcm9iYWJseSBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMuIE5vdGhpbmcgd2FzIGNsZWFubHkgbWVyZ2VkLgorICAgICAgLy8KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0gbnVsbDsKKworICAgICAgcncucmVzZXRSZXRhaW4oY2FuTWVyZ2VGbGFnKTsKKyAgICAgIHJ3LnNvcnQoUmV2U29ydC5UT1BPKTsKKyAgICAgIHJ3LnNvcnQoUmV2U29ydC5SRVZFUlNFLCB0cnVlKTsKKyAgICAgIHJ3Lm1hcmtTdGFydChtZXJnZVRpcCk7CisgICAgICBmb3IgKFJldkNvbW1pdCBjIDogYWxyZWFkeUFjY2VwdGVkKSB7CisgICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKGMpOworICAgICAgfQorCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IGM7CisgICAgICB3aGlsZSAoKGMgPSAoQ29kZVJldmlld0NvbW1pdCkgcncubmV4dCgpKSAhPSBudWxsKSB7CisgICAgICAgIGlmIChjLnBhdGNoc2V0SWQgIT0gbnVsbCkgeworICAgICAgICAgIGMuc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX01FUkdFOworICAgICAgICAgIGlmIChzdWJtaXRBcHByb3ZhbCA9PSBudWxsKSB7CisgICAgICAgICAgICBzdWJtaXRBcHByb3ZhbCA9IGdldFN1Ym1pdHRlcihjLnBhdGNoc2V0SWQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICByZXR1cm4gc3VibWl0QXBwcm92YWw7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWFyayBjbGVhbiBtZXJnZXMiLCBlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01ldGFEYXRhVXBkYXRlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXRhRGF0YVVwZGF0ZS5qYXZhCmluZGV4IDg2ZGMxOWMuLmRjMDhhNmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01ldGFEYXRhVXBkYXRlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWV0YURhdGFVcGRhdGUuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTg3LDE1ICs4OCwxNSBAQAogICAgICAgICBAQXNzaXN0ZWQgUmVwb3NpdG9yeSBkYik7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IGRiOwogICBwcml2YXRlIGZpbmFsIENvbW1pdEJ1aWxkZXIgY29tbWl0OwogCiAgIEBJbmplY3QKLSAgcHVibGljIE1ldGFEYXRhVXBkYXRlKEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sCisgIHB1YmxpYyBNZXRhRGF0YVVwZGF0ZShHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCiAgICAgICBAQXNzaXN0ZWQgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLCBAQXNzaXN0ZWQgUmVwb3NpdG9yeSBkYikgewotICAgIHRoaXMucmVwbGljYXRpb24gPSByZXBsaWNhdGlvbjsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOwogICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5jb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOwpAQCAtMTA2LDYgKzEwNywxMiBAQAogICAgIGdldENvbW1pdEJ1aWxkZXIoKS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwogICB9CiAKKyAgcHVibGljIHZvaWQgc2V0QXV0aG9yKElkZW50aWZpZWRVc2VyIHVzZXIpIHsKKyAgICBnZXRDb21taXRCdWlsZGVyKCkuc2V0QXV0aG9yKHVzZXIubmV3Q29tbWl0dGVySWRlbnQoCisgICAgICAgIGdldENvbW1pdEJ1aWxkZXIoKS5nZXRDb21taXR0ZXIoKS5nZXRXaGVuKCksCisgICAgICAgIGdldENvbW1pdEJ1aWxkZXIoKS5nZXRDb21taXR0ZXIoKS5nZXRUaW1lWm9uZSgpKSk7CisgIH0KKwogICAvKiogQ2xvc2UgdGhlIGNhY2hlZCBSZXBvc2l0b3J5IGhhbmRsZS4gKi8KICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgZ2V0UmVwb3NpdG9yeSgpLmNsb3NlKCk7CkBAIC0xMjMsNyArMTMwLDcgQEAKICAgICByZXR1cm4gY29tbWl0OwogICB9CiAKLSAgdm9pZCByZXBsaWNhdGUoU3RyaW5nIHJlZikgewotICAgIHJlcGxpY2F0aW9uLmZpcmUocHJvamVjdE5hbWUsIHJlZik7CisgIHZvaWQgZmlyZUdpdFJlZlVwZGF0ZWRFdmVudChSZWZVcGRhdGUgcnUpIHsKKyAgICBnaXRSZWZVcGRhdGVkLmZpcmUocHJvamVjdE5hbWUsIHJ1KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTXVsdGlQcm9ncmVzc01vbml0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L011bHRpUHJvZ3Jlc3NNb25pdG9yLmphdmEKaW5kZXggMjNkOGRhZC4uOWM1NjMzYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTXVsdGlQcm9ncmVzc01vbml0b3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NdWx0aVByb2dyZXNzTW9uaXRvci5qYXZhCkBAIC0xODMsNiArMTgzLDcgQEAKICAgICAgIGZpbmFsIFRpbWVVbml0IHRpbWVvdXRVbml0KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKICAgICBsb25nIG92ZXJhbGxTdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgIGxvbmcgZGVhZGxpbmU7CisgICAgU3RyaW5nIGRldGFpbE1lc3NhZ2UgPSAiIjsKICAgICBpZiAodGltZW91dFRpbWUgPiAwKSB7CiAgICAgICBkZWFkbGluZSA9IG92ZXJhbGxTdGFydCArIE5BTk9TRUNPTkRTLmNvbnZlcnQodGltZW91dFRpbWUsIHRpbWVvdXRVbml0KTsKICAgICB9IGVsc2UgewpAQCAtMjA0LDEwICsyMDUsMTUgQEAKICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0ubmFub1RpbWUoKTsKIAogICAgICAgICBpZiAoZGVhZGxpbmUgPiAwICYmIG5vdyA+IGRlYWRsaW5lKSB7Ci0gICAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgIk11bHRpUHJvZ3Jlc3NNb25pdG9yIHdvcmtlciBraWxsZWQgYWZ0ZXIgJXNtcyIsCi0gICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KG5vdyAtIG92ZXJhbGxTdGFydCwgTkFOT1NFQ09ORFMpKSk7CiAgICAgICAgICAgd29ya2VyRnV0dXJlLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICBpZiAod29ya2VyRnV0dXJlLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgIGRldGFpbE1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiKHRpbWVvdXQgJXNtcywgY2FuY2VsbGVkKSIsCisgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KG5vdyAtIGRlYWRsaW5lLCBOQU5PU0VDT05EUykpOworICAgICAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpUHJvZ3Jlc3NNb25pdG9yIHdvcmtlciBraWxsZWQgYWZ0ZXIgJXNtcyIgKyBkZXRhaWxNZXNzYWdlLCAvLworICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydChub3cgLSBvdmVyYWxsU3RhcnQsIE5BTk9TRUNPTkRTKSkpOworICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzUsNyArMjQxLDcgQEAKICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwogICAgIH0gY2F0Y2ggKENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOworICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihkZXRhaWxNZXNzYWdlLCBlKTsKICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKICAgICAgIHdvcmtlckZ1dHVyZS5jYW5jZWwodHJ1ZSk7CiAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGUpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90ZXNCcmFuY2hVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Ob3Rlc0JyYW5jaFV0aWwuamF2YQppbmRleCAxN2NmZWE4Li4yYzZjN2I4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Ob3Rlc0JyYW5jaFV0aWwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Ob3Rlc0JyYW5jaFV0aWwuamF2YQpAQCAtMTQsNyArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC00NywxNCArNDksMTggQEAKICAqLwogcHVibGljIGNsYXNzIE5vdGVzQnJhbmNoVXRpbCB7CiAgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgTm90ZXNCcmFuY2hVdGlsIGNyZWF0ZShSZXBvc2l0b3J5IGRiKTsKKyAgICBOb3Rlc0JyYW5jaFV0aWwgY3JlYXRlKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBSZXBvc2l0b3J5IGRiLAorICAgICAgICBPYmplY3RJbnNlcnRlciBpbnNlcnRlcik7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xPQ0tfRkFJTFVSRV9DQUxMUyA9IDEwOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfT05fTE9DS19GQUlMVVJFX01TID0gMjU7CiAKLSAgcHJpdmF0ZSBQZXJzb25JZGVudCBnZXJyaXRJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CiAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlcjsKIAogICBwcml2YXRlIFJldkNvbW1pdCBiYXNlQ29tbWl0OwogICBwcml2YXRlIE5vdGVNYXAgYmFzZTsKQEAgLTYzLDcgKzY5LDYgQEAKICAgcHJpdmF0ZSBOb3RlTWFwIG91cnM7CiAKICAgcHJpdmF0ZSBSZXZXYWxrIHJldldhbGs7Ci0gIHByaXZhdGUgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXI7CiAgIHByaXZhdGUgT2JqZWN0UmVhZGVyIHJlYWRlcjsKICAgcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZTsKIApAQCAtNzEsOSArNzYsMTUgQEAKIAogICBASW5qZWN0CiAgIHB1YmxpYyBOb3Rlc0JyYW5jaFV0aWwoQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50LAotICAgICAgQEFzc2lzdGVkIFJlcG9zaXRvcnkgZGIpIHsKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwKKyAgICAgIEBBc3Npc3RlZCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwKKyAgICAgIEBBc3Npc3RlZCBSZXBvc2l0b3J5IGRiLAorICAgICAgQEFzc2lzdGVkIE9iamVjdEluc2VydGVyIGluc2VydGVyKSB7CiAgICAgdGhpcy5nZXJyaXRJZGVudCA9IGdlcnJpdElkZW50OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5pbnNlcnRlciA9IGluc2VydGVyOwogICB9CiAKICAgLyoqCkBAIC0xMjgsNyArMTM5LDYgQEAKICAgICAgIENvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb24gewogICAgIHRyeSB7CiAgICAgICByZXZXYWxrID0gbmV3IFJldldhbGsoZGIpOwotICAgICAgaW5zZXJ0ZXIgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpOwogICAgICAgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCk7CiAgICAgICBsb2FkQmFzZShub3Rlc0JyYW5jaCk7CiAgICAgICBpZiAob3ZlcndyaXRlKSB7CkBAIC0xNDQsNyArMTU0LDYgQEAKICAgICAgIHVwZGF0ZVJlZihub3Rlc0JyYW5jaCk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIHJldldhbGsucmVsZWFzZSgpOwotICAgICAgaW5zZXJ0ZXIucmVsZWFzZSgpOwogICAgICAgcmVhZGVyLnJlbGVhc2UoKTsKICAgICB9CiAgIH0KQEAgLTI1Miw2ICsyNjEsNyBAQAogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkbid0IHVwZGF0ZSAiICsgbm90ZXNCcmFuY2ggKyAiLiAiCiAgICAgICAgICAgICArIHJlc3VsdC5uYW1lKCkpOwogICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHByb2plY3QsIHJlZlVwZGF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L05vdGlmeUNvbmZpZy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90aWZ5Q29uZmlnLmphdmEKaW5kZXggYmEyODMzZC4uM2EwYzI3OCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90aWZ5Q29uZmlnLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90aWZ5Q29uZmlnLmphdmEKQEAgLTI0LDEwICsyNCwxNSBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBOb3RpZnlDb25maWcgaW1wbGVtZW50cyBDb21wYXJhYmxlPE5vdGlmeUNvbmZpZz4geworICBwdWJsaWMgc3RhdGljIGVudW0gSGVhZGVyIHsKKyAgICBUTywgQ0MsIEJDQzsKKyAgfQorCiAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAgIHByaXZhdGUgRW51bVNldDxOb3RpZnlUeXBlPiB0eXBlcyA9IEVudW1TZXQub2YoTm90aWZ5VHlwZS5BTEwpOwogICBwcml2YXRlIFN0cmluZyBmaWx0ZXI7CiAKKyAgcHJpdmF0ZSBIZWFkZXIgaGVhZGVyOwogICBwcml2YXRlIFNldDxHcm91cFJlZmVyZW5jZT4gZ3JvdXBzID0gU2V0cy5uZXdIYXNoU2V0KCk7CiAgIHByaXZhdGUgU2V0PEFkZHJlc3M+IGFkZHJlc3NlcyA9IFNldHMubmV3SGFzaFNldCgpOwogCkBAIC02Myw2ICs2OCwxNCBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyBIZWFkZXIgZ2V0SGVhZGVyKCkgeworICAgIHJldHVybiBoZWFkZXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRIZWFkZXIoSGVhZGVyIGhkcikgeworICAgIGhlYWRlciA9IGhkcjsKKyAgfQorCiAgIHB1YmxpYyBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdldEdyb3VwcygpIHsKICAgICByZXR1cm4gZ3JvdXBzOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9QZXJUaHJlYWRSZXF1ZXN0U2NvcGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1BlclRocmVhZFJlcXVlc3RTY29wZS5qYXZhCmluZGV4IDhhZWE3M2EuLmU3YmIwYWUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1BlclRocmVhZFJlcXVlc3RTY29wZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1BlclRocmVhZFJlcXVlc3RTY29wZS5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlRocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKQEAgLTUyLDggKzUzLDkgQEAKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BhZ2F0b3IgZXh0ZW5kcyBUaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3I8Q29udGV4dD4gewogICAgIEBJbmplY3QKLSAgICBQcm9wYWdhdG9yKFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKLSAgICAgIHN1cGVyKFJFUVVFU1QsIGN1cnJlbnQsIGxvY2FsKTsKKyAgICBQcm9wYWdhdG9yKFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwsCisgICAgICAgIFByb3ZpZGVyPFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyPiBkYlByb3ZpZGVyUHJvdmlkZXIpIHsKKyAgICAgIHN1cGVyKFJFUVVFU1QsIGN1cnJlbnQsIGxvY2FsLCBkYlByb3ZpZGVyUHJvdmlkZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUHJvamVjdENvbmZpZy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUHJvamVjdENvbmZpZy5qYXZhCmluZGV4IDEzZTk5NjcuLjJhMjYwZTRkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Qcm9qZWN0Q29uZmlnLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUHJvamVjdENvbmZpZy5qYXZhCkBAIC0xNiwxMyArMTYsMjMgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLmlzUGVybWlzc2lvbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlNob3J0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbnRyaWJ1dG9yQWdyZWVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlLkFjdGlvbjsKQEAgLTc5LDYgKzg5LDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTUFJTCA9ICJlbWFpbCI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMVEVSID0gImZpbHRlciI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJ0eXBlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IRUFERVIgPSAiaGVhZGVyIjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWSA9ICJjYXBhYmlsaXR5IjsKIApAQCAtOTMsNiArMTA0LDE5IEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVSR0VfQ09OVEVOVCA9ICJtZXJnZUNvbnRlbnQiOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFID0gInN0YXRlIjsKIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFTSEJPQVJEID0gImRhc2hib2FyZCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBTF9ERUZBVUxUID0gImxvY2FsLWRlZmF1bHQiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUJCUkVWSUFUSU9OID0gImFiYnJldmlhdGlvbiI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRlVOQ1RJT04gPSAiZnVuY3Rpb24iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUFlfTUlOX1NDT1JFID0gImNvcHlNaW5TY29yZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVkFMVUUgPSAidmFsdWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9PVkVSUklERSA9ICJjYW5PdmVycmlkZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IExBQkVMX0ZVTkNUSU9OUyA9IEltbXV0YWJsZVNldC5vZigKKyAgICAgICJNYXhXaXRoQmxvY2siLCAiTWF4Tm9CbG9jayIsICJOb0Jsb2NrIiwgIk5vT3AiKTsKKwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdWJtaXRUeXBlIGRlZmF1bHRTdWJtaXRBY3Rpb24gPQogICAgICAgU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXRlIGRlZmF1bHRTdGF0ZVZhbHVlID0KQEAgLTEwNSw2ICsxMjksNyBAQAogICBwcml2YXRlIE1hcDxTdHJpbmcsIEFjY2Vzc1NlY3Rpb24+IGFjY2Vzc1NlY3Rpb25zOwogICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRyaWJ1dG9yQWdyZWVtZW50PiBjb250cmlidXRvckFncmVlbWVudHM7CiAgIHByaXZhdGUgTWFwPFN0cmluZywgTm90aWZ5Q29uZmlnPiBub3RpZnlTZWN0aW9uczsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGxhYmVsU2VjdGlvbnM7CiAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXJyb3I+IHZhbGlkYXRpb25FcnJvcnM7CiAgIHByaXZhdGUgT2JqZWN0SWQgcnVsZXNJZDsKIApAQCAtMjAzLDYgKzIyOCwxMCBAQAogICAgIHJldHVybiBub3RpZnlTZWN0aW9ucy52YWx1ZXMoKTsKICAgfQogCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGdldExhYmVsU2VjdGlvbnMoKSB7CisgICAgcmV0dXJuIGxhYmVsU2VjdGlvbnM7CisgIH0KKwogICBwdWJsaWMgR3JvdXBSZWZlcmVuY2UgcmVzb2x2ZShBY2NvdW50R3JvdXAgZ3JvdXApIHsKICAgICByZXR1cm4gcmVzb2x2ZShHcm91cFJlZmVyZW5jZS5mb3JHcm91cChncm91cCkpOwogICB9CkBAIC0yMjMsNiArMjUyLDExIEBACiAgICAgcmV0dXJuIGdyb3Vwc0J5VVVJRC5nZXQodXVpZCk7CiAgIH0KIAorICAvKiogQHJldHVybiBzZXQgb2YgYWxsIGdyb3VwcyB1c2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbi4gKi8KKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0QWxsR3JvdXBVVUlEcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGdyb3Vwc0J5VVVJRC5rZXlTZXQoKSk7CisgIH0KKwogICAvKioKICAgICogQHJldHVybiB0aGUgcHJvamVjdCdzIHJ1bGVzLnBsIE9iamVjdElkLCBpZiBwcmVzZW50IGluIHRoZSBicmFuY2guCiAgICAqICAgIE51bGwgaWYgaXQgZG9lc24ndCBleGlzdC4KQEAgLTI4MiwxOCArMzE2LDIyIEBACiAgICAgfQogICAgIHAuc2V0UGFyZW50TmFtZShyYy5nZXRTdHJpbmcoQUNDRVNTLCBudWxsLCBLRVlfSU5IRVJJVF9GUk9NKSk7CiAKLSAgICBwLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhnZXRCb29sZWFuKHJjLCBSRUNFSVZFLCBLRVlfUkVRVUlSRV9DT05UUklCVVRPUl9BR1JFRU1FTlQsIGZhbHNlKSk7Ci0gICAgcC5zZXRVc2VTaWduZWRPZmZCeShnZXRCb29sZWFuKHJjLCBSRUNFSVZFLCBLRVlfUkVRVUlSRV9TSUdORURfT0ZGX0JZLCBmYWxzZSkpOwotICAgIHAuc2V0UmVxdWlyZUNoYW5nZUlEKGdldEJvb2xlYW4ocmMsIFJFQ0VJVkUsIEtFWV9SRVFVSVJFX0NIQU5HRV9JRCwgZmFsc2UpKTsKKyAgICBwLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhnZXRFbnVtKHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DT05UUklCVVRPUl9BR1JFRU1FTlQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKKyAgICBwLnNldFVzZVNpZ25lZE9mZkJ5KGdldEVudW0ocmMsIFJFQ0VJVkUsIG51bGwsIEtFWV9SRVFVSVJFX1NJR05FRF9PRkZfQlksIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKKyAgICBwLnNldFJlcXVpcmVDaGFuZ2VJRChnZXRFbnVtKHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DSEFOR0VfSUQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKIAogICAgIHAuc2V0U3VibWl0VHlwZShnZXRFbnVtKHJjLCBTVUJNSVQsIG51bGwsIEtFWV9BQ1RJT04sIGRlZmF1bHRTdWJtaXRBY3Rpb24pKTsKLSAgICBwLnNldFVzZUNvbnRlbnRNZXJnZShnZXRCb29sZWFuKHJjLCBTVUJNSVQsIEtFWV9NRVJHRV9DT05URU5ULCBmYWxzZSkpOworICAgIHAuc2V0VXNlQ29udGVudE1lcmdlKGdldEVudW0ocmMsIFNVQk1JVCwgbnVsbCwgS0VZX01FUkdFX0NPTlRFTlQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKICAgICBwLnNldFN0YXRlKGdldEVudW0ocmMsIFBST0pFQ1QsIG51bGwsIEtFWV9TVEFURSwgZGVmYXVsdFN0YXRlVmFsdWUpKTsKIAorICAgIHAuc2V0RGVmYXVsdERhc2hib2FyZChyYy5nZXRTdHJpbmcoREFTSEJPQVJELCBudWxsLCBLRVlfREVGQVVMVCkpOworICAgIHAuc2V0TG9jYWxEZWZhdWx0RGFzaGJvYXJkKHJjLmdldFN0cmluZyhEQVNIQk9BUkQsIG51bGwsIEtFWV9MT0NBTF9ERUZBVUxUKSk7CisKICAgICBsb2FkQWNjb3VudHNTZWN0aW9uKHJjLCBncm91cHNCeU5hbWUpOwogICAgIGxvYWRDb250cmlidXRvckFncmVlbWVudHMocmMsIGdyb3Vwc0J5TmFtZSk7CiAgICAgbG9hZEFjY2Vzc1NlY3Rpb25zKHJjLCBncm91cHNCeU5hbWUpOwogICAgIGxvYWROb3RpZnlTZWN0aW9ucyhyYywgZ3JvdXBzQnlOYW1lKTsKKyAgICBsb2FkTGFiZWxTZWN0aW9ucyhyYyk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgbG9hZEFjY291bnRzU2VjdGlvbigKQEAgLTM2OCw2ICs0MDYsOSBAQAogICAgICAgICAgIE5PVElGWSwgc2VjdGlvbk5hbWUsIEtFWV9UWVBFLAogICAgICAgICAgIE5vdGlmeVR5cGUuQUxMKSk7CiAgICAgICBuLnNldFR5cGVzKHR5cGVzKTsKKyAgICAgIG4uc2V0SGVhZGVyKENvbmZpZ1V0aWwuZ2V0RW51bShyYywKKyAgICAgICAgICBOT1RJRlksIHNlY3Rpb25OYW1lLCBLRVlfSEVBREVSLAorICAgICAgICAgIE5vdGlmeUNvbmZpZy5IZWFkZXIuQkNDKSk7CiAKICAgICAgIGZvciAoU3RyaW5nIGRzdCA6IHJjLmdldFN0cmluZ0xpc3QoTk9USUZZLCBzZWN0aW9uTmFtZSwgS0VZX0VNQUlMKSkgewogICAgICAgICBpZiAoZHN0LnN0YXJ0c1dpdGgoImdyb3VwICIpKSB7CkBAIC00ODAsNiArNTIxLDcyIEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgTGFiZWxWYWx1ZSBwYXJzZUxhYmVsVmFsdWUoU3RyaW5nIHNyYykgeworICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IEltbXV0YWJsZUxpc3QuY29weU9mKAorICAgICAgICBTcGxpdHRlci5vbihDaGFyTWF0Y2hlci5XSElURVNQQUNFKS5vbWl0RW1wdHlTdHJpbmdzKCkubGltaXQoMikKKyAgICAgICAgLnNwbGl0KHNyYykpOworICAgIGlmIChwYXJ0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVtcHR5IHZhbHVlIik7CisgICAgfQorICAgIHJldHVybiBuZXcgTGFiZWxWYWx1ZSgKKyAgICAgICAgU2hvcnRzLmNoZWNrZWRDYXN0KFBlcm1pc3Npb25SdWxlLnBhcnNlSW50KHBhcnRzLmdldCgwKSkpLAorICAgICAgICBwYXJ0cy5nZXQoMSkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRMYWJlbFNlY3Rpb25zKENvbmZpZyByYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvd2VyTmFtZXMgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgIGxhYmVsU2VjdGlvbnMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogcmMuZ2V0U3Vic2VjdGlvbnMoTEFCRUwpKSB7CisgICAgICBTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICBpZiAobG93ZXJOYW1lcy5jb250YWluc0tleShsb3dlcikpIHsKKyAgICAgICAgZXJyb3IobmV3IFZhbGlkYXRpb25FcnJvcihQUk9KRUNUX0NPTkZJRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJMYWJlbCBcIiVzXCIgY29uZmxpY3RzIHdpdGggXCIlc1wiIiwKKyAgICAgICAgICAgIG5hbWUsIGxvd2VyTmFtZXMuZ2V0KGxvd2VyKSkpKTsKKyAgICAgIH0KKyAgICAgIGxvd2VyTmFtZXMucHV0KGxvd2VyLCBuYW1lKTsKKworICAgICAgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcmMuZ2V0U3RyaW5nTGlzdChMQUJFTCwgbmFtZSwgS0VZX1ZBTFVFKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhbHVlcy5hZGQocGFyc2VMYWJlbFZhbHVlKHZhbHVlKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3RWYWx1ZSkgeworICAgICAgICAgIGVycm9yKG5ldyBWYWxpZGF0aW9uRXJyb3IoUFJPSkVDVF9DT05GSUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJJbnZhbGlkICVzIFwiJXNcIiBmb3IgbGFiZWwgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgIEtFWV9WQUxVRSwgdmFsdWUsIG5hbWUsIG5vdFZhbHVlLmdldE1lc3NhZ2UoKSkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBMYWJlbFR5cGUgbGFiZWw7CisgICAgICB0cnkgeworICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFR5cGUobmFtZSwgdmFsdWVzKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBiYWROYW1lKSB7CisgICAgICAgIGVycm9yKG5ldyBWYWxpZGF0aW9uRXJyb3IoUFJPSkVDVF9DT05GSUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiSW52YWxpZCBsYWJlbCBcIiVzXCIiLCBuYW1lKSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBhYmJyID0gcmMuZ2V0U3RyaW5nKExBQkVMLCBuYW1lLCBLRVlfQUJCUkVWSUFUSU9OKTsKKyAgICAgIGlmIChhYmJyICE9IG51bGwpIHsKKyAgICAgICAgbGFiZWwuc2V0QWJicmV2aWF0ZWROYW1lKGFiYnIpOworICAgICAgfQorCisgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgcmMuZ2V0U3RyaW5nKExBQkVMLCBuYW1lLCBLRVlfRlVOQ1RJT04pLCAiTWF4V2l0aEJsb2NrIik7CisgICAgICBpZiAoTEFCRUxfRlVOQ1RJT05TLmNvbnRhaW5zKGZ1bmN0aW9uTmFtZSkpIHsKKyAgICAgICAgbGFiZWwuc2V0RnVuY3Rpb25OYW1lKGZ1bmN0aW9uTmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnJvcihuZXcgVmFsaWRhdGlvbkVycm9yKFBST0pFQ1RfQ09ORklHLCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkludmFsaWQgJXMgZm9yIGxhYmVsIFwiJXNcIi4gVmFsaWQgbmFtZXMgYXJlOiAlcyIsCisgICAgICAgICAgICBLRVlfRlVOQ1RJT04sIG5hbWUsIEpvaW5lci5vbigiLCAiKS5qb2luKExBQkVMX0ZVTkNUSU9OUykpKSk7CisgICAgICAgIGxhYmVsLnNldEZ1bmN0aW9uTmFtZShudWxsKTsKKyAgICAgIH0KKyAgICAgIGxhYmVsLnNldENvcHlNaW5TY29yZSgKKyAgICAgICAgICByYy5nZXRCb29sZWFuKExBQkVMLCBuYW1lLCBLRVlfQ09QWV9NSU5fU0NPUkUsIGZhbHNlKSk7CisgICAgICBsYWJlbC5zZXRDYW5PdmVycmlkZSgKKyAgICAgICAgICByYy5nZXRCb29sZWFuKExBQkVMLCBuYW1lLCBLRVlfQ0FOX09WRVJSSURFLCB0cnVlKSk7CisgICAgICBsYWJlbFNlY3Rpb25zLnB1dChuYW1lLCBsYWJlbCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBHcm91cFJlZmVyZW5jZT4gcmVhZEdyb3VwTGlzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZ3JvdXBzQnlVVUlEID0gbmV3IEhhc2hNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEdyb3VwUmVmZXJlbmNlPigpOwogICAgIE1hcDxTdHJpbmcsIEdyb3VwUmVmZXJlbmNlPiBncm91cHNCeU5hbWUgPQpAQCAtNTI1LDIxICs2MzIsMjUgQEAKICAgICB9CiAgICAgc2V0KHJjLCBBQ0NFU1MsIG51bGwsIEtFWV9JTkhFUklUX0ZST00sIHAuZ2V0UGFyZW50TmFtZSgpKTsKIAotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ09OVFJJQlVUT1JfQUdSRUVNRU5ULCBwLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfU0lHTkVEX09GRl9CWSwgcC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ0hBTkdFX0lELCBwLmlzUmVxdWlyZUNoYW5nZUlEKCkpOworICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ09OVFJJQlVUT1JfQUdSRUVNRU5ULCBwLmdldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpLCBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKKyAgICBzZXQocmMsIFJFQ0VJVkUsIG51bGwsIEtFWV9SRVFVSVJFX1NJR05FRF9PRkZfQlksIHAuZ2V0VXNlU2lnbmVkT2ZmQnkoKSwgUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CisgICAgc2V0KHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DSEFOR0VfSUQsIHAuZ2V0UmVxdWlyZUNoYW5nZUlEKCksIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpOwogCiAgICAgc2V0KHJjLCBTVUJNSVQsIG51bGwsIEtFWV9BQ1RJT04sIHAuZ2V0U3VibWl0VHlwZSgpLCBkZWZhdWx0U3VibWl0QWN0aW9uKTsKLSAgICBzZXQocmMsIFNVQk1JVCwgbnVsbCwgS0VZX01FUkdFX0NPTlRFTlQsIHAuaXNVc2VDb250ZW50TWVyZ2UoKSk7CisgICAgc2V0KHJjLCBTVUJNSVQsIG51bGwsIEtFWV9NRVJHRV9DT05URU5ULCBwLmdldFVzZUNvbnRlbnRNZXJnZSgpLCBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKIAogICAgIHNldChyYywgUFJPSkVDVCwgbnVsbCwgS0VZX1NUQVRFLCBwLmdldFN0YXRlKCksIG51bGwpOwogCisgICAgc2V0KHJjLCBEQVNIQk9BUkQsIG51bGwsIEtFWV9ERUZBVUxULCBwLmdldERlZmF1bHREYXNoYm9hcmQoKSk7CisgICAgc2V0KHJjLCBEQVNIQk9BUkQsIG51bGwsIEtFWV9MT0NBTF9ERUZBVUxULCBwLmdldExvY2FsRGVmYXVsdERhc2hib2FyZCgpKTsKKwogICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4ga2VlcEdyb3VwcyA9IG5ldyBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPigpOwogICAgIHNhdmVBY2NvdW50c1NlY3Rpb24ocmMsIGtlZXBHcm91cHMpOwogICAgIHNhdmVDb250cmlidXRvckFncmVlbWVudHMocmMsIGtlZXBHcm91cHMpOwogICAgIHNhdmVBY2Nlc3NTZWN0aW9ucyhyYywga2VlcEdyb3Vwcyk7CiAgICAgc2F2ZU5vdGlmeVNlY3Rpb25zKHJjLCBrZWVwR3JvdXBzKTsKICAgICBncm91cHNCeVVVSUQua2V5U2V0KCkucmV0YWluQWxsKGtlZXBHcm91cHMpOworICAgIHNhdmVMYWJlbFNlY3Rpb25zKHJjKTsKIAogICAgIHNhdmVDb25maWcoUFJPSkVDVF9DT05GSUcsIHJjKTsKICAgICBzYXZlR3JvdXBMaXN0KCk7CkBAIC01OTMsNiArNzA0LDggQEAKICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWRkcnMpOwogICAgICAgZW1haWwuYWRkQWxsKGFkZHJzKTsKIAorICAgICAgc2V0KHJjLCBOT1RJRlksIG5jLmdldE5hbWUoKSwgS0VZX0hFQURFUiwKKyAgICAgICAgICBuYy5nZXRIZWFkZXIoKSwgTm90aWZ5Q29uZmlnLkhlYWRlci5CQ0MpOwogICAgICAgaWYgKGVtYWlsLmlzRW1wdHkoKSkgewogICAgICAgICByYy51bnNldChOT1RJRlksIG5jLmdldE5hbWUoKSwgS0VZX0VNQUlMKTsKICAgICAgIH0gZWxzZSB7CkBAIC03MDcsNiArODIwLDUzIEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIHNhdmVMYWJlbFNlY3Rpb25zKENvbmZpZyByYykgeworICAgIExpc3Q8U3RyaW5nPiBleGlzdGluZyA9IExpc3RzLm5ld0FycmF5TGlzdChyYy5nZXRTdWJzZWN0aW9ucyhMQUJFTCkpOworICAgIGlmICghTGlzdHMubmV3QXJyYXlMaXN0KGxhYmVsU2VjdGlvbnMua2V5U2V0KCkpLmVxdWFscyhleGlzdGluZykpIHsKKyAgICAgIC8vIE9yZGVyIG9mIHNlY3Rpb25zIGNoYW5nZWQsIHJlbW92ZSBhbmQgcmV3cml0ZSB0aGVtIGFsbC4KKyAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBleGlzdGluZykgeworICAgICAgICByYy51bnNldFNlY3Rpb24oTEFCRUwsIG5hbWUpOworICAgICAgfQorICAgIH0KKworICAgIFNldDxTdHJpbmc+IHRvVW5zZXQgPSBTZXRzLm5ld0hhc2hTZXQoZXhpc3RpbmcpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGFiZWxUeXBlPiBlIDogbGFiZWxTZWN0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0S2V5KCk7CisgICAgICBMYWJlbFR5cGUgbGFiZWwgPSBlLmdldFZhbHVlKCk7CisgICAgICB0b1Vuc2V0LnJlbW92ZShuYW1lKTsKKyAgICAgIHJjLnNldFN0cmluZyhMQUJFTCwgbmFtZSwgS0VZX0ZVTkNUSU9OLCBsYWJlbC5nZXRGdW5jdGlvbk5hbWUoKSk7CisKKyAgICAgIGlmICghTGFiZWxUeXBlLmRlZmF1bHRBYmJyZXZpYXRpb24obmFtZSkKKyAgICAgICAgICAuZXF1YWxzKGxhYmVsLmdldEFiYnJldmlhdGVkTmFtZSgpKSkgeworICAgICAgICByYy5zZXRTdHJpbmcoCisgICAgICAgICAgICBMQUJFTCwgbmFtZSwgS0VZX0FCQlJFVklBVElPTiwgbGFiZWwuZ2V0QWJicmV2aWF0ZWROYW1lKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmMudW5zZXQoTEFCRUwsIG5hbWUsIEtFWV9BQkJSRVZJQVRJT04pOworICAgICAgfQorICAgICAgaWYgKGxhYmVsLmlzQ29weU1pblNjb3JlKCkpIHsKKyAgICAgICAgcmMuc2V0Qm9vbGVhbihMQUJFTCwgbmFtZSwgS0VZX0NPUFlfTUlOX1NDT1JFLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJjLnVuc2V0KExBQkVMLCBuYW1lLCBLRVlfQ09QWV9NSU5fU0NPUkUpOworICAgICAgfQorICAgICAgaWYgKCFsYWJlbC5jYW5PdmVycmlkZSgpKSB7CisgICAgICAgIHJjLnNldEJvb2xlYW4oTEFCRUwsIG5hbWUsIEtFWV9DQU5fT1ZFUlJJREUsIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJjLnVuc2V0KExBQkVMLCBuYW1lLCBLRVlfQ0FOX09WRVJSSURFKTsKKyAgICAgIH0KKworICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9CisgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGxhYmVsLmdldFZhbHVlcygpLnNpemUoKSk7CisgICAgICBmb3IgKExhYmVsVmFsdWUgdmFsdWUgOiBsYWJlbC5nZXRWYWx1ZXMoKSkgeworICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlLmZvcm1hdCgpKTsKKyAgICAgIH0KKyAgICAgIHJjLnNldFN0cmluZ0xpc3QoTEFCRUwsIG5hbWUsIEtFWV9WQUxVRSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogdG9VbnNldCkgeworICAgICAgcmMudW5zZXRTZWN0aW9uKExBQkVMLCBuYW1lKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgc2F2ZUdyb3VwTGlzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKGdyb3Vwc0J5VVVJRC5pc0VtcHR5KCkpIHsKICAgICAgIHNhdmVGaWxlKEdST1VQX0xJU1QsIG51bGwpOwpAQCAtNzM0LDE2ICs4OTQsNiBAQAogICAgIHNhdmVVVEY4KEdST1VQX0xJU1QsIGJ1Zi50b1N0cmluZygpKTsKICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKENvbmZpZyByYywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lLAotICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHJjLmdldEJvb2xlYW4oc2VjdGlvbiwgbmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBlcnJvcihuZXcgVmFsaWRhdGlvbkVycm9yKFBST0pFQ1RfQ09ORklHLCBlcnIuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgfQotCiAgIHByaXZhdGUgPEUgZXh0ZW5kcyBFbnVtPD8+PiBFIGdldEVudW0oQ29uZmlnIHJjLCBTdHJpbmcgc2VjdGlvbiwKICAgICAgIFN0cmluZyBzdWJzZWN0aW9uLCBTdHJpbmcgbmFtZSwgRSBkZWZhdWx0VmFsdWUpIHsKICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlSWZOZWNlc3NhcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlYmFzZUlmTmVjZXNzYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5MGVhMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlYmFzZUlmTmVjZXNzYXJ5LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlBhdGhDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlJlYmFzZUNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBSZWJhc2VJZk5lY2Vzc2FyeSBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKworICBwcml2YXRlIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gbmV3Q29tbWl0czsKKworICBSZWJhc2VJZk5lY2Vzc2FyeShmaW5hbCBTdWJtaXRTdHJhdGVneS5Bcmd1bWVudHMgYXJncywKKyAgICAgIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2UpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICB0aGlzLnJlYmFzZUNoYW5nZSA9IHJlYmFzZUNoYW5nZTsKKyAgICB0aGlzLm5ld0NvbW1pdHMgPSBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIENvZGVSZXZpZXdDb21taXQgX3J1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIENvZGVSZXZpZXdDb21taXQgbmV3TWVyZ2VUaXAgPSBtZXJnZVRpcDsKKyAgICBzb3J0KHRvTWVyZ2UpOworCisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gdG9NZXJnZS5yZW1vdmUoMCk7CisKKyAgICAgIGlmIChuZXdNZXJnZVRpcCA9PSBudWxsKSB7CisgICAgICAgIC8vIFRoZSBicmFuY2ggaXMgdW5ib3JuLiBUYWtlIGEgZmFzdC1mb3J3YXJkIHJlc29sdXRpb24gdG8KKyAgICAgICAgLy8gY3JlYXRlIHRoZSBicmFuY2guCisgICAgICAgIC8vCisgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0U7CisKKyAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgLy8gUmVmdXNlIHRvIG1lcmdlIGEgcm9vdCBjb21taXQgaW50byBhbiBleGlzdGluZyBicmFuY2gsCisgICAgICAgIC8vIHdlIGNhbm5vdCBvYnRhaW4gYSBkZWx0YSBmb3IgdGhlIHJlYmFzZSB0byBhcHBseS4KKyAgICAgICAgLy8KKyAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0FOTk9UX1JFQkFTRV9ST09UOworCisgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA9PSAxKSB7CisgICAgICAgIGlmIChhcmdzLm1lcmdlVXRpbC5jYW5GYXN0Rm9yd2FyZCgKKyAgICAgICAgICAgIGFyZ3MubWVyZ2VTb3J0ZXIsIG5ld01lcmdlVGlwLCBhcmdzLnJ3LCBuKSkgeworICAgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBQYXRjaFNldCBuZXdQYXRjaFNldCA9CisgICAgICAgICAgICAgICAgcmViYXNlQ2hhbmdlLnJlYmFzZShhcmdzLnJlcG8sIGFyZ3MucncsIGFyZ3MuaW5zZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgIG4ucGF0Y2hzZXRJZCwgbi5jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgIGFyZ3MubWVyZ2VVdGlsLmdldFN1Ym1pdHRlcihuLnBhdGNoc2V0SWQpLmdldEFjY291bnRJZCgpLAorICAgICAgICAgICAgICAgICAgICBuZXdNZXJnZVRpcCwgYXJncy5tZXJnZVV0aWwpOworICAgICAgICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXJncy5tZXJnZVV0aWwuZ2V0QXBwcm92YWxzRm9yQ29tbWl0KG4pKSB7CisgICAgICAgICAgICAgIGFwcHJvdmFscy5hZGQobmV3IFBhdGNoU2V0QXBwcm92YWwobmV3UGF0Y2hTZXQuZ2V0SWQoKSwgYSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5kYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydChhcHByb3ZhbHMpOworICAgICAgICAgICAgbmV3TWVyZ2VUaXAgPQorICAgICAgICAgICAgICAgIChDb2RlUmV2aWV3Q29tbWl0KSBhcmdzLnJ3LnBhcnNlQ29tbWl0KE9iamVjdElkCisgICAgICAgICAgICAgICAgICAgIC5mcm9tU3RyaW5nKG5ld1BhdGNoU2V0LmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwLmNvcHlGcm9tKG4pOworICAgICAgICAgICAgbmV3TWVyZ2VUaXAucGF0Y2hzZXRJZCA9IG5ld1BhdGNoU2V0LmdldElkKCk7CisgICAgICAgICAgICBuZXdNZXJnZVRpcC5jaGFuZ2UgPQorICAgICAgICAgICAgICAgIGFyZ3MuZGIuY2hhbmdlcygpLmdldChuZXdQYXRjaFNldC5nZXRJZCgpLmdldFBhcmVudEtleSgpKTsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9SRUJBU0U7CisgICAgICAgICAgICBuZXdDb21taXRzLnB1dChuZXdQYXRjaFNldC5nZXRJZCgpLmdldFBhcmVudEtleSgpLCBuZXdNZXJnZVRpcCk7CisgICAgICAgICAgICBzZXRSZWZMb2dJZGVudChhcmdzLm1lcmdlVXRpbC5nZXRTdWJtaXR0ZXIobi5wYXRjaHNldElkKSk7CisgICAgICAgICAgfSBjYXRjaCAoUGF0aENvbmZsaWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLlBBVEhfQ09ORkxJQ1Q7CisgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IHJlYmFzZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IHJlYmFzZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA+IDEpIHsKKyAgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHBhcmVudHMsIHNvIHRoaXMgaXMgYSBtZXJnZSBjb21taXQuIFdlCisgICAgICAgIC8vIGRvbid0IHdhbnQgdG8gcmViYXNlIHRoZSBtZXJnZSBhcyBjbGllbnRzIGNhbid0IGVhc2lseQorICAgICAgICAvLyByZWJhc2UgdGhlaXIgaGlzdG9yeSB3aXRoIHRoYXQgbWVyZ2UgcHJlc2VudCBhbmQgcmVwbGFjZWQKKyAgICAgICAgLy8gYnkgYW4gZXF1aXZhbGVudCBtZXJnZSB3aXRoIGEgZGlmZmVyZW50IGZpcnN0IHBhcmVudC4gU28KKyAgICAgICAgLy8gaW5zdGVhZCBiZWhhdmUgYXMgdGhvdWdoIE1FUkdFX0lGX05FQ0VTU0FSWSB3YXMgY29uZmlndXJlZC4KKyAgICAgICAgLy8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXJncy5ydy5pc01lcmdlZEludG8obmV3TWVyZ2VUaXAsIG4pKSB7CisgICAgICAgICAgICBuZXdNZXJnZVRpcCA9IG47CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwID0gYXJncy5tZXJnZVV0aWwubWVyZ2VPbmVDb21taXQoCisgICAgICAgICAgICAgICAgYXJncy5teUlkZW50LCBhcmdzLnJlcG8sIGFyZ3MucncsIGFyZ3MuaW5zZXJ0ZXIsCisgICAgICAgICAgICAgICAgYXJncy5jYW5NZXJnZUZsYWcsIGFyZ3MuZGVzdEJyYW5jaCwgbmV3TWVyZ2VUaXAsIG4pOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0gYXJncy5tZXJnZVV0aWwubWFya0NsZWFuTWVyZ2VzKAorICAgICAgICAgICAgICBhcmdzLnJ3LCBhcmdzLmNhbk1lcmdlRmxhZywgbmV3TWVyZ2VUaXAsIGFyZ3MuYWxyZWFkeUFjY2VwdGVkKTsKKyAgICAgICAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBcHByb3ZhbCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFyZ3MuYWxyZWFkeUFjY2VwdGVkLmFkZChuZXdNZXJnZVRpcCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld01lcmdlVGlwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNvcnQoZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b1NvcnQpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gc29ydGVkID0KKyAgICAgICAgICBuZXcgUmViYXNlU29ydGVyKGFyZ3MucncsIGFyZ3MuYWxyZWFkeUFjY2VwdGVkLCBhcmdzLmNhbk1lcmdlRmxhZykKKyAgICAgICAgICAgICAgLnNvcnQodG9Tb3J0KTsKKyAgICAgIHRvU29ydC5jbGVhcigpOworICAgICAgdG9Tb3J0LmFkZEFsbChzb3J0ZWQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ29tbWl0IHNvcnRpbmcgZmFpbGVkIiwgZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8Q2hhbmdlLklkLCBDb2RlUmV2aWV3Q29tbWl0PiBnZXROZXdDb21taXRzKCkgeworICAgIHJldHVybiBuZXdDb21taXRzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGRyeVJ1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIHJldHVybiAhYXJncy5tZXJnZVV0aWwuaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhhcmdzLm1lcmdlU29ydGVyLCB0b01lcmdlKQorICAgICAgICAmJiBhcmdzLm1lcmdlVXRpbC5jYW5DaGVycnlQaWNrKGFyZ3MubWVyZ2VTb3J0ZXIsIGFyZ3MucmVwbywgbWVyZ2VUaXAsCisgICAgICAgICAgICBhcmdzLnJ3LCB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlU29ydGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWJhc2VTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5MjliCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlU29ydGVyLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZGbGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworY2xhc3MgUmViYXNlU29ydGVyIHsKKworICBwcml2YXRlIGZpbmFsIFJldldhbGsgcnc7CisgIHByaXZhdGUgZmluYWwgUmV2RmxhZyBjYW5NZXJnZUZsYWc7CisgIHByaXZhdGUgZmluYWwgU2V0PFJldkNvbW1pdD4gYWNjZXB0ZWQ7CisKKyAgUmViYXNlU29ydGVyKGZpbmFsIFJldldhbGsgcncsIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCwKKyAgICAgIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnKSB7CisgICAgdGhpcy5ydyA9IHJ3OworICAgIHRoaXMuY2FuTWVyZ2VGbGFnID0gY2FuTWVyZ2VGbGFnOworICAgIHRoaXMuYWNjZXB0ZWQgPSBhbHJlYWR5QWNjZXB0ZWQ7CisgIH0KKworICBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHNvcnQoQ29sbGVjdGlvbjxDb2RlUmV2aWV3Q29tbWl0PiBpbmNvbWluZykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7CisgICAgZmluYWwgU2V0PENvZGVSZXZpZXdDb21taXQ+IHNvcnQgPSBuZXcgSGFzaFNldDxDb2RlUmV2aWV3Q29tbWl0PihpbmNvbWluZyk7CisgICAgd2hpbGUgKCFzb3J0LmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gcmVtb3ZlT25lKHNvcnQpOworCisgICAgICBydy5yZXNldFJldGFpbihjYW5NZXJnZUZsYWcpOworICAgICAgcncubWFya1N0YXJ0KG4pOworICAgICAgZm9yIChSZXZDb21taXQgYyA6IGFjY2VwdGVkKSB7CisgICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKGMpOworICAgICAgfQorCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IGM7CisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IGNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgICAgd2hpbGUgKChjID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgeworICAgICAgICBpZiAoIWMuaGFzKGNhbk1lcmdlRmxhZykgfHwgIWluY29taW5nLmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgLy8gV2UgY2Fubm90IG1lcmdlIG4gYXMgaXQgd291bGQgYnJpbmcgc29tZXRoaW5nIHdlCisgICAgICAgICAgLy8gYXJlbid0IHBlcm1pdHRlZCB0byBtZXJnZSBhdCB0aGlzIHRpbWUuIERyb3Agbi4KKyAgICAgICAgICAvLworICAgICAgICAgIGlmIChuLm1pc3NpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuTUlTU0lOR19ERVBFTkRFTkNZOworICAgICAgICAgICAgbi5taXNzaW5nID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgICAgICAgIH0KKyAgICAgICAgICBuLm1pc3NpbmcuYWRkKChDb2RlUmV2aWV3Q29tbWl0KSBjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZW50cy5hZGQoYyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG4uc3RhdHVzQ29kZSA9PSBDb21taXRNZXJnZVN0YXR1cy5NSVNTSU5HX0RFUEVOREVOQ1kpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHNvcnQucmVtb3ZlQWxsKGNvbnRlbnRzKTsKKyAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoY29udGVudHMpOworICAgICAgc29ydGVkLnJlbW92ZUFsbChjb250ZW50cyk7CisgICAgICBzb3J0ZWQuYWRkQWxsKGNvbnRlbnRzKTsKKyAgICB9CisgICAgcmV0dXJuIHNvcnRlZDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJlbW92ZU9uZShmaW5hbCBDb2xsZWN0aW9uPFQ+IGMpIHsKKyAgICBmaW5hbCBJdGVyYXRvcjxUPiBpID0gYy5pdGVyYXRvcigpOworICAgIGZpbmFsIFQgciA9IGkubmV4dCgpOworICAgIGkucmVtb3ZlKCk7CisgICAgcmV0dXJuIHI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0cy5qYXZhCmluZGV4IGEyYTgwOWIuLmE1NDc4YWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHMuamF2YQpAQCAtMTQsMTUgKzE0LDIyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZS5JTklUSUFMX1BBVENIX1NFVF9JRDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NdWx0aVByb2dyZXNzTW9uaXRvci5VTktOT1dOOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NYWlsVXRpbC5nZXRSZWNpcGllbnRzRnJvbUFwcHJvdmFsczsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWFpbFV0aWwuZ2V0UmVjaXBpZW50c0Zyb21Gb290ZXJzOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5SX0hFQURTOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuTk9UX0FUVEVNUFRFRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0Lk9LOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuUkVKRUNURURfTUlTU0lOR19PQkpFQ1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kLlJlc3VsdC5SRUpFQ1RFRF9OT05GQVNURk9SV0FSRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0LlJFSkVDVEVEX09USEVSX1JFQVNPTjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRMaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CkBAIC0zMCwxNyArMzcsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5DaGVja2VkRnV0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXIuSG9va1Jlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DYXBhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hBY2NvdW50RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKQEAgLTUxLDEyICs2MCwxOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlSW5zZXJ0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5UcmFja2luZ0Zvb3RlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5Db21taXRSZWNlaXZlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTXVsdGlQcm9ncmVzc01vbml0b3IuVGFzazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzLkNvbW1pdFZhbGlkYXRvcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ3JlYXRlQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLk1haWxSZWNpcGllbnRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlZFNlbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CkBAIC02NSwxNyArODAsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUmVmQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuTWFnaWNCcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC51dGlsLmNsaS5DbWRMaW5lUGFyc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJhdGNoUmVmVXBkYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTkzLDEzICsxMTAsMTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLlJldkZpbHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5BZHZlcnRpc2VSZWZzSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5BZHZlcnRpc2VSZWZzSG9va0NoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VSZWNlaXZlUGFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZVBhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjazsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMTA5LDYgKzEzMSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCkBAIC0xMjIsOCArMTQ1LDYgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBORVdfUEFUQ0hTRVQgPQogICAgICAgUGF0dGVybi5jb21waWxlKCJecmVmcy9jaGFuZ2VzLyg/OlswLTldWzAtOV0vKT8oWzEtOV1bMC05XSopKD86L25ldyk/JCIpOwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBSRVZJRVdFRF9CWSA9IG5ldyBGb290ZXJLZXkoIlJldmlld2VkLWJ5Iik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBURVNURURfQlkgPSBuZXcgRm9vdGVyS2V5KCJUZXN0ZWQtYnkiKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IENIQU5HRV9JRCA9IG5ldyBGb290ZXJLZXkoIkNoYW5nZS1JZCIpOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1JFSkVDVElPTl9NRVNTQUdFX0ZPT1RFUiA9CkBAIC0xMzgsNiArMTU5LDcgQEAKICAgICAgICAgKyAiVG8gcHVzaCBpbnRvIHRoaXMgcmVmZXJlbmNlIHlvdSBuZWVkICdQdXNoJyByaWdodHMuIiksCiAgICAgICAgIERFTEVURSgiWW91IG5lZWQgJ1B1c2gnIHJpZ2h0cyB3aXRoIHRoZSAnRm9yY2UgUHVzaCdcbiIKICAgICAgICAgICAgICsgImZsYWcgc2V0IHRvIGRlbGV0ZSByZWZlcmVuY2VzLiIpLAorICAgICAgICBERUxFVEVfQ0hBTkdFUygiQ2Fubm90IGRlbGV0ZSBmcm9tICdyZWZzL2NoYW5nZXMnIiksCiAgICAgICAgIENPREVfUkVWSUVXKCJZb3UgbmVlZCAnUHVzaCcgcmlnaHRzIHRvIHVwbG9hZCBjb2RlIHJldmlldyByZXF1ZXN0cy5cbiIKICAgICAgICAgICAgICsgIlZlcmlmeSB0aGF0IHlvdSBhcmUgcHVzaGluZyB0byB0aGUgcmlnaHQgYnJhbmNoLiIpOwogCkBAIC0xOTksNjEgKzIyMSw2NyBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2UgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRXJyb3I7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uPiBPUk1fRVhDRVBUSU9OID0KKyAgICAgIG5ldyBGdW5jdGlvbjxFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3JtRXhjZXB0aW9uIGFwcGx5KEV4Y2VwdGlvbiBpbnB1dCkgeworICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ybUV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIChPcm1FeGNlcHRpb24pIGlucHV0OworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbmV3IE9ybUV4Y2VwdGlvbigiRXJyb3IgdXBkYXRpbmcgZGF0YWJhc2UiLCBpbnB1dCk7CisgICAgICAgIH0KKyAgICAgIH07CiAKLSAgICBwcml2YXRlIE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIGJvb2xlYW4gaXNFcnJvcikgewotICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICAgIHRoaXMuaXNFcnJvciA9IGlzRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJJZCA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7Ci0gIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnQuSWQ+IGNjSWQgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworICBwcml2YXRlIFNldDxBY2NvdW50LklkPiByZXZpZXdlcnNGcm9tQ29tbWFuZExpbmUgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgcHJpdmF0ZSBTZXQ8QWNjb3VudC5JZD4gY2NGcm9tQ29tbWFuZExpbmUgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKIAogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDbWRMaW5lUGFyc2VyLkZhY3Rvcnkgb3B0aW9uUGFyc2VyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBDcmVhdGVDaGFuZ2VTZW5kZXIuRmFjdG9yeSBjcmVhdGVDaGFuZ2VTZW5kZXJGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIE1lcmdlZFNlbmRlci5GYWN0b3J5IG1lcmdlZFNlbmRlckZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUmVwbGFjZVBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmVwbGFjZVBhdGNoU2V0RmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CiAgIHByaXZhdGUgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsOwogICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwogICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKLSAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBDb21taXRWYWxpZGF0b3JzLkZhY3RvcnkgY29tbWl0VmFsaWRhdG9yc0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVyczsKICAgcHJpdmF0ZSBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VJbnNlcnRlciBjaGFuZ2VJbnNlcnRlcjsKICAgcHJpdmF0ZSBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlOworICBwcml2YXRlIGZpbmFsIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZSBjaGFuZ2VVcGRhdGVFeGVjdG9yOwogICBwcml2YXRlIGZpbmFsIFJlcXVlc3RTY29wZVByb3BhZ2F0b3IgcmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKKyAgcHJpdmF0ZSBmaW5hbCBTc2hJbmZvIHNzaEluZm87CiAgIHByaXZhdGUgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlQ29uZmlnIHJlY2VpdmVDb25maWc7CiAKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbDsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0IHByb2plY3Q7CisgIHByaXZhdGUgZmluYWwgTGFiZWxUeXBlcyBsYWJlbFR5cGVzOwogICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgcmVwbzsKICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlUGFjayBycDsKICAgcHJpdmF0ZSBmaW5hbCBOb3RlTWFwIHJlamVjdENvbW1pdHM7Ci0gIHByaXZhdGUgUmVjZWl2ZUNvbW1hbmQgbmV3Q2hhbmdlOwotICBwcml2YXRlIEJyYW5jaC5OYW1lS2V5IGRlc3RCcmFuY2g7Ci0gIHByaXZhdGUgUmVmQ29udHJvbCBkZXN0QnJhbmNoQ3RsOworICBwcml2YXRlIE1hZ2ljQnJhbmNoSW5wdXQgbWFnaWNCcmFuY2g7CiAKICAgcHJpdmF0ZSBMaXN0PENyZWF0ZVJlcXVlc3Q+IG5ld0NoYW5nZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhbmdlLklkLCBSZXBsYWNlUmVxdWVzdD4gcmVwbGFjZUJ5Q2hhbmdlID0KICAgICAgIG5ldyBIYXNoTWFwPENoYW5nZS5JZCwgUmVwbGFjZVJlcXVlc3Q+KCk7CiAgIHByaXZhdGUgZmluYWwgTWFwPFJldkNvbW1pdCwgUmVwbGFjZVJlcXVlc3Q+IHJlcGxhY2VCeUNvbW1pdCA9CiAgICAgICBuZXcgSGFzaE1hcDxSZXZDb21taXQsIFJlcGxhY2VSZXF1ZXN0PigpOworICBwcml2YXRlIGZpbmFsIFNldDxSZXZDb21taXQ+IHZhbGlkQ29tbWl0cyA9IG5ldyBIYXNoU2V0PFJldkNvbW1pdD4oKTsKIAogICBwcml2YXRlIE1hcDxPYmplY3RJZCwgUmVmPiByZWZzQnlJZDsKLQotICBwcml2YXRlIFN0cmluZyBkZXN0VG9waWNOYW1lOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmczsKIAogICBwcml2YXRlIGZpbmFsIFN1Ym1vZHVsZU9wLkZhY3Rvcnkgc3ViT3BGYWN0b3J5OwogCi0gIHByaXZhdGUgZmluYWwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CiAgIHByaXZhdGUgTGlzdE11bHRpbWFwPEVycm9yLCBTdHJpbmc+IGVycm9ycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKICAgcHJpdmF0ZSBUYXNrIG5ld1Byb2dyZXNzOwogICBwcml2YXRlIFRhc2sgcmVwbGFjZVByb2dyZXNzOwpAQCAtMjY0LDQ4ICsyOTIsNjIgQEAKIAogICBASW5qZWN0CiAgIFJlY2VpdmVDb21taXRzKGZpbmFsIFJldmlld0RiIGRiLAorICAgICAgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeSwKICAgICAgIGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXIsCisgICAgICBmaW5hbCBDbWRMaW5lUGFyc2VyLkZhY3Rvcnkgb3B0aW9uUGFyc2VyRmFjdG9yeSwKICAgICAgIGZpbmFsIENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3RvcnksCiAgICAgICBmaW5hbCBNZXJnZWRTZW5kZXIuRmFjdG9yeSBtZXJnZWRTZW5kZXJGYWN0b3J5LAogICAgICAgZmluYWwgUmVwbGFjZVBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmVwbGFjZVBhdGNoU2V0RmFjdG9yeSwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCiAgICAgICBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCiAgICAgICBmaW5hbCBDaGFuZ2VIb29rcyBob29rcywKICAgICAgIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCwKICAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCiAgICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwKICAgICAgIGZpbmFsIFRhZ0NhY2hlIHRhZ0NhY2hlLAorICAgICAgZmluYWwgQ2hhbmdlQ2FjaGUgY2hhbmdlQ2FjaGUsCisgICAgICBmaW5hbCBDaGFuZ2VJbnNlcnRlciBjaGFuZ2VJbnNlcnRlciwKKyAgICAgIGZpbmFsIENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeSwKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwsCiAgICAgICBAR2Vycml0UGVyc29uSWRlbnQgZmluYWwgUGVyc29uSWRlbnQgZ2Vycml0SWRlbnQsCiAgICAgICBmaW5hbCBUcmFja2luZ0Zvb3RlcnMgdHJhY2tpbmdGb290ZXJzLAogICAgICAgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZSwKKyAgICAgIEBDaGFuZ2VVcGRhdGVFeGVjdXRvciBMaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2UgY2hhbmdlVXBkYXRlRXhlY3RvciwKICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZVByb3BhZ2F0b3IgcmVxdWVzdFNjb3BlUHJvcGFnYXRvciwKKyAgICAgIGZpbmFsIFNzaEluZm8gc3NoSW5mbywKICAgICAgIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWUsCi0KKyAgICAgIFJlY2VpdmVDb25maWcgY29uZmlnLAogICAgICAgQEFzc2lzdGVkIGZpbmFsIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sLAogICAgICAgQEFzc2lzdGVkIGZpbmFsIFJlcG9zaXRvcnkgcmVwbywKICAgICAgIGZpbmFsIFN1Ym1vZHVsZU9wLkZhY3Rvcnkgc3ViT3BGYWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHRoaXMuY3VycmVudFVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIHByb2plY3RDb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CiAgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuc2NoZW1hRmFjdG9yeSA9IHNjaGVtYUZhY3Rvcnk7CiAgICAgdGhpcy5hY2NvdW50UmVzb2x2ZXIgPSBhY2NvdW50UmVzb2x2ZXI7CisgICAgdGhpcy5vcHRpb25QYXJzZXJGYWN0b3J5ID0gb3B0aW9uUGFyc2VyRmFjdG9yeTsKICAgICB0aGlzLmNyZWF0ZUNoYW5nZVNlbmRlckZhY3RvcnkgPSBjcmVhdGVDaGFuZ2VTZW5kZXJGYWN0b3J5OwogICAgIHRoaXMubWVyZ2VkU2VuZGVyRmFjdG9yeSA9IG1lcmdlZFNlbmRlckZhY3Rvcnk7CiAgICAgdGhpcy5yZXBsYWNlUGF0Y2hTZXRGYWN0b3J5ID0gcmVwbGFjZVBhdGNoU2V0RmFjdG9yeTsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKICAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OwogICAgIHRoaXMuaG9va3MgPSBob29rczsKICAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOwogICAgIHRoaXMucHJvamVjdENhY2hlID0gcHJvamVjdENhY2hlOwogICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKICAgICB0aGlzLmNhbm9uaWNhbFdlYlVybCA9IGNhbm9uaWNhbFdlYlVybDsKLSAgICB0aGlzLmdlcnJpdElkZW50ID0gZ2Vycml0SWRlbnQ7CiAgICAgdGhpcy50cmFja2luZ0Zvb3RlcnMgPSB0cmFja2luZ0Zvb3RlcnM7CiAgICAgdGhpcy50YWdDYWNoZSA9IHRhZ0NhY2hlOworICAgIHRoaXMuY2hhbmdlSW5zZXJ0ZXIgPSBjaGFuZ2VJbnNlcnRlcjsKKyAgICB0aGlzLmNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5ID0gY29tbWl0VmFsaWRhdG9yc0ZhY3Rvcnk7CiAgICAgdGhpcy53b3JrUXVldWUgPSB3b3JrUXVldWU7CisgICAgdGhpcy5jaGFuZ2VVcGRhdGVFeGVjdG9yID0gY2hhbmdlVXBkYXRlRXhlY3RvcjsKICAgICB0aGlzLnJlcXVlc3RTY29wZVByb3BhZ2F0b3IgPSByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOworICAgIHRoaXMuc3NoSW5mbyA9IHNzaEluZm87CiAgICAgdGhpcy5hbGxQcm9qZWN0c05hbWUgPSBhbGxQcm9qZWN0c05hbWU7CisgICAgdGhpcy5yZWNlaXZlQ29uZmlnID0gY29uZmlnOwogCiAgICAgdGhpcy5wcm9qZWN0Q29udHJvbCA9IHByb2plY3RDb250cm9sOworICAgIHRoaXMubGFiZWxUeXBlcyA9IHByb2plY3RDb250cm9sLmdldExhYmVsVHlwZXMoKTsKICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0KCk7CiAgICAgdGhpcy5yZXBvID0gcmVwbzsKICAgICB0aGlzLnJwID0gbmV3IFJlY2VpdmVQYWNrKHJlcG8pOwpAQCAtMzIxLDEwICszNjMsMjQgQEAKICAgICBycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKIAogICAgIGlmICghcHJvamVjdENvbnRyb2wuYWxsUmVmc0FyZVZpc2libGUoKSkgewotICAgICAgcnAuc2V0Q2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZSh0cnVlKTsKLSAgICAgIHJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCByZXBvLCBwcm9qZWN0Q29udHJvbCwgZGIsIGZhbHNlKSk7CisgICAgICBycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKGNvbmZpZy5jaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKTsKKyAgICAgIHJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCBjaGFuZ2VDYWNoZSwgcmVwbywgcHJvamVjdENvbnRyb2wsIGRiLCBmYWxzZSkpOwogICAgIH0KLSAgICBMaXN0PEFkdmVydGlzZVJlZnNIb29rPiBhZHZIb29rcyA9IG5ldyBBcnJheUxpc3Q8QWR2ZXJ0aXNlUmVmc0hvb2s+KDIpOworICAgIExpc3Q8QWR2ZXJ0aXNlUmVmc0hvb2s+IGFkdkhvb2tzID0gbmV3IEFycmF5TGlzdDxBZHZlcnRpc2VSZWZzSG9vaz4oMyk7CisgICAgYWR2SG9va3MuYWRkKG5ldyBBZHZlcnRpc2VSZWZzSG9vaygpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgYWR2ZXJ0aXNlUmVmcyhCYXNlUmVjZWl2ZVBhY2sgcnApIHsKKyAgICAgICAgYWxsUmVmcyA9IHJwLmdldEFkdmVydGlzZWRSZWZzKCk7CisgICAgICAgIGlmIChhbGxSZWZzID09IG51bGwpIHsKKyAgICAgICAgICBhbGxSZWZzID0gcnAuZ2V0UmVwb3NpdG9yeSgpLmdldEFsbFJlZnMoKTsKKyAgICAgICAgfQorICAgICAgICBycC5zZXRBZHZlcnRpc2VkUmVmcyhhbGxSZWZzLCBycC5nZXRBZHZlcnRpc2VkT2JqZWN0cygpKTsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhZHZlcnRpc2VSZWZzKFVwbG9hZFBhY2sgdXBsb2FkUGFjaykgeworICAgICAgfQorICAgIH0pOwogICAgIGFkdkhvb2tzLmFkZChycC5nZXRBZHZlcnRpc2VSZWZzSG9vaygpKTsKICAgICBhZHZIb29rcy5hZGQobmV3IFJlY2VpdmVDb21taXRzQWR2ZXJ0aXNlUmVmc0hvb2soKSk7CiAgICAgcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2soQWR2ZXJ0aXNlUmVmc0hvb2tDaGFpbi5uZXdDaGFpbihhZHZIb29rcykpOwpAQCAtMzMyLDEyICszODgsMTIgQEAKIAogICAvKiogQWRkIHJldmlld2VycyBmb3IgbmV3IChvciB1cGRhdGVkKSBjaGFuZ2VzLiAqLwogICBwdWJsaWMgdm9pZCBhZGRSZXZpZXdlcnMoQ29sbGVjdGlvbjxBY2NvdW50LklkPiB3aG8pIHsKLSAgICByZXZpZXdlcklkLmFkZEFsbCh3aG8pOworICAgIHJldmlld2Vyc0Zyb21Db21tYW5kTGluZS5hZGRBbGwod2hvKTsKICAgfQogCiAgIC8qKiBBZGQgcmV2aWV3ZXJzIGZvciBuZXcgKG9yIHVwZGF0ZWQpIGNoYW5nZXMuICovCiAgIHB1YmxpYyB2b2lkIGFkZEV4dHJhQ0MoQ29sbGVjdGlvbjxBY2NvdW50LklkPiB3aG8pIHsKLSAgICBjY0lkLmFkZEFsbCh3aG8pOworICAgIGNjRnJvbUNvbW1hbmRMaW5lLmFkZEFsbCh3aG8pOwogICB9CiAKICAgLyoqIFNldCBhIG1lc3NhZ2Ugc2VuZGVyIGZvciB0aGlzIG9wZXJhdGlvbi4gKi8KQEAgLTQ0MSwyNCArNDk3LDI2IEBACiAgICAgaWYgKHJlc3VsdCAhPSBDYXBhYmxlLk9LKSB7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KLQotICAgIHJldHVybiBNYWdpY0JyYW5jaC5jaGVja01hZ2ljQnJhbmNoUmVmcyhyZXBvLCBwcm9qZWN0KTsKKyAgICBpZiAocmVjZWl2ZUNvbmZpZy5jaGVja01hZ2ljUmVmcykgeworICAgICAgcmVzdWx0ID0gTWFnaWNCcmFuY2guY2hlY2tNYWdpY0JyYW5jaFJlZnMocmVwbywgcHJvamVjdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgIG1lc3NhZ2VzLmFkZChuZXcgTWVzc2FnZShtZXNzYWdlLCBmYWxzZSkpOworICAgIG1lc3NhZ2VzLmFkZChuZXcgQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSwgZmFsc2UpKTsKICAgfQogCiAgIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGVycm9yKSB7Ci0gICAgbWVzc2FnZXMuYWRkKG5ldyBNZXNzYWdlKGVycm9yLCB0cnVlKSk7CisgICAgbWVzc2FnZXMuYWRkKG5ldyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZShlcnJvciwgdHJ1ZSkpOwogICB9CiAKICAgdm9pZCBzZW5kTWVzc2FnZXMoKSB7Ci0gICAgZm9yIChNZXNzYWdlIG0gOiBtZXNzYWdlcykgewotICAgICAgaWYgKG0uaXNFcnJvcikgewotICAgICAgICBtZXNzYWdlU2VuZGVyLnNlbmRFcnJvcihtLm1lc3NhZ2UpOworICAgIGZvciAoQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UgbSA6IG1lc3NhZ2VzKSB7CisgICAgICBpZiAobS5pc0Vycm9yKCkpIHsKKyAgICAgICAgbWVzc2FnZVNlbmRlci5zZW5kRXJyb3IobS5nZXRNZXNzYWdlKCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWVzc2FnZVNlbmRlci5zZW5kTWVzc2FnZShtLm1lc3NhZ2UpOworICAgICAgICBtZXNzYWdlU2VuZGVyLnNlbmRNZXNzYWdlKG0uZ2V0TWVzc2FnZSgpKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTQ3NSw3ICs1MzMsNyBAQAogICAgIGJhdGNoLnNldFJlZkxvZ01lc3NhZ2UoInB1c2giLCB0cnVlKTsKIAogICAgIHBhcnNlQ29tbWFuZHMoY29tbWFuZHMpOwotICAgIGlmIChuZXdDaGFuZ2UgIT0gbnVsbCAmJiBuZXdDaGFuZ2UuZ2V0UmVzdWx0KCkgPT0gTk9UX0FUVEVNUFRFRCkgeworICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsICYmIG1hZ2ljQnJhbmNoLmNtZC5nZXRSZXN1bHQoKSA9PSBOT1RfQVRURU1QVEVEKSB7CiAgICAgICBuZXdDaGFuZ2VzID0gc2VsZWN0TmV3Q2hhbmdlcygpOwogICAgIH0KICAgICBwcmVwYXJlUGF0Y2hTZXRzRm9yUmVwbGFjZSgpOwpAQCAtNTMyLDYgKzU5MCw5IEBACiAgICAgICAgICAgICAgIGF1dG9DbG9zZUNoYW5nZXMoYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNDb25maWcoYykpIHsKQEAgLTU0MiwxMCArNjAzLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIU1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goYy5nZXRSZWZOYW1lKCkpKSB7Ci0gICAgICAgICAgLy8gV2Ugb25seSBzY2hlZHVsZSBkaXJlY3QgcmVmcyB1cGRhdGVzIGZvciByZXBsaWNhdGlvbi4KLSAgICAgICAgICAvLyBDaGFuZ2UgcmVmcyBhcmUgc2NoZWR1bGVkIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KKyAgICAgICAgICAvLyBXZSBvbmx5IGZpcmUgZ2l0UmVmVXBkYXRlZCBmb3IgZGlyZWN0IHJlZnMgdXBkYXRlcy4KKyAgICAgICAgICAvLyBFdmVudHMgZm9yIGNoYW5nZSByZWZzIGFyZSBmaXJlZCB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuCiAgICAgICAgICAgLy8KLSAgICAgICAgICByZXBsaWNhdGlvbi5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBjLmdldFJlZk5hbWUoKSk7CisgICAgICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBjLmdldFJlZk5hbWUoKSwKKyAgICAgICAgICAgICAgYy5nZXRPbGRJZCgpLCBjLmdldE5ld0lkKCkpOwogICAgICAgICAgIGhvb2tzLmRvUmVmVXBkYXRlZEhvb2soCiAgICAgICAgICAgICAgIG5ldyBCcmFuY2guTmFtZUtleShwcm9qZWN0LmdldE5hbWVLZXkoKSwgYy5nZXRSZWZOYW1lKCkpLAogICAgICAgICAgICAgICBjLmdldE9sZElkKCksCkBAIC01ODcsOCArNjQ5LDkgQEAKICAgICBpbnQgcmVwbGFjZUNvdW50ID0gMDsKICAgICBpbnQgb2tUb0luc2VydCA9IDA7CiAKLSAgICBmb3IgKFJlcGxhY2VSZXF1ZXN0IHJlcGxhY2UgOiByZXBsYWNlQnlDaGFuZ2UudmFsdWVzKCkpIHsKLSAgICAgIGlmIChyZXBsYWNlLmlucHV0Q29tbWFuZCA9PSBuZXdDaGFuZ2UpIHsKKyAgICBmb3IgKE1hcC5FbnRyeTxDaGFuZ2UuSWQsIFJlcGxhY2VSZXF1ZXN0PiBlIDogcmVwbGFjZUJ5Q2hhbmdlLmVudHJ5U2V0KCkpIHsKKyAgICAgIFJlcGxhY2VSZXF1ZXN0IHJlcGxhY2UgPSBlLmdldFZhbHVlKCk7CisgICAgICBpZiAobWFnaWNCcmFuY2ggIT0gbnVsbCAmJiByZXBsYWNlLmlucHV0Q29tbWFuZCA9PSBtYWdpY0JyYW5jaC5jbWQpIHsKICAgICAgICAgcmVwbGFjZUNvdW50Kys7CiAKICAgICAgICAgaWYgKHJlcGxhY2UuY21kICE9IG51bGwgJiYgcmVwbGFjZS5jbWQuZ2V0UmVzdWx0KCkgPT0gT0spIHsKQEAgLTU5NiwyNiArNjU5LDI2IEBACiAgICAgICAgIH0KICAgICAgIH0gZWxzZSBpZiAocmVwbGFjZS5jbWQgIT0gbnVsbCAmJiByZXBsYWNlLmNtZC5nZXRSZXN1bHQoKSA9PSBPSykgewogICAgICAgICB0cnkgewotICAgICAgICAgIGlmIChyZXBsYWNlLmluc2VydFBhdGNoU2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChyZXBsYWNlLmluc2VydFBhdGNoU2V0KCkuY2hlY2tlZEdldCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlcGxhY2UuaW5wdXRDb21tYW5kLnNldFJlc3VsdChPSyk7CiAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKICAgICAgICAgICByZWplY3QocmVwbGFjZS5pbnB1dENvbW1hbmQsICJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKICAgICAgICAgICBsb2cuZXJyb3IoU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgIkNhbm5vdCBhZGQgcGF0Y2ggc2V0IHRvICVkIG9mICVzIiwKLSAgICAgICAgICAgICAgcmVwbGFjZS5uZXdQYXRjaFNldC5nZXRJZCgpLCBwcm9qZWN0LmdldE5hbWUoKSksIGVycik7CisgICAgICAgICAgICAgIGUuZ2V0S2V5KCkuZ2V0KCksIHByb2plY3QuZ2V0TmFtZSgpKSwgZXJyKTsKICAgICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGVycikgewogICAgICAgICAgIHJlamVjdChyZXBsYWNlLmlucHV0Q29tbWFuZCwgImludGVybmFsIHNlcnZlciBlcnJvciIpOwogICAgICAgICAgIGxvZy5lcnJvcihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAiQ2Fubm90IGFkZCBwYXRjaCBzZXQgdG8gJWQgb2YgJXMiLAotICAgICAgICAgICAgICByZXBsYWNlLm5ld1BhdGNoU2V0LmdldElkKCksIHByb2plY3QuZ2V0TmFtZSgpKSwgZXJyKTsKKyAgICAgICAgICAgICAgZS5nZXRLZXkoKS5nZXQoKSwgcHJvamVjdC5nZXROYW1lKCkpLCBlcnIpOwogICAgICAgICB9Ci0gICAgICB9IGVsc2UgeworICAgICAgfSBlbHNlIGlmIChyZXBsYWNlLmlucHV0Q29tbWFuZC5nZXRSZXN1bHQoKSA9PSBOT1RfQVRURU1QVEVEKSB7CiAgICAgICAgIHJlamVjdChyZXBsYWNlLmlucHV0Q29tbWFuZCwgImludGVybmFsIHNlcnZlciBlcnJvciIpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmIChuZXdDaGFuZ2UgPT0gbnVsbCB8fCBuZXdDaGFuZ2UuZ2V0UmVzdWx0KCkgIT0gTk9UX0FUVEVNUFRFRCkgeworICAgIGlmIChtYWdpY0JyYW5jaCA9PSBudWxsIHx8IG1hZ2ljQnJhbmNoLmNtZC5nZXRSZXN1bHQoKSAhPSBOT1RfQVRURU1QVEVEKSB7CiAgICAgICAvLyByZWZzL2Zvci8gb3IgcmVmcy9kcmFmdHMvIG5vdCB1c2VkLCBvciBpdCBhbHJlYWR5IGZhaWxlZCBlYXJsaWVyLgogICAgICAgLy8gTm8gbmVlZCB0byBjb250aW51ZS4KICAgICAgIHJldHVybjsKQEAgLTYzMCwzMCArNjkzLDM1IEBACiAgICAgaWYgKG9rVG9JbnNlcnQgIT0gcmVwbGFjZUNvdW50ICsgbmV3Q2hhbmdlcy5zaXplKCkpIHsKICAgICAgIC8vIE9uZSBvciBtb3JlIG5ldyByZWZlcmVuY2VzIGZhaWxlZCB0byBjcmVhdGUuIEFzc3VtZSB0aGUKICAgICAgIC8vIHN5c3RlbSBpc24ndCB3b3JraW5nIGNvcnJlY3RseSBhbnltb3JlIGFuZCBhYm9ydC4KLSAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKKyAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsICJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKICAgICAgIGxvZy5lcnJvcihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICJPbmx5ICVkIG9mICVkIG5ldyBjaGFuZ2UgcmVmcyBjcmVhdGVkIGluICVzOyBhYm9ydGluZyIsCi0gICAgICAgICAgb2tUb0luc2VydCwgbmV3Q2hhbmdlcy5zaXplKCksIHByb2plY3QuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgb2tUb0luc2VydCwgcmVwbGFjZUNvdW50ICsgbmV3Q2hhbmdlcy5zaXplKCksIHByb2plY3QuZ2V0TmFtZSgpKSk7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgdHJ5IHsKKyAgICAgIExpc3Q8Q2hlY2tlZEZ1dHVyZTw/LCBPcm1FeGNlcHRpb24+PiBmdXR1cmVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAgICAgICBmb3IgKFJlcGxhY2VSZXF1ZXN0IHJlcGxhY2UgOiByZXBsYWNlQnlDaGFuZ2UudmFsdWVzKCkpIHsKLSAgICAgICAgaWYgKHJlcGxhY2UuaW5wdXRDb21tYW5kID09IG5ld0NoYW5nZSkgewotICAgICAgICAgIHJlcGxhY2UuaW5zZXJ0UGF0Y2hTZXQoKTsKKyAgICAgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwgJiYgcmVwbGFjZS5pbnB1dENvbW1hbmQgPT0gbWFnaWNCcmFuY2guY21kKSB7CisgICAgICAgICAgZnV0dXJlcy5hZGQocmVwbGFjZS5pbnNlcnRQYXRjaFNldCgpKTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICBmb3IgKENyZWF0ZVJlcXVlc3QgY3JlYXRlIDogbmV3Q2hhbmdlcykgewotICAgICAgICBjcmVhdGUuaW5zZXJ0Q2hhbmdlKCk7CisgICAgICAgIGZ1dHVyZXMuYWRkKGNyZWF0ZS5pbnNlcnRDaGFuZ2UoKSk7CiAgICAgICB9Ci0gICAgICBuZXdDaGFuZ2Uuc2V0UmVzdWx0KE9LKTsKKworICAgICAgZm9yIChDaGVja2VkRnV0dXJlPD8sIE9ybUV4Y2VwdGlvbj4gZiA6IGZ1dHVyZXMpIHsKKyAgICAgICAgZi5jaGVja2VkR2V0KCk7CisgICAgICB9CisgICAgICBtYWdpY0JyYW5jaC5jbWQuc2V0UmVzdWx0KE9LKTsKICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbid0IGluc2VydCBjaGFuZ2VzIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCksIGVycik7Ci0gICAgICByZWplY3QobmV3Q2hhbmdlLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CisgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbid0IHJlYWQgY29tbWl0cyBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpLCBlcnIpOwotICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgImludGVybmFsIHNlcnZlciBlcnJvciIpOworICAgICAgcmVqZWN0KG1hZ2ljQnJhbmNoLmNtZCwgImludGVybmFsIHNlcnZlciBlcnJvciIpOwogICAgIH0KICAgfQogCkBAIC02ODEsMTYgKzc0OSw2IEBACiAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOwogICB9CiAKLSAgcHJpdmF0ZSBBY2NvdW50LklkIHRvQWNjb3VudElkKGZpbmFsIFN0cmluZyBuYW1lT3JFbWFpbCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgIE5vU3VjaEFjY291bnRFeGNlcHRpb24gewotICAgIGZpbmFsIEFjY291bnQgYSA9IGFjY291bnRSZXNvbHZlci5maW5kQnlOYW1lT3JFbWFpbChuYW1lT3JFbWFpbCk7Ci0gICAgaWYgKGEgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaEFjY291bnRFeGNlcHRpb24oIlwiIiArIG5hbWVPckVtYWlsCi0gICAgICAgICAgKyAiXCIgaXMgbm90IHJlZ2lzdGVyZWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGEuZ2V0SWQoKTsKLSAgfQotCiAgIHByaXZhdGUgdm9pZCBwYXJzZUNvbW1hbmRzKGZpbmFsIENvbGxlY3Rpb248UmVjZWl2ZUNvbW1hbmQ+IGNvbW1hbmRzKSB7CiAgICAgZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogICAgICAgaWYgKGNtZC5nZXRSZXN1bHQoKSAhPSBOT1RfQVRURU1QVEVEKSB7CkBAIC03MDUsOCArNzYzLDIxIEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCisgICAgICBIb29rUmVzdWx0IHJlc3VsdCA9IGhvb2tzLmRvUmVmVXBkYXRlSG9vayhwcm9qZWN0LCBjbWQuZ2V0UmVmTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFVzZXIuZ2V0QWNjb3VudCgpLCBjbWQuZ2V0T2xkSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5nZXROZXdJZCgpKTsKKworICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpOworICAgICAgICBpZiAocmVzdWx0LmdldEV4aXRWYWx1ZSgpICE9IDApIHsKKyAgICAgICAgICByZWplY3QoY21kLCBtZXNzYWdlKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBycC5zZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgIH0KKwogICAgICAgaWYgKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goY21kLmdldFJlZk5hbWUoKSkpIHsKLSAgICAgICAgcGFyc2VOZXdDaGFuZ2VDb21tYW5kKGNtZCk7CisgICAgICAgIHBhcnNlTWFnaWNCcmFuY2goY21kKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKQEAgLTg3MywxNCArOTQ0LDE3IEBACiAKICAgcHJpdmF0ZSB2b2lkIHBhcnNlRGVsZXRlKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCkgewogICAgIFJlZkNvbnRyb2wgY3RsID0gcHJvamVjdENvbnRyb2wuY29udHJvbEZvclJlZihjbWQuZ2V0UmVmTmFtZSgpKTsKLSAgICBpZiAoY3RsLmNhbkRlbGV0ZSgpKSB7CisgICAgaWYgKGN0bC5nZXRSZWZOYW1lKCkuc3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpKSB7CisgICAgICBlcnJvcnMucHV0KEVycm9yLkRFTEVURV9DSEFOR0VTLCBjdGwuZ2V0UmVmTmFtZSgpKTsKKyAgICAgIHJlamVjdChjbWQsICJjYW5ub3QgZGVsZXRlIGNoYW5nZXMiKTsKKyAgICB9IGVsc2UgaWYgKGN0bC5jYW5EZWxldGUoKSkgewogICAgICAgYmF0Y2guYWRkQ29tbWFuZChjbWQpOwogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRy5lcXVhbHMoY3RsLmdldFJlZk5hbWUoKSkpIHsKICAgICAgICAgcmVqZWN0KGNtZCwgImNhbm5vdCBkZWxldGUgcHJvamVjdCBjb25maWd1cmF0aW9uIik7CiAgICAgICB9IGVsc2UgewogICAgICAgICBlcnJvcnMucHV0KEVycm9yLkRFTEVURSwgY3RsLmdldFJlZk5hbWUoKSk7Ci0gICAgICAgIHJlamVjdChjbWQsICJjYW4gbm90IGRlbGV0ZSByZWZlcmVuY2VzIik7CisgICAgICAgIHJlamVjdChjbWQsICJjYW5ub3QgZGVsZXRlIHJlZmVyZW5jZXMiKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTkxNCw3MiArOTg4LDEzOCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBwYXJzZU5ld0NoYW5nZUNvbW1hbmQoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kKSB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hZ2ljQnJhbmNoSW5wdXQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIENPTU1BUyA9IFNwbGl0dGVyLm9uKCcsJykub21pdEVtcHR5U3RyaW5ncygpOworCisgICAgZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kOworICAgIEJyYW5jaC5OYW1lS2V5IGRlc3Q7CisgICAgUmVmQ29udHJvbCBjdGw7CisgICAgU2V0PEFjY291bnQuSWQ+IHJldmlld2VyID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KCk7CisgICAgU2V0PEFjY291bnQuSWQ+IGNjID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KCk7CisKKyAgICBAT3B0aW9uKG5hbWUgPSAiLS10b3BpYyIsIG1ldGFWYXIgPSAiTkFNRSIsIHVzYWdlID0gImF0dGFjaCB0b3BpYyB0byBjaGFuZ2VzIikKKyAgICBTdHJpbmcgdG9waWM7CisKKyAgICBAT3B0aW9uKG5hbWUgPSAiLS1kcmFmdCIsIHVzYWdlID0gIm1hcmsgbmV3L3VwZGF0ZWQgY2hhbmdlcyBhcyBkcmFmdCIpCisgICAgYm9vbGVhbiBkcmFmdDsKKworICAgIEBPcHRpb24obmFtZSA9ICItciIsIG1ldGFWYXIgPSAiRU1BSUwiLCB1c2FnZSA9ICJhZGQgcmV2aWV3ZXIgdG8gY2hhbmdlcyIpCisgICAgdm9pZCByZXZpZXdlcihBY2NvdW50LklkIGlkKSB7CisgICAgICByZXZpZXdlci5hZGQoaWQpOworICAgIH0KKworICAgIEBPcHRpb24obmFtZSA9ICItLWNjIiwgbWV0YVZhciA9ICJFTUFJTCIsIHVzYWdlID0gIm5vdGlmeSB1c2VyIGJ5IENDIikKKyAgICB2b2lkIGNjKEFjY291bnQuSWQgaWQpIHsKKyAgICAgIGNjLmFkZChpZCk7CisgICAgfQorCisgICAgQE9wdGlvbihuYW1lID0gIi0tcHVibGlzaCIsIHVzYWdlID0gInB1Ymxpc2ggbmV3L3VwZGF0ZWQgY2hhbmdlcyIpCisgICAgdm9pZCBwdWJsaXNoKGJvb2xlYW4gcHVibGlzaCkgeworICAgICAgZHJhZnQgPSAhcHVibGlzaDsKKyAgICB9CisKKyAgICBNYWdpY0JyYW5jaElucHV0KFJlY2VpdmVDb21tYW5kIGNtZCkgeworICAgICAgdGhpcy5jbWQgPSBjbWQ7CisgICAgICB0aGlzLmRyYWZ0ID0gY21kLmdldFJlZk5hbWUoKS5zdGFydHNXaXRoKE1hZ2ljQnJhbmNoLk5FV19EUkFGVF9DSEFOR0UpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNEcmFmdCgpIHsKKyAgICAgIHJldHVybiBkcmFmdDsKKyAgICB9CisKKyAgICBNYWlsUmVjaXBpZW50cyBnZXRNYWlsUmVjaXBpZW50cygpIHsKKyAgICAgIHJldHVybiBuZXcgTWFpbFJlY2lwaWVudHMocmV2aWV3ZXIsIGNjKTsKKyAgICB9CisKKyAgICBTdHJpbmcgcGFyc2UoQ21kTGluZVBhcnNlciBjbHAsIFJlcG9zaXRvcnkgcmVwbywgU2V0PFN0cmluZz4gcmVmcykKKyAgICAgICAgdGhyb3dzIENtZExpbmVFeGNlcHRpb24geworICAgICAgU3RyaW5nIHJlZiA9IE1hZ2ljQnJhbmNoLmdldERlc3RCcmFuY2hOYW1lKGNtZC5nZXRSZWZOYW1lKCkpOworICAgICAgaWYgKCFyZWYuc3RhcnRzV2l0aChDb25zdGFudHMuUl9SRUZTKSkgeworICAgICAgICByZWYgPSBDb25zdGFudHMuUl9IRUFEUyArIHJlZjsKKyAgICAgIH0KKworICAgICAgaW50IG9wdGlvblN0YXJ0ID0gcmVmLmluZGV4T2YoJyUnKTsKKyAgICAgIGlmICgwIDwgb3B0aW9uU3RhcnQpIHsKKyAgICAgICAgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgICBmb3IgKFN0cmluZyBzIDogQ09NTUFTLnNwbGl0KHJlZi5zdWJzdHJpbmcob3B0aW9uU3RhcnQgKyAxKSkpIHsKKyAgICAgICAgICBpbnQgZSA9IHMuaW5kZXhPZignPScpOworICAgICAgICAgIGlmICgwIDwgZSkgeworICAgICAgICAgICAgb3B0aW9ucy5wdXQocy5zdWJzdHJpbmcoMCwgZSksIHMuc3Vic3RyaW5nKGUgKyAxKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wdGlvbnMucHV0KHMsICIiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xwLnBhcnNlT3B0aW9uTWFwKG9wdGlvbnMpOworICAgICAgICByZWYgPSByZWYuc3Vic3RyaW5nKDAsIG9wdGlvblN0YXJ0KTsKKyAgICAgIH0KKworICAgICAgLy8gU3BsaXQgdGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBieSBicmFuY2ggYW5kIHRvcGljLiBUaGUgdG9waWMKKyAgICAgIC8vIHN1ZmZpeCBpcyBlbnRpcmVseSBvcHRpb25hbCwgc28gaXQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuCisgICAgICBTdHJpbmcgaGVhZCA9IHJlYWRIRUFEKHJlcG8pOworICAgICAgaW50IHNwbGl0ID0gcmVmLmxlbmd0aCgpOworICAgICAgZm9yICg7OykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IHJlZi5zdWJzdHJpbmcoMCwgc3BsaXQpOworICAgICAgICBpZiAocmVmcy5jb250YWlucyhuYW1lKSB8fCBuYW1lLmVxdWFscyhoZWFkKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3BsaXQgPSBuYW1lLmxhc3RJbmRleE9mKCcvJywgc3BsaXQgLSAxKTsKKyAgICAgICAgaWYgKHNwbGl0IDw9IENvbnN0YW50cy5SX1JFRlMubGVuZ3RoKCkpIHsKKyAgICAgICAgICByZXR1cm4gcmVmOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3BsaXQgPCByZWYubGVuZ3RoKCkpIHsKKyAgICAgICAgdG9waWMgPSBTdHJpbmdzLmVtcHR5VG9OdWxsKHJlZi5zdWJzdHJpbmcoc3BsaXQgKyAxKSk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVmLnN1YnN0cmluZygwLCBzcGxpdCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBhcnNlTWFnaWNCcmFuY2goZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kKSB7CiAgICAgLy8gUGVybWl0IGV4YWN0bHkgb25lIG5ldyBjaGFuZ2UgcmVxdWVzdCBwZXIgcHVzaC4KLSAgICAvLwotICAgIGlmIChuZXdDaGFuZ2UgIT0gbnVsbCkgeworICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsKSB7CiAgICAgICByZWplY3QoY21kLCAiZHVwbGljYXRlIHJlcXVlc3QiKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBuZXdDaGFuZ2UgPSBjbWQ7Ci0gICAgU3RyaW5nIGRlc3RCcmFuY2hOYW1lID0gTWFnaWNCcmFuY2guZ2V0RGVzdEJyYW5jaE5hbWUoY21kLmdldFJlZk5hbWUoKSk7Ci0gICAgaWYgKCFkZXN0QnJhbmNoTmFtZS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFRlMpKSB7Ci0gICAgICBkZXN0QnJhbmNoTmFtZSA9IENvbnN0YW50cy5SX0hFQURTICsgZGVzdEJyYW5jaE5hbWU7Ci0gICAgfQorICAgIG1hZ2ljQnJhbmNoID0gbmV3IE1hZ2ljQnJhbmNoSW5wdXQoY21kKTsKKyAgICBtYWdpY0JyYW5jaC5yZXZpZXdlci5hZGRBbGwocmV2aWV3ZXJzRnJvbUNvbW1hbmRMaW5lKTsKKyAgICBtYWdpY0JyYW5jaC5jYy5hZGRBbGwoY2NGcm9tQ29tbWFuZExpbmUpOwogCi0gICAgZmluYWwgU3RyaW5nIGhlYWQ7CisgICAgU3RyaW5nIHJlZjsKKyAgICBDbWRMaW5lUGFyc2VyIGNscCA9IG9wdGlvblBhcnNlckZhY3RvcnkuY3JlYXRlKG1hZ2ljQnJhbmNoKTsKICAgICB0cnkgewotICAgICAgaGVhZCA9IHJlcG8uZ2V0RnVsbEJyYW5jaCgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJlYWQgSEVBRCBzeW1yZWYiLCBlKTsKLSAgICAgIHJlamVjdChjbWQsICJpbnRlcm5hbCBlcnJvciIpOworICAgICAgcmVmID0gbWFnaWNCcmFuY2gucGFyc2UoY2xwLCByZXBvLCBycC5nZXRBZHZlcnRpc2VkUmVmcygpLmtleVNldCgpKTsKKyAgICB9IGNhdGNoIChDbWRMaW5lRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmICghY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7CisgICAgICAgIHJlamVjdChjbWQsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcmVmID0gbnVsbDsgLy8gbmV2ZXIgaGFwcGVuCisgICAgfQorICAgIGlmIChjbHAud2FzSGVscFJlcXVlc3RlZEJ5T3B0aW9uKCkpIHsKKyAgICAgIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgdy53cml0ZSgiXG5IZWxwIGZvciByZWZzL2Zvci9icmFuY2g6XG5cbiIpOworICAgICAgY2xwLnByaW50VXNhZ2UodywgbnVsbCk7CisgICAgICBhZGRNZXNzYWdlKHcudG9TdHJpbmcoKSk7CisgICAgICByZWplY3QoY21kLCAic2VlIGhlbHAiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFycC5nZXRBZHZlcnRpc2VkUmVmcygpLmNvbnRhaW5zS2V5KHJlZikgJiYgIXJlZi5lcXVhbHMocmVhZEhFQUQocmVwbykpKSB7CisgICAgICBpZiAocmVmLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7CisgICAgICAgIFN0cmluZyBuID0gcmVmLnN1YnN0cmluZyhDb25zdGFudHMuUl9IRUFEUy5sZW5ndGgoKSk7CisgICAgICAgIHJlamVjdChjbWQsICJicmFuY2ggIiArIG4gKyAiIG5vdCBmb3VuZCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVqZWN0KGNtZCwgcmVmICsgIiBub3QgZm91bmQiKTsKKyAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBTcGxpdCB0aGUgZGVzdGluYXRpb24gYnJhbmNoIGJ5IGJyYW5jaCBhbmQgdG9waWMuICBUaGUgdG9waWMKLSAgICAvLyBzdWZmaXggaXMgZW50aXJlbHkgb3B0aW9uYWwsIHNvIGl0IG1pZ2h0IG5vdCBldmVuIGV4aXN0LgotICAgIC8vCi0gICAgaW50IHNwbGl0ID0gZGVzdEJyYW5jaE5hbWUubGVuZ3RoKCk7Ci0gICAgZm9yICg7OykgewotICAgICAgU3RyaW5nIG5hbWUgPSBkZXN0QnJhbmNoTmFtZS5zdWJzdHJpbmcoMCwgc3BsaXQpOwotCi0gICAgICBpZiAocnAuZ2V0QWR2ZXJ0aXNlZFJlZnMoKS5jb250YWluc0tleShuYW1lKSkgewotICAgICAgICAvLyBXZSBhZHZlcnRpc2VkIHRoZSBicmFuY2ggdG8gdGhlIGNsaWVudCBzbyB3ZSBrbm93Ci0gICAgICAgIC8vIHRoZSBicmFuY2ggZXhpc3RzLiBUYXJnZXQgdGhpcyBicmFuY2ggZm9yIHRoZSB1cGxvYWQuCi0gICAgICAgIC8vCi0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmIChoZWFkLmVxdWFscyhuYW1lKSkgewotICAgICAgICAvLyBXZSBkaWRuJ3QgYWR2ZXJ0aXNlIHRoZSBicmFuY2gsIGJlY2F1c2UgaXQgZG9lc24ndCBleGlzdCB5ZXQuCi0gICAgICAgIC8vIEFsbG93IGl0IGFueXdheSBhcyBIRUFEIGlzIGEgc3ltYm9saWMgcmVmZXJlbmNlIHRvIHRoZSBuYW1lLgotICAgICAgICAvLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgc3BsaXQgPSBuYW1lLmxhc3RJbmRleE9mKCcvJywgc3BsaXQgLSAxKTsKLSAgICAgIGlmIChzcGxpdCA8PSBDb25zdGFudHMuUl9SRUZTLmxlbmd0aCgpKSB7Ci0gICAgICAgIFN0cmluZyBuID0gZGVzdEJyYW5jaE5hbWU7Ci0gICAgICAgIGlmIChuLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQotICAgICAgICAgIG4gPSBuLnN1YnN0cmluZyhDb25zdGFudHMuUl9IRUFEUy5sZW5ndGgoKSk7Ci0gICAgICAgIHJlamVjdChjbWQsICJicmFuY2ggIiArIG4gKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNwbGl0IDwgZGVzdEJyYW5jaE5hbWUubGVuZ3RoKCkpIHsKLSAgICAgIGRlc3RUb3BpY05hbWUgPSBkZXN0QnJhbmNoTmFtZS5zdWJzdHJpbmcoc3BsaXQgKyAxKTsKLSAgICAgIGlmIChkZXN0VG9waWNOYW1lLmlzRW1wdHkoKSkgewotICAgICAgICBkZXN0VG9waWNOYW1lID0gbnVsbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZGVzdFRvcGljTmFtZSA9IG51bGw7Ci0gICAgfQotICAgIGRlc3RCcmFuY2ggPSBuZXcgQnJhbmNoLk5hbWVLZXkocHJvamVjdC5nZXROYW1lS2V5KCksIC8vCi0gICAgICAgIGRlc3RCcmFuY2hOYW1lLnN1YnN0cmluZygwLCBzcGxpdCkpOwotICAgIGRlc3RCcmFuY2hDdGwgPSBwcm9qZWN0Q29udHJvbC5jb250cm9sRm9yUmVmKGRlc3RCcmFuY2gpOwotICAgIGlmICghZGVzdEJyYW5jaEN0bC5jYW5VcGxvYWQoKSkgewotICAgICAgZXJyb3JzLnB1dChFcnJvci5DT0RFX1JFVklFVywgY21kLmdldFJlZk5hbWUoKSk7Ci0gICAgICByZWplY3QoY21kLCAiY2FuIG5vdCB1cGxvYWQgcmV2aWV3Iik7CisgICAgbWFnaWNCcmFuY2guZGVzdCA9IG5ldyBCcmFuY2guTmFtZUtleShwcm9qZWN0LmdldE5hbWVLZXkoKSwgcmVmKTsKKyAgICBtYWdpY0JyYW5jaC5jdGwgPSBwcm9qZWN0Q29udHJvbC5jb250cm9sRm9yUmVmKHJlZik7CisgICAgaWYgKCFtYWdpY0JyYW5jaC5jdGwuY2FuVXBsb2FkKCkpIHsKKyAgICAgIGVycm9ycy5wdXQoRXJyb3IuQ09ERV9SRVZJRVcsIHJlZik7CisgICAgICByZWplY3QoY21kLCAiY2Fubm90IHVwbG9hZCByZXZpZXciKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTk5MCw5ICsxMTMwLDggQEAKICAgICAvLwogICAgIHRyeSB7CiAgICAgICBmaW5hbCBSZXZXYWxrIHdhbGsgPSBycC5nZXRSZXZXYWxrKCk7Ci0KLSAgICAgIGZpbmFsIFJldkNvbW1pdCB0aXAgPSB3YWxrLnBhcnNlQ29tbWl0KG5ld0NoYW5nZS5nZXROZXdJZCgpKTsKLSAgICAgIFJlZiB0YXJnZXRSZWYgPSBycC5nZXRBZHZlcnRpc2VkUmVmcygpLmdldChkZXN0QnJhbmNoTmFtZSk7CisgICAgICBmaW5hbCBSZXZDb21taXQgdGlwID0gd2Fsay5wYXJzZUNvbW1pdChtYWdpY0JyYW5jaC5jbWQuZ2V0TmV3SWQoKSk7CisgICAgICBSZWYgdGFyZ2V0UmVmID0gcnAuZ2V0QWR2ZXJ0aXNlZFJlZnMoKS5nZXQobWFnaWNCcmFuY2guY3RsLmdldFJlZk5hbWUoKSk7CiAgICAgICBpZiAodGFyZ2V0UmVmID09IG51bGwgfHwgdGFyZ2V0UmVmLmdldE9iamVjdElkKCkgPT0gbnVsbCkgewogICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gYnJhbmNoIGRvZXMgbm90IHlldCBleGlzdC4gQXNzdW1lIHRoZQogICAgICAgICAvLyBoaXN0b3J5IGJlaW5nIHNlbnQgZm9yIHJldmlldyB3aWxsIHN0YXJ0IGl0IGFuZCB0aHVzCkBAIC0xMDAwLDcgKzExMzksNiBAQAogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBmaW5hbCBSZXZDb21taXQgaCA9IHdhbGsucGFyc2VDb21taXQodGFyZ2V0UmVmLmdldE9iamVjdElkKCkpOwotCiAgICAgICBmaW5hbCBSZXZGaWx0ZXIgb2xkUmV2RmlsdGVyID0gd2Fsay5nZXRSZXZGaWx0ZXIoKTsKICAgICAgIHRyeSB7CiAgICAgICAgIHdhbGsucmVzZXQoKTsKQEAgLTEwMDgsNyArMTE0Niw3IEBACiAgICAgICAgIHdhbGsubWFya1N0YXJ0KHRpcCk7CiAgICAgICAgIHdhbGsubWFya1N0YXJ0KGgpOwogICAgICAgICBpZiAod2Fsay5uZXh0KCkgPT0gbnVsbCkgewotICAgICAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJubyBjb21tb24gYW5jZXN0cnkiKTsKKyAgICAgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAibm8gY29tbW9uIGFuY2VzdHJ5Iik7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9IGZpbmFsbHkgewpAQCAtMTAxNiwxMiArMTE1NCwyMSBAQAogICAgICAgICB3YWxrLnNldFJldkZpbHRlcihvbGRSZXZGaWx0ZXIpOwogICAgICAgfQogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIG5ld0NoYW5nZS5zZXRSZXN1bHQoUkVKRUNURURfTUlTU0lOR19PQkpFQ1QpOworICAgICAgbWFnaWNCcmFuY2guY21kLnNldFJlc3VsdChSRUpFQ1RFRF9NSVNTSU5HX09CSkVDVCk7CiAgICAgICBsb2cuZXJyb3IoIkludmFsaWQgcGFjayB1cGxvYWQ7IG9uZSBvciBtb3JlIG9iamVjdHMgd2VyZW4ndCBzZW50IiwgZSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRIRUFEKFJlcG9zaXRvcnkgcmVwbykgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gcmVwby5nZXRGdWxsQnJhbmNoKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcmVhZCBIRUFEIHN5bXJlZiIsIGUpOworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKICAgLyoqCiAgICAqIExvYWRzIGEgbGlzdCBvZiBjb21taXRzIHRvIHJlamVjdCBmcm9tIHtAY29kZSByZWZzL21ldGEvcmVqZWN0LWNvbW1pdHN9LgogICAgKgpAQCAtMTExMSw4ICsxMjU4LDExIEBACiAgICAgd2Fsay5zb3J0KFJldlNvcnQuUkVWRVJTRSwgdHJ1ZSk7CiAgICAgdHJ5IHsKICAgICAgIFNldDxPYmplY3RJZD4gZXhpc3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICAgIHdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQobmV3Q2hhbmdlLmdldE5ld0lkKCkpKTsKLSAgICAgIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZyh3YWxrLCBleGlzdGluZyk7CisgICAgICB3YWxrLm1hcmtTdGFydCh3YWxrLnBhcnNlQ29tbWl0KG1hZ2ljQnJhbmNoLmNtZC5nZXROZXdJZCgpKSk7CisgICAgICBtYXJrSGVhZHNBc1VuaW50ZXJlc3RpbmcoCisgICAgICAgICAgd2FsaywKKyAgICAgICAgICBleGlzdGluZywKKyAgICAgICAgICBtYWdpY0JyYW5jaC5jdGwgIT0gbnVsbCA/IG1hZ2ljQnJhbmNoLmN0bC5nZXRSZWZOYW1lKCkgOiBudWxsKTsKIAogICAgICAgTGlzdDxDaGFuZ2VMb29rdXA+IHBlbmRpbmcgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICAgIGZpbmFsIFNldDxDaGFuZ2UuS2V5PiBuZXdDaGFuZ2VJZHMgPSBuZXcgSGFzaFNldDxDaGFuZ2UuS2V5PigpOwpAQCAtMTEyNiw3ICsxMjc2LDggQEAKICAgICAgICAgICAvLwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmICghdmFsaWRDb21taXQoZGVzdEJyYW5jaEN0bCwgbmV3Q2hhbmdlLCBjKSkgeworCisgICAgICAgIGlmICghdmFsaWRDb21taXQobWFnaWNCcmFuY2guY3RsLCBtYWdpY0JyYW5jaC5jbWQsIGMpKSB7CiAgICAgICAgICAgLy8gTm90IGEgY2hhbmdlIHRoZSB1c2VyIGNhbiBwcm9wb3NlPyBBYm9ydCBhcyBlYXJseSBhcyBwb3NzaWJsZS4KICAgICAgICAgICAvLwogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKQEAgLTExNDIsNyArMTI5Myw3IEBACiAgICAgICAgIGZpbmFsIFN0cmluZyBpZFN0ciA9IGlkTGlzdC5nZXQoaWRMaXN0LnNpemUoKSAtIDEpLnRyaW0oKTsKICAgICAgICAgaWYgKGlkU3RyLm1hdGNoZXMoIl5JMDAqJCIpKSB7CiAgICAgICAgICAgLy8gUmVqZWN0IHRoaXMgaW52YWxpZCBsaW5lIGZyb20gRUdpdC4KLSAgICAgICAgICByZWplY3QobmV3Q2hhbmdlLCAiaW52YWxpZCBDaGFuZ2UtSWQiKTsKKyAgICAgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAiaW52YWxpZCBDaGFuZ2UtSWQiKTsKICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgIH0KIApAQCAtMTE1Miw3ICsxMzAzLDcgQEAKIAogICAgICAgZm9yIChDaGFuZ2VMb29rdXAgcCA6IHBlbmRpbmcpIHsKICAgICAgICAgaWYgKG5ld0NoYW5nZUlkcy5jb250YWlucyhwLmNoYW5nZUtleSkpIHsKLSAgICAgICAgICByZWplY3QobmV3Q2hhbmdlLCAic3F1YXNoIGNvbW1pdHMgZmlyc3QiKTsKKyAgICAgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAic3F1YXNoIGNvbW1pdHMgZmlyc3QiKTsKICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgIH0KIApAQCAtMTE2MywxNCArMTMxNCwxNCBAQAogICAgICAgICAgIC8vIGEgZGlmZmVyZW50IENoYW5nZS1JZC4gSW4gcHJhY3RpY2UsIHdlIHNob3VsZCBuZXZlciBzZWUKICAgICAgICAgICAvLyB0aGlzIGVycm9yIG1lc3NhZ2UgYXMgQ2hhbmdlLUlkIHNob3VsZCBiZSB1bmlxdWUuCiAgICAgICAgICAgLy8KLSAgICAgICAgICByZWplY3QobmV3Q2hhbmdlLCBwLmNoYW5nZUtleS5nZXQoKSArICIgaGFzIGR1cGxpY2F0ZXMiKTsKKyAgICAgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCBwLmNoYW5nZUtleS5nZXQoKSArICIgaGFzIGR1cGxpY2F0ZXMiKTsKICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2hhbmdlcy5zaXplKCkgPT0gMSkgewogICAgICAgICAgIC8vIFNjaGVkdWxlIGFzIGEgcmVwbGFjZW1lbnQgdG8gdGhpcyBvbmUgbWF0Y2hpbmcgY2hhbmdlLgogICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKHJlcXVlc3RSZXBsYWNlKG5ld0NoYW5nZSwgZmFsc2UsIGNoYW5nZXMuZ2V0KDApLCBwLmNvbW1pdCkpIHsKKyAgICAgICAgICBpZiAocmVxdWVzdFJlcGxhY2UobWFnaWNCcmFuY2guY21kLCBmYWxzZSwgY2hhbmdlcy5nZXQoMCksIHAuY29tbWl0KSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKQEAgLTExNzksNyArMTMzMCw3IEBACiAKICAgICAgICAgaWYgKGNoYW5nZXMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICBpZiAoIWlzVmFsaWRDaGFuZ2VJZChwLmNoYW5nZUtleS5nZXQoKSkpIHsKLSAgICAgICAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJpbnZhbGlkIENoYW5nZS1JZCIpOworICAgICAgICAgICAgcmVqZWN0KG1hZ2ljQnJhbmNoLmNtZCwgImludmFsaWQgQ2hhbmdlLUlkIik7CiAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgICAgfQogCkBAIC0xMTkxLDE3ICsxMzQyLDE3IEBACiAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCB0aGUgY29yZSByZWNlaXZlIHByb2Nlc3Mgd291bGQgaGF2ZQogICAgICAgLy8gaWRlbnRpZmllZCB0aGUgbWlzc2luZyBvYmplY3QgZWFybGllciBiZWZvcmUgd2UgZ290IGNvbnRyb2wuCiAgICAgICAvLwotICAgICAgbmV3Q2hhbmdlLnNldFJlc3VsdChSRUpFQ1RFRF9NSVNTSU5HX09CSkVDVCk7CisgICAgICBtYWdpY0JyYW5jaC5jbWQuc2V0UmVzdWx0KFJFSkVDVEVEX01JU1NJTkdfT0JKRUNUKTsKICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBwYWNrIHVwbG9hZDsgb25lIG9yIG1vcmUgb2JqZWN0cyB3ZXJlbid0IHNlbnQiLCBlKTsKICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewogICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcXVlcnkgZGF0YWJhc2UgdG8gbG9jYXRlIHByaW9yIGNoYW5nZXMiLCBlKTsKLSAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJkYXRhYmFzZSBlcnJvciIpOworICAgICAgcmVqZWN0KG1hZ2ljQnJhbmNoLmNtZCwgImRhdGFiYXNlIGVycm9yIik7CiAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQogCiAgICAgaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpICYmIHJlcGxhY2VCeUNoYW5nZS5pc0VtcHR5KCkpIHsKLSAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJubyBuZXcgY2hhbmdlcyIpOworICAgICAgcmVqZWN0KG1hZ2ljQnJhbmNoLmNtZCwgIm5vIG5ldyBjaGFuZ2VzIik7CiAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQogICAgIGZvciAoQ3JlYXRlUmVxdWVzdCBjcmVhdGUgOiBuZXdDaGFuZ2VzKSB7CkBAIC0xMjEwLDE1ICsxMzYxLDE3IEBACiAgICAgcmV0dXJuIG5ld0NoYW5nZXM7CiAgIH0KIAotCi0gIHByaXZhdGUgdm9pZCBtYXJrSGVhZHNBc1VuaW50ZXJlc3RpbmcoZmluYWwgUmV2V2FsayB3YWxrLCBTZXQ8T2JqZWN0SWQ+IGV4aXN0aW5nKSB7Ci0gICAgZm9yIChSZWYgcmVmIDogcmVwby5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKKyAgcHJpdmF0ZSB2b2lkIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZygKKyAgICAgIGZpbmFsIFJldldhbGsgd2FsaywKKyAgICAgIFNldDxPYmplY3RJZD4gZXhpc3RpbmcsCisgICAgICBATnVsbGFibGUgU3RyaW5nIGZvclJlZikgeworICAgIGZvciAoUmVmIHJlZiA6IGFsbFJlZnMudmFsdWVzKCkpIHsKICAgICAgIGlmIChyZWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKSB7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInJlZnMvY2hhbmdlcy8iKSkgewogICAgICAgICBleGlzdGluZy5hZGQocmVmLmdldE9iamVjdElkKCkpOwogICAgICAgfSBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoUl9IRUFEUykKLSAgICAgICAgICB8fCAoZGVzdEJyYW5jaEN0bCAhPSBudWxsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKGRlc3RCcmFuY2hDdGwuZ2V0UmVmTmFtZSgpKSkpIHsKKyAgICAgICAgICB8fCAoZm9yUmVmICE9IG51bGwgJiYgZm9yUmVmLmVxdWFscyhyZWYuZ2V0TmFtZSgpKSkpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICB3YWxrLm1hcmtVbmludGVyZXN0aW5nKHdhbGsucGFyc2VDb21taXQocmVmLmdldE9iamVjdElkKCkpKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMTI0Miw3ICsxMzk1LDcgQEAKICAgICBDaGFuZ2VMb29rdXAoUmV2Q29tbWl0IGMsIENoYW5nZS5LZXkga2V5KSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICAgIGNvbW1pdCA9IGM7CiAgICAgICBjaGFuZ2VLZXkgPSBrZXk7Ci0gICAgICBjaGFuZ2VzID0gZGIuY2hhbmdlcygpLmJ5QnJhbmNoS2V5KGRlc3RCcmFuY2gsIGtleSk7CisgICAgICBjaGFuZ2VzID0gZGIuY2hhbmdlcygpLmJ5QnJhbmNoS2V5KG1hZ2ljQnJhbmNoLmRlc3QsIGtleSk7CiAgICAgfQogICB9CiAKQEAgLTEyNjAsMTYgKzE0MTMsMTUgQEAKICAgICAgIGNoYW5nZSA9IG5ldyBDaGFuZ2UoY2hhbmdlS2V5LAogICAgICAgICAgIG5ldyBDaGFuZ2UuSWQoZGIubmV4dENoYW5nZUlkKCkpLAogICAgICAgICAgIGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpLAotICAgICAgICAgIGRlc3RCcmFuY2gpOwotICAgICAgY2hhbmdlLnNldFRvcGljKGRlc3RUb3BpY05hbWUpOwotICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7CisgICAgICAgICAgbWFnaWNCcmFuY2guZGVzdCk7CisgICAgICBjaGFuZ2Uuc2V0VG9waWMobWFnaWNCcmFuY2gudG9waWMpOwogCi0gICAgICBwcyA9IG5ldyBQYXRjaFNldChjaGFuZ2UuY3VyclBhdGNoU2V0SWQoKSk7CisgICAgICBwcyA9IG5ldyBQYXRjaFNldChuZXcgUGF0Y2hTZXQuSWQoY2hhbmdlLmdldElkKCksIElOSVRJQUxfUEFUQ0hfU0VUX0lEKSk7CiAgICAgICBwcy5zZXRDcmVhdGVkT24oY2hhbmdlLmdldENyZWF0ZWRPbigpKTsKICAgICAgIHBzLnNldFVwbG9hZGVyKGNoYW5nZS5nZXRPd25lcigpKTsKICAgICAgIHBzLnNldFJldmlzaW9uKHRvUmV2SWQoYykpOwogCi0gICAgICBpZiAoTWFnaWNCcmFuY2guaXNEcmFmdChuZXdDaGFuZ2UuZ2V0UmVmTmFtZSgpKSkgeworICAgICAgaWYgKG1hZ2ljQnJhbmNoLmlzRHJhZnQoKSkgewogICAgICAgICBjaGFuZ2Uuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuRFJBRlQpOwogICAgICAgICBwcy5zZXREcmFmdCh0cnVlKTsKICAgICAgIH0KQEAgLTEyODAsNDggKzE0MzIsNDggQEAKICAgICAgIGNtZCA9IG5ldyBSZWNlaXZlQ29tbWFuZChPYmplY3RJZC56ZXJvSWQoKSwgYywgcHMuZ2V0UmVmTmFtZSgpKTsKICAgICB9CiAKLSAgICB2b2lkIGluc2VydENoYW5nZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGVja2VkRnV0dXJlPFZvaWQsIE9ybUV4Y2VwdGlvbj4gaW5zZXJ0Q2hhbmdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgIHJwLmdldFJldldhbGsoKS5wYXJzZUJvZHkoY29tbWl0KTsKLSAgICAgIHdhcm5NYWxmb3JtZWRNZXNzYWdlKGNvbW1pdCk7CiAKLSAgICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKTsKLSAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiByZXZpZXdlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPihyZXZpZXdlcklkKTsKLSAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBjYyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KGNjSWQpOwotICAgICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJMaW5lcyA9IGNvbW1pdC5nZXRGb290ZXJMaW5lcygpOwotICAgICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGZvb3RlckxpbmUgOiBmb290ZXJMaW5lcykgewotICAgICAgICB0cnkgewotICAgICAgICAgIGlmIChwcy5pc0RyYWZ0KCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgZmluYWwgVGhyZWFkIGNhbGxlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICBMaXN0ZW5hYmxlRnV0dXJlPFZvaWQ+IGZ1dHVyZSA9IGNoYW5nZVVwZGF0ZUV4ZWN0b3Iuc3VibWl0KAorICAgICAgICAgIHJlcXVlc3RTY29wZVByb3BhZ2F0b3Iud3JhcChuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICAgICAgaWYgKGNhbGxlciA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICBpbnNlcnRDaGFuZ2UoZGIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZXZpZXdEYiBkYiA9IHNjaGVtYUZhY3Rvcnkub3BlbigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgaW5zZXJ0Q2hhbmdlKGRiKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIGlmIChpc1Jldmlld2VyKGZvb3RlckxpbmUpKSB7Ci0gICAgICAgICAgICByZXZpZXdlcnMuYWRkKHRvQWNjb3VudElkKGZvb3RlckxpbmUuZ2V0VmFsdWUoKS50cmltKCkpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGZvb3RlckxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQ0MpKSB7Ci0gICAgICAgICAgICBjYy5hZGQodG9BY2NvdW50SWQoZm9vdGVyTGluZS5nZXRWYWx1ZSgpLnRyaW0oKSkpOworICAgICAgICAgIHN5bmNocm9uaXplZCAobmV3UHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIG5ld1Byb2dyZXNzLnVwZGF0ZSgxKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFjY291bnRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXZpZXdlcnMucmVtb3ZlKG1lKTsKLSAgICAgIGNjLnJlbW92ZShtZSk7Ci0gICAgICBjYy5yZW1vdmVBbGwocmV2aWV3ZXJzKTsKKyAgICAgIH0pKTsKKyAgICAgIHJldHVybiBGdXR1cmVzLm1ha2VDaGVja2VkKGZ1dHVyZSwgT1JNX0VYQ0VQVElPTik7CisgICAgfQogCi0gICAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbnNlcnRBbmNlc3RvcnMocHMuZ2V0SWQoKSwgY29tbWl0KTsKLSAgICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcykpOwotICAgICAgICBkYi5jaGFuZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKLSAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVUcmFja2luZ0lkcyhkYiwgY2hhbmdlLCB0cmFja2luZ0Zvb3RlcnMsIGZvb3RlckxpbmVzKTsKLSAgICAgICAgYXBwcm92YWxzVXRpbC5hZGRSZXZpZXdlcnMoY2hhbmdlLCBwcywgaW5mbywgcmV2aWV3ZXJzKTsKLSAgICAgICAgZGIuY29tbWl0KCk7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBkYi5yb2xsYmFjaygpOworICAgIHByaXZhdGUgdm9pZCBpbnNlcnRDaGFuZ2UoUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpOworICAgICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJMaW5lcyA9IGNvbW1pdC5nZXRGb290ZXJMaW5lcygpOworICAgICAgZmluYWwgTWFpbFJlY2lwaWVudHMgcmVjaXBpZW50cyA9IG5ldyBNYWlsUmVjaXBpZW50cygpOworICAgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwpIHsKKyAgICAgICAgcmVjaXBpZW50cy5hZGQobWFnaWNCcmFuY2guZ2V0TWFpbFJlY2lwaWVudHMoKSk7CiAgICAgICB9CisgICAgICByZWNpcGllbnRzLmFkZChnZXRSZWNpcGllbnRzRnJvbUZvb3RlcnMoYWNjb3VudFJlc29sdmVyLCBwcywgZm9vdGVyTGluZXMpKTsKKyAgICAgIHJlY2lwaWVudHMucmVtb3ZlKG1lKTsKKworICAgICAgY2hhbmdlSW5zZXJ0ZXIuaW5zZXJ0Q2hhbmdlKGRiLCBjaGFuZ2UsIHBzLCBjb21taXQsIGxhYmVsVHlwZXMsCisgICAgICAgICAgZm9vdGVyTGluZXMsIGluZm8sIHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCkpOwogCiAgICAgICBjcmVhdGVkID0gdHJ1ZTsKLSAgICAgIHJlcGxpY2F0aW9uLmZpcmUocHJvamVjdC5nZXROYW1lS2V5KCksIHBzLmdldFJlZk5hbWUoKSk7Ci0gICAgICBob29rcy5kb1BhdGNoc2V0Q3JlYXRlZEhvb2soY2hhbmdlLCBwcywgZGIpOwotICAgICAgbmV3UHJvZ3Jlc3MudXBkYXRlKDEpOworCiAgICAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkKICAgICAgICAgICAuc3VibWl0KHJlcXVlc3RTY29wZVByb3BhZ2F0b3Iud3JhcChuZXcgUnVubmFibGUoKSB7CiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTMzMSw4ICsxNDgzLDggQEAKICAgICAgICAgICAgICAgICBjcmVhdGVDaGFuZ2VTZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOwogICAgICAgICAgICAgY20uc2V0RnJvbShtZSk7CiAgICAgICAgICAgICBjbS5zZXRQYXRjaFNldChwcywgaW5mbyk7Ci0gICAgICAgICAgICBjbS5hZGRSZXZpZXdlcnMocmV2aWV3ZXJzKTsKLSAgICAgICAgICAgIGNtLmFkZEV4dHJhQ0MoY2MpOworICAgICAgICAgICAgY20uYWRkUmV2aWV3ZXJzKHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCkpOworICAgICAgICAgICAgY20uYWRkRXh0cmFDQyhyZWNpcGllbnRzLmdldENjT25seSgpKTsKICAgICAgICAgICAgIGNtLnNlbmQoKTsKICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgc2VuZCBlbWFpbCBmb3IgbmV3IGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCksIGUpOwpAQCAtMTM0NywxOCArMTQ5OSwxMCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZXZpZXdlcihmaW5hbCBGb290ZXJMaW5lIGNhbmRpZGF0ZUZvb3RlckxpbmUpIHsKLSAgICByZXR1cm4gY2FuZGlkYXRlRm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5TSUdORURfT0ZGX0JZKQotICAgICAgICB8fCBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoRm9vdGVyS2V5LkFDS0VEX0JZKQotICAgICAgICB8fCBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoUkVWSUVXRURfQlkpCi0gICAgICAgIHx8IGNhbmRpZGF0ZUZvb3RlckxpbmUubWF0Y2hlcyhURVNURURfQlkpOwotICB9Ci0KICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVQYXRjaFNldHNGb3JSZXBsYWNlKCkgewogICAgIHRyeSB7CiAgICAgICByZWFkQ2hhbmdlc0ZvclJlcGxhY2UoKTsKICAgICAgIHJlYWRQYXRjaFNldHNGb3JSZXBsYWNlKCk7Ci0KICAgICAgIGZvciAoUmVwbGFjZVJlcXVlc3QgcmVxIDogcmVwbGFjZUJ5Q2hhbmdlLnZhbHVlcygpKSB7CiAgICAgICAgIGlmIChyZXEuaW5wdXRDb21tYW5kLmdldFJlc3VsdCgpID09IE5PVF9BVFRFTVBURUQpIHsKICAgICAgICAgICByZXEudmFsaWRhdGUoZmFsc2UpOwpAQCAtMTM4NiwxMCArMTUzMCwxMCBAQAogICAgICAgfQogICAgIH0KIAotICAgIGlmIChuZXdDaGFuZ2UgIT0gbnVsbCAmJiBuZXdDaGFuZ2UuZ2V0UmVzdWx0KCkgIT0gTk9UX0FUVEVNUFRFRCkgeworICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsICYmIG1hZ2ljQnJhbmNoLmNtZC5nZXRSZXN1bHQoKSAhPSBOT1RfQVRURU1QVEVEKSB7CiAgICAgICAvLyBDYW5jZWwgY3JlYXRpb25zIHRpZWQgdG8gcmVmcy9mb3IvIG9yIHJlZnMvZHJhZnRzLyBjb21tYW5kLgogICAgICAgZm9yIChSZXBsYWNlUmVxdWVzdCByZXEgOiByZXBsYWNlQnlDaGFuZ2UudmFsdWVzKCkpIHsKLSAgICAgICAgaWYgKHJlcS5pbnB1dENvbW1hbmQgPT0gbmV3Q2hhbmdlICYmIHJlcS5jbWQgIT0gbnVsbCkgeworICAgICAgICBpZiAocmVxLmlucHV0Q29tbWFuZCA9PSBtYWdpY0JyYW5jaC5jbWQgJiYgcmVxLmNtZCAhPSBudWxsKSB7CiAgICAgICAgICAgcmVxLmNtZC5zZXRSZXN1bHQoUmVzdWx0LlJFSkVDVEVEX09USEVSX1JFQVNPTiwgImFib3J0ZWQiKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTQ2OSw2ICsxNjEzLDcgQEAKICAgICAgIH0KIAogICAgICAgcnAuZ2V0UmV2V2FsaygpLnBhcnNlQm9keShuZXdDb21taXQpOworCiAgICAgICBpZiAoIXZhbGlkQ29tbWl0KGNoYW5nZUN0bC5nZXRSZWZDb250cm9sKCksIGlucHV0Q29tbWFuZCwgbmV3Q29tbWl0KSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CkBAIC0xNDk0LDYgKzE2MzksMTMgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBmaW5hbCBSZXZDb21taXQgcHJpb3IgPSBycC5nZXRSZXZXYWxrKCkucGFyc2VDb21taXQoY29tbWl0SWQpOwogCisgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlIHNhbWUgY29tbWl0IHRvIGFwcGVhciB0d2ljZSBvbiB0aGUgc2FtZSBjaGFuZ2UKKyAgICAgICAgICAvLworICAgICAgICAgIGlmIChuZXdDb21taXQgPT0gcHJpb3IpIHsKKyAgICAgICAgICAgIHJlamVjdChpbnB1dENvbW1hbmQsICJjb21taXQgYWxyZWFkeSBleGlzdHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisKICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBhIGNoYW5nZSB0byBkaXJlY3RseSBkZXBlbmQgdXBvbiBpdHNlbGYuIFRoaXMgaXMgYQogICAgICAgICAgIC8vIHZlcnkgY29tbW9uIGVycm9yIGR1ZSB0byB1c2VycyBtYWtpbmcgYSBuZXcgY29tbWl0IHJhdGhlciB0aGFuCiAgICAgICAgICAgLy8gYW1lbmRpbmcgd2hlbiB0cnlpbmcgdG8gYWRkcmVzcyByZXZpZXcgY29tbWVudHMuCkBAIC0xNTAzLDEzICsxNjU1LDYgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9CiAKLSAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGUgc2FtZSBjb21taXQgdG8gYXBwZWFyIHR3aWNlIG9uIHRoZSBzYW1lIGNoYW5nZQotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKG5ld0NvbW1pdCA9PSBwcmlvcikgewotICAgICAgICAgICAgcmVqZWN0KGlucHV0Q29tbWFuZCwgImNvbW1pdCBhbHJlYWR5IGV4aXN0cyIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLQogICAgICAgICAgIC8vIERvbid0IGFsbG93IHRoZSBzYW1lIHRyZWUgaWYgdGhlIGNvbW1pdCBtZXNzYWdlIGlzIHVubW9kaWZpZWQKICAgICAgICAgICAvLyBvciBubyBwYXJlbnRzIHdlcmUgdXBkYXRlZCAocmViYXNlKSwgZWxzZSB3YXJuIHRoYXQgb25seSBwYXJ0CiAgICAgICAgICAgLy8gb2YgdGhlIGNvbW1pdCB3YXMgbW9kaWZpZWQuCkBAIC0xNTUwLDEyICsxNjk1LDEzIEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7Ci0gICAgICBuZXdQYXRjaFNldCA9IG5ldyBQYXRjaFNldChjaGFuZ2UuY3VyclBhdGNoU2V0SWQoKSk7CisgICAgICBQYXRjaFNldC5JZCBpZCA9CisgICAgICAgICAgQ2hhbmdlVXRpbC5uZXh0UGF0Y2hTZXRJZChhbGxSZWZzLCBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICBuZXdQYXRjaFNldCA9IG5ldyBQYXRjaFNldChpZCk7CiAgICAgICBuZXdQYXRjaFNldC5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOwogICAgICAgbmV3UGF0Y2hTZXQuc2V0VXBsb2FkZXIoY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCkpOwogICAgICAgbmV3UGF0Y2hTZXQuc2V0UmV2aXNpb24odG9SZXZJZChuZXdDb21taXQpKTsKLSAgICAgIGlmIChuZXdDaGFuZ2UgIT0gbnVsbCAmJiBNYWdpY0JyYW5jaC5pc0RyYWZ0KG5ld0NoYW5nZS5nZXRSZWZOYW1lKCkpKSB7CisgICAgICBpZiAobWFnaWNCcmFuY2ggIT0gbnVsbCAmJiBtYWdpY0JyYW5jaC5pc0RyYWZ0KCkpIHsKICAgICAgICAgbmV3UGF0Y2hTZXQuc2V0RHJhZnQodHJ1ZSk7CiAgICAgICB9CiAgICAgICBpbmZvID0gcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQobmV3Q29tbWl0LCBuZXdQYXRjaFNldC5nZXRJZCgpKTsKQEAgLTE1NjYsNTIgKzE3MTIsNTUgQEAKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIFBhdGNoU2V0LklkIGluc2VydFBhdGNoU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIENoZWNrZWRGdXR1cmU8UGF0Y2hTZXQuSWQsIE9ybUV4Y2VwdGlvbj4gaW5zZXJ0UGF0Y2hTZXQoKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgcnAuZ2V0UmV2V2FsaygpLnBhcnNlQm9keShuZXdDb21taXQpOwotICAgICAgd2Fybk1hbGZvcm1lZE1lc3NhZ2UobmV3Q29tbWl0KTsKIAotICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpOwotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IHJldmlld2VycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KHJldmlld2VySWQpOwotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IGNjID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oY2NJZCk7Ci0gICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzID0gbmV3Q29tbWl0LmdldEZvb3RlckxpbmVzKCk7Ci0gICAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgZm9vdGVyTGluZSA6IGZvb3RlckxpbmVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKGlzUmV2aWV3ZXIoZm9vdGVyTGluZSkpIHsKLSAgICAgICAgICAgIHJldmlld2Vycy5hZGQodG9BY2NvdW50SWQoZm9vdGVyTGluZS5nZXRWYWx1ZSgpLnRyaW0oKSkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoZm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5DQykpIHsKLSAgICAgICAgICAgIGNjLmFkZCh0b0FjY291bnRJZChmb290ZXJMaW5lLmdldFZhbHVlKCkudHJpbSgpKSk7CisgICAgICBmaW5hbCBUaHJlYWQgY2FsbGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgIExpc3RlbmFibGVGdXR1cmU8UGF0Y2hTZXQuSWQ+IGZ1dHVyZSA9IGNoYW5nZVVwZGF0ZUV4ZWN0b3Iuc3VibWl0KAorICAgICAgICAgIHJlcXVlc3RTY29wZVByb3BhZ2F0b3Iud3JhcChuZXcgQ2FsbGFibGU8UGF0Y2hTZXQuSWQ+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhdGNoU2V0LklkIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGNhbGxlciA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7CisgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRQYXRjaFNldChkYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBSZXZpZXdEYiBkYiA9IHNjaGVtYUZhY3Rvcnkub3BlbigpOworICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnNlcnRQYXRjaFNldChkYik7CisgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHJlcGxhY2VQcm9ncmVzcykgeworICAgICAgICAgICAgICByZXBsYWNlUHJvZ3Jlc3MudXBkYXRlKDEpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWNjb3VudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldmlld2Vycy5yZW1vdmUobWUpOwotICAgICAgY2MucmVtb3ZlKG1lKTsKLSAgICAgIGNjLnJlbW92ZUFsbChyZXZpZXdlcnMpOworICAgICAgfSkpOworICAgICAgcmV0dXJuIEZ1dHVyZXMubWFrZUNoZWNrZWQoZnV0dXJlLCBPUk1fRVhDRVBUSU9OKTsKKyAgICB9CiAKLSAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBvbGRSZXZpZXdlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IG9sZENDID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKKyAgICBQYXRjaFNldC5JZCBpbnNlcnRQYXRjaFNldChSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCk7CisgICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzID0gbmV3Q29tbWl0LmdldEZvb3RlckxpbmVzKCk7CisgICAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyByZWNpcGllbnRzID0gbmV3IE1haWxSZWNpcGllbnRzKCk7CisgICAgICBpZiAobWFnaWNCcmFuY2ggIT0gbnVsbCkgeworICAgICAgICByZWNpcGllbnRzLmFkZChtYWdpY0JyYW5jaC5nZXRNYWlsUmVjaXBpZW50cygpKTsKKyAgICAgIH0KKyAgICAgIHJlY2lwaWVudHMuYWRkKGdldFJlY2lwaWVudHNGcm9tRm9vdGVycyhhY2NvdW50UmVzb2x2ZXIsIG5ld1BhdGNoU2V0LCBmb290ZXJMaW5lcykpOworICAgICAgcmVjaXBpZW50cy5yZW1vdmUobWUpOwogCiAgICAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7CiAgICAgICB0cnkgewotICAgICAgICBjaGFuZ2UgPQotICAgICAgICAgIGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlLmdldElkKCksIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGNoYW5nZS51cGRhdGVOdW1iZXJPZlBhdGNoU2V0cyhuZXdQYXRjaFNldC5nZXRQYXRjaFNldElkKCkpOwotICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKKyAgICAgICAgY2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChjaGFuZ2UuZ2V0SWQoKSk7CisgICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCB8fCBjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNDbG9zZWQoKSkgewogICAgICAgICAgIHJlamVjdChpbnB1dENvbW1hbmQsICJjaGFuZ2UgaXMgY2xvc2VkIik7CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpbnNlcnRBbmNlc3RvcnMobmV3UGF0Y2hTZXQuZ2V0SWQoKSwgbmV3Q29tbWl0KTsKKyAgICAgICAgQ2hhbmdlVXRpbC5pbnNlcnRBbmNlc3RvcnMoZGIsIG5ld1BhdGNoU2V0LmdldElkKCksIG5ld0NvbW1pdCk7CiAgICAgICAgIGRiLnBhdGNoU2V0cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3UGF0Y2hTZXQpKTsKIAogICAgICAgICBpZiAoY2hlY2tNZXJnZWRJbnRvKSB7CkBAIC0xNjE5LDIyICsxNzY4LDEzIEBACiAgICAgICAgICAgbWVyZ2VkSW50b1JlZiA9IG1lcmdlZEludG8gIT0gbnVsbCA/IG1lcmdlZEludG8uZ2V0TmFtZSgpIDogbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gcGF0Y2hTZXRBcHByb3ZhbHMgPSBhcHByb3ZhbHNVdGlsLmNvcHlWZXRvc1RvTGF0ZXN0UGF0Y2hTZXQoY2hhbmdlKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gaGF2ZUFwcHJvdmFscyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7Ci0gICAgICAgIG9sZFJldmlld2Vycy5jbGVhcigpOwotICAgICAgICBvbGRDQy5jbGVhcigpOwotCi0gICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogcGF0Y2hTZXRBcHByb3ZhbHMpIHsKLSAgICAgICAgICBoYXZlQXBwcm92YWxzLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKLSAgICAgICAgICAgIG9sZFJldmlld2Vycy5hZGQoYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9sZENDLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhjaGFuZ2UsIG5ld1BhdGNoU2V0LCBpbmZvLCByZXZpZXdlcnMsIGhhdmVBcHByb3ZhbHMpOworICAgICAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHBhdGNoU2V0QXBwcm92YWxzID0KKyAgICAgICAgICAgIGFwcHJvdmFsc1V0aWwuY29weVZldG9zVG9QYXRjaFNldChkYiwgbGFiZWxUeXBlcywgbmV3UGF0Y2hTZXQuZ2V0SWQoKSk7CisgICAgICAgIGZpbmFsIE1haWxSZWNpcGllbnRzIG9sZFJlY2lwaWVudHMgPQorICAgICAgICAgICAgZ2V0UmVjaXBpZW50c0Zyb21BcHByb3ZhbHMocGF0Y2hTZXRBcHByb3ZhbHMpOworICAgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhkYiwgbGFiZWxUeXBlcywgY2hhbmdlLCBuZXdQYXRjaFNldCwgaW5mbywKKyAgICAgICAgICAgIHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCksIG9sZFJlY2lwaWVudHMuZ2V0QWxsKCkpOworICAgICAgICByZWNpcGllbnRzLmFkZChvbGRSZWNpcGllbnRzKTsKIAogICAgICAgICBtc2cgPQogICAgICAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UobmV3IENoYW5nZU1lc3NhZ2UuS2V5KGNoYW5nZS5nZXRJZCgpLCBDaGFuZ2VVdGlsCkBAIC0xNjYwLDggKzE4MDAsOCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOwogICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICBpZiAoZGVzdFRvcGljTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRUb3BpYyhkZXN0VG9waWNOYW1lKTsKKyAgICAgICAgICAgICAgICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsICYmIG1hZ2ljQnJhbmNoLnRvcGljICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFRvcGljKG1hZ2ljQnJhbmNoLnRvcGljKTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5EUkFGVCAmJiBuZXdQYXRjaFNldC5pc0RyYWZ0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmUgaW4gZHJhZnQgc3RhdHVzLgpAQCAtMTY5Niw5ICsxODM2LDkgQEAKICAgICAgIGlmIChjbWQuZ2V0UmVzdWx0KCkgPT0gTk9UX0FUVEVNUFRFRCkgewogICAgICAgICBjbWQuZXhlY3V0ZShycCk7CiAgICAgICB9Ci0gICAgICByZXBsaWNhdGlvbi5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOworICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgT2JqZWN0SWQuemVyb0lkKCksIG5ld0NvbW1pdCk7CiAgICAgICBob29rcy5kb1BhdGNoc2V0Q3JlYXRlZEhvb2soY2hhbmdlLCBuZXdQYXRjaFNldCwgZGIpOwotICAgICAgcmVwbGFjZVByb2dyZXNzLnVwZGF0ZSgxKTsKICAgICAgIGlmIChtZXJnZWRJbnRvUmVmICE9IG51bGwpIHsKICAgICAgICAgaG9va3MuZG9DaGFuZ2VNZXJnZWRIb29rKAogICAgICAgICAgICAgY2hhbmdlLCBjdXJyZW50VXNlci5nZXRBY2NvdW50KCksIG5ld1BhdGNoU2V0LCBkYik7CkBAIC0xNzEzLDEwICsxODUzLDggQEAKICAgICAgICAgICAgIGNtLnNldEZyb20obWUpOwogICAgICAgICAgICAgY20uc2V0UGF0Y2hTZXQobmV3UGF0Y2hTZXQsIGluZm8pOwogICAgICAgICAgICAgY20uc2V0Q2hhbmdlTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgY20uYWRkUmV2aWV3ZXJzKHJldmlld2Vycyk7Ci0gICAgICAgICAgICBjbS5hZGRFeHRyYUNDKGNjKTsKLSAgICAgICAgICAgIGNtLmFkZFJldmlld2VycyhvbGRSZXZpZXdlcnMpOwotICAgICAgICAgICAgY20uYWRkRXh0cmFDQyhvbGRDQyk7CisgICAgICAgICAgICBjbS5hZGRSZXZpZXdlcnMocmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSk7CisgICAgICAgICAgICBjbS5hZGRFeHRyYUNDKHJlY2lwaWVudHMuZ2V0Q2NPbmx5KCkpOwogICAgICAgICAgICAgY20uc2VuZCgpOwogICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBzZW5kIGVtYWlsIGZvciBuZXcgcGF0Y2ggc2V0ICIgKyBuZXdQYXRjaFNldC5nZXRJZCgpLCBlKTsKQEAgLTE4MDMsNyArMTk0MSw3IEBACiAgICAgICAgICYmIGN0bC5jYW5Gb3JnZUNvbW1pdHRlcigpCiAgICAgICAgICYmIGN0bC5jYW5Gb3JnZUdlcnJpdFNlcnZlcklkZW50aXR5KCkKICAgICAgICAgJiYgY3RsLmNhblVwbG9hZE1lcmdlcygpCi0gICAgICAgICYmICFwcm9qZWN0LmlzVXNlU2lnbmVkT2ZmQnkoKQorICAgICAgICAmJiAhcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCkuaXNVc2VTaWduZWRPZmZCeSgpCiAgICAgICAgICYmIEl0ZXJhYmxlcy5pc0VtcHR5KHJlamVjdENvbW1pdHMpCiAgICAgICAgICYmICFHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhjdGwuZ2V0UmVmTmFtZSgpKQogICAgICAgICAmJiAhKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goY21kLmdldFJlZk5hbWUoKSkKQEAgLTE4MTcsNyArMTk1NSw3IEBACiAgICAgdHJ5IHsKICAgICAgIFNldDxPYmplY3RJZD4gZXhpc3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQoKTsKICAgICAgIHdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQoY21kLmdldE5ld0lkKCkpKTsKLSAgICAgIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZyh3YWxrLCBleGlzdGluZyk7CisgICAgICBtYXJrSGVhZHNBc1VuaW50ZXJlc3Rpbmcod2FsaywgZXhpc3RpbmcsIGNtZC5nZXRSZWZOYW1lKCkpOwogCiAgICAgICBSZXZDb21taXQgYzsKICAgICAgIHdoaWxlICgoYyA9IHdhbGsubmV4dCgpKSAhPSBudWxsKSB7CkBAIC0xODM1LDIyMiArMTk3MywyNyBAQAogCiAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZENvbW1pdChmaW5hbCBSZWZDb250cm9sIGN0bCwgZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kLAogICAgICAgZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgcnAuZ2V0UmV2V2FsaygpLnBhcnNlQm9keShjKTsKLSAgICBmaW5hbCBQZXJzb25JZGVudCBjb21taXR0ZXIgPSBjLmdldENvbW1pdHRlcklkZW50KCk7Ci0gICAgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yID0gYy5nZXRBdXRob3JJZGVudCgpOwogCi0gICAgLy8gUmVxdWlyZSBwZXJtaXNzaW9uIHRvIHVwbG9hZCBtZXJnZXMuCi0gICAgaWYgKGMuZ2V0UGFyZW50Q291bnQoKSA+IDEgJiYgIWN0bC5jYW5VcGxvYWRNZXJnZXMoKSkgewotICAgICAgcmVqZWN0KGNtZCwgInlvdSBhcmUgbm90IGFsbG93ZWQgdG8gdXBsb2FkIG1lcmdlcyIpOworICAgIGlmICh2YWxpZENvbW1pdHMuY29udGFpbnMoYykpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50ID0KKyAgICAgICAgbmV3IENvbW1pdFJlY2VpdmVkRXZlbnQoY21kLCBwcm9qZWN0LCBjdGwuZ2V0UmVmTmFtZSgpLCBjLCBjdXJyZW50VXNlcik7CisgICAgQ29tbWl0VmFsaWRhdG9ycyBjb21taXRWYWxpZGF0b3JzID0KKyAgICAgICAgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnkuY3JlYXRlKGN0bCwgc3NoSW5mbywgcmVwbyk7CisKKyAgICB0cnkgeworICAgICAgbWVzc2FnZXMuYWRkQWxsKGNvbW1pdFZhbGlkYXRvcnMudmFsaWRhdGVGb3JSZWNlaXZlQ29tbWl0cyhyZWNlaXZlRXZlbnQpKTsKKyAgICB9IGNhdGNoIChDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIG1lc3NhZ2VzLmFkZEFsbChlLmdldE1lc3NhZ2VzKCkpOworICAgICAgcmVqZWN0KGNtZCwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQotICAgIC8vIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIGFtZW5kIGEgbWVyZ2UgY3JlYXRlZCBieSBHZXJyaXQgQ29kZSBSZXZpZXcuCi0gICAgLy8gVGhpcyBzZWVtcyB0byBoYXBwZW4gYWxsIHRvbyBvZnRlbiwgZHVlIHRvIHVzZXJzIG5vdCBwYXlpbmcgYW55Ci0gICAgLy8gYXR0ZW50aW9uIHRvIHdoYXQgdGhleSBhcmUgZG9pbmcuCi0gICAgLy8KLSAgICBpZiAoYy5nZXRQYXJlbnRDb3VudCgpID4gMQotICAgICAgICAmJiBhdXRob3IuZ2V0TmFtZSgpLmVxdWFscyhnZXJyaXRJZGVudC5nZXROYW1lKCkpCi0gICAgICAgICYmIGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHMoZ2Vycml0SWRlbnQuZ2V0RW1haWxBZGRyZXNzKCkpCi0gICAgICAgICYmICFjdGwuY2FuRm9yZ2VHZXJyaXRTZXJ2ZXJJZGVudGl0eSgpKSB7Ci0gICAgICByZWplY3QoY21kLCAiZG8gbm90IGFtZW5kIG1lcmdlcyBub3QgbWFkZSBieSB5b3UiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBSZXF1aXJlIHRoYXQgYXV0aG9yIG1hdGNoZXMgdGhlIHVwbG9hZGVyLgotICAgIC8vCi0gICAgaWYgKCFjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKSkKLSAgICAgICAgJiYgIWN0bC5jYW5Gb3JnZUF1dGhvcigpKSB7Ci0gICAgICBzZW5kSW52YWxpZEVtYWlsRXJyb3IoYywgImF1dGhvciIsIGF1dGhvcik7Ci0gICAgICByZWplY3QoY21kLCAiaW52YWxpZCBhdXRob3IiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBSZXF1aXJlIHRoYXQgY29tbWl0dGVyIG1hdGNoZXMgdGhlIHVwbG9hZGVyLgotICAgIC8vCi0gICAgaWYgKCFjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGNvbW1pdHRlci5nZXRFbWFpbEFkZHJlc3MoKSkKLSAgICAgICAgJiYgIWN0bC5jYW5Gb3JnZUNvbW1pdHRlcigpKSB7Ci0gICAgICBzZW5kSW52YWxpZEVtYWlsRXJyb3IoYywgImNvbW1pdHRlciIsIGNvbW1pdHRlcik7Ci0gICAgICByZWplY3QoY21kLCAiaW52YWxpZCBjb21taXR0ZXIiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocHJvamVjdC5pc1VzZVNpZ25lZE9mZkJ5KCkpIHsKLSAgICAgIC8vIElmIHRoZSBwcm9qZWN0IHdhbnRzIFNpZ25lZC1vZmYtYnkgLyBBY2tlZC1ieSBsaW5lcywgdmVyaWZ5IHdlCi0gICAgICAvLyBoYXZlIHRoZW0gZm9yIHRoZSBibGFtYWJsZSBwYXJ0aWVzIGludm9sdmVkIG9uIHRoaXMgY2hhbmdlLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gc2JvQXV0aG9yID0gZmFsc2UsIHNib0NvbW1pdHRlciA9IGZhbHNlLCBzYm9NZSA9IGZhbHNlOwotICAgICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGZvb3RlciA6IGMuZ2V0Rm9vdGVyTGluZXMoKSkgewotICAgICAgICBpZiAoZm9vdGVyLm1hdGNoZXMoRm9vdGVyS2V5LlNJR05FRF9PRkZfQlkpKSB7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIGUgPSBmb290ZXIuZ2V0RW1haWxBZGRyZXNzKCk7Ci0gICAgICAgICAgaWYgKGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2JvQXV0aG9yIHw9IGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHMoZSk7Ci0gICAgICAgICAgICBzYm9Db21taXR0ZXIgfD0gY29tbWl0dGVyLmdldEVtYWlsQWRkcmVzcygpLmVxdWFscyhlKTsKLSAgICAgICAgICAgIHNib01lIHw9IGN1cnJlbnRVc2VyLmdldEVtYWlsQWRkcmVzc2VzKCkuY29udGFpbnMoZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIXNib0F1dGhvciAmJiAhc2JvQ29tbWl0dGVyICYmICFzYm9NZSAmJiAhY3RsLmNhbkZvcmdlQ29tbWl0dGVyKCkpIHsKLSAgICAgICAgcmVqZWN0KGNtZCwgIm5vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpZExpc3QgPSBjLmdldEZvb3RlckxpbmVzKENIQU5HRV9JRCk7Ci0gICAgaWYgKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goY21kLmdldFJlZk5hbWUoKSkgfHwgTkVXX1BBVENIU0VULm1hdGNoZXIoY21kLmdldFJlZk5hbWUoKSkubWF0Y2hlcygpKSB7Ci0gICAgICBpZiAoaWRMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICBpZiAocHJvamVjdC5pc1JlcXVpcmVDaGFuZ2VJRCgpKSB7Ci0gICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJtaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZSI7Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgZXJyTXNnKTsKLSAgICAgICAgICBhZGRNZXNzYWdlKGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGVyck1zZywgYykpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChpZExpc3Quc2l6ZSgpID4gMSkgewotICAgICAgICByZWplY3QoY21kLCAibXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2ID0gaWRMaXN0LmdldChpZExpc3Quc2l6ZSgpIC0gMSkudHJpbSgpOwotICAgICAgICBpZiAoIXYubWF0Y2hlcygiXklbMC05YS1mXXs4LH0uKiQiKSkgewotICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJNc2cgPQotICAgICAgICAgICAgICAibWlzc2luZyBvciBpbnZhbGlkIENoYW5nZS1JZCBsaW5lIGZvcm1hdCBpbiBjb21taXQgbWVzc2FnZSI7Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgZXJyTXNnKTsKLSAgICAgICAgICBhZGRNZXNzYWdlKGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGVyck1zZywgYykpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciBiYW5uZWQgY29tbWl0cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBlbnRlcmluZyB0aGUgdHJlZSBhZ2Fpbi4KLSAgICBpZiAocmVqZWN0Q29tbWl0cy5jb250YWlucyhjKSkgewotICAgICAgcmVqZWN0KGNtZCwgImNvbnRhaW5zIGJhbm5lZCBjb21taXQgIiArIGMuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGlzIGlzIHRoZSBzcGVjaWFsIHByb2plY3QgY29uZmlndXJhdGlvbiBicmFuY2gsIHZhbGlkYXRlIHRoZSBjb25maWcuCi0gICAgaWYgKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcuZXF1YWxzKGN0bC5nZXRSZWZOYW1lKCkpKSB7Ci0gICAgICB0cnkgewotICAgICAgICBQcm9qZWN0Q29uZmlnIGNmZyA9IG5ldyBQcm9qZWN0Q29uZmlnKHByb2plY3QuZ2V0TmFtZUtleSgpKTsKLSAgICAgICAgY2ZnLmxvYWQocmVwbywgY21kLmdldE5ld0lkKCkpOwotICAgICAgICBpZiAoIWNmZy5nZXRWYWxpZGF0aW9uRXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgYWRkRXJyb3IoIkludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uOiIpOwotICAgICAgICAgIGZvciAoVmFsaWRhdGlvbkVycm9yIGVyciA6IGNmZy5nZXRWYWxpZGF0aW9uRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yKCIgICIgKyBlcnIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgImludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uIik7Ci0gICAgICAgICAgbG9nLmVycm9yKCJVc2VyICIgKyBjdXJyZW50VXNlci5nZXRVc2VyTmFtZSgpCi0gICAgICAgICAgICAgICsgIiB0cmllZCB0byBwdXNoIGludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uICIKLSAgICAgICAgICAgICAgKyBjbWQuZ2V0TmV3SWQoKS5uYW1lKCkgKyAiIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmVqZWN0KGNtZCwgImludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uIik7Ci0gICAgICAgIGxvZy5lcnJvcigiVXNlciAiICsgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKQotICAgICAgICAgICAgKyAiIHRyaWVkIHRvIHB1c2ggaW52YWxpZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gIgotICAgICAgICAgICAgKyBjbWQuZ2V0TmV3SWQoKS5uYW1lKCkgKyAiIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCksIGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCisgICAgdmFsaWRDb21taXRzLmFkZChjKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKFN0cmluZyBlcnJNc2csIFJldkNvbW1pdCBjKSB7Ci0gICAgLy8gV2UgaGFuZGxlIDMgY2FzZXM6Ci0gICAgLy8gMS4gTm8gY2hhbmdlIGlkIGluIHRoZSBjb21taXQgbWVzc2FnZSBhdCBhbGwuCi0gICAgLy8gMi4gY2hhbmdlIGlkIGxhc3QgaW4gdGhlIGNvbW1pdCBtZXNzYWdlIGJ1dCBtaXNzaW5nIGVtcHR5IGxpbmUgdG8gY3JlYXRlIHRoZSBmb290ZXIuCi0gICAgLy8gMy4gdGhlcmUgaXMgYSBjaGFuZ2UtaWQgc29tZXdoZXJlIGluIHRoZSBjb21taXQgbWVzc2FnZSwgYnV0IHdlIGlnbm9yZSBpdC4KLSAgICBmaW5hbCBTdHJpbmcgY2hhbmdlSWQgPSAiQ2hhbmdlLUlkOiI7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKCJFUlJPUjogIikuYXBwZW5kKGVyck1zZyk7Ci0gICAgc2IuYXBwZW5kKCJcbiIpOwotICAgIHNiLmFwcGVuZCgiU3VnZ2VzdGlvbiBmb3IgY29tbWl0IG1lc3NhZ2U6XG4iKTsKLQotICAgIGlmIChjLmdldEZ1bGxNZXNzYWdlKCkuaW5kZXhPZihjaGFuZ2VJZCk9PS0xKSB7Ci0gICAgICBzYi5hcHBlbmQoYy5nZXRGdWxsTWVzc2FnZSgpKTsKLSAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgIHNiLmFwcGVuZChjaGFuZ2VJZCkuYXBwZW5kKCIgSSIpLmFwcGVuZChjLm5hbWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFN0cmluZyBsaW5lc1tdID0gYy5nZXRGdWxsTWVzc2FnZSgpLnRyaW0oKS5zcGxpdCgiXG4iKTsKLSAgICAgIFN0cmluZyBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA+IDAgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA6ICIiOwotCi0gICAgICBpZiAobGFzdExpbmUuaW5kZXhPZihjaGFuZ2VJZCk9PTApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICBzYi5hcHBlbmQobGluZXNbaV0pOwotICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgc2IuYXBwZW5kKGxhc3RMaW5lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNiLmFwcGVuZChjLmdldEZ1bGxNZXNzYWdlKCkpOwotICAgICAgICBzYi5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHNiLmFwcGVuZChjaGFuZ2VJZCkuYXBwZW5kKCIgSSIpLmFwcGVuZChjLm5hbWUoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXG5IaW50OiBBIHBvdGVudGlhbCBDaGFuZ2UtSWQgd2FzIGZvdW5kLCBidXQgaXQgd2FzIG5vdCBpbiB0aGUgZm9vdGVyIG9mIHRoZSBjb21taXQgbWVzc2FnZS4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZW5kSW52YWxpZEVtYWlsRXJyb3IoUmV2Q29tbWl0IGMsIFN0cmluZyB0eXBlLCBQZXJzb25JZGVudCB3aG8pIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIlxuIik7Ci0gICAgc2IuYXBwZW5kKCJFUlJPUjogIEluIGNvbW1pdCAiICsgYy5uYW1lKCkgKyAiXG4iKTsKLSAgICBzYi5hcHBlbmQoIkVSUk9SOiAgIiArIHR5cGUgKyAiIGVtYWlsIGFkZHJlc3MgIiArIHdoby5nZXRFbWFpbEFkZHJlc3MoKSArICJcbiIpOwotICAgIHNiLmFwcGVuZCgiRVJST1I6ICBkb2VzIG5vdCBtYXRjaCB5b3VyIHVzZXIgYWNjb3VudC5cbiIpOwotICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKLSAgICBpZiAoY3VycmVudFVzZXIuZ2V0RW1haWxBZGRyZXNzZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBZb3UgaGF2ZSBub3QgcmVnaXN0ZXJlZCBhbnkgZW1haWwgYWRkcmVzc2VzLlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUaGUgZm9sbG93aW5nIGFkZHJlc3NlcyBhcmUgY3VycmVudGx5IHJlZ2lzdGVyZWQ6XG4iKTsKLSAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3MgOiBjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAgICIgKyBhZGRyZXNzICsgIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKLSAgICBpZiAoY2Fub25pY2FsV2ViVXJsICE9IG51bGwpIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUbyByZWdpc3RlciBhbiBlbWFpbCBhZGRyZXNzLCBwbGVhc2UgdmlzaXQ6XG4iKTsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAiICsgY2Fub25pY2FsV2ViVXJsICsgIiMiICsgUGFnZUxpbmtzLlNFVFRJTkdTX0NPTlRBQ1QgKyAiXG4iKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKCJcbiIpOwotICAgIGFkZE1lc3NhZ2Uoc2IudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd2Fybk1hbGZvcm1lZE1lc3NhZ2UoUmV2Q29tbWl0IGMpIHsKLSAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gcnAuZ2V0UmV2V2FsaygpLmdldE9iamVjdFJlYWRlcigpOwotICAgIGlmICg2NSA8IGMuZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLSAgICAgIEFiYnJldmlhdGVkT2JqZWN0SWQgaWQ7Ci0gICAgICB0cnkgewotICAgICAgICBpZCA9IHJlYWRlci5hYmJyZXZpYXRlKGMpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgIGlkID0gYy5hYmJyZXZpYXRlKDYpOwotICAgICAgfQotICAgICAgYWRkTWVzc2FnZSgiKFcpICIgKyBpZC5uYW1lKCkgLy8KLSAgICAgICAgICArICI6IGNvbW1pdCBzdWJqZWN0ID42NSBjaGFyYWN0ZXJzOyB1c2Ugc2hvcnRlciBmaXJzdCBwYXJhZ3JhcGgiKTsKLSAgICB9Ci0KLSAgICBpbnQgbG9uZ0xpbmVDbnQgPSAwLCBub25FbXB0eUNudCA9IDA7Ci0gICAgZm9yIChTdHJpbmcgbGluZSA6IGMuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKSkgewotICAgICAgaWYgKCFsaW5lLnRyaW0oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgbm9uRW1wdHlDbnQrKzsKLSAgICAgIH0KLSAgICAgIGlmICg3MCA8IGxpbmUubGVuZ3RoKCkpIHsKLSAgICAgICAgbG9uZ0xpbmVDbnQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoMCA8IGxvbmdMaW5lQ250ICYmIDMzIDwgbG9uZ0xpbmVDbnQgKiAxMDAgLyBub25FbXB0eUNudCkgewotICAgICAgQWJicmV2aWF0ZWRPYmplY3RJZCBpZDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlkID0gcmVhZGVyLmFiYnJldmlhdGUoYyk7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgaWQgPSBjLmFiYnJldmlhdGUoNik7Ci0gICAgICB9Ci0gICAgICBhZGRNZXNzYWdlKCIoVykgIiArIGlkLm5hbWUoKSAvLwotICAgICAgICAgICsgIjogY29tbWl0IG1lc3NhZ2UgbGluZXMgPjcwIGNoYXJhY3RlcnM7IG1hbnVhbGx5IHdyYXAgbGluZXMiKTsKLSAgICB9Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgYXV0b0Nsb3NlQ2hhbmdlcyhmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQpIHsKICAgICBmaW5hbCBSZXZXYWxrIHJ3ID0gcnAuZ2V0UmV2V2FsaygpOwogICAgIHRyeSB7CkBAIC0yMDkxLDcgKzIwMzQsOSBAQAogICAgICAgfQogCiAgICAgICBmb3IgKGZpbmFsIFJlcGxhY2VSZXF1ZXN0IHJlcSA6IHRvQ2xvc2UpIHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNpID0gcmVxLnZhbGlkYXRlKHRydWUpID8gcmVxLmluc2VydFBhdGNoU2V0KCkgOiBudWxsOworICAgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc2kgPSByZXEudmFsaWRhdGUodHJ1ZSkKKyAgICAgICAgICAgID8gcmVxLmluc2VydFBhdGNoU2V0KCkuY2hlY2tlZEdldCgpCisgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgIGlmIChwc2kgIT0gbnVsbCkgewogICAgICAgICAgIGNsb3NlQ2hhbmdlKHJlcS5pbnB1dENvbW1hbmQsIHBzaSwgcmVxLm5ld0NvbW1pdCk7CiAgICAgICAgICAgY2xvc2VQcm9ncmVzcy51cGRhdGUoMSk7CkBAIC0yMTMxLDEwICsyMDc2LDEwIEBACiAgICAgfQogCiAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk1FUkdFRCB8fAotICAgICAgICBjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5BQkFORE9ORUQpIHsKLSAgICAgIC8vIElmIGl0cyBhbHJlYWR5IG1lcmdlZCwgZG9uJ3QgbWFrZSBmdXJ0aGVyIHVwZGF0ZXMsIGl0Ci0gICAgICAvLyBtaWdodCBqdXN0IGJlIG1vdmluZyBmcm9tIGFuIGV4cGVyaW1lbnRhbCBicmFuY2ggaW50bwotICAgICAgLy8gYSBtb3JlIHN0YWJsZSBicmFuY2guCisgICAgICAgIGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkFCQU5ET05FRCB8fAorICAgICAgICAhY2hhbmdlLmdldERlc3QoKS5nZXQoKS5lcXVhbHMocmVmTmFtZSkpIHsKKyAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBtZXJnZWQgb3IgdGhlIGNvbW1pdCBpcyBub3QgYWltZWQgZm9yCisgICAgICAvLyB0aGlzIGNoYW5nZSdzIGRlc3RpbmF0aW9uLCBkb24ndCBtYWtlIGZ1cnRoZXIgdXBkYXRlcy4KICAgICAgIC8vCiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yMjIxLDcgKzIxNjYsNyBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgZmluYWwgTWVyZ2VkU2VuZGVyIGNtID0gbWVyZ2VkU2VuZGVyRmFjdG9yeS5jcmVhdGUocmVzdWx0LmNoYW5nZSk7CisgICAgICAgICAgZmluYWwgTWVyZ2VkU2VuZGVyIGNtID0gbWVyZ2VkU2VuZGVyRmFjdG9yeS5jcmVhdGUocmVzdWx0LmNoYW5nZUN0bCk7CiAgICAgICAgICAgY20uc2V0RnJvbShjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CiAgICAgICAgICAgY20uc2V0UGF0Y2hTZXQocmVzdWx0Lm5ld1BhdGNoU2V0LCByZXN1bHQuaW5mbyk7CiAgICAgICAgICAgY20uc2VuZCgpOwpAQCAtMjIzOCwyMCArMjE4Myw2IEBACiAgICAgfSkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluc2VydEFuY2VzdG9ycyhQYXRjaFNldC5JZCBpZCwgUmV2Q29tbWl0IHNyYykKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBjbnQgPSBzcmMuZ2V0UGFyZW50Q291bnQoKTsKLSAgICBMaXN0PFBhdGNoU2V0QW5jZXN0b3I+IHRvSW5zZXJ0ID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFuY2VzdG9yPihjbnQpOwotICAgIGZvciAoaW50IHAgPSAwOyBwIDwgY250OyBwKyspIHsKLSAgICAgIFBhdGNoU2V0QW5jZXN0b3IgYTsKLQotICAgICAgYSA9IG5ldyBQYXRjaFNldEFuY2VzdG9yKG5ldyBQYXRjaFNldEFuY2VzdG9yLklkKGlkLCBwICsgMSkpOwotICAgICAgYS5zZXRBbmNlc3RvclJldmlzaW9uKHRvUmV2SWQoc3JjLmdldFBhcmVudChwKSkpOwotICAgICAgdG9JbnNlcnQuYWRkKGEpOwotICAgIH0KLSAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmluc2VydCh0b0luc2VydCk7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyBSZXZJZCB0b1JldklkKGZpbmFsIFJldkNvbW1pdCBzcmMpIHsKICAgICByZXR1cm4gbmV3IFJldklkKHNyYy5nZXRJZCgpLm5hbWUoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzQWR2ZXJ0aXNlUmVmc0hvb2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzQWR2ZXJ0aXNlUmVmc0hvb2suamF2YQppbmRleCBlYzhjMDgwLi4wZWI5YjYxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0c0FkdmVydGlzZVJlZnNIb29rLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNBZHZlcnRpc2VSZWZzSG9vay5qYXZhCkBAIC0xNCwxMiArMTQsMTQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLk1hZ2ljQnJhbmNoOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkFkdmVydGlzZVJlZnNIb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VSZWNlaXZlUGFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIEV4cG9zZXMgb25seSB0aGUgbm9uIHJlZnMvY2hhbmdlcy8gcmVmZXJlbmNlIG5hbWVzLiAqLwpAQCAtMzYsMTIgKzM4LDE5IEBACiAgICAgaWYgKG9sZFJlZnMgPT0gbnVsbCkgewogICAgICAgb2xkUmVmcyA9IHJwLmdldFJlcG9zaXRvcnkoKS5nZXRBbGxSZWZzKCk7CiAgICAgfQotICAgIEhhc2hNYXA8U3RyaW5nLCBSZWY+IHIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlZj4oKTsKKyAgICBNYXA8U3RyaW5nLCBSZWY+IHIgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKG9sZFJlZnMuc2l6ZSgpKTsKICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFJlZj4gZSA6IG9sZFJlZnMuZW50cnlTZXQoKSkgewotICAgICAgaWYgKCFlLmdldEtleSgpLnN0YXJ0c1dpdGgoInJlZnMvY2hhbmdlcy8iKSkgewotICAgICAgICByLnB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgU3RyaW5nIG5hbWUgPSBlLmdldEtleSgpOworICAgICAgaWYgKCFza2lwKG5hbWUpKSB7CisgICAgICAgIHIucHV0KG5hbWUsIGUuZ2V0VmFsdWUoKSk7CiAgICAgICB9CiAgICAgfQogICAgIHJwLnNldEFkdmVydGlzZWRSZWZzKHIsIHJwLmdldEFkdmVydGlzZWRPYmplY3RzKCkpOwogICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBza2lwKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpCisgICAgICAgIHx8IG5hbWUuc3RhcnRzV2l0aChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZTX0NBQ0hFX0FVVE9NRVJHRSkKKyAgICAgICAgfHwgTWFnaWNCcmFuY2guaXNNYWdpY0JyYW5jaChuYW1lKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZS5qYXZhCmluZGV4IDA2M2RiMmQuLjFjYmQyMjcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzRXhlY3V0b3JNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0c0V4ZWN1dG9yTW9kdWxlLmphdmEKQEAgLTE0LDE1ICsxNCwyMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Nb3JlRXhlY3V0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZS5FeGVjdXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCiAvKiogTW9kdWxlIHByb3ZpZGluZyB0aGUge0BsaW5rIFJlY2VpdmVDb21taXRzRXhlY3V0b3J9LiAqLwogcHVibGljIGNsYXNzIFJlY2VpdmVDb21taXRzRXhlY3V0b3JNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CiAgIEBPdmVycmlkZQpAQCAtMzIsMTAgKzM3LDMxIEBACiAgIEBQcm92aWRlcwogICBAU2luZ2xldG9uCiAgIEBSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yCi0gIHB1YmxpYyBFeGVjdXRvciBnZXRSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNvbmZpZywKKyAgcHVibGljIFdvcmtRdWV1ZS5FeGVjdXRvciBjcmVhdGVSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yKAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnLAogICAgICAgV29ya1F1ZXVlIHF1ZXVlcykgewogICAgIGludCBwb29sU2l6ZSA9IGNvbmZpZy5nZXRJbnQoInJlY2VpdmUiLCBudWxsLCAidGhyZWFkUG9vbFNpemUiLAogICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkpOwogICAgIHJldHVybiBxdWV1ZXMuY3JlYXRlUXVldWUocG9vbFNpemUsICJSZWNlaXZlQ29tbWl0cyIpOwogICB9CisKKyAgQFByb3ZpZGVzCisgIEBTaW5nbGV0b24KKyAgQENoYW5nZVVwZGF0ZUV4ZWN1dG9yCisgIHB1YmxpYyBMaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2UgY3JlYXRlQ2hhbmdlVXBkYXRlRXhlY3V0b3IoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnKSB7CisgICAgaW50IHBvb2xTaXplID0gY29uZmlnLmdldEludCgicmVjZWl2ZSIsIG51bGwsICJjaGFuZ2VVcGRhdGVUaHJlYWRzIiwgMSk7CisgICAgaWYgKHBvb2xTaXplIDw9IDEpIHsKKyAgICAgIHJldHVybiBNb3JlRXhlY3V0b3JzLnNhbWVUaHJlYWRFeGVjdXRvcigpOworICAgIH0KKyAgICByZXR1cm4gTW9yZUV4ZWN1dG9ycy5saXN0ZW5pbmdEZWNvcmF0b3IoCisgICAgICAgIE1vcmVFeGVjdXRvcnMuZ2V0RXhpdGluZ0V4ZWN1dG9yU2VydmljZSgKKyAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIHBvb2xTaXplLAorICAgICAgICAgICAgICAxMCwgVGltZVVuaXQuTUlOVVRFUywKKyAgICAgICAgICAgICAgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4ocG9vbFNpemUpLAorICAgICAgICAgICAgICBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJDaGFuZ2VVcGRhdGUtJWQiKQorICAgICAgICAgICAgICAgIC5zZXREYWVtb24odHJ1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvci5DYWxsZXJSdW5zUG9saWN5KCkpKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb25maWcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWEzZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworQFNpbmdsZXRvbgorY2xhc3MgUmVjZWl2ZUNvbmZpZyB7CisgIGZpbmFsIGJvb2xlYW4gY2hlY2tNYWdpY1JlZnM7CisgIGZpbmFsIGJvb2xlYW4gY2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZTsKKworICBASW5qZWN0CisgIFJlY2VpdmVDb25maWcoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnKSB7CisgICAgY2hlY2tNYWdpY1JlZnMgPSBjb25maWcuZ2V0Qm9vbGVhbigKKyAgICAgICAgInJlY2VpdmUiLCBudWxsLCAiY2hlY2tNYWdpY1JlZnMiLAorICAgICAgICB0cnVlKTsKKyAgICBjaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlID0gY29uZmlnLmdldEJvb2xlYW4oCisgICAgICAgICJyZWNlaXZlIiwgbnVsbCwgImNoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUiLAorICAgICAgICB0cnVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlci5qYXZhCmluZGV4IDdiNjY5YjIuLjcxZGJmODcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Jldmlld05vdGVIZWFkZXJGb3JtYXR0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZXZpZXdOb3RlSGVhZGVyRm9ybWF0dGVyLmphdmEKQEAgLTE0LDggKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIApAQCAtNTEsOSArNTEsOCBAQAogICAgIHNiLmFwcGVuZCgiQ2hhbmdlLUlkOiAiKS5hcHBlbmQoY2hhbmdlS2V5LmdldCgpKS5hcHBlbmQoIlxuIik7CiAgIH0KIAotICB2b2lkIGFwcGVuZEFwcHJvdmFsKEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnksCi0gICAgICBzaG9ydCB2YWx1ZSwgQWNjb3VudCB1c2VyKSB7Ci0gICAgc2IuYXBwZW5kKGNhdGVnb3J5LmdldExhYmVsTmFtZSgpKTsKKyAgdm9pZCBhcHBlbmRBcHByb3ZhbChMYWJlbFR5cGUgdHlwZSwgc2hvcnQgdmFsdWUsIEFjY291bnQgdXNlcikgeworICAgIHNiLmFwcGVuZCh0eXBlLmdldE5hbWUoKSk7CiAgICAgc2IuYXBwZW5kKHZhbHVlIDwgMCA/ICItIiA6ICIrIikuYXBwZW5kKE1hdGguYWJzKHZhbHVlKSkuYXBwZW5kKCI6ICIpOwogICAgIGFwcGVuZFVzZXJEYXRhKHVzZXIpOwogICAgIHNiLmFwcGVuZCgiXG4iKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1pdFN0cmF0ZWd5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZGbGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRoYXQgc3VibWl0IHN0cmF0ZWdpZXMgbXVzdCBleHRlbmQuIEEgc3VibWl0IHN0cmF0ZWd5IGZvciBhCisgKiBjZXJ0YWluIHtAbGluayBTdWJtaXRUeXBlfSBkZWZpbmVzIGhvdyB0aGUgc3VibWl0dGVkIGNvbW1pdHMgc2hvdWxkIGJlCisgKiBtZXJnZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJtaXRTdHJhdGVneSB7CisKKyAgcHJpdmF0ZSBQZXJzb25JZGVudCByZWZMb2dJZGVudDsKKworICBzdGF0aWMgY2xhc3MgQXJndW1lbnRzIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICAgIHByb3RlY3RlZCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50OworICAgIHByb3RlY3RlZCBmaW5hbCBSZXZpZXdEYiBkYjsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisgICAgcHJvdGVjdGVkIGZpbmFsIFJldldhbGsgcnc7CisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyOworICAgIHByb3RlY3RlZCBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkOworICAgIHByb3RlY3RlZCBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoOworICAgIHByb3RlY3RlZCBmaW5hbCBNZXJnZVV0aWwgbWVyZ2VVdGlsOworICAgIHByb3RlY3RlZCBmaW5hbCBNZXJnZVNvcnRlciBtZXJnZVNvcnRlcjsKKworICAgIEFyZ3VtZW50cyhmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCisgICAgICAgIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICAgIGZpbmFsIFJldldhbGsgcncsIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLAorICAgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkLAorICAgICAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoLCBmaW5hbCBNZXJnZVV0aWwgbWVyZ2VVdGlsKSB7CisgICAgICB0aGlzLmlkZW50aWZpZWRVc2VyRmFjdG9yeSA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKKyAgICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CisgICAgICB0aGlzLmRiID0gZGI7CisKKyAgICAgIHRoaXMucmVwbyA9IHJlcG87CisgICAgICB0aGlzLnJ3ID0gcnc7CisgICAgICB0aGlzLmluc2VydGVyID0gaW5zZXJ0ZXI7CisgICAgICB0aGlzLmNhbk1lcmdlRmxhZyA9IGNhbk1lcmdlRmxhZzsKKyAgICAgIHRoaXMuYWxyZWFkeUFjY2VwdGVkID0gYWxyZWFkeUFjY2VwdGVkOworICAgICAgdGhpcy5kZXN0QnJhbmNoID0gZGVzdEJyYW5jaDsKKyAgICAgIHRoaXMubWVyZ2VVdGlsID0gbWVyZ2VVdGlsOworICAgICAgdGhpcy5tZXJnZVNvcnRlciA9IG5ldyBNZXJnZVNvcnRlcihydywgYWxyZWFkeUFjY2VwdGVkLCBjYW5NZXJnZUZsYWcpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBmaW5hbCBBcmd1bWVudHMgYXJnczsKKworICBTdWJtaXRTdHJhdGVneShmaW5hbCBBcmd1bWVudHMgYXJncykgeworICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgIH0KKworICAvKioKKyAgICogUnVucyB0aGlzIHN1Ym1pdCBzdHJhdGVneS4gSWYgcG9zc2libGUgdGhlIHByb3ZpZGVkIGNvbW1pdHMgd2lsbCBiZSBtZXJnZWQKKyAgICogd2l0aCB0aGlzIHN1Ym1pdCBzdHJhdGVneS4KKyAgICoKKyAgICogQHBhcmFtIG1lcmdlVGlwIHRoZSBtZXJnZVRpcAorICAgKiBAcGFyYW0gdG9NZXJnZSB0aGUgbGlzdCBvZiBzdWJtaXR0ZWQgY29tbWl0cyB0aGF0IHNob3VsZCBiZSBtZXJnZWQgdXNpbmcKKyAgICogICAgICAgIHRoaXMgc3VibWl0IHN0cmF0ZWd5CisgICAqIEByZXR1cm4gdGhlIG5ldyBtZXJnZVRpcAorICAgKiBAdGhyb3dzIE1lcmdlRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgZmluYWwgQ29kZVJldmlld0NvbW1pdCBydW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICByZWZMb2dJZGVudCA9IG51bGw7CisgICAgcmV0dXJuIF9ydW4obWVyZ2VUaXAsIHRvTWVyZ2UpOworICB9CisKKyAgLyoqCisgICAqIFJ1bnMgdGhpcyBzdWJtaXQgc3RyYXRlZ3kuIElmIHBvc3NpYmxlIHRoZSBwcm92aWRlZCBjb21taXRzIHdpbGwgYmUgbWVyZ2VkCisgICAqIHdpdGggdGhpcyBzdWJtaXQgc3RyYXRlZ3kuCisgICAqCisgICAqIEBwYXJhbSBtZXJnZVRpcCB0aGUgbWVyZ2VUaXAKKyAgICogQHBhcmFtIHRvTWVyZ2UgdGhlIGxpc3Qgb2Ygc3VibWl0dGVkIGNvbW1pdHMgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHVzaW5nCisgICAqICAgICAgICB0aGlzIHN1Ym1pdCBzdHJhdGVneQorICAgKiBAcmV0dXJuIHRoZSBuZXcgbWVyZ2VUaXAKKyAgICogQHRocm93cyBNZXJnZUV4Y2VwdGlvbgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IENvZGVSZXZpZXdDb21taXQgX3J1bihDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb247CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBjb21taXQgY2FuIGJlIG1lcmdlZC4KKyAgICoKKyAgICogU3ViY2xhc3NlcyBtdXN0IGVuc3VyZSB0aGF0IGludm9raW5nIHRoaXMgbWV0aG9kIGRvZXMgbmVpdGhlciBtb2RpZnkgdGhlCisgICAqIGdpdCByZXBvc2l0b3J5IG5vciB0aGUgR2Vycml0IGRhdGFiYXNlLgorICAgKgorICAgKiBAcGFyYW0gbWVyZ2VUaXAgdGhlIG1lcmdlVGlwCisgICAqIEBwYXJhbSB0b01lcmdlIHRoZSBjb21taXQgZm9yIHdoaWNoIGl0IHNob3VsZCBiZSBjaGVja2VkIHdoZXRoZXIgaXQgY2FuIGJlCisgICAqICAgICAgICBtZXJnZWQgb3Igbm90CisgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGNvbW1pdCBjYW4gYmUgbWVyZ2VkLCBvdGhlcndpc2UKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICogQHRocm93cyBNZXJnZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJ5UnVuKENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgUGVyc29uSWRlbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJlZiBsb2cgZW50cmllcyB3aGVuCisgICAqIHVwZGF0aW5nIHRoZSBkZXN0aW5hdGlvbiBicmFuY2guIFRoZSByZWYgbG9nIGlkZW50aXR5IG1heSBiZSBzZXQgYWZ0ZXIgdGhlCisgICAqIHtAbGluayAjcnVuKENvZGVSZXZpZXdDb21taXQsIExpc3QpfSBtZXRob2QgZmluaXNoZWQuCisgICAqCisgICAqIERvIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciB0aGUge0BsaW5rICNydW4oQ29kZVJldmlld0NvbW1pdCwgTGlzdCl9CisgICAqIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSByZWYgbG9nIGlkZW50aXR5LCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBQZXJzb25JZGVudCBnZXRSZWZMb2dJZGVudCgpIHsKKyAgICByZXR1cm4gcmVmTG9nSWRlbnQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhbGwgY29tbWl0cyB0aGF0IGhhdmUgYmVlbiBuZXdseSBjcmVhdGVkIGZvciB0aGUgY2hhbmdlcyB0aGF0IGFyZQorICAgKiBnZXR0aW5nIG1lcmdlZC4KKyAgICoKKyAgICogQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbWFwLCBidXQgc3ViY2xhc3NlcyBtYXkKKyAgICogb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorICAgKgorICAgKiBEbyBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIHtAbGluayAjcnVuKENvZGVSZXZpZXdDb21taXQsIExpc3QpfQorICAgKiBtZXRob2QgaGFzIGJlZW4gaW52b2tlZC4KKyAgICoKKyAgICogQHJldHVybiBuZXcgY29tbWl0cyBjcmVhdGVkIGZvciBjaGFuZ2VzIHRoYXQgYXJlIGdldHRpbmcgbWVyZ2VkCisgICAqLworICBwdWJsaWMgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gZ2V0TmV3Q29tbWl0cygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBtZXJnZSB0aGF0IGZhaWxlZCB3aXRoCisgICAqIHtAbGluayBSZWZVcGRhdGUuUmVzdWx0I0xPQ0tfRkFJTFVSRX0gc2hvdWxkIGJlIHJldHJpZWQuCisgICAqCisgICAqIE1heSBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzLgorICAgKgorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWVyZ2UgdGhhdCBmYWlsZWQgd2l0aAorICAgKiAgICAgICAgIHtAbGluayBSZWZVcGRhdGUuUmVzdWx0I0xPQ0tfRkFJTFVSRX0gc2hvdWxkIGJlIHJldHJpZWQsIG90aGVyd2lzZQorICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gcmV0cnlPbkxvY2tGYWlsdXJlKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHJlZiBsb2cgaWRlbnRpdHkgaWYgaXQgd2Fzbid0IHNldCB5ZXQuCisgICAqCisgICAqIEBwYXJhbSBzdWJtaXRBcHByb3ZhbCB0aGUgYXBwcm92YWwgdGhhdCBzdWJtaXR0ZWQgdGhlIHBhdGNoIHNldAorICAgKi8KKyAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBcHByb3ZhbCkgeworICAgIGlmIChyZWZMb2dJZGVudCA9PSBudWxsICYmIHN1Ym1pdEFwcHJvdmFsICE9IG51bGwpIHsKKyAgICAgIHJlZkxvZ0lkZW50ID0KKyAgICAgICAgICBhcmdzLmlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoc3VibWl0QXBwcm92YWwuZ2V0QWNjb3VudElkKCkpCisgICAgICAgICAgICAgIC5uZXdSZWZMb2dJZGVudCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibWl0U3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY4MzFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibWl0U3RyYXRlZ3lGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUmViYXNlQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkZsYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCisvKiogRmFjdG9yeSB0byBjcmVhdGUgYSB7QGxpbmsgU3VibWl0U3RyYXRlZ3l9IGZvciBhIHtAbGluayBTdWJtaXRUeXBlfS4gKi8KK3B1YmxpYyBjbGFzcyBTdWJtaXRTdHJhdGVneUZhY3RvcnkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihTdWJtaXRTdHJhdGVneUZhY3RvcnkuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBSZWJhc2VDaGFuZ2UgcmViYXNlQ2hhbmdlOworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgTWVyZ2VVdGlsLkZhY3RvcnkgbWVyZ2VVdGlsRmFjdG9yeTsKKworICBASW5qZWN0CisgIFN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSgKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgZmluYWwgUmViYXNlQ2hhbmdlIHJlYmFzZUNoYW5nZSwKKyAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCisgICAgICBmaW5hbCBNZXJnZVV0aWwuRmFjdG9yeSBtZXJnZVV0aWxGYWN0b3J5KSB7CisgICAgdGhpcy5pZGVudGlmaWVkVXNlckZhY3RvcnkgPSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CisgICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5yZWJhc2VDaGFuZ2UgPSByZWJhc2VDaGFuZ2U7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CisgICAgdGhpcy5tZXJnZVV0aWxGYWN0b3J5ID0gbWVyZ2VVdGlsRmFjdG9yeTsKKyAgfQorCisgIHB1YmxpYyBTdWJtaXRTdHJhdGVneSBjcmVhdGUoZmluYWwgU3VibWl0VHlwZSBzdWJtaXRUeXBlLCBmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgUmV2V2FsayBydywgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkLAorICAgICAgZmluYWwgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaCkKKyAgICAgIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdFN0YXRlIHByb2plY3QgPSBnZXRQcm9qZWN0KGRlc3RCcmFuY2gpOworICAgIGZpbmFsIFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyBhcmdzID0KKyAgICAgICAgbmV3IFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyhpZGVudGlmaWVkVXNlckZhY3RvcnksIG15SWRlbnQsIGRiLCByZXBvLAorICAgICAgICAgICAgcncsIGluc2VydGVyLCBjYW5NZXJnZUZsYWcsIGFscmVhZHlBY2NlcHRlZCwgZGVzdEJyYW5jaCwKKyAgICAgICAgICAgIG1lcmdlVXRpbEZhY3RvcnkuY3JlYXRlKHByb2plY3QpKTsKKyAgICBzd2l0Y2ggKHN1Ym1pdFR5cGUpIHsKKyAgICAgIGNhc2UgQ0hFUlJZX1BJQ0s6CisgICAgICAgIHJldHVybiBuZXcgQ2hlcnJ5UGljayhhcmdzLCBwYXRjaFNldEluZm9GYWN0b3J5LCBnaXRSZWZVcGRhdGVkKTsKKyAgICAgIGNhc2UgRkFTVF9GT1JXQVJEX09OTFk6CisgICAgICAgIHJldHVybiBuZXcgRmFzdEZvcndhcmRPbmx5KGFyZ3MpOworICAgICAgY2FzZSBNRVJHRV9BTFdBWVM6CisgICAgICAgIHJldHVybiBuZXcgTWVyZ2VBbHdheXMoYXJncyk7CisgICAgICBjYXNlIE1FUkdFX0lGX05FQ0VTU0FSWToKKyAgICAgICAgcmV0dXJuIG5ldyBNZXJnZUlmTmVjZXNzYXJ5KGFyZ3MpOworICAgICAgY2FzZSBSRUJBU0VfSUZfTkVDRVNTQVJZOgorICAgICAgICByZXR1cm4gbmV3IFJlYmFzZUlmTmVjZXNzYXJ5KGFyZ3MsIHJlYmFzZUNoYW5nZSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JNc2cgPSAiTm8gc3VibWl0IHN0cmF0ZWd5IGZvcjogIiArIHN1Ym1pdFR5cGU7CisgICAgICAgIGxvZy5lcnJvcihlcnJvck1zZyk7CisgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbihlcnJvck1zZyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBQcm9qZWN0U3RhdGUgZ2V0UHJvamVjdChCcmFuY2guTmFtZUtleSBicmFuY2gpCisgICAgICB0aHJvd3MgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgZmluYWwgUHJvamVjdFN0YXRlIHAgPSBwcm9qZWN0Q2FjaGUuZ2V0KGJyYW5jaC5nZXRQYXJlbnRLZXkoKSk7CisgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaFByb2plY3RFeGNlcHRpb24oYnJhbmNoLmdldFBhcmVudEtleSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtb2R1bGVPcC5qYXZhCmluZGV4IGNjYjkxYTMuLmVlYWI4ZjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibW9kdWxlT3AuamF2YQpAQCAtODUsNyArODUsNyBAQAogICBwcml2YXRlIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IGNvbW1pdHM7CiAgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFNldDxCcmFuY2guTmFtZUtleT4gdXBkYXRlZFN1YnNjcmliZXJzOwogCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICBAQXNzaXN0ZWQgUHJvamVjdCBkZXN0UHJvamVjdCwgQEFzc2lzdGVkIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gY29tbWl0cywKICAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAotICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24pIHsKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQpIHsKICAgICB0aGlzLmRlc3RCcmFuY2ggPSBkZXN0QnJhbmNoOwogICAgIHRoaXMubWVyZ2VUaXAgPSBtZXJnZVRpcDsKICAgICB0aGlzLnJ3ID0gcnc7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICB0aGlzLmNvbW1pdHMgPSBjb21taXRzOwogICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwotICAgIHRoaXMucmVwbGljYXRpb24gPSByZXBsaWNhdGlvbjsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOwogCiAgICAgdXBkYXRlZFN1YnNjcmliZXJzID0gbmV3IEhhc2hTZXQ8QnJhbmNoLk5hbWVLZXk+KCk7CiAgIH0KQEAgLTIxNyw3ICsyMTcsOCBAQAogICAgICAgICAgIGZvciAoZmluYWwgQ2hhbmdlIGNoZyA6IHN1Ym1pdHRlZCkgewogICAgICAgICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjID0gY29tbWl0cy5nZXQoY2hnLmdldElkKCkpOwogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIChjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0UgfHwgYy5zdGF0dXNDb2RlID09IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX1BJQ0spKSB7CisgICAgICAgICAgICAgICAgJiYgKGMuc3RhdHVzQ29kZSA9PSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRQorICAgICAgICAgICAgICAgICAgICB8fCBjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fUElDSyB8fCBjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fUkVCQVNFKSkgewogICAgICAgICAgICAgICBtc2didWYgKz0gIlxuIjsKICAgICAgICAgICAgICAgbXNnYnVmICs9IGMuZ2V0RnVsbE1lc3NhZ2UoKTsKICAgICAgICAgICAgIH0KQEAgLTMzNiw3ICszMzcsNyBAQAogICAgICAgc3dpdGNoIChyZnUudXBkYXRlKCkpIHsKICAgICAgICAgY2FzZSBORVc6CiAgICAgICAgIGNhc2UgRkFTVF9GT1JXQVJEOgotICAgICAgICAgIHJlcGxpY2F0aW9uLmZpcmUoc3Vic2NyaWJlci5nZXRQYXJlbnRLZXkoKSwgcmZ1LmdldE5hbWUoKSk7CisgICAgICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHN1YnNjcmliZXIuZ2V0UGFyZW50S2V5KCksIHJmdSk7CiAgICAgICAgICAgLy8gVE9ETyBzaW5jZSB0aGlzIGlzIHBlcmZvcm1lZCAiaW4gdGhlIGJhY2tncm91bmQiIG5vIG1haWwgd2lsbCBiZQogICAgICAgICAgIC8vIHNlbnQgdG8gaW5mb3JtIHVzZXJzIGFib3V0IHRoZSB1cGRhdGVkIGJyYW5jaAogICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmVyc2lvbmVkTWV0YURhdGEuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1ZlcnNpb25lZE1ldGFEYXRhLmphdmEKaW5kZXggZTljNTUzNi4uN2MzYzBjNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmVyc2lvbmVkTWV0YURhdGEuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9WZXJzaW9uZWRNZXRhRGF0YS5qYXZhCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgc3dpdGNoIChyZXN1bHQpIHsKICAgICAgICAgICBjYXNlIE5FVzoKICAgICAgICAgICAgIHJldmlzaW9uID0gcncucGFyc2VDb21taXQocnUuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0gICAgICAgICAgICB1cGRhdGUucmVwbGljYXRlKHJ1LmdldE5hbWUoKSk7CisgICAgICAgICAgICB1cGRhdGUuZmlyZUdpdFJlZlVwZGF0ZWRFdmVudChydSk7CiAgICAgICAgICAgICByZXR1cm4gcmV2aXNpb247CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHVwZGF0ZSAiICsgcnUuZ2V0TmFtZSgpICsgIiBpbiAiCkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICAgICAgICBjYXNlIE5FVzoKICAgICAgICAgICBjYXNlIEZBU1RfRk9SV0FSRDoKICAgICAgICAgICAgIHJldmlzaW9uID0gcncucGFyc2VDb21taXQocnUuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0gICAgICAgICAgICB1cGRhdGUucmVwbGljYXRlKHJ1LmdldE5hbWUoKSk7CisgICAgICAgICAgICB1cGRhdGUuZmlyZUdpdFJlZlVwZGF0ZWRFdmVudChydSk7CiAgICAgICAgICAgICByZXR1cm4gcmV2aXNpb247CiAKICAgICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmlzaWJsZVJlZkZpbHRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmlzaWJsZVJlZkZpbHRlci5qYXZhCmluZGV4IDhkMjdjMGUuLjVjZDBkZWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Zpc2libGVSZWZGaWx0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9WaXNpYmxlUmVmRmlsdGVyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKQEAgLTQ0LDE2ICs0MywxOSBAQAogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVmlzaWJsZVJlZkZpbHRlci5jbGFzcyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IGRiOwogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q3RsOwogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIHJldmlld0RiOwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvd0NoYW5nZXM7CiAKLSAgcHVibGljIFZpc2libGVSZWZGaWx0ZXIoZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGUsIGZpbmFsIFJlcG9zaXRvcnkgZGIsCisgIHB1YmxpYyBWaXNpYmxlUmVmRmlsdGVyKGZpbmFsIFRhZ0NhY2hlIHRhZ0NhY2hlLCBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZSwKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnkgZGIsCiAgICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCwgZmluYWwgUmV2aWV3RGIgcmV2aWV3RGIsCiAgICAgICBmaW5hbCBib29sZWFuIHNob3dDaGFuZ2VzKSB7CiAgICAgdGhpcy50YWdDYWNoZSA9IHRhZ0NhY2hlOworICAgIHRoaXMuY2hhbmdlQ2FjaGUgPSBjaGFuZ2VDYWNoZTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3RDb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CiAgICAgdGhpcy5wcm9qZWN0Q3RsID0gcHJvamVjdENvbnRyb2w7CkBAIC03OSw3ICs4MSw3IEBACiAgICAgICB9IGVsc2UgaWYgKFBhdGNoU2V0LmlzUmVmKHJlZi5nZXROYW1lKCkpKSB7CiAgICAgICAgIC8vIFJlZmVyZW5jZSB0byBhIHBhdGNoIHNldCBpcyB2aXNpYmxlIGlmIHRoZSBjaGFuZ2UgaXMgdmlzaWJsZS4KICAgICAgICAgLy8KLSAgICAgICAgaWYgKHZpc2libGVDaGFuZ2VzLmNvbnRhaW5zKENoYW5nZS5JZC5mcm9tUmVmKHJlZi5nZXROYW1lKCkpKSkgeworICAgICAgICBpZiAoc2hvd0NoYW5nZXMgJiYgdmlzaWJsZUNoYW5nZXMuY29udGFpbnMoQ2hhbmdlLklkLmZyb21SZWYocmVmLmdldE5hbWUoKSkpKSB7CiAgICAgICAgICAgcmVzdWx0LnB1dChyZWYuZ2V0TmFtZSgpLCByZWYpOwogICAgICAgICB9CiAKQEAgLTEzNSw3ICsxMzcsNyBAQAogICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCA9IHByb2plY3RDdGwuZ2V0UHJvamVjdCgpOwogICAgIHRyeSB7CiAgICAgICBmaW5hbCBTZXQ8Q2hhbmdlLklkPiB2aXNpYmxlQ2hhbmdlcyA9IG5ldyBIYXNoU2V0PENoYW5nZS5JZD4oKTsKLSAgICAgIGZvciAoQ2hhbmdlIGNoYW5nZSA6IHJldmlld0RiLmNoYW5nZXMoKS5ieVByb2plY3QocHJvamVjdC5nZXROYW1lS2V5KCkpKSB7CisgICAgICBmb3IgKENoYW5nZSBjaGFuZ2UgOiBjaGFuZ2VDYWNoZS5nZXQocHJvamVjdC5nZXROYW1lS2V5KCkpKSB7CiAgICAgICAgIGlmIChwcm9qZWN0Q3RsLmNvbnRyb2xGb3IoY2hhbmdlKS5pc1Zpc2libGUocmV2aWV3RGIpKSB7CiAgICAgICAgICAgdmlzaWJsZUNoYW5nZXMuYWRkKGNoYW5nZS5nZXRJZCgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI3OGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlczsKKworICBwdWJsaWMgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcmVhc29uLCBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcykgeworICAgIHN1cGVyKHJlYXNvbik7CisgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOworICB9CisKKyAgcHVibGljIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgeworICAgIHN1cGVyKHJlYXNvbik7CisgICAgdGhpcy5tZXNzYWdlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICB9CisKKyAgcHVibGljIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgVGhyb3dhYmxlIHdoeSkgeworICAgIHN1cGVyKHJlYXNvbiwgd2h5KTsKKyAgICB0aGlzLm1lc3NhZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gZ2V0TWVzc2FnZXMoKSB7CisgICAgcmV0dXJuIG1lc3NhZ2VzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRpb25MaXN0ZW5lci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjExMjQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkNvbW1pdFJlY2VpdmVkRXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBMaXN0ZW5lciB0byBwcm92aWRlIHZhbGlkYXRpb24gb24gcmVjZWl2ZWQgY29tbWl0cy4KKyAqCisgKiBJbnZva2VkIGJ5IEdlcnJpdCB3aGVuIGEgbmV3IGNvbW1pdCBpcyByZWNlaXZlZCwgaGFzIHBhc3NlZCBiYXNpYyBHZXJyaXQKKyAqIHZhbGlkYXRpb24gYW5kIGNhbiBiZSB0aGVuIHN1YmplY3QgdG8gZXh0cmEgdmFsaWRhdGlvbiBjaGVja3MuCisgKi8KK0BFeHRlbnNpb25Qb2ludAorcHVibGljIGludGVyZmFjZSBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAvKioKKyAgICogQ29tbWl0IHZhbGlkYXRpb24uCisgICAqCisgICAqIEBwYXJhbSByZWNlaXZlZCBjb21taXQgZXZlbnQgZGV0YWlscworICAgKiBAcmV0dXJuIGxpc3Qgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcworICAgKiBAdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gaWYgdmFsaWRhdGlvbiBmYWlscworICAgKi8KKyAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpCisgICAgICB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L3ZhbGlkYXRvcnMvQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L3ZhbGlkYXRvcnMvQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg2MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnM7CisKK3B1YmxpYyBjbGFzcyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZSB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Vycm9yOworCisgIHB1YmxpYyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgYm9vbGVhbiBpc0Vycm9yKSB7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aGlzLmlzRXJyb3IgPSBpc0Vycm9yOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKKyAgICByZXR1cm4gaXNFcnJvcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0b3JzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJlNTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0b3JzLmphdmEKQEAgLTAsMCArMSw1ODAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkNvbW1pdFJlY2VpdmVkRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5WYWxpZGF0aW9uRXJyb3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUmVmQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuTWFnaWNCcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkhvc3RLZXk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlcktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyTGluZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5TeXN0ZW1SZWFkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIENvbW1pdFZhbGlkYXRvcnMgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihDb21taXRWYWxpZGF0b3JzLmNsYXNzKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb290ZXJLZXkgQ0hBTkdFX0lEID0gbmV3IEZvb3RlcktleSgiQ2hhbmdlLUlkIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBORVdfUEFUQ0hTRVQgPSBQYXR0ZXJuCisgICAgICAuY29tcGlsZSgiXnJlZnMvY2hhbmdlcy8oPzpbMC05XVswLTldKT8oL1sxLTldWzAtOV0qKXsxLDJ9KD86L25ldyk/JCIpOworCisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgQ29tbWl0VmFsaWRhdG9ycyBjcmVhdGUoUmVmQ29udHJvbCByZWZDb250cm9sLCBTc2hJbmZvIHNzaEluZm8sCisgICAgICAgIFJlcG9zaXRvcnkgcmVwbyk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50OworICBwcml2YXRlIGZpbmFsIFJlZkNvbnRyb2wgcmVmQ29udHJvbDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsOworICBwcml2YXRlIGZpbmFsIFNzaEluZm8gc3NoSW5mbzsKKyAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisgIHByaXZhdGUgZmluYWwgRHluYW1pY1NldDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnM7CisKKyAgQEluamVjdAorICBDb21taXRWYWxpZGF0b3JzKEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudCwKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwsCisgICAgICBmaW5hbCBEeW5hbWljU2V0PENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcj4gY29tbWl0VmFsaWRhdGlvbkxpc3RlbmVycywKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBTc2hJbmZvIHNzaEluZm8sCisgICAgICBAQXNzaXN0ZWQgZmluYWwgUmVwb3NpdG9yeSByZXBvLCBAQXNzaXN0ZWQgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sKSB7CisgICAgdGhpcy5nZXJyaXRJZGVudCA9IGdlcnJpdElkZW50OworICAgIHRoaXMucmVmQ29udHJvbCA9IHJlZkNvbnRyb2w7CisgICAgdGhpcy5jYW5vbmljYWxXZWJVcmwgPSBjYW5vbmljYWxXZWJVcmw7CisgICAgdGhpcy5zc2hJbmZvID0gc3NoSW5mbzsKKyAgICB0aGlzLnJlcG8gPSByZXBvOworICAgIHRoaXMuY29tbWl0VmFsaWRhdGlvbkxpc3RlbmVycyA9IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnM7CisgIH0KKworICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gdmFsaWRhdGVGb3JSZWNlaXZlQ29tbWl0cygKKyAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcj4gdmFsaWRhdG9ycyA9CisgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcj4oKTsKKworICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBVcGxvYWRNZXJnZXNQZXJtaXNzaW9uVmFsaWRhdG9yKHJlZkNvbnRyb2wpKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQW1lbmRlZEdlcnJpdE1lcmdlQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyKAorICAgICAgICByZWZDb250cm9sLCBnZXJyaXRJZGVudCkpOworICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBBdXRob3JVcGxvYWRlclZhbGlkYXRvcihyZWZDb250cm9sLCBjYW5vbmljYWxXZWJVcmwpKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQ29tbWl0dGVyVXBsb2FkZXJWYWxpZGF0b3IocmVmQ29udHJvbCwgY2Fub25pY2FsV2ViVXJsKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFNpZ25lZE9mZkJ5VmFsaWRhdG9yKHJlZkNvbnRyb2wsIGNhbm9uaWNhbFdlYlVybCkpOworICAgIGlmIChNYWdpY0JyYW5jaC5pc01hZ2ljQnJhbmNoKHJlY2VpdmVFdmVudC5jb21tYW5kLmdldFJlZk5hbWUoKSkKKyAgICAgICAgfHwgTkVXX1BBVENIU0VULm1hdGNoZXIocmVjZWl2ZUV2ZW50LmNvbW1hbmQuZ2V0UmVmTmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBDaGFuZ2VJZFZhbGlkYXRvcihyZWZDb250cm9sLCBjYW5vbmljYWxXZWJVcmwsIHNzaEluZm8pKTsKKyAgICB9CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IENvbmZpZ1ZhbGlkYXRvcihyZWZDb250cm9sLCByZXBvKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFBsdWdpbkNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcihjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzKSk7CisKKyAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgdHJ5IHsKKyAgICAgIGZvciAoQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIGNvbW1pdFZhbGlkYXRvciA6IHZhbGlkYXRvcnMpIHsKKyAgICAgICAgbWVzc2FnZXMuYWRkQWxsKGNvbW1pdFZhbGlkYXRvci5vbkNvbW1pdFJlY2VpdmVkKHJlY2VpdmVFdmVudCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gS2VlcCB0aGUgb2xkIG1lc3NhZ2VzIChhbmQgdGhlaXIgb3JkZXIpIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uCisgICAgICBtZXNzYWdlcy5hZGRBbGwoZS5nZXRNZXNzYWdlcygpKTsKKyAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlcyk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiB2YWxpZGF0ZUZvckdlcnJpdENvbW1pdHMoCisgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IHZhbGlkYXRvcnMgPQorICAgICAgICBuZXcgTGlua2VkTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+KCk7CisKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgVXBsb2FkTWVyZ2VzUGVybWlzc2lvblZhbGlkYXRvcihyZWZDb250cm9sKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IEFtZW5kZWRHZXJyaXRNZXJnZUNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgcmVmQ29udHJvbCwgZ2Vycml0SWRlbnQpKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQXV0aG9yVXBsb2FkZXJWYWxpZGF0b3IocmVmQ29udHJvbCwgY2Fub25pY2FsV2ViVXJsKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFNpZ25lZE9mZkJ5VmFsaWRhdG9yKHJlZkNvbnRyb2wsIGNhbm9uaWNhbFdlYlVybCkpOworICAgIGlmIChNYWdpY0JyYW5jaC5pc01hZ2ljQnJhbmNoKHJlY2VpdmVFdmVudC5jb21tYW5kLmdldFJlZk5hbWUoKSkKKyAgICAgICAgfHwgTkVXX1BBVENIU0VULm1hdGNoZXIocmVjZWl2ZUV2ZW50LmNvbW1hbmQuZ2V0UmVmTmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBDaGFuZ2VJZFZhbGlkYXRvcihyZWZDb250cm9sLCBjYW5vbmljYWxXZWJVcmwsIHNzaEluZm8pKTsKKyAgICB9CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IENvbmZpZ1ZhbGlkYXRvcihyZWZDb250cm9sLCByZXBvKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFBsdWdpbkNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcihjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzKSk7CisKKyAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgdHJ5IHsKKyAgICAgIGZvciAoQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIGNvbW1pdFZhbGlkYXRvciA6IHZhbGlkYXRvcnMpIHsKKyAgICAgICAgbWVzc2FnZXMuYWRkQWxsKGNvbW1pdFZhbGlkYXRvci5vbkNvbW1pdFJlY2VpdmVkKHJlY2VpdmVFdmVudCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gS2VlcCB0aGUgb2xkIG1lc3NhZ2VzIChhbmQgdGhlaXIgb3JkZXIpIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uCisgICAgICBtZXNzYWdlcy5hZGRBbGwoZS5nZXRNZXNzYWdlcygpKTsKKyAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlcyk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hhbmdlSWRWYWxpZGF0b3IgaW1wbGVtZW50cyBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKKyAgICBwcml2YXRlIGZpbmFsIFNzaEluZm8gc3NoSW5mbzsKKworICAgIHB1YmxpYyBDaGFuZ2VJZFZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwsCisgICAgICAgIFNzaEluZm8gc3NoSW5mbykgeworICAgICAgdGhpcy5yZWZDb250cm9sID0gcmVmQ29udHJvbDsKKyAgICAgIHRoaXMuY2Fub25pY2FsV2ViVXJsID0gY2Fub25pY2FsV2ViVXJsOworICAgICAgdGhpcy5zc2hJbmZvID0gc3NoSW5mbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gb25Db21taXRSZWNlaXZlZCgKKyAgICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpIHRocm93cyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKworICAgICAgZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wgPSByZWZDb250cm9sLmdldFByb2plY3RDb250cm9sKCk7CisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcmVmQ29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGlkTGlzdCA9IHJlY2VpdmVFdmVudC5jb21taXQuZ2V0Rm9vdGVyTGluZXMoQ0hBTkdFX0lEKTsKKworICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgICBpZiAoaWRMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICBpZiAocHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCkuaXNSZXF1aXJlQ2hhbmdlSUQoKSkgeworICAgICAgICAgIFN0cmluZyBlcnJNc2cgPSAibWlzc2luZyBDaGFuZ2UtSWQgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyIjsKKyAgICAgICAgICBtZXNzYWdlcy5hZGQoZ2V0Rml4ZWRDb21taXRNc2dXaXRoQ2hhbmdlSWQoZXJyTXNnLCByZWNlaXZlRXZlbnQuY29tbWl0LAorICAgICAgICAgICAgICBjdXJyZW50VXNlciwgY2Fub25pY2FsV2ViVXJsLCBzc2hJbmZvKSk7CisgICAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oZXJyTXNnLCBtZXNzYWdlcyk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoaWRMaXN0LnNpemUoKSA+IDEpIHsKKyAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAibXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlIGZvb3RlciIsIG1lc3NhZ2VzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2ID0gaWRMaXN0LmdldChpZExpc3Quc2l6ZSgpIC0gMSkudHJpbSgpOworICAgICAgICBpZiAoIXYubWF0Y2hlcygiXklbMC05YS1mXXs4LH0uKiQiKSkgeworICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJNc2cgPQorICAgICAgICAgICAgICAibWlzc2luZyBvciBpbnZhbGlkIENoYW5nZS1JZCBsaW5lIGZvcm1hdCBpbiBjb21taXQgbWVzc2FnZSBmb290ZXIiOworICAgICAgICAgIG1lc3NhZ2VzLmFkZChnZXRGaXhlZENvbW1pdE1zZ1dpdGhDaGFuZ2VJZChlcnJNc2csIHJlY2VpdmVFdmVudC5jb21taXQsCisgICAgICAgICAgICAgIGN1cnJlbnRVc2VyLCBjYW5vbmljYWxXZWJVcmwsIHNzaEluZm8pKTsKKyAgICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJNc2csIG1lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSWYgdGhpcyBpcyB0aGUgc3BlY2lhbCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYnJhbmNoLCB2YWxpZGF0ZSB0aGUgY29uZmlnLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWdWYWxpZGF0b3IgaW1wbGVtZW50cyBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworCisgICAgcHVibGljIENvbmZpZ1ZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wsIFJlcG9zaXRvcnkgcmVwbykgeworICAgICAgdGhpcy5yZWZDb250cm9sID0gcmVmQ29udHJvbDsKKyAgICAgIHRoaXMucmVwbyA9IHJlcG87CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcmVmQ29udHJvbC5nZXRDdXJyZW50VXNlcigpOworCisgICAgICBpZiAoR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRy5lcXVhbHMocmVmQ29udHJvbC5nZXRSZWZOYW1lKCkpKSB7CisgICAgICAgIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0KKyAgICAgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgUHJvamVjdENvbmZpZyBjZmcgPQorICAgICAgICAgICAgICBuZXcgUHJvamVjdENvbmZpZyhyZWNlaXZlRXZlbnQucHJvamVjdC5nZXROYW1lS2V5KCkpOworICAgICAgICAgIGNmZy5sb2FkKHJlcG8sIHJlY2VpdmVFdmVudC5jb21tYW5kLmdldE5ld0lkKCkpOworICAgICAgICAgIGlmICghY2ZnLmdldFZhbGlkYXRpb25FcnJvcnMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZEVycm9yKCJJbnZhbGlkIHByb2plY3QgY29uZmlndXJhdGlvbjoiLCBtZXNzYWdlcyk7CisgICAgICAgICAgICBmb3IgKFZhbGlkYXRpb25FcnJvciBlcnIgOiBjZmcuZ2V0VmFsaWRhdGlvbkVycm9ycygpKSB7CisgICAgICAgICAgICAgIGFkZEVycm9yKCIgICIgKyBlcnIuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbigiaW52YWxpZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgbG9nLmVycm9yKCJVc2VyICIgKyBjdXJyZW50VXNlci5nZXRVc2VyTmFtZSgpCisgICAgICAgICAgICAgICsgIiB0cmllZCB0byBwdXNoIGludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uICIKKyAgICAgICAgICAgICAgKyByZWNlaXZlRXZlbnQuY29tbWFuZC5nZXROZXdJZCgpLm5hbWUoKSArICIgZm9yICIKKyAgICAgICAgICAgICAgKyByZWNlaXZlRXZlbnQucHJvamVjdC5nZXROYW1lKCksIGUpOworICAgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKCJpbnZhbGlkIHByb2plY3QgY29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgIG1lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICAvKiogUmVxdWlyZSBwZXJtaXNzaW9uIHRvIHVwbG9hZCBtZXJnZXMuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXBsb2FkTWVyZ2VzUGVybWlzc2lvblZhbGlkYXRvciBpbXBsZW1lbnRzCisgICAgICBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworCisgICAgcHVibGljIFVwbG9hZE1lcmdlc1Blcm1pc3Npb25WYWxpZGF0b3IoUmVmQ29udHJvbCByZWZDb250cm9sKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBvbkNvbW1pdFJlY2VpdmVkKAorICAgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgaWYgKHJlY2VpdmVFdmVudC5jb21taXQuZ2V0UGFyZW50Q291bnQoKSA+IDEKKyAgICAgICAgICAmJiAhcmVmQ29udHJvbC5jYW5VcGxvYWRNZXJnZXMoKSkgeworICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbigieW91IGFyZSBub3QgYWxsb3dlZCB0byB1cGxvYWQgbWVyZ2VzIik7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIC8qKiBFeGVjdXRlIGNvbW1pdCB2YWxpZGF0aW9uIHBsdWctaW5zICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGx1Z2luQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIGltcGxlbWVudHMKKyAgICAgIENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljU2V0PENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcj4gY29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyczsKKworICAgIHB1YmxpYyBQbHVnaW5Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIoCisgICAgICAgIGZpbmFsIER5bmFtaWNTZXQ8Q29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyPiBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzKSB7CisgICAgICB0aGlzLmNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMgPSBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBvbkNvbW1pdFJlY2VpdmVkKAorICAgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgICBmb3IgKENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB2YWxpZGF0b3IgOiBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgbWVzc2FnZXMuYWRkQWxsKHZhbGlkYXRvci5vbkNvbW1pdFJlY2VpdmVkKHJlY2VpdmVFdmVudCkpOworICAgICAgICB9IGNhdGNoIChDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBtZXNzYWdlcy5hZGRBbGwoZS5nZXRNZXNzYWdlcygpKTsKKyAgICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgbWVzc2FnZXMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBTaWduZWRPZmZCeVZhbGlkYXRvciBpbXBsZW1lbnRzIENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisKKyAgICBwdWJsaWMgU2lnbmVkT2ZmQnlWYWxpZGF0b3IoUmVmQ29udHJvbCByZWZDb250cm9sLCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBvbkNvbW1pdFJlY2VpdmVkKAorICAgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIHJlZkNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICAgIGZpbmFsIFBlcnNvbklkZW50IGNvbW1pdHRlciA9IHJlY2VpdmVFdmVudC5jb21taXQuZ2V0Q29tbWl0dGVySWRlbnQoKTsKKyAgICAgIGZpbmFsIFBlcnNvbklkZW50IGF1dGhvciA9IHJlY2VpdmVFdmVudC5jb21taXQuZ2V0QXV0aG9ySWRlbnQoKTsKKyAgICAgIGZpbmFsIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sID0gcmVmQ29udHJvbC5nZXRQcm9qZWN0Q29udHJvbCgpOworCisgICAgICBpZiAocHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCkuaXNVc2VTaWduZWRPZmZCeSgpKSB7CisgICAgICAgIGJvb2xlYW4gc2JvQXV0aG9yID0gZmFsc2UsIHNib0NvbW1pdHRlciA9IGZhbHNlLCBzYm9NZSA9IGZhbHNlOworICAgICAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgZm9vdGVyIDogcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRGb290ZXJMaW5lcygpKSB7CisgICAgICAgICAgaWYgKGZvb3Rlci5tYXRjaGVzKEZvb3RlcktleS5TSUdORURfT0ZGX0JZKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGUgPSBmb290ZXIuZ2V0RW1haWxBZGRyZXNzKCk7CisgICAgICAgICAgICBpZiAoZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIHNib0F1dGhvciB8PSBhdXRob3IuZ2V0RW1haWxBZGRyZXNzKCkuZXF1YWxzKGUpOworICAgICAgICAgICAgICBzYm9Db21taXR0ZXIgfD0gY29tbWl0dGVyLmdldEVtYWlsQWRkcmVzcygpLmVxdWFscyhlKTsKKyAgICAgICAgICAgICAgc2JvTWUgfD0gY3VycmVudFVzZXIuZ2V0RW1haWxBZGRyZXNzZXMoKS5jb250YWlucyhlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzYm9BdXRob3IgJiYgIXNib0NvbW1pdHRlciAmJiAhc2JvTWUKKyAgICAgICAgICAgICYmICFyZWZDb250cm9sLmNhbkZvcmdlQ29tbWl0dGVyKCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIm5vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+ZW1wdHlMaXN0KCk7CisgICAgfQorICB9CisKKyAgLyoqIFJlcXVpcmUgdGhhdCBhdXRob3IgbWF0Y2hlcyB0aGUgdXBsb2FkZXIuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aG9yVXBsb2FkZXJWYWxpZGF0b3IgaW1wbGVtZW50cworICAgICAgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlZkNvbnRyb2wgcmVmQ29udHJvbDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmw7CisKKyAgICBwdWJsaWMgQXV0aG9yVXBsb2FkZXJWYWxpZGF0b3IoUmVmQ29udHJvbCByZWZDb250cm9sLCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgICAgdGhpcy5jYW5vbmljYWxXZWJVcmwgPSBjYW5vbmljYWxXZWJVcmw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcmVmQ29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgICAgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRBdXRob3JJZGVudCgpOworCisgICAgICBpZiAoIWN1cnJlbnRVc2VyLmdldEVtYWlsQWRkcmVzc2VzKCkuY29udGFpbnMoYXV0aG9yLmdldEVtYWlsQWRkcmVzcygpKQorICAgICAgICAgICYmICFyZWZDb250cm9sLmNhbkZvcmdlQXV0aG9yKCkpIHsKKyAgICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisKKyAgICAgICAgbWVzc2FnZXMuYWRkKGdldEludmFsaWRFbWFpbEVycm9yKHJlY2VpdmVFdmVudC5jb21taXQsICJhdXRob3IiLCBhdXRob3IsCisgICAgICAgICAgICBjdXJyZW50VXNlciwgY2Fub25pY2FsV2ViVXJsKSk7CisgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKCJpbnZhbGlkIGF1dGhvciIsIG1lc3NhZ2VzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+ZW1wdHlMaXN0KCk7CisgICAgfQorICB9CisKKyAgLyoqIFJlcXVpcmUgdGhhdCBjb21taXR0ZXIgbWF0Y2hlcyB0aGUgdXBsb2FkZXIuICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWl0dGVyVXBsb2FkZXJWYWxpZGF0b3IgaW1wbGVtZW50cworICAgICAgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlZkNvbnRyb2wgcmVmQ29udHJvbDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxXZWJVcmw7CisKKyAgICBwdWJsaWMgQ29tbWl0dGVyVXBsb2FkZXJWYWxpZGF0b3IoUmVmQ29udHJvbCByZWZDb250cm9sLAorICAgICAgICBTdHJpbmcgY2Fub25pY2FsV2ViVXJsKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgICAgdGhpcy5jYW5vbmljYWxXZWJVcmwgPSBjYW5vbmljYWxXZWJVcmw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcmVmQ29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgICAgZmluYWwgUGVyc29uSWRlbnQgY29tbWl0dGVyID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRDb21taXR0ZXJJZGVudCgpOworICAgICAgaWYgKCFjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpCisgICAgICAgICAgLmNvbnRhaW5zKGNvbW1pdHRlci5nZXRFbWFpbEFkZHJlc3MoKSkKKyAgICAgICAgICAmJiAhcmVmQ29udHJvbC5jYW5Gb3JnZUNvbW1pdHRlcigpKSB7CisgICAgICAgIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0KKyAgICAgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworICAgICAgICBtZXNzYWdlcy5hZGQoZ2V0SW52YWxpZEVtYWlsRXJyb3IocmVjZWl2ZUV2ZW50LmNvbW1pdCwgImNvbW1pdHRlciIsIGNvbW1pdHRlciwKKyAgICAgICAgICAgIGN1cnJlbnRVc2VyLCBjYW5vbmljYWxXZWJVcmwpKTsKKyAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oImludmFsaWQgY29tbWl0dGVyIiwgbWVzc2FnZXMpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRG9uJ3QgYWxsb3cgdGhlIHVzZXIgdG8gYW1lbmQgYSBtZXJnZSBjcmVhdGVkIGJ5IEdlcnJpdCBDb2RlIFJldmlldy4gVGhpcworICAgKiBzZWVtcyB0byBoYXBwZW4gYWxsIHRvbyBvZnRlbiwgZHVlIHRvIHVzZXJzIG5vdCBwYXlpbmcgYW55IGF0dGVudGlvbiB0bworICAgKiB3aGF0IHRoZXkgYXJlIGRvaW5nLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBbWVuZGVkR2Vycml0TWVyZ2VDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cworICAgICAgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50OworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworCisgICAgcHVibGljIEFtZW5kZWRHZXJyaXRNZXJnZUNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sLCBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudCkgeworICAgICAgdGhpcy5yZWZDb250cm9sID0gcmVmQ29udHJvbDsKKyAgICAgIHRoaXMuZ2Vycml0SWRlbnQgPSBnZXJyaXRJZGVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gb25Db21taXRSZWNlaXZlZCgKKyAgICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpIHRocm93cyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIFBlcnNvbklkZW50IGF1dGhvciA9IHJlY2VpdmVFdmVudC5jb21taXQuZ2V0QXV0aG9ySWRlbnQoKTsKKworICAgICAgaWYgKHJlY2VpdmVFdmVudC5jb21taXQuZ2V0UGFyZW50Q291bnQoKSA+IDEKKyAgICAgICAgICAmJiBhdXRob3IuZ2V0TmFtZSgpLmVxdWFscyhnZXJyaXRJZGVudC5nZXROYW1lKCkpCisgICAgICAgICAgJiYgYXV0aG9yLmdldEVtYWlsQWRkcmVzcygpLmVxdWFscyhnZXJyaXRJZGVudC5nZXRFbWFpbEFkZHJlc3MoKSkKKyAgICAgICAgICAmJiAhcmVmQ29udHJvbC5jYW5Gb3JnZUdlcnJpdFNlcnZlcklkZW50aXR5KCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oImRvIG5vdCBhbWVuZCBtZXJnZXMgbm90IG1hZGUgYnkgeW91Iik7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENvbW1pdFZhbGlkYXRpb25NZXNzYWdlIGdldEludmFsaWRFbWFpbEVycm9yKFJldkNvbW1pdCBjLCBTdHJpbmcgdHlwZSwKKyAgICAgIFBlcnNvbklkZW50IHdobywgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBzYi5hcHBlbmQoIlxuIik7CisgICAgc2IuYXBwZW5kKCJFUlJPUjogIEluIGNvbW1pdCAiICsgYy5uYW1lKCkgKyAiXG4iKTsKKyAgICBzYi5hcHBlbmQoIkVSUk9SOiAgIiArIHR5cGUgKyAiIGVtYWlsIGFkZHJlc3MgIiArIHdoby5nZXRFbWFpbEFkZHJlc3MoKQorICAgICAgICArICJcbiIpOworICAgIHNiLmFwcGVuZCgiRVJST1I6ICBkb2VzIG5vdCBtYXRjaCB5b3VyIHVzZXIgYWNjb3VudC5cbiIpOworICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKKyAgICBpZiAoY3VycmVudFVzZXIuZ2V0RW1haWxBZGRyZXNzZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBZb3UgaGF2ZSBub3QgcmVnaXN0ZXJlZCBhbnkgZW1haWwgYWRkcmVzc2VzLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUaGUgZm9sbG93aW5nIGFkZHJlc3NlcyBhcmUgY3VycmVudGx5IHJlZ2lzdGVyZWQ6XG4iKTsKKyAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3MgOiBjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpKSB7CisgICAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAgICIgKyBhZGRyZXNzICsgIlxuIik7CisgICAgICB9CisgICAgfQorICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKKyAgICBpZiAoY2Fub25pY2FsV2ViVXJsICE9IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUbyByZWdpc3RlciBhbiBlbWFpbCBhZGRyZXNzLCBwbGVhc2UgdmlzaXQ6XG4iKTsKKyAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAiICsgY2Fub25pY2FsV2ViVXJsICsgIiMiICsgUGFnZUxpbmtzLlNFVFRJTkdTX0NPTlRBQ1QKKyAgICAgICAgICArICJcbiIpOworICAgIH0KKyAgICBzYi5hcHBlbmQoIlxuIik7CisgICAgcmV0dXJuIG5ldyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZShzYi50b1N0cmluZygpLCBmYWxzZSk7CisgIH0KKworICAvKioKKyAgICogV2UgaGFuZGxlIDMgY2FzZXM6CisgICAqIDEuIE5vIGNoYW5nZSBpZCBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYXQgYWxsLgorICAgKiAyLiBDaGFuZ2UgaWQgbGFzdCBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgYnV0IG1pc3NpbmcgZW1wdHkgbGluZSB0byBjcmVhdGUgdGhlIGZvb3Rlci4KKyAgICogMy4gVGhlcmUgaXMgYSBjaGFuZ2UtaWQgc29tZXdoZXJlIGluIHRoZSBjb21taXQgbWVzc2FnZSwgYnV0IHdlIGlnbm9yZSBpdC4KKyAgICoKKyAgICogQHJldHVybiBUaGUgZml4ZWQgdXAgY29tbWl0IG1lc3NhZ2UKKyAgICovCisgIHByaXZhdGUgc3RhdGljIENvbW1pdFZhbGlkYXRpb25NZXNzYWdlIGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGZpbmFsIFN0cmluZyBlcnJNc2csCisgICAgICBmaW5hbCBSZXZDb21taXQgYywgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBTdHJpbmcgY2Fub25pY2FsV2ViVXJsLCBmaW5hbCBTc2hJbmZvIHNzaEluZm8pIHsKKyAgICBmaW5hbCBTdHJpbmcgY2hhbmdlSWQgPSAiQ2hhbmdlLUlkOiI7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgc2IuYXBwZW5kKCJFUlJPUjogIikuYXBwZW5kKGVyck1zZyk7CisgICAgc2IuYXBwZW5kKCdcbicpOworICAgIHNiLmFwcGVuZCgiU3VnZ2VzdGlvbiBmb3IgY29tbWl0IG1lc3NhZ2U6XG4iKTsKKworICAgIGlmIChjLmdldEZ1bGxNZXNzYWdlKCkuaW5kZXhPZihjaGFuZ2VJZCkgPT0gLTEpIHsKKyAgICAgIHNiLmFwcGVuZChjLmdldEZ1bGxNZXNzYWdlKCkpOworICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgc2IuYXBwZW5kKGNoYW5nZUlkKS5hcHBlbmQoIiBJIikuYXBwZW5kKGMubmFtZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIGxpbmVzW10gPSBjLmdldEZ1bGxNZXNzYWdlKCkudHJpbSgpLnNwbGl0KCJcbiIpOworICAgICAgU3RyaW5nIGxhc3RMaW5lID0gbGluZXMubGVuZ3RoID4gMCA/IGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdIDogIiI7CisKKyAgICAgIGlmIChsYXN0TGluZS5pbmRleE9mKGNoYW5nZUlkKSA9PSAwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoIC0gMTsgaSsrKSB7CisgICAgICAgICAgc2IuYXBwZW5kKGxpbmVzW2ldKTsKKyAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHNiLmFwcGVuZChsYXN0TGluZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQoYy5nZXRGdWxsTWVzc2FnZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCdcbicpOworICAgICAgICBzYi5hcHBlbmQoY2hhbmdlSWQpLmFwcGVuZCgiIEkiKS5hcHBlbmQoYy5uYW1lKCkpOworICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHNiLmFwcGVuZCgiSGludDogQSBwb3RlbnRpYWwgQ2hhbmdlLUlkIHdhcyBmb3VuZCwgYnV0IGl0IHdhcyBub3QgaW4gdGhlICIpOworICAgICAgICBzYi5hcHBlbmQoImZvb3RlciAobGFzdCBwYXJhZ3JhcGgpIG9mIHRoZSBjb21taXQgbWVzc2FnZS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCdcbicpOworICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICBzYi5hcHBlbmQoIkhpbnQ6IFRvIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IENoYW5nZS1JZCwgaW5zdGFsbCB0aGUgaG9vazpcbiIpOworICAgIHNiLmFwcGVuZChnZXRDb21taXRNZXNzYWdlSG9va0luc3RhbGxhdGlvbkhpbnQoY3VycmVudFVzZXIsCisgICAgICAgIGNhbm9uaWNhbFdlYlVybCwgc3NoSW5mbykpLmFwcGVuZCgnXG4nKTsKKyAgICBzYi5hcHBlbmQoJ1xuJyk7CisKKyAgICByZXR1cm4gbmV3IENvbW1pdFZhbGlkYXRpb25NZXNzYWdlKHNiLnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb21taXRNZXNzYWdlSG9va0luc3RhbGxhdGlvbkhpbnQoCisgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCwKKyAgICAgIGZpbmFsIFNzaEluZm8gc3NoSW5mbykgeworICAgIGZpbmFsIExpc3Q8SG9zdEtleT4gaG9zdEtleXMgPSBzc2hJbmZvLmdldEhvc3RLZXlzKCk7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gU1NIIGtleXMsIHRoZSBjb21taXQtbXNnIGhvb2sgbXVzdCBiZSBpbnN0YWxsZWQgdmlhCisgICAgLy8gSFRUUChTKQorICAgIGlmIChob3N0S2V5cy5pc0VtcHR5KCkpIHsKKyAgICAgIFN0cmluZyBwID0gIi5naXQvaG9va3MvY29tbWl0LW1zZyI7CisgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiICBjdXJsIC1vICVzICVzL3Rvb2xzL2hvb2tzL2NvbW1pdC1tc2cgOyBjaG1vZCAreCAlcyIsIHAsCisgICAgICAgICAgZ2V0R2Vycml0VXJsKGNhbm9uaWNhbFdlYlVybCksIHApOworICAgIH0KKworICAgIC8vIFNTSCBrZXlzIGV4aXN0LCBzbyB0aGUgaG9vayBjYW4gYmUgaW5zdGFsbGVkIHdpdGggc2NwLgorICAgIFN0cmluZyBzc2hIb3N0OworICAgIGludCBzc2hQb3J0OworICAgIFN0cmluZyBob3N0ID0gaG9zdEtleXMuZ2V0KDApLmdldEhvc3QoKTsKKyAgICBpbnQgYyA9IGhvc3QubGFzdEluZGV4T2YoJzonKTsKKyAgICBpZiAoMCA8PSBjKSB7CisgICAgICBpZiAoaG9zdC5zdGFydHNXaXRoKCIqOiIpKSB7CisgICAgICAgIHNzaEhvc3QgPSBnZXRHZXJyaXRIb3N0KGNhbm9uaWNhbFdlYlVybCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzc2hIb3N0ID0gaG9zdC5zdWJzdHJpbmcoMCwgYyk7CisgICAgICB9CisgICAgICBzc2hQb3J0ID0gSW50ZWdlci5wYXJzZUludChob3N0LnN1YnN0cmluZyhjICsgMSkpOworICAgIH0gZWxzZSB7CisgICAgICBzc2hIb3N0ID0gaG9zdDsKKyAgICAgIHNzaFBvcnQgPSAyMjsKKyAgICB9CisKKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiICBzY3AgLXAgLVAgJWQgJXNAJXM6aG9va3MvY29tbWl0LW1zZyAuZ2l0L2hvb2tzLyIsCisgICAgICAgIHNzaFBvcnQsIGN1cnJlbnRVc2VyLmdldFVzZXJOYW1lKCksIHNzaEhvc3QpOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgR2Vycml0IFVSTC4KKyAgICoKKyAgICogQHJldHVybiB0aGUgY2Fub25pY2FsIFVSTCAod2l0aCBhbnkgdHJhaWxpbmcgc2xhc2ggcmVtb3ZlZCkgaWYgaXQgaXMKKyAgICogICAgICAgICBjb25maWd1cmVkLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvICJodHRwOi8vaG9zdG5hbWUiIHdoZXJlIGhvc3RuYW1lCisgICAqICAgICAgICAgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0R2Vycml0SG9zdCgpfS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHZXJyaXRVcmwoU3RyaW5nIGNhbm9uaWNhbFdlYlVybCkgeworICAgIGlmIChjYW5vbmljYWxXZWJVcmwgIT0gbnVsbCkgeworICAgICAgaWYgKGNhbm9uaWNhbFdlYlVybC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgIHJldHVybiBjYW5vbmljYWxXZWJVcmwuc3Vic3RyaW5nKDAsIGNhbm9uaWNhbFdlYlVybC5sYXN0SW5kZXhPZigiLyIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBjYW5vbmljYWxXZWJVcmw7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiaHR0cDovLyIgKyBnZXRHZXJyaXRIb3N0KGNhbm9uaWNhbFdlYlVybCk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgR2Vycml0IGhvc3RuYW1lLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBjYW5vbmljYWwgVVJMIGlmIGl0IGlzIGNvbmZpZ3VyZWQsIG90aGVyd2lzZQorICAgKiAgICAgICAgIHdoYXRldmVyIHRoZSBPUyBzYXlzIHRoZSBob3N0bmFtZSBpcy4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHZXJyaXRIb3N0KFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICBTdHJpbmcgaG9zdDsKKyAgICBpZiAoY2Fub25pY2FsV2ViVXJsICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGhvc3QgPSBuZXcgVVJMKGNhbm9uaWNhbFdlYlVybCkuZ2V0SG9zdCgpOworICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaG9zdCA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEhvc3RuYW1lKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGhvc3QgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRIb3N0bmFtZSgpOworICAgIH0KKyAgICByZXR1cm4gaG9zdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIGVycm9yLAorICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMpIHsKKyAgICBtZXNzYWdlcy5hZGQobmV3IENvbW1pdFZhbGlkYXRpb25NZXNzYWdlKGVycm9yLCB0cnVlKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQWRkSW5jbHVkZWRHcm91cHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQWRkSW5jbHVkZWRHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNmMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9BZGRJbmNsdWRlZEdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEluY2x1ZGVDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQWRkSW5jbHVkZWRHcm91cHMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgX29uZUdyb3VwOworCisgICAgTGlzdDxTdHJpbmc+IGdyb3VwczsKKworICAgIHN0YXRpYyBJbnB1dCBpbml0KElucHV0IGluKSB7CisgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICBpbiA9IG5ldyBJbnB1dCgpOworICAgICAgfQorICAgICAgaWYgKGluLmdyb3VwcyA9PSBudWxsKSB7CisgICAgICAgIGluLmdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSgxKTsKKyAgICAgIH0KKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGluLl9vbmVHcm91cCkpIHsKKyAgICAgICAgaW4uZ3JvdXBzLmFkZChpbi5fb25lR3JvdXApOworICAgICAgfQorICAgICAgcmV0dXJuIGluOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEluY2x1ZGVDYWNoZSBncm91cEluY2x1ZGVDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIHB1YmxpYyBBZGRJbmNsdWRlZEdyb3VwcyhQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLAorICAgICAgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGUsCisgICAgICBSZXZpZXdEYiBkYiwgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuZ3JvdXBJbmNsdWRlQ2FjaGUgPSBncm91cEluY2x1ZGVDYWNoZTsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxHcm91cEluZm8+IGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBncm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlucHV0ID0gSW5wdXQuaW5pdChpbnB1dCk7CisKKyAgICBHcm91cENvbnRyb2wgY29udHJvbCA9IHJlc291cmNlLmdldENvbnRyb2woKTsKKyAgICBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IG5ld0luY2x1ZGVkR3JvdXBzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ+IG5ld0luY2x1ZGVkR3JvdXBzQXVkaXRzID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIExpc3Q8R3JvdXBJbmZvPiByZXN1bHQgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgQWNjb3VudC5JZCBtZSA9ICgoSWRlbnRpZmllZFVzZXIpIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSkuZ2V0QWNjb3VudElkKCk7CisKKyAgICBmb3IgKFN0cmluZyBpbmNsdWRlZEdyb3VwIDogaW5wdXQuZ3JvdXBzKSB7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGQgPSBncm91cHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKGluY2x1ZGVkR3JvdXApOworICAgICAgaWYgKCFjb250cm9sLmNhbkFkZEdyb3VwKGQuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBhZGQgZ3JvdXA6ICVzIiwKKyAgICAgICAgICAgIGQuZ2V0TmFtZSgpKSk7CisgICAgICB9CisKKyAgICAgIGlmICghbmV3SW5jbHVkZWRHcm91cHMuY29udGFpbnNLZXkoZC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgICAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5LZXkgYWdpS2V5ID0KKyAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleShncm91cC5nZXRJZCgpLAorICAgICAgICAgICAgICAgIGQuZ2V0R3JvdXBVVUlEKCkpOworICAgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGFnaSA9IGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuZ2V0KGFnaUtleSk7CisgICAgICAgIGlmIChhZ2kgPT0gbnVsbCkgeworICAgICAgICAgIGFnaSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkKGFnaUtleSk7CisgICAgICAgICAgbmV3SW5jbHVkZWRHcm91cHMucHV0KGQuZ2V0R3JvdXBVVUlEKCksIGFnaSk7CisgICAgICAgICAgbmV3SW5jbHVkZWRHcm91cHNBdWRpdHMuYWRkKG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQoYWdpLCBtZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXN1bHQuYWRkKGpzb24uZm9ybWF0KGQpKTsKKyAgICB9CisKKyAgICBpZiAoIW5ld0luY2x1ZGVkR3JvdXBzLmlzRW1wdHkoKSkgeworICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWRBdWRpdCgpLmluc2VydChuZXdJbmNsdWRlZEdyb3Vwc0F1ZGl0cyk7CisgICAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmluc2VydChuZXdJbmNsdWRlZEdyb3Vwcy52YWx1ZXMoKSk7CisgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgYWdpIDogbmV3SW5jbHVkZWRHcm91cHMudmFsdWVzKCkpIHsKKyAgICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RNZW1iZXJJbihhZ2kuZ2V0SW5jbHVkZVVVSUQoKSk7CisgICAgICB9CisgICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdE1lbWJlcnNPZihncm91cC5nZXRHcm91cFVVSUQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBQdXRJbmNsdWRlZEdyb3VwIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgUHV0SW5jbHVkZWRHcm91cC5JbnB1dD4geworICAgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBZGRJbmNsdWRlZEdyb3Vwcz4gcHV0OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCisgICAgUHV0SW5jbHVkZWRHcm91cChQcm92aWRlcjxBZGRJbmNsdWRlZEdyb3Vwcz4gcHV0LCBTdHJpbmcgaWQpIHsKKyAgICAgIHRoaXMucHV0ID0gcHV0OworICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgICAgQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQgaW4gPSBuZXcgQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQoKTsKKyAgICAgIGluLmdyb3VwcyA9IEltbXV0YWJsZUxpc3Qub2YoaWQpOworICAgICAgTGlzdDxHcm91cEluZm8+IGxpc3QgPSBwdXQuZ2V0KCkuYXBwbHkocmVzb3VyY2UsIGluKTsKKyAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgVXBkYXRlSW5jbHVkZWRHcm91cCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZSwgUHV0SW5jbHVkZWRHcm91cC5JbnB1dD4geworICAgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHZXRJbmNsdWRlZEdyb3VwPiBnZXQ7CisKKyAgICBASW5qZWN0CisgICAgVXBkYXRlSW5jbHVkZWRHcm91cChQcm92aWRlcjxHZXRJbmNsdWRlZEdyb3VwPiBnZXQpIHsKKyAgICAgIHRoaXMuZ2V0ID0gZ2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoSW5jbHVkZWRHcm91cFJlc291cmNlIHJlc291cmNlLAorICAgICAgICBQdXRJbmNsdWRlZEdyb3VwLklucHV0IGlucHV0KSB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICAgIC8vIERvIG5vdGhpbmcsIHRoZSBncm91cCBpcyBhbHJlYWR5IGluY2x1ZGVkLgorICAgICAgcmV0dXJuIGdldC5nZXQoKS5hcHBseShyZXNvdXJjZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0FkZE1lbWJlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQWRkTWVtYmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzJhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0FkZE1lbWJlcnMuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlckF1ZGl0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvbHZlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlcXVlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkTWVtYmVycy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2NsYXNzIEFkZE1lbWJlcnMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgX29uZU1lbWJlcjsKKworICAgIExpc3Q8U3RyaW5nPiBtZW1iZXJzOworCisgICAgc3RhdGljIElucHV0IGluaXQoSW5wdXQgaW4pIHsKKyAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgIGluID0gbmV3IElucHV0KCk7CisgICAgICB9CisgICAgICBpZiAoaW4ubWVtYmVycyA9PSBudWxsKSB7CisgICAgICAgIGluLm1lbWJlcnMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoMSk7CisgICAgICB9CisgICAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbi5fb25lTWVtYmVyKSkgeworICAgICAgICBpbi5tZW1iZXJzLmFkZChpbi5fb25lTWVtYmVyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIEF1dGhUeXBlIGF1dGhUeXBlOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHM7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworCisgIEBJbmplY3QKKyAgQWRkTWVtYmVycyhBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciwKKyAgICAgIEF1dGhDb25maWcgYXV0aENvbmZpZywKKyAgICAgIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHMsCisgICAgICBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAorICAgICAgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKKyAgICAgIFJldmlld0RiIGRiKSB7CisgICAgdGhpcy5hY2NvdW50TWFuYWdlciA9IGFjY291bnRNYW5hZ2VyOworICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoQ29uZmlnLmdldEF1dGhUeXBlKCk7CisgICAgdGhpcy5hY2NvdW50cyA9IGFjY291bnRzOworICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOworICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOworICAgIHRoaXMuZGIgPSBkYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxBY2NvdW50SW5mbz4gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwKKyAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGludGVybmFsR3JvdXAgPSByZXNvdXJjZS50b0FjY291bnRHcm91cCgpOworICAgIGlmIChpbnRlcm5hbEdyb3VwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGlucHV0ID0gSW5wdXQuaW5pdChpbnB1dCk7CisKKyAgICBHcm91cENvbnRyb2wgY29udHJvbCA9IHJlc291cmNlLmdldENvbnRyb2woKTsKKyAgICBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEdyb3VwTWVtYmVyPiBuZXdBY2NvdW50R3JvdXBNZW1iZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgTGlzdDxBY2NvdW50R3JvdXBNZW1iZXJBdWRpdD4gbmV3QWNjb3VudEdyb3VwTWVtYmVyQXVkaXRzID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIExpc3Q8QWNjb3VudEluZm8+IHJlc3VsdCA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBBY2NvdW50LklkIG1lID0gKChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpKS5nZXRBY2NvdW50SWQoKTsKKworICAgIGZvciAoU3RyaW5nIG5hbWVPckVtYWlsIDogaW5wdXQubWVtYmVycykgeworICAgICAgQWNjb3VudCBhID0gZmluZEFjY291bnQobmFtZU9yRW1haWwpOworICAgICAgaWYgKCFhLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJBY2NvdW50IEluYWN0aXZlOiAlcyIsIG5hbWVPckVtYWlsKSk7CisgICAgICB9CisKKyAgICAgIGlmICghY29udHJvbC5jYW5BZGRNZW1iZXIoYS5nZXRJZCgpKSkgeworICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiQ2Fubm90IGFkZCBtZW1iZXI6ICIgKyBhLmdldEZ1bGxOYW1lKCkpOworICAgICAgfQorCisgICAgICBpZiAoIW5ld0FjY291bnRHcm91cE1lbWJlcnMuY29udGFpbnNLZXkoYS5nZXRJZCgpKSkgeworICAgICAgICBBY2NvdW50R3JvdXBNZW1iZXIuS2V5IGtleSA9CisgICAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwTWVtYmVyLktleShhLmdldElkKCksIGludGVybmFsR3JvdXAuZ2V0SWQoKSk7CisgICAgICAgIEFjY291bnRHcm91cE1lbWJlciBtID0gZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmdldChrZXkpOworICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgbSA9IG5ldyBBY2NvdW50R3JvdXBNZW1iZXIoa2V5KTsKKyAgICAgICAgICBuZXdBY2NvdW50R3JvdXBNZW1iZXJzLnB1dChtLmdldEFjY291bnRJZCgpLCBtKTsKKyAgICAgICAgICBuZXdBY2NvdW50R3JvdXBNZW1iZXJBdWRpdHMuYWRkKG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLCBtZSkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXN1bHQuYWRkKEFjY291bnRJbmZvLnBhcnNlKGEsIHRydWUpKTsKKyAgICB9CisKKyAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzQXVkaXQoKS5pbnNlcnQobmV3QWNjb3VudEdyb3VwTWVtYmVyQXVkaXRzKTsKKyAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuaW5zZXJ0KG5ld0FjY291bnRHcm91cE1lbWJlcnMudmFsdWVzKCkpOworICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyIG0gOiBuZXdBY2NvdW50R3JvdXBNZW1iZXJzLnZhbHVlcygpKSB7CisgICAgICBhY2NvdW50Q2FjaGUuZXZpY3QobS5nZXRBY2NvdW50SWQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgQWNjb3VudCBmaW5kQWNjb3VudChTdHJpbmcgbmFtZU9yRW1haWwpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGFjY291bnRzLmdldCgpLnBhcnNlKG5hbWVPckVtYWlsKS5nZXRBY2NvdW50KCk7CisgICAgfSBjYXRjaCAoVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBtaWdodCBiZSBiZWNhdXNlIHRoZSBhY2NvdW50IGRvZXMgbm90IGV4aXN0IG9yIGJlY2F1c2UgdGhlIGFjY291bnQgaXMKKyAgICAgIC8vIG5vdCB2aXNpYmxlCisgICAgICBzd2l0Y2ggKGF1dGhUeXBlKSB7CisgICAgICAgIGNhc2UgSFRUUF9MREFQOgorICAgICAgICBjYXNlIENMSUVOVF9TU0xfQ0VSVF9MREFQOgorICAgICAgICBjYXNlIExEQVA6CisgICAgICAgICAgaWYgKGFjY291bnRSZXNvbHZlci5maW5kKG5hbWVPckVtYWlsKSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBhY2NvdW50IGRvZXMgbm90IGV4aXN0LCB0cnkgdG8gY3JlYXRlIGl0CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlQWNjb3VudEJ5TGRhcChuYW1lT3JFbWFpbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgfQorICAgICAgdGhyb3cgZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEFjY291bnQgY3JlYXRlQWNjb3VudEJ5TGRhcChTdHJpbmcgdXNlcikgeworICAgIGlmICghdXNlci5tYXRjaGVzKEFjY291bnQuVVNFUl9OQU1FX1BBVFRFUk4pKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgQXV0aFJlcXVlc3QgcmVxID0gQXV0aFJlcXVlc3QuZm9yVXNlcih1c2VyKTsKKyAgICAgIHJlcS5zZXRTa2lwQXV0aGVudGljYXRpb24odHJ1ZSk7CisgICAgICByZXR1cm4gYWNjb3VudENhY2hlLmdldChhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUocmVxKS5nZXRBY2NvdW50SWQoKSkKKyAgICAgICAgICAuZ2V0QWNjb3VudCgpOworICAgIH0gY2F0Y2ggKEFjY291bnRFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIFB1dE1lbWJlciBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIFB1dE1lbWJlci5JbnB1dD4geworICAgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBZGRNZW1iZXJzPiBwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisKKyAgICBQdXRNZW1iZXIoUHJvdmlkZXI8QWRkTWVtYmVycz4gcHV0LCBTdHJpbmcgaWQpIHsKKyAgICAgIHRoaXMucHV0ID0gcHV0OworICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgUHV0TWVtYmVyLklucHV0IGlucHV0KQorICAgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwKKyAgICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICAgIEFkZE1lbWJlcnMuSW5wdXQgaW4gPSBuZXcgQWRkTWVtYmVycy5JbnB1dCgpOworICAgICAgaW4uX29uZU1lbWJlciA9IGlkOworICAgICAgTGlzdDxBY2NvdW50SW5mbz4gbGlzdCA9IHB1dC5nZXQoKS5hcHBseShyZXNvdXJjZSwgaW4pOworICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBVcGRhdGVNZW1iZXIgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxNZW1iZXJSZXNvdXJjZSwgUHV0TWVtYmVyLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdldE1lbWJlcj4gZ2V0OworCisgICAgQEluamVjdAorICAgIFVwZGF0ZU1lbWJlcihQcm92aWRlcjxHZXRNZW1iZXI+IGdldCkgeworICAgICAgdGhpcy5nZXQgPSBnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcHBseShNZW1iZXJSZXNvdXJjZSByZXNvdXJjZSwgUHV0TWVtYmVyLklucHV0IGlucHV0KSB7CisgICAgICAvLyBEbyBub3RoaW5nLCB0aGUgdXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyLgorICAgICAgcmV0dXJuIGdldC5nZXQoKS5hcHBseShyZXNvdXJjZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0NyZWF0ZUdyb3VwLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0NyZWF0ZUdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNGNmMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQ3JlYXRlR3JvdXAuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtQ3JlYXRlR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkNyZWF0ZUdyb3VwLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX0dST1VQKQorY2xhc3MgQ3JlYXRlR3JvdXAgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxUb3BMZXZlbFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBCb29sZWFuIHZpc2libGVUb0FsbDsKKyAgICBTdHJpbmcgb3duZXJJZDsKKyAgfQorCisgIHN0YXRpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgQ3JlYXRlR3JvdXAgY3JlYXRlKEBBc3Npc3RlZCBTdHJpbmcgbmFtZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPElkZW50aWZpZWRVc2VyPiBzZWxmOworICBwcml2YXRlIGZpbmFsIEdyb3Vwc0NvbGxlY3Rpb24gZ3JvdXBzOworICBwcml2YXRlIGZpbmFsIFBlcmZvcm1DcmVhdGVHcm91cC5GYWN0b3J5IG9wOworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVmYXVsdFZpc2libGVUb0FsbDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICBASW5qZWN0CisgIENyZWF0ZUdyb3VwKFByb3ZpZGVyPElkZW50aWZpZWRVc2VyPiBzZWxmLCBHcm91cHNDb2xsZWN0aW9uIGdyb3VwcywKKyAgICAgIFBlcmZvcm1DcmVhdGVHcm91cC5GYWN0b3J5IHBlcmZvcm1DcmVhdGVHcm91cEZhY3RvcnksIEdyb3VwSnNvbiBqc29uLAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnLCBAQXNzaXN0ZWQgU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOworICAgIHRoaXMub3AgPSBwZXJmb3JtQ3JlYXRlR3JvdXBGYWN0b3J5OworICAgIHRoaXMuanNvbiA9IGpzb247CisgICAgdGhpcy5kZWZhdWx0VmlzaWJsZVRvQWxsID0gY2ZnLmdldEJvb2xlYW4oImdyb3VwcyIsICJuZXdHcm91cHNWaXNpYmxlVG9BbGwiLCBmYWxzZSk7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBJbmZvIGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sCisgICAgICBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7CisgICAgfQorICAgIGlmIChpbnB1dC5uYW1lICE9IG51bGwgJiYgIW5hbWUuZXF1YWxzKGlucHV0Lm5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibmFtZSBtdXN0IG1hdGNoIFVSTCIpOworICAgIH0KKworICAgIEFjY291bnRHcm91cC5JZCBvd25lcklkID0gb3duZXIoaW5wdXQpOworICAgIEFjY291bnRHcm91cCBncm91cDsKKyAgICB0cnkgeworICAgICAgZ3JvdXAgPSBvcC5jcmVhdGUoKS5jcmVhdGVHcm91cCgKKyAgICAgICAgICBuYW1lLAorICAgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuZGVzY3JpcHRpb24pLAorICAgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKGlucHV0LnZpc2libGVUb0FsbCwgZGVmYXVsdFZpc2libGVUb0FsbCksCisgICAgICAgICAgb3duZXJJZCwKKyAgICAgICAgICBvd25lcklkID09IG51bGwKKyAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNlbGYuZ2V0KCkuZ2V0QWNjb3VudElkKCkpCisgICAgICAgICAgICA6IENvbGxlY3Rpb25zLjxBY2NvdW50LklkPiBlbXB0eVNldCgpLAorICAgICAgICAgIG51bGwpOworICAgIH0gY2F0Y2ggKFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgICByZXR1cm4ganNvbi5mb3JtYXQoR3JvdXBEZXNjcmlwdGlvbnMuZm9yQWNjb3VudEdyb3VwKGdyb3VwKSk7CisgIH0KKworICBwcml2YXRlIEFjY291bnRHcm91cC5JZCBvd25lcihJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQub3duZXJJZCAhPSBudWxsKSB7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGQgPSBncm91cHMucGFyc2VJbnRlcm5hbChVcmwuZGVjb2RlKGlucHV0Lm93bmVySWQpKTsKKyAgICAgIHJldHVybiBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChkKS5nZXRJZCgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9EZWxldGVJbmNsdWRlZEdyb3Vwcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9EZWxldGVJbmNsdWRlZEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjkzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZUluY2x1ZGVkR3JvdXBzLmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBJbmNsdWRlQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkFkZEluY2x1ZGVkR3JvdXBzLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIERlbGV0ZUluY2x1ZGVkR3JvdXBzIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uOworICBwcml2YXRlIGZpbmFsIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZUNhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmOworCisgIEBJbmplY3QKKyAgRGVsZXRlSW5jbHVkZWRHcm91cHMoUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbiwKKyAgICAgIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZUNhY2hlLCBSZXZpZXdEYiBkYiwKKyAgICAgIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmKSB7CisgICAgdGhpcy5ncm91cHNDb2xsZWN0aW9uID0gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgICB0aGlzLmdyb3VwSW5jbHVkZUNhY2hlID0gZ3JvdXBJbmNsdWRlQ2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgaW50ZXJuYWxHcm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGludGVybmFsR3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaW5wdXQgPSBJbnB1dC5pbml0KGlucHV0KTsKKworICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIGZpbmFsIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gaW5jbHVkZWRHcm91cHMgPSBnZXRJbmNsdWRlZEdyb3VwcyhpbnRlcm5hbEdyb3VwLmdldElkKCkpOworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gdG9SZW1vdmUgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBpbmNsdWRlZEdyb3VwIDogaW5wdXQuZ3JvdXBzKSB7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGQgPSBncm91cHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKGluY2x1ZGVkR3JvdXApOworICAgICAgaWYgKCFjb250cm9sLmNhblJlbW92ZUdyb3VwKGQuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBkZWxldGUgZ3JvdXA6ICVzIiwKKyAgICAgICAgICAgIGQuZ2V0TmFtZSgpKSk7CisgICAgICB9CisKKyAgICAgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZyA9IGluY2x1ZGVkR3JvdXBzLnJlbW92ZShkLmdldEdyb3VwVVVJRCgpKTsKKyAgICAgIGlmIChnICE9IG51bGwpIHsKKyAgICAgICAgdG9SZW1vdmUuYWRkKGcpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghdG9SZW1vdmUuaXNFbXB0eSgpKSB7CisgICAgICB3cml0ZUF1ZGl0cyh0b1JlbW92ZSk7CisgICAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmRlbGV0ZSh0b1JlbW92ZSk7CisgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZyA6IHRvUmVtb3ZlKSB7CisgICAgICAgIGdyb3VwSW5jbHVkZUNhY2hlLmV2aWN0TWVtYmVySW4oZy5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgIH0KKyAgICAgIGdyb3VwSW5jbHVkZUNhY2hlLmV2aWN0TWVtYmVyc09mKGludGVybmFsR3JvdXAuZ2V0R3JvdXBVVUlEKCkpOworICAgIH0KKworICAgIHJldHVybiBSZXNwb25zZS5ub25lKCk7CisgIH0KKworICBwcml2YXRlIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gZ2V0SW5jbHVkZWRHcm91cHMoCisgICAgICBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFwPEFjY291bnRHcm91cC5VVUlELCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBncm91cHMgPQorICAgICAgICBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZyA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuYnlHcm91cChncm91cElkKSkgeworICAgICAgZ3JvdXBzLnB1dChnLmdldEluY2x1ZGVVVUlEKCksIGcpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXBzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlQXVkaXRzKGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gdG9CZVJlbW92ZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gKChJZGVudGlmaWVkVXNlcikgc2VsZi5nZXQoKSkuZ2V0QWNjb3VudElkKCk7CisgICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ+IGF1ZGl0VXBkYXRlcyA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZyA6IHRvQmVSZW1vdmVkKSB7CisgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQgYXVkaXQgPSBudWxsOworICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQgYSA6IGRiCisgICAgICAgICAgLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkQXVkaXQoKS5ieUdyb3VwSW5jbHVkZShnLmdldEdyb3VwSWQoKSwKKyAgICAgICAgICAgICAgZy5nZXRJbmNsdWRlVVVJRCgpKSkgeworICAgICAgICBpZiAoYS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgYXVkaXQgPSBhOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChhdWRpdCAhPSBudWxsKSB7CisgICAgICAgIGF1ZGl0LnJlbW92ZWQobWUpOworICAgICAgICBhdWRpdFVwZGF0ZXMuYWRkKGF1ZGl0KTsKKyAgICAgIH0KKyAgICB9CisgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWRBdWRpdCgpLnVwZGF0ZShhdWRpdFVwZGF0ZXMpOworICB9CisKKyAgc3RhdGljIGNsYXNzIERlbGV0ZUluY2x1ZGVkR3JvdXAgaW1wbGVtZW50cworICAgICAgUmVzdE1vZGlmeVZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlLCBEZWxldGVJbmNsdWRlZEdyb3VwLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPERlbGV0ZUluY2x1ZGVkR3JvdXBzPiBkZWxldGU7CisKKyAgICBASW5qZWN0CisgICAgRGVsZXRlSW5jbHVkZWRHcm91cChmaW5hbCBQcm92aWRlcjxEZWxldGVJbmNsdWRlZEdyb3Vwcz4gZGVsZXRlKSB7CisgICAgICB0aGlzLmRlbGV0ZSA9IGRlbGV0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KEluY2x1ZGVkR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgICAgQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQgaW4gPSBuZXcgQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQoKTsKKyAgICAgIGluLmdyb3VwcyA9IEltbXV0YWJsZUxpc3Qub2YocmVzb3VyY2UuZ2V0TWVtYmVyKCkuZ2V0KCkpOworICAgICAgcmV0dXJuIGRlbGV0ZS5nZXQoKS5hcHBseShyZXNvdXJjZSwgaW4pOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9EZWxldGVNZW1iZXJzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZU1lbWJlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI3NmNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9EZWxldGVNZW1iZXJzLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXJBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkTWVtYmVycy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBEZWxldGVNZW1iZXJzIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBY2NvdW50c0NvbGxlY3Rpb24+IGFjY291bnRzOworICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGY7CisKKyAgQEluamVjdAorICBEZWxldGVNZW1iZXJzKFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHMsCisgICAgICBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLCBSZXZpZXdEYiBkYiwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGYpIHsKKyAgICB0aGlzLmFjY291bnRzID0gYWNjb3VudHM7CisgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgaW50ZXJuYWxHcm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGludGVybmFsR3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaW5wdXQgPSBJbnB1dC5pbml0KGlucHV0KTsKKworICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBBY2NvdW50R3JvdXBNZW1iZXI+IG1lbWJlcnMgPSBnZXRNZW1iZXJzKGludGVybmFsR3JvdXAuZ2V0SWQoKSk7CisgICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBNZW1iZXI+IHRvUmVtb3ZlID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworCisgICAgZm9yIChmaW5hbCBTdHJpbmcgbmFtZU9yRW1haWwgOiBpbnB1dC5tZW1iZXJzKSB7CisgICAgICBBY2NvdW50IGEgPSBhY2NvdW50cy5nZXQoKS5wYXJzZShuYW1lT3JFbWFpbCkuZ2V0QWNjb3VudCgpOworCisgICAgICBpZiAoIWNvbnRyb2wuY2FuUmVtb3ZlTWVtYmVyKGEuZ2V0SWQoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkNhbm5vdCBkZWxldGUgbWVtYmVyOiAiICsgYS5nZXRGdWxsTmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIG0gPSBtZW1iZXJzLnJlbW92ZShhLmdldElkKCkpOworICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICB0b1JlbW92ZS5hZGQobSk7CisgICAgICB9CisgICAgfQorCisgICAgd3JpdGVBdWRpdHModG9SZW1vdmUpOworICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5kZWxldGUodG9SZW1vdmUpOworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIG0gOiB0b1JlbW92ZSkgeworICAgICAgYWNjb3VudENhY2hlLmV2aWN0KG0uZ2V0QWNjb3VudElkKCkpOworICAgIH0KKworICAgIHJldHVybiBSZXNwb25zZS5ub25lKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVBdWRpdHMoZmluYWwgTGlzdDxBY2NvdW50R3JvdXBNZW1iZXI+IHRvQmVSZW1vdmVkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9ICgoSWRlbnRpZmllZFVzZXIpIHNlbGYuZ2V0KCkpLmdldEFjY291bnRJZCgpOworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ+IGF1ZGl0VXBkYXRlcyA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRHcm91cE1lbWJlckF1ZGl0PiBhdWRpdEluc2VydHMgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgbSA6IHRvQmVSZW1vdmVkKSB7CisgICAgICBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdCBhdWRpdCA9IG51bGw7CisgICAgICBmb3IgKEFjY291bnRHcm91cE1lbWJlckF1ZGl0IGEgOiBkYi5hY2NvdW50R3JvdXBNZW1iZXJzQXVkaXQoKQorICAgICAgICAgIC5ieUdyb3VwQWNjb3VudChtLmdldEFjY291bnRHcm91cElkKCksIG0uZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICAgIGlmIChhLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICBhdWRpdCA9IGE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGF1ZGl0ICE9IG51bGwpIHsKKyAgICAgICAgYXVkaXQucmVtb3ZlZChtZSk7CisgICAgICAgIGF1ZGl0VXBkYXRlcy5hZGQoYXVkaXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXVkaXQgPSBuZXcgQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQobSwgbWUpOworICAgICAgICBhdWRpdC5yZW1vdmVkTGVnYWN5KCk7CisgICAgICAgIGF1ZGl0SW5zZXJ0cy5hZGQoYXVkaXQpOworICAgICAgfQorICAgIH0KKyAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzQXVkaXQoKS51cGRhdGUoYXVkaXRVcGRhdGVzKTsKKyAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzQXVkaXQoKS5pbnNlcnQoYXVkaXRJbnNlcnRzKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPEFjY291bnQuSWQsIEFjY291bnRHcm91cE1lbWJlcj4gZ2V0TWVtYmVycygKKyAgICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEdyb3VwTWVtYmVyPiBtZW1iZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgbSA6IGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5ieUdyb3VwKGdyb3VwSWQpKSB7CisgICAgICBtZW1iZXJzLnB1dChtLmdldEFjY291bnRJZCgpLCBtKTsKKyAgICB9CisgICAgcmV0dXJuIG1lbWJlcnM7CisgIH0KKworICBzdGF0aWMgY2xhc3MgRGVsZXRlTWVtYmVyIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8TWVtYmVyUmVzb3VyY2UsIERlbGV0ZU1lbWJlci5JbnB1dD4geworICAgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxEZWxldGVNZW1iZXJzPiBkZWxldGU7CisKKyAgICBASW5qZWN0CisgICAgRGVsZXRlTWVtYmVyKGZpbmFsIFByb3ZpZGVyPERlbGV0ZU1lbWJlcnM+IGRlbGV0ZSkgeworICAgICAgdGhpcy5kZWxldGUgPSBkZWxldGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcHBseShNZW1iZXJSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLAorICAgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIE5vU3VjaEdyb3VwRXhjZXB0aW9uIHsKKyAgICAgIEFkZE1lbWJlcnMuSW5wdXQgaW4gPSBuZXcgQWRkTWVtYmVycy5JbnB1dCgpOworICAgICAgaW4uX29uZU1lbWJlciA9IHJlc291cmNlLmdldE1lbWJlcigpLmdldEFjY291bnRJZCgpLnRvU3RyaW5nKCk7CisgICAgICByZXR1cm4gZGVsZXRlLmdldCgpLmFwcGx5KHJlc291cmNlLCBpbik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldERlc2NyaXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldERlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3NGEyMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKKworY2xhc3MgR2V0RGVzY3JpcHRpb24gaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8R3JvdXBSZXNvdXJjZT4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZ3MubnVsbFRvRW1wdHkoZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGV0YWlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldERldGFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZDJlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldERldGFpbC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZ3JvdXBzLkxpc3RHcm91cHNPcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIEdldERldGFpbCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxHcm91cFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXREZXRhaWwoR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uLmFkZE9wdGlvbihMaXN0R3JvdXBzT3B0aW9uLk1FTUJFUlMpCisgICAgICAgIC5hZGRPcHRpb24oTGlzdEdyb3Vwc09wdGlvbi5JTkNMVURFUyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdyb3VwSW5mbyBhcHBseShHcm91cFJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBqc29uLmZvcm1hdChyc3JjKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRHcm91cC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTgwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEdyb3VwLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2NsYXNzIEdldEdyb3VwIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldEdyb3VwKEdyb3VwSnNvbiBqc29uKSB7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBJbmZvIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBqc29uLmZvcm1hdChyZXNvdXJjZS5nZXRHcm91cCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRJbmNsdWRlZEdyb3VwLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEluY2x1ZGVkR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYyMGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRJbmNsdWRlZEdyb3VwLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBHZXRJbmNsdWRlZEdyb3VwIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4gIHsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldEluY2x1ZGVkR3JvdXAoR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoSW5jbHVkZWRHcm91cFJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBqc29uLmZvcm1hdChyc3JjLmdldE1lbWJlckRlc2NyaXB0aW9uKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldE1lbWJlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRNZW1iZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRNZW1iZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKKworcHVibGljIGNsYXNzIEdldE1lbWJlciBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxNZW1iZXJSZXNvdXJjZT4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIEFjY291bnRJbmZvIGFwcGx5KE1lbWJlclJlc291cmNlIHJlc291cmNlKSB7CisgICAgcmV0dXJuIEFjY291bnRJbmZvLnBhcnNlKHJlc291cmNlLmdldE1lbWJlcigpLmdldEFjY291bnQoKSwgdHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0TmFtZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkYTdjNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0TmFtZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworCitwdWJsaWMgY2xhc3MgR2V0TmFtZSBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxHcm91cFJlc291cmNlPiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIHJldHVybiByZXNvdXJjZS5nZXROYW1lKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0T3B0aW9ucy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZiZmM3MAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworCitwdWJsaWMgY2xhc3MgR2V0T3B0aW9ucyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxHcm91cFJlc291cmNlPiB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cE9wdGlvbnNJbmZvIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gbmV3IEdyb3VwT3B0aW9uc0luZm8ocmVzb3VyY2UuZ2V0R3JvdXAoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0T3duZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0T3duZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEzYTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0T3duZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0T3duZXIgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8R3JvdXBSZXNvdXJjZT4geworCisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgY29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXRPd25lcihHcm91cENvbnRyb2wuRmFjdG9yeSBjb250cm9sRmFjdG9yeSwgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmNvbnRyb2xGYWN0b3J5ID0gY29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBJbmZvIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSByZXNvdXJjZS50b0FjY291bnRHcm91cCgpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0cnkgeworICAgICAgR3JvdXBDb250cm9sIGMgPSBjb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihncm91cC5nZXRPd25lckdyb3VwVVVJRCgpKTsKKyAgICAgIHJldHVybiBqc29uLmZvcm1hdChjLmdldEdyb3VwKCkpOworICAgIH0gY2F0Y2ggKE5vU3VjaEdyb3VwRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwSnNvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Hcm91cEpzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRlNmVmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Hcm91cEpzb24uamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZ3JvdXBzLkxpc3RHcm91cHNPcHRpb24uSU5DTFVERVM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5ncm91cHMuTGlzdEdyb3Vwc09wdGlvbi5NRU1CRVJTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmdyb3Vwcy5MaXN0R3JvdXBzT3B0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cEpzb24geworICBwcml2YXRlIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7CisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0TWVtYmVycz4gbGlzdE1lbWJlcnM7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdEluY2x1ZGVkR3JvdXBzPiBsaXN0SW5jbHVkZXM7CisgIHByaXZhdGUgRW51bVNldDxMaXN0R3JvdXBzT3B0aW9uPiBvcHRpb25zOworCisgIEBJbmplY3QKKyAgR3JvdXBKc29uKEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCisgICAgICBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8TGlzdE1lbWJlcnM+IGxpc3RNZW1iZXJzLAorICAgICAgUHJvdmlkZXI8TGlzdEluY2x1ZGVkR3JvdXBzPiBsaXN0SW5jbHVkZXMpIHsKKyAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKKyAgICB0aGlzLmdyb3VwQ29udHJvbEZhY3RvcnkgPSBncm91cENvbnRyb2xGYWN0b3J5OworICAgIHRoaXMubGlzdE1lbWJlcnMgPSBsaXN0TWVtYmVyczsKKyAgICB0aGlzLmxpc3RJbmNsdWRlcyA9IGxpc3RJbmNsdWRlczsKKworICAgIG9wdGlvbnMgPSBFbnVtU2V0Lm5vbmVPZihMaXN0R3JvdXBzT3B0aW9uLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBHcm91cEpzb24gYWRkT3B0aW9uKExpc3RHcm91cHNPcHRpb24gbykgeworICAgIG9wdGlvbnMuYWRkKG8pOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIEdyb3VwSnNvbiBhZGRPcHRpb25zKENvbGxlY3Rpb248TGlzdEdyb3Vwc09wdGlvbj4gbykgeworICAgIG9wdGlvbnMuYWRkQWxsKG8pOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHVibGljIEdyb3VwSW5mbyBmb3JtYXQoR3JvdXBSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBHcm91cEluZm8gaW5mbyA9IGluaXQocnNyYy5nZXRHcm91cCgpKTsKKyAgICBpbml0TWVtYmVyc0FuZEluY2x1ZGVzKHJzcmMsIGluZm8pOworICAgIHJldHVybiBpbmZvOworICB9CisKKyAgcHVibGljIEdyb3VwSW5mbyBmb3JtYXQoR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgR3JvdXBJbmZvIGluZm8gPSBpbml0KGdyb3VwKTsKKyAgICBpZiAob3B0aW9ucy5jb250YWlucyhNRU1CRVJTKSB8fCBvcHRpb25zLmNvbnRhaW5zKElOQ0xVREVTKSkgeworICAgICAgR3JvdXBSZXNvdXJjZSByc3JjID0KKyAgICAgICAgICBuZXcgR3JvdXBSZXNvdXJjZShncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoZ3JvdXApKTsKKyAgICAgIGluaXRNZW1iZXJzQW5kSW5jbHVkZXMocnNyYywgaW5mbyk7CisgICAgfQorICAgIHJldHVybiBpbmZvOworICB9CisKKyAgcHJpdmF0ZSBHcm91cEluZm8gaW5pdChHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwKSB7CisgICAgR3JvdXBJbmZvIGluZm8gPSBuZXcgR3JvdXBJbmZvKCk7CisgICAgaW5mby5pZCA9IFVybC5lbmNvZGUoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkuZ2V0KCkpOworICAgIGluZm8ubmFtZSA9IFN0cmluZ3MuZW1wdHlUb051bGwoZ3JvdXAuZ2V0TmFtZSgpKTsKKyAgICBpbmZvLnVybCA9IFN0cmluZ3MuZW1wdHlUb051bGwoZ3JvdXAuZ2V0VXJsKCkpOworICAgIGluZm8ub3B0aW9ucyA9IG5ldyBHcm91cE9wdGlvbnNJbmZvKGdyb3VwKTsKKworICAgIEFjY291bnRHcm91cCBnID0gR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoZ3JvdXApOworICAgIGlmIChnICE9IG51bGwpIHsKKyAgICAgIGluZm8uZGVzY3JpcHRpb24gPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGcuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgICBpbmZvLmdyb3VwSWQgPSBnLmdldElkKCkuZ2V0KCk7CisgICAgICBpZiAoZy5nZXRPd25lckdyb3VwVVVJRCgpICE9IG51bGwpIHsKKyAgICAgICAgaW5mby5vd25lcklkID0gVXJsLmVuY29kZShnLmdldE93bmVyR3JvdXBVVUlEKCkuZ2V0KCkpOworICAgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIG8gPSBncm91cEJhY2tlbmQuZ2V0KGcuZ2V0T3duZXJHcm91cFVVSUQoKSk7CisgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICBpbmZvLm93bmVyID0gby5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5mbzsKKyAgfQorCisgIHByaXZhdGUgR3JvdXBJbmZvIGluaXRNZW1iZXJzQW5kSW5jbHVkZXMoR3JvdXBSZXNvdXJjZSByc3JjLCBHcm91cEluZm8gaW5mbykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGlmIChyc3JjLnRvQWNjb3VudEdyb3VwKCkgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGluZm87CisgICAgfQorICAgIHRyeSB7CisgICAgICBpZiAob3B0aW9ucy5jb250YWlucyhNRU1CRVJTKSkgeworICAgICAgICBpbmZvLm1lbWJlcnMgPSBsaXN0TWVtYmVycy5nZXQoKS5hcHBseShyc3JjKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9wdGlvbnMuY29udGFpbnMoSU5DTFVERVMpKSB7CisgICAgICAgIGluZm8uaW5jbHVkZXMgPSBsaXN0SW5jbHVkZXMuZ2V0KCkuYXBwbHkocnNyYyk7CisgICAgICB9CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9IGNhdGNoIChNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIHRoaXMgZXhjZXB0aW9uIGlzIG9ubHkgdGhyb3duIGlmIHdlIHdvdWxkIHRyeSB0bworICAgICAgLy8gbGlzdCBtZW1iZXJzL2luY2x1ZGVzIG9mIGFuIGV4dGVybmFsIGdyb3VwLCBidXQgaW4gY2FzZSBvZiBhbiBleHRlcm5hbAorICAgICAgLy8gZ3JvdXAgd2UgcmV0dXJuIGJlZm9yZQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwSW5mbyB7CisgICAgZmluYWwgU3RyaW5nIGtpbmQgPSAiZ2Vycml0Y29kZXJldmlldyNncm91cCI7CisgICAgcHVibGljIFN0cmluZyBpZDsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIFN0cmluZyB1cmw7CisgICAgcHVibGljIEdyb3VwT3B0aW9uc0luZm8gb3B0aW9uczsKKworICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgb25seSBzdXBwbGllZCBmb3IgaW50ZXJuYWwgZ3JvdXBzLgorICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgcHVibGljIEludGVnZXIgZ3JvdXBJZDsKKyAgICBwdWJsaWMgU3RyaW5nIG93bmVyOworICAgIHB1YmxpYyBTdHJpbmcgb3duZXJJZDsKKworICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgb25seSBzdXBwbGllZCBmb3IgaW50ZXJuYWwgZ3JvdXBzLCBidXQgb25seSBpZiByZXF1ZXN0ZWQKKyAgICBwdWJsaWMgTGlzdDxBY2NvdW50SW5mbz4gbWVtYmVyczsKKyAgICBwdWJsaWMgTGlzdDxHcm91cEluZm8+IGluY2x1ZGVzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwT3B0aW9uc0luZm8uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBPcHRpb25zSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTkyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwT3B0aW9uc0luZm8uamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworCitwdWJsaWMgY2xhc3MgR3JvdXBPcHRpb25zSW5mbyB7CisgIHB1YmxpYyBCb29sZWFuIHZpc2libGVUb0FsbDsKKworICBwdWJsaWMgR3JvdXBPcHRpb25zSW5mbyhHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwKSB7CisgICAgQWNjb3VudEdyb3VwIGFnID0gR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoZ3JvdXApOworICAgIHZpc2libGVUb0FsbCA9IGFnICE9IG51bGwgJiYgYWcuaXNWaXNpYmxlVG9BbGwoKSA/IHRydWUgOiBudWxsOworICB9CisKKyAgcHVibGljIEdyb3VwT3B0aW9uc0luZm8oQWNjb3VudEdyb3VwIGdyb3VwKSB7CisgICAgdmlzaWJsZVRvQWxsID0gZ3JvdXAuaXNWaXNpYmxlVG9BbGwoKSA/IHRydWUgOiBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTEzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIEdyb3VwUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+PiBHUk9VUF9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxHcm91cFJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sOworCisgIEdyb3VwUmVzb3VyY2UoR3JvdXBDb250cm9sIGNvbnRyb2wpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sOworICB9CisKKyAgR3JvdXBSZXNvdXJjZShHcm91cFJlc291cmNlIHJzcmMpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSByc3JjLmdldENvbnRyb2woKTsKKyAgfQorCisgIHB1YmxpYyBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdldEdyb3VwKCkgeworICAgIHJldHVybiBjb250cm9sLmdldEdyb3VwKCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIGdldEdyb3VwKCkuZ2V0TmFtZSgpOworICB9CisKKyAgcHVibGljIEFjY291bnRHcm91cC5VVUlEIGdldEdyb3VwVVVJRCgpIHsKKyAgICByZXR1cm4gZ2V0R3JvdXAoKS5nZXRHcm91cFVVSUQoKTsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXAgdG9BY2NvdW50R3JvdXAoKSB7CisgICAgcmV0dXJuIEdyb3VwRGVzY3JpcHRpb25zLnRvQWNjb3VudEdyb3VwKGdldEdyb3VwKCkpOworICB9CisKKyAgcHVibGljIEdyb3VwQ29udHJvbCBnZXRDb250cm9sKCkgeworICAgIHJldHVybiBjb250cm9sOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3Vwc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOGE1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3Vwc0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgR3JvdXBzQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgUmVzdENvbGxlY3Rpb248VG9wTGV2ZWxSZXNvdXJjZSwgR3JvdXBSZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxUb3BMZXZlbFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxHcm91cFJlc291cmNlPj4gdmlld3M7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdEdyb3Vwcz4gbGlzdDsKKyAgcHJpdmF0ZSBmaW5hbCBDcmVhdGVHcm91cC5GYWN0b3J5IGNyZWF0ZUdyb3VwOworICBwcml2YXRlIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZjsKKworICBASW5qZWN0CisgIEdyb3Vwc0NvbGxlY3Rpb24oZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxHcm91cFJlc291cmNlPj4gdmlld3MsCisgICAgICBmaW5hbCBQcm92aWRlcjxMaXN0R3JvdXBzPiBsaXN0LAorICAgICAgZmluYWwgQ3JlYXRlR3JvdXAuRmFjdG9yeSBjcmVhdGVHcm91cCwKKyAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAorICAgICAgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGYpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICB0aGlzLmNyZWF0ZUdyb3VwID0gY3JlYXRlR3JvdXA7CisgICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxUb3BMZXZlbFJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICBBdXRoRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBDdXJyZW50VXNlciB1c2VyID0gc2VsZi5nZXQoKTsKKyAgICBpZiAodXNlciBpbnN0YW5jZW9mIEFub255bW91c1VzZXIpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworICAgIH0gZWxzZSBpZighKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcmV0dXJuIGxpc3QuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdyb3VwUmVzb3VyY2UgcGFyc2UoVG9wTGV2ZWxSZXNvdXJjZSBwYXJlbnQsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXIgPSBzZWxmLmdldCgpOworICAgIGlmICh1c2VyIGluc3RhbmNlb2YgQW5vbnltb3VzVXNlcikgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIik7CisgICAgfSBlbHNlIGlmKCEodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgIH0KKworICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ3JvdXAgPSBfcGFyc2UoaWQuZ2V0KCkpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZC5nZXQoKSk7CisgICAgfQorICAgIEdyb3VwQ29udHJvbCBjdGwgPSBncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoZ3JvdXApOworICAgIGlmICghY3RsLmlzVmlzaWJsZSgpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgR3JvdXBSZXNvdXJjZShjdGwpOworICB9CisKKyAgLyoqCisgICAqIFBhcnNlcyBhIGdyb3VwIElEIGZyb20gYSByZXF1ZXN0IGJvZHkgYW5kIHJldHVybnMgdGhlIGdyb3VwLgorICAgKgorICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIGdyb3VwLCBjYW4gYmUgYSBncm91cCBVVUlELCBhIGdyb3VwIG5hbWUgb3IgYSBsZWdhY3kKKyAgICogICAgICAgIGdyb3VwIElECisgICAqIEByZXR1cm4gdGhlIGdyb3VwCisgICAqIEB0aHJvd3MgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGdyb3VwIElEIGNhbm5vdCBiZQorICAgKiAgICAgICAgIHJlc29sdmVkIG9yIGlmIHRoZSBncm91cCBpcyBub3QgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyCisgICAqLworICBwdWJsaWMgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBwYXJzZShTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiB7CisgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCA9IF9wYXJzZShpZCk7CisgICAgaWYgKGdyb3VwID09IG51bGwgfHwgIWdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cCkuaXNWaXNpYmxlKCkpIHsKKyAgICAgIHRocm93IG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIkdyb3VwIE5vdCBGb3VuZDogJXMiLCBpZCkpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIGEgZ3JvdXAgSUQgZnJvbSBhIHJlcXVlc3QgYm9keSBhbmQgcmV0dXJucyB0aGUgZ3JvdXAgaWYgaXQgaXMgYQorICAgKiBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisgICAqCisgICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgZ3JvdXAsIGNhbiBiZSBhIGdyb3VwIFVVSUQsIGEgZ3JvdXAgbmFtZSBvciBhIGxlZ2FjeQorICAgKiAgICAgICAgZ3JvdXAgSUQKKyAgICogQHJldHVybiB0aGUgZ3JvdXAKKyAgICogQHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHRocm93biBpZiB0aGUgZ3JvdXAgSUQgY2Fubm90IGJlCisgICAqICAgICAgICAgcmVzb2x2ZWQsIGlmIHRoZSBncm91cCBpcyBub3QgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyIG9yIGlmCisgICAqICAgICAgICAgaXQncyBhbiBleHRlcm5hbCBncm91cAorICAgKi8KKyAgcHVibGljIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgcGFyc2VJbnRlcm5hbChTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiB7CisgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCA9IHBhcnNlKGlkKTsKKyAgICBpZiAoR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoZ3JvdXApID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIkV4dGVybmFsIEdyb3VwIE5vdCBBbGxvd2VkOiAlcyIsIGlkKSk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKKyAgfQorCisgIHByaXZhdGUgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBfcGFyc2UoU3RyaW5nIGlkKSB7CisgICAgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA9IG5ldyBBY2NvdW50R3JvdXAuVVVJRChpZCk7CisgICAgaWYgKGdyb3VwQmFja2VuZC5oYW5kbGVzKHV1aWQpKSB7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGQgPSBncm91cEJhY2tlbmQuZ2V0KHV1aWQpOworICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNaWdodCBiZSBhIGxlZ2FjeSBBY2NvdW50R3JvdXAuSWQuCisgICAgaWYgKGlkLm1hdGNoZXMoIl5bMS05XVswLTldKiQiKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgQWNjb3VudEdyb3VwLklkIGxlZ2FjeUlkID0gQWNjb3VudEdyb3VwLklkLnBhcnNlKGlkKTsKKyAgICAgICAgcmV0dXJuIGdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihsZWdhY3lJZCkuZ2V0R3JvdXAoKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnZhbGlkSWQpIHsKKyAgICAgIH0gY2F0Y2ggKE5vU3VjaEdyb3VwRXhjZXB0aW9uIGUpIHsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNaWdodCBiZSBhIGdyb3VwIG5hbWUsIGJlIG5pY2UgYW5kIGFjY2VwdCB1bmlxdWUgbmFtZXMuCisgICAgR3JvdXBSZWZlcmVuY2UgcmVmID0gR3JvdXBCYWNrZW5kcy5maW5kRXhhY3RTdWdnZXN0aW9uKGdyb3VwQmFja2VuZCwgaWQpOworICAgIGlmIChyZWYgIT0gbnVsbCkgeworICAgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBkID0gZ3JvdXBCYWNrZW5kLmdldChyZWYuZ2V0VVVJRCgpKTsKKyAgICAgIGlmIChkICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDcmVhdGVHcm91cCBjcmVhdGUoVG9wTGV2ZWxSZXNvdXJjZSByb290LCBJZFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyb3VwLmNyZWF0ZShuYW1lLmdldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxHcm91cFJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0luY2x1ZGVkR3JvdXBSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9JbmNsdWRlZEdyb3VwUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI5OWExCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9JbmNsdWRlZEdyb3VwUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIEluY2x1ZGVkR3JvdXBSZXNvdXJjZSBleHRlbmRzIEdyb3VwUmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4+IElOQ0xVREVEX0dST1VQX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cERlc2NyaXB0aW9uLkJhc2ljIG1lbWJlcjsKKworICBJbmNsdWRlZEdyb3VwUmVzb3VyY2UoR3JvdXBSZXNvdXJjZSBncm91cCwgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBtZW1iZXIpIHsKKyAgICBzdXBlcihncm91cCk7CisgICAgdGhpcy5tZW1iZXIgPSBtZW1iZXI7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwLlVVSUQgZ2V0TWVtYmVyKCkgeworICAgIHJldHVybiBnZXRNZW1iZXJEZXNjcmlwdGlvbigpLmdldEdyb3VwVVVJRCgpOworICB9CisKKyAgcHVibGljIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ2V0TWVtYmVyRGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuIG1lbWJlcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9JbmNsdWRlZEdyb3Vwc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvSW5jbHVkZWRHcm91cHNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1MmNhYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvSW5jbHVkZWRHcm91cHNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQWNjZXB0c0NyZWF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQ2hpbGRDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkFkZEluY2x1ZGVkR3JvdXBzLlB1dEluY2x1ZGVkR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBJbmNsdWRlZEdyb3Vwc0NvbGxlY3Rpb24gaW1wbGVtZW50cworICAgIENoaWxkQ29sbGVjdGlvbjxHcm91cFJlc291cmNlLCBJbmNsdWRlZEdyb3VwUmVzb3VyY2U+LAorICAgIEFjY2VwdHNDcmVhdGU8R3JvdXBSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPj4gdmlld3M7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdEluY2x1ZGVkR3JvdXBzPiBsaXN0OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb247CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8QWRkSW5jbHVkZWRHcm91cHM+IHB1dDsKKworICBASW5qZWN0CisgIEluY2x1ZGVkR3JvdXBzQ29sbGVjdGlvbihEeW5hbWljTWFwPFJlc3RWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4+IHZpZXdzLAorICAgICAgUHJvdmlkZXI8TGlzdEluY2x1ZGVkR3JvdXBzPiBsaXN0LAorICAgICAgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbiwKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLCBQcm92aWRlcjxBZGRJbmNsdWRlZEdyb3Vwcz4gcHV0KSB7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgICAgdGhpcy5ncm91cHNDb2xsZWN0aW9uID0gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMucHV0ID0gcHV0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxHcm91cFJlc291cmNlPiBsaXN0KCkgeworICAgIHJldHVybiBsaXN0LmdldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbmNsdWRlZEdyb3VwUmVzb3VyY2UgcGFyc2UoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIHBhcmVudCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgbWVtYmVyID0KKyAgICAgICAgZ3JvdXBzQ29sbGVjdGlvbi5nZXQoKS5wYXJzZShUb3BMZXZlbFJlc291cmNlLklOU1RBTkNFLCBpZCkuZ2V0R3JvdXAoKTsKKyAgICBpZiAoaXNNZW1iZXIocGFyZW50LCBtZW1iZXIpCisgICAgICAgICYmIHJlc291cmNlLmdldENvbnRyb2woKS5jYW5TZWVHcm91cChtZW1iZXIuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICByZXR1cm4gbmV3IEluY2x1ZGVkR3JvdXBSZXNvdXJjZShyZXNvdXJjZSwgbWVtYmVyKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGlzTWVtYmVyKEFjY291bnRHcm91cCBwYXJlbnQsIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgbWVtYmVyKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGRiUHJvdmlkZXIuZ2V0KCkuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5nZXQoCisgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleSgKKyAgICAgICAgICAgIHBhcmVudC5nZXRJZCgpLAorICAgICAgICAgICAgbWVtYmVyLmdldEdyb3VwVVVJRCgpKSkgIT0gbnVsbDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFB1dEluY2x1ZGVkR3JvdXAgY3JlYXRlKEdyb3VwUmVzb3VyY2UgZ3JvdXAsIElkU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIG5ldyBQdXRJbmNsdWRlZEdyb3VwKHB1dCwgaWQuZ2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9MaXN0R3JvdXBzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2VjMDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9MaXN0R3JvdXBzLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5ncm91cHMuTGlzdEdyb3Vwc09wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR2V0R3JvdXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb21wYXJhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKiBMaXN0IGdyb3VwcyB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIuICovCitwdWJsaWMgY2xhc3MgTGlzdEdyb3VwcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxUb3BMZXZlbFJlc291cmNlPiB7CisKKyAgcHJvdGVjdGVkIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKworICBwcml2YXRlIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkdlbmVyaWNGYWN0b3J5IGdlbmVyaWNHcm91cENvbnRyb2xGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPElkZW50aWZpZWRVc2VyPiBpZGVudGlmaWVkVXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHZXRHcm91cHM+IGFjY291bnRHZXRHcm91cHM7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisgIHByaXZhdGUgRW51bVNldDxMaXN0R3JvdXBzT3B0aW9uPiBvcHRpb25zOworCisgIEBPcHRpb24obmFtZSA9ICItLXByb2plY3QiLCBhbGlhc2VzID0geyItcCJ9LAorICAgICAgdXNhZ2UgPSAicHJvamVjdHMgZm9yIHdoaWNoIHRoZSBncm91cHMgc2hvdWxkIGJlIGxpc3RlZCIpCisgIHByaXZhdGUgZmluYWwgTGlzdDxQcm9qZWN0Q29udHJvbD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RDb250cm9sPigpOworCisgIEBPcHRpb24obmFtZSA9ICItLXZpc2libGUtdG8tYWxsIiwgdXNhZ2UgPSAidG8gbGlzdCBvbmx5IGdyb3VwcyB0aGF0IGFyZSB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzIikKKyAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKKworICBAT3B0aW9uKG5hbWUgPSAiLS10eXBlIiwgdXNhZ2UgPSAidHlwZSBvZiBncm91cCIpCisgIHByaXZhdGUgQWNjb3VudEdyb3VwLlR5cGUgZ3JvdXBUeXBlOworCisgIEBPcHRpb24obmFtZSA9ICItLXVzZXIiLCBhbGlhc2VzID0geyItdSJ9LAorICAgICAgdXNhZ2UgPSAidXNlciBmb3Igd2hpY2ggdGhlIGdyb3VwcyBzaG91bGQgYmUgbGlzdGVkIikKKyAgcHJpdmF0ZSBBY2NvdW50LklkIHVzZXI7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tb3duZWQiLCB1c2FnZSA9ICJ0byBsaXN0IG9ubHkgZ3JvdXBzIHRoYXQgYXJlIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgdXNlciIKKyAgICAgICsgIiBvciBieSB0aGUgY2FsbGluZyB1c2VyIGlmIG5vIHVzZXIgd2FzIHNwZWNpZmVkIikKKyAgcHJpdmF0ZSBib29sZWFuIG93bmVkOworCisgIHByaXZhdGUgU2V0PEFjY291bnRHcm91cC5VVUlEPiBncm91cHNUb0luc3BlY3QgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKworICBAT3B0aW9uKG5hbWUgPSAiLXEiLCB1c2FnZSA9ICJncm91cCB0byBpbnNwZWN0IikKKyAgdm9pZCBhZGRHcm91cChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBpZCkgeworICAgIGdyb3Vwc1RvSW5zcGVjdC5hZGQoaWQpOworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi1tIiwgbWV0YVZhciA9ICJNQVRDSCIsIHVzYWdlID0gIm1hdGNoIGdyb3VwIHN1YnN0cmluZyIpCisgIHByaXZhdGUgU3RyaW5nIG1hdGNoU3Vic3RyaW5nOworCisgIEBPcHRpb24obmFtZSA9ICItbyIsIG11bHRpVmFsdWVkID0gdHJ1ZSwgdXNhZ2UgPSAiT3V0cHV0IG9wdGlvbnMgcGVyIGdyb3VwIikKKyAgcHVibGljIHZvaWQgYWRkT3B0aW9uKExpc3RHcm91cHNPcHRpb24gbykgeworICAgIG9wdGlvbnMuYWRkKG8pOworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi1PIiwgdXNhZ2UgPSAiT3V0cHV0IG9wdGlvbiBmbGFncywgaW4gaGV4IikKKyAgdm9pZCBzZXRPcHRpb25GbGFnc0hleChTdHJpbmcgaGV4KSB7CisgICAgb3B0aW9ucy5hZGRBbGwoTGlzdEdyb3Vwc09wdGlvbi5mcm9tQml0cyhJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKSk7CisgIH0KKworICBASW5qZWN0CisgIHByb3RlY3RlZCBMaXN0R3JvdXBzKGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwKKyAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICBmaW5hbCBHcm91cENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICBmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gaWRlbnRpZmllZFVzZXIsCisgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgIGZpbmFsIFByb3ZpZGVyPEdldEdyb3Vwcz4gYWNjb3VudEdldEdyb3VwcywgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOworICAgIHRoaXMuZ3JvdXBDb250cm9sRmFjdG9yeSA9IGdyb3VwQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5nZW5lcmljR3JvdXBDb250cm9sRmFjdG9yeSA9IGdlbmVyaWNHcm91cENvbnRyb2xGYWN0b3J5OworICAgIHRoaXMuaWRlbnRpZmllZFVzZXIgPSBpZGVudGlmaWVkVXNlcjsKKyAgICB0aGlzLnVzZXJGYWN0b3J5ID0gdXNlckZhY3Rvcnk7CisgICAgdGhpcy5hY2NvdW50R2V0R3JvdXBzID0gYWNjb3VudEdldEdyb3VwczsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICAgIHRoaXMub3B0aW9ucyA9IEVudW1TZXQubm9uZU9mKExpc3RHcm91cHNPcHRpb24uY2xhc3MpOworICB9CisKKyAgcHVibGljIEFjY291bnQuSWQgZ2V0VXNlcigpIHsKKyAgICByZXR1cm4gdXNlcjsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFByb2plY3RDb250cm9sPiBnZXRQcm9qZWN0cygpIHsKKyAgICByZXR1cm4gcHJvamVjdHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShUb3BMZXZlbFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFwPFN0cmluZywgR3JvdXBJbmZvPiBvdXRwdXQgPSBNYXBzLm5ld1RyZWVNYXAoKTsKKyAgICBmb3IgKEdyb3VwSW5mbyBpbmZvIDogZ2V0KCkpIHsKKyAgICAgIG91dHB1dC5wdXQoT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgaW5mby5uYW1lLAorICAgICAgICAgICJHcm91cCAiICsgVXJsLmRlY29kZShpbmZvLmlkKSksIGluZm8pOworICAgICAgaW5mby5uYW1lID0gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIE91dHB1dEZvcm1hdC5KU09OLm5ld0dzb24oKS50b0pzb25UcmVlKG91dHB1dCwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBHcm91cEluZm8+PigpIHt9LmdldFR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxHcm91cEluZm8+IGdldCgpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8R3JvdXBJbmZvPiBncm91cEluZm9zOworICAgIGlmICh1c2VyICE9IG51bGwpIHsKKyAgICAgIGlmIChvd25lZCkgeworICAgICAgICBncm91cEluZm9zID0gZ2V0R3JvdXBzT3duZWRCeSh1c2VyRmFjdG9yeS5jcmVhdGUodXNlcikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JvdXBJbmZvcyA9IGFjY291bnRHZXRHcm91cHMuZ2V0KCkuYXBwbHkoCisgICAgICAgICAgICBuZXcgQWNjb3VudFJlc291cmNlKHVzZXJGYWN0b3J5LmNyZWF0ZSh1c2VyKSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAob3duZWQpIHsKKyAgICAgICAgZ3JvdXBJbmZvcyA9IGdldEdyb3Vwc093bmVkQnkoaWRlbnRpZmllZFVzZXIuZ2V0KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTGlzdDxBY2NvdW50R3JvdXA+IGdyb3VwTGlzdDsKKyAgICAgICAgaWYgKCFwcm9qZWN0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEFjY291bnRHcm91cD4gZ3JvdXBzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgICAgICAgZm9yIChmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCA6IHByb2plY3RzKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdyb3Vwc1JlZnMgPSBwcm9qZWN0Q29udHJvbC5nZXRBbGxHcm91cHMoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgR3JvdXBSZWZlcmVuY2UgZ3JvdXBSZWYgOiBncm91cHNSZWZzKSB7CisgICAgICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGdyb3VwUmVmLmdldFVVSUQoKSk7CisgICAgICAgICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ3JvdXBzLnB1dChncm91cC5nZXRHcm91cFVVSUQoKSwgZ3JvdXApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGdyb3VwTGlzdCA9IGZpbHRlckdyb3Vwcyhncm91cHMudmFsdWVzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdyb3VwTGlzdCA9IGZpbHRlckdyb3Vwcyhncm91cENhY2hlLmFsbCgpKTsKKyAgICAgICAgfQorICAgICAgICBncm91cEluZm9zID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGdyb3VwTGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKEFjY291bnRHcm91cCBncm91cCA6IGdyb3VwTGlzdCkgeworICAgICAgICAgIGdyb3VwSW5mb3MuYWRkKGpzb24uYWRkT3B0aW9ucyhvcHRpb25zKS5mb3JtYXQoCisgICAgICAgICAgICAgIEdyb3VwRGVzY3JpcHRpb25zLmZvckFjY291bnRHcm91cChncm91cCkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ3JvdXBJbmZvczsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxHcm91cEluZm8+IGdldEdyb3Vwc093bmVkQnkoSWRlbnRpZmllZFVzZXIgdXNlcikKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8R3JvdXBJbmZvPiBncm91cHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKEFjY291bnRHcm91cCBnIDogZmlsdGVyR3JvdXBzKGdyb3VwQ2FjaGUuYWxsKCkpKSB7CisgICAgICBHcm91cENvbnRyb2wgY3RsID0gZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGcpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGdlbmVyaWNHcm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IodXNlciwgZy5nZXRHcm91cFVVSUQoKSkKKyAgICAgICAgICAgIC5pc093bmVyKCkpIHsKKyAgICAgICAgICBncm91cHMuYWRkKGpzb24uYWRkT3B0aW9ucyhvcHRpb25zKS5mb3JtYXQoY3RsLmdldEdyb3VwKCkpKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxBY2NvdW50R3JvdXA+IGZpbHRlckdyb3VwcyhmaW5hbCBJdGVyYWJsZTxBY2NvdW50R3JvdXA+IGdyb3VwcykgeworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwPiBmaWx0ZXJlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZpbmFsIGJvb2xlYW4gaXNBZG1pbiA9CisgICAgICAgIGlkZW50aWZpZWRVc2VyLmdldCgpLmdldENhcGFiaWxpdGllcygpLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpOworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwIDogZ3JvdXBzKSB7CisgICAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShtYXRjaFN1YnN0cmluZykpIHsKKyAgICAgICAgaWYgKCFncm91cC5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKQorICAgICAgICAgICAgLmNvbnRhaW5zKG1hdGNoU3Vic3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghaXNBZG1pbikgeworICAgICAgICBmaW5hbCBHcm91cENvbnRyb2wgYyA9IGdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cCk7CisgICAgICAgIGlmICghYy5pc1Zpc2libGUoKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoKHZpc2libGVUb0FsbCAmJiAhZ3JvdXAuaXNWaXNpYmxlVG9BbGwoKSkKKyAgICAgICAgICB8fCAoZ3JvdXBUeXBlICE9IG51bGwgJiYgIWdyb3VwVHlwZS5lcXVhbHMoZ3JvdXAuZ2V0VHlwZSgpKSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoIWdyb3Vwc1RvSW5zcGVjdC5pc0VtcHR5KCkKKyAgICAgICAgICAmJiAhZ3JvdXBzVG9JbnNwZWN0LmNvbnRhaW5zKGdyb3VwLmdldEdyb3VwVVVJRCgpKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZpbHRlcmVkR3JvdXBzLmFkZChncm91cCk7CisgICAgfQorICAgIENvbGxlY3Rpb25zLnNvcnQoZmlsdGVyZWRHcm91cHMsIG5ldyBHcm91cENvbXBhcmF0b3IoKSk7CisgICAgcmV0dXJuIGZpbHRlcmVkR3JvdXBzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RJbmNsdWRlZEdyb3Vwcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9MaXN0SW5jbHVkZWRHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkxZTgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9MaXN0SW5jbHVkZWRHcm91cHMuamF2YQpAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5ncy5udWxsVG9FbXB0eTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTGlzdEluY2x1ZGVkR3JvdXBzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMaXN0SW5jbHVkZWRHcm91cHMuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgY29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisKKyAgQEluamVjdAorICBMaXN0SW5jbHVkZWRHcm91cHMoR3JvdXBDb250cm9sLkZhY3RvcnkgY29udHJvbEZhY3RvcnksCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmNvbnRyb2xGYWN0b3J5ID0gY29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PEdyb3VwSW5mbz4gYXBwbHkoR3JvdXBSZXNvdXJjZSByc3JjKQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKHJzcmMudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGJvb2xlYW4gb3duZXJPZlBhcmVudCA9IHJzcmMuZ2V0Q29udHJvbCgpLmlzT3duZXIoKTsKKyAgICBMaXN0PEdyb3VwSW5mbz4gaW5jbHVkZWQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgdSA6IGRiUHJvdmlkZXIuZ2V0KCkKKyAgICAgICAgLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkKKyAgICAgICAgLmJ5R3JvdXAocnNyYy50b0FjY291bnRHcm91cCgpLmdldElkKCkpKSB7CisgICAgICB0cnkgeworICAgICAgICBHcm91cENvbnRyb2wgaSA9IGNvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IodS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgICAgaWYgKG93bmVyT2ZQYXJlbnQgfHwgaS5pc1Zpc2libGUoKSkgeworICAgICAgICAgIGluY2x1ZGVkLmFkZChqc29uLmZvcm1hdChpLmdldEdyb3VwKCkpKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gbm90Rm91bmQpIHsKKyAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgiR3JvdXAgJXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSwgaW5jbHVkZWQgaW50byAiLAorICAgICAgICAgICAgdS5nZXRJbmNsdWRlVVVJRCgpLAorICAgICAgICAgICAgcnNyYy5nZXRHcm91cCgpLmdldE5hbWUoKSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgQ29sbGVjdGlvbnMuc29ydChpbmNsdWRlZCwgbmV3IENvbXBhcmF0b3I8R3JvdXBJbmZvPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKEdyb3VwSW5mbyBhLCBHcm91cEluZm8gYikgeworICAgICAgICBpbnQgY21wID0gbnVsbFRvRW1wdHkoYS5uYW1lKS5jb21wYXJlVG8obnVsbFRvRW1wdHkoYi5uYW1lKSk7CisgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxUb0VtcHR5KGEuaWQpLmNvbXBhcmVUbyhudWxsVG9FbXB0eShiLmlkKSk7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIGluY2x1ZGVkOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RNZW1iZXJzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RNZW1iZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyYzYzMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTGlzdE1lbWJlcnMuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29tcGFyaXNvbkNoYWluOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwRGV0YWlsRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIExpc3RNZW1iZXJzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgR3JvdXBEZXRhaWxGYWN0b3J5LkZhY3RvcnkgZ3JvdXBEZXRhaWxGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEFjY291bnRJbmZvLkxvYWRlciBhY2NvdW50TG9hZGVyOworCisgIEBPcHRpb24obmFtZSA9ICItLXJlY3Vyc2l2ZSIsIHVzYWdlID0gInRvIHJlc29sdmUgaW5jbHVkZWQgZ3JvdXBzIHJlY3Vyc2l2ZWx5IikKKyAgcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2l2ZTsKKworICBASW5qZWN0CisgIExpc3RNZW1iZXJzKEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwKKyAgICAgIEdyb3VwRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGdyb3VwRGV0YWlsRmFjdG9yeSwKKyAgICAgIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGFjY291bnRMb2FkZXJGYWN0b3J5KSB7CisgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKKyAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKKyAgICB0aGlzLmFjY291bnRMb2FkZXIgPSBhY2NvdW50TG9hZGVyRmFjdG9yeS5jcmVhdGUodHJ1ZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8QWNjb3VudEluZm8+IGFwcGx5KGZpbmFsIEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAocmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICBmaW5hbCBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEluZm8+IG1lbWJlcnMgPQorICAgICAgICBnZXRNZW1iZXJzKHJlc291cmNlLmdldEdyb3VwVVVJRCgpLCBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuVVVJRD4oKSk7CisgICAgZmluYWwgTGlzdDxBY2NvdW50SW5mbz4gbWVtYmVySW5mb3MgPSBMaXN0cy5uZXdBcnJheUxpc3QobWVtYmVycy52YWx1ZXMoKSk7CisgICAgQ29sbGVjdGlvbnMuc29ydChtZW1iZXJJbmZvcywgbmV3IENvbXBhcmF0b3I8QWNjb3VudEluZm8+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQWNjb3VudEluZm8gYSwgQWNjb3VudEluZm8gYikgeworICAgICAgICByZXR1cm4gQ29tcGFyaXNvbkNoYWluLnN0YXJ0KCkKKyAgICAgICAgICAgIC5jb21wYXJlKGEubmFtZSwgYi5uYW1lLCBPcmRlcmluZy5uYXR1cmFsKCkubnVsbHNGaXJzdCgpKQorICAgICAgICAgICAgLmNvbXBhcmUoYS5lbWFpbCwgYi5lbWFpbCwgT3JkZXJpbmcubmF0dXJhbCgpLm51bGxzRmlyc3QoKSkKKyAgICAgICAgICAgIC5jb21wYXJlKGEuX2FjY291bnRfaWQsIGIuX2FjY291bnRfaWQsIE9yZGVyaW5nLm5hdHVyYWwoKS5udWxsc0ZpcnN0KCkpLnJlc3VsdCgpOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBtZW1iZXJJbmZvczsKKyAgfQorCisgIHByaXZhdGUgTWFwPEFjY291bnQuSWQsIEFjY291bnRJbmZvPiBnZXRNZW1iZXJzKAorICAgICAgZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlELAorICAgICAgZmluYWwgSGFzaFNldDxBY2NvdW50R3JvdXAuVVVJRD4gc2Vlbkdyb3VwcykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgc2Vlbkdyb3Vwcy5hZGQoZ3JvdXBVVUlEKTsKKworICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBBY2NvdW50SW5mbz4gbWVtYmVycyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KGdyb3VwVVVJRCk7CisgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgIC8vIHRoZSBpbmNsdWRlZCBncm91cCBpcyBhbiBleHRlcm5hbCBncm91cCBhbmQgY2FuJ3QgYmUgcmVzb2x2ZWQKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0KKworICAgIGZpbmFsIEdyb3VwRGV0YWlsIGdyb3VwRGV0YWlsOworICAgIHRyeSB7CisgICAgICBncm91cERldGFpbCA9IGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXAuZ2V0SWQoKSkuY2FsbCgpOworICAgIH0gY2F0Y2ggKE5vU3VjaEdyb3VwRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIHRoZSBpbmNsdWRlZCBncm91cCBpcyBub3QgdmlzaWJsZQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgaWYgKGdyb3VwRGV0YWlsLm1lbWJlcnMgIT0gbnVsbCkgeworICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgbSA6IGdyb3VwRGV0YWlsLm1lbWJlcnMpIHsKKyAgICAgICAgaWYgKCFtZW1iZXJzLmNvbnRhaW5zS2V5KG0uZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICAgICAgbWVtYmVycy5wdXQobS5nZXRBY2NvdW50SWQoKSwgYWNjb3VudExvYWRlci5nZXQobS5nZXRBY2NvdW50SWQoKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgaWYgKGdyb3VwRGV0YWlsLmluY2x1ZGVzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGluY2x1ZGVkR3JvdXAgOiBncm91cERldGFpbC5pbmNsdWRlcykgeworICAgICAgICAgIGlmICghc2Vlbkdyb3Vwcy5jb250YWlucyhpbmNsdWRlZEdyb3VwLmdldEluY2x1ZGVVVUlEKCkpKSB7CisgICAgICAgICAgICBtZW1iZXJzLnB1dEFsbChnZXRNZW1iZXJzKGluY2x1ZGVkR3JvdXAuZ2V0SW5jbHVkZVVVSUQoKSwgc2Vlbkdyb3VwcykpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBhY2NvdW50TG9hZGVyLmZpbGwoKTsKKyAgICByZXR1cm4gbWVtYmVyczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9NZW1iZXJSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9NZW1iZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTM3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL01lbWJlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBNZW1iZXJSZXNvdXJjZSBleHRlbmRzIEdyb3VwUmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PE1lbWJlclJlc291cmNlPj4gTUVNQkVSX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PE1lbWJlclJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CisKKyAgcHVibGljIE1lbWJlclJlc291cmNlKEdyb3VwUmVzb3VyY2UgZ3JvdXAsIElkZW50aWZpZWRVc2VyIHVzZXIpIHsKKyAgICBzdXBlcihncm91cCk7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgfQorCisgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBnZXRNZW1iZXIoKSB7CisgICAgcmV0dXJuIHVzZXI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTWVtYmVyc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTWVtYmVyc0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmVkMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9NZW1iZXJzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5BZGRNZW1iZXJzLlB1dE1lbWJlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIE1lbWJlcnNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBDaGlsZENvbGxlY3Rpb248R3JvdXBSZXNvdXJjZSwgTWVtYmVyUmVzb3VyY2U+LAorICAgIEFjY2VwdHNDcmVhdGU8R3JvdXBSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8TWVtYmVyUmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0TWVtYmVycz4gbGlzdDsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBY2NvdW50c0NvbGxlY3Rpb24+IGFjY291bnRzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBZGRNZW1iZXJzPiBwdXQ7CisKKyAgQEluamVjdAorICBNZW1iZXJzQ29sbGVjdGlvbihEeW5hbWljTWFwPFJlc3RWaWV3PE1lbWJlclJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxMaXN0TWVtYmVycz4gbGlzdCwKKyAgICAgIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHMsCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICBQcm92aWRlcjxBZGRNZW1iZXJzPiBwdXQpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICB0aGlzLmFjY291bnRzID0gYWNjb3VudHM7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMucHV0ID0gcHV0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxHcm91cFJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICBBdXRoRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbGlzdC5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTWVtYmVyUmVzb3VyY2UgcGFyc2UoR3JvdXBSZXNvdXJjZSBwYXJlbnQsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChwYXJlbnQudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSBhY2NvdW50cy5nZXQoKS5wYXJzZShUb3BMZXZlbFJlc291cmNlLklOU1RBTkNFLCBpZCkuZ2V0VXNlcigpOworICAgIEFjY291bnRHcm91cE1lbWJlci5LZXkga2V5ID0KKyAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlci5LZXkodXNlci5nZXRBY2NvdW50SWQoKSwgcGFyZW50LnRvQWNjb3VudEdyb3VwKCkuZ2V0SWQoKSk7CisgICAgaWYgKGRiLmdldCgpLmFjY291bnRHcm91cE1lbWJlcnMoKS5nZXQoa2V5KSAhPSBudWxsCisgICAgICAgICYmIHBhcmVudC5nZXRDb250cm9sKCkuY2FuU2VlTWVtYmVyKHVzZXIuZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICByZXR1cm4gbmV3IE1lbWJlclJlc291cmNlKHBhcmVudCwgdXNlcik7CisgICAgfQorICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFB1dE1lbWJlciBjcmVhdGUoR3JvdXBSZXNvdXJjZSBncm91cCwgSWRTdHJpbmcgaWQpIHsKKyAgICByZXR1cm4gbmV3IFB1dE1lbWJlcihwdXQsIGlkLmdldCgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxNZW1iZXJSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Nb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczMzhmMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTW9kdWxlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBSZXNvdXJjZS5HUk9VUF9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuSW5jbHVkZWRHcm91cFJlc291cmNlLklOQ0xVREVEX0dST1VQX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5NZW1iZXJSZXNvdXJjZS5NRU1CRVJfS0lORDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RBcGlNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkFkZEluY2x1ZGVkR3JvdXBzLlVwZGF0ZUluY2x1ZGVkR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkFkZE1lbWJlcnMuVXBkYXRlTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5EZWxldGVJbmNsdWRlZEdyb3Vwcy5EZWxldGVJbmNsdWRlZEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5EZWxldGVNZW1iZXJzLkRlbGV0ZU1lbWJlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5GYWN0b3J5TW9kdWxlQnVpbGRlcjsKKworcHVibGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIFJlc3RBcGlNb2R1bGUgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGJpbmQoR3JvdXBzQ29sbGVjdGlvbi5jbGFzcyk7CisKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBHUk9VUF9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBNRU1CRVJfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgSU5DTFVERURfR1JPVVBfS0lORCk7CisKKyAgICBnZXQoR1JPVVBfS0lORCkudG8oR2V0R3JvdXAuY2xhc3MpOworICAgIHB1dChHUk9VUF9LSU5EKS50byhQdXRHcm91cC5jbGFzcyk7CisgICAgZ2V0KEdST1VQX0tJTkQsICJkZXRhaWwiKS50byhHZXREZXRhaWwuY2xhc3MpOworICAgIHBvc3QoR1JPVVBfS0lORCwgIm1lbWJlcnMiKS50byhBZGRNZW1iZXJzLmNsYXNzKTsKKyAgICBwb3N0KEdST1VQX0tJTkQsICJtZW1iZXJzLmFkZCIpLnRvKEFkZE1lbWJlcnMuY2xhc3MpOworICAgIHBvc3QoR1JPVVBfS0lORCwgIm1lbWJlcnMuZGVsZXRlIikudG8oRGVsZXRlTWVtYmVycy5jbGFzcyk7CisgICAgcG9zdChHUk9VUF9LSU5ELCAiZ3JvdXBzIikudG8oQWRkSW5jbHVkZWRHcm91cHMuY2xhc3MpOworICAgIHBvc3QoR1JPVVBfS0lORCwgImdyb3Vwcy5hZGQiKS50byhBZGRJbmNsdWRlZEdyb3Vwcy5jbGFzcyk7CisgICAgcG9zdChHUk9VUF9LSU5ELCAiZ3JvdXBzLmRlbGV0ZSIpLnRvKERlbGV0ZUluY2x1ZGVkR3JvdXBzLmNsYXNzKTsKKyAgICBnZXQoR1JPVVBfS0lORCwgImRlc2NyaXB0aW9uIikudG8oR2V0RGVzY3JpcHRpb24uY2xhc3MpOworICAgIHB1dChHUk9VUF9LSU5ELCAiZGVzY3JpcHRpb24iKS50byhQdXREZXNjcmlwdGlvbi5jbGFzcyk7CisgICAgZGVsZXRlKEdST1VQX0tJTkQsICJkZXNjcmlwdGlvbiIpLnRvKFB1dERlc2NyaXB0aW9uLmNsYXNzKTsKKyAgICBnZXQoR1JPVVBfS0lORCwgIm5hbWUiKS50byhHZXROYW1lLmNsYXNzKTsKKyAgICBwdXQoR1JPVVBfS0lORCwgIm5hbWUiKS50byhQdXROYW1lLmNsYXNzKTsKKyAgICBnZXQoR1JPVVBfS0lORCwgIm93bmVyIikudG8oR2V0T3duZXIuY2xhc3MpOworICAgIHB1dChHUk9VUF9LSU5ELCAib3duZXIiKS50byhQdXRPd25lci5jbGFzcyk7CisgICAgZ2V0KEdST1VQX0tJTkQsICJvcHRpb25zIikudG8oR2V0T3B0aW9ucy5jbGFzcyk7CisgICAgcHV0KEdST1VQX0tJTkQsICJvcHRpb25zIikudG8oUHV0T3B0aW9ucy5jbGFzcyk7CisKKyAgICBjaGlsZChHUk9VUF9LSU5ELCAibWVtYmVycyIpLnRvKE1lbWJlcnNDb2xsZWN0aW9uLmNsYXNzKTsKKyAgICBnZXQoTUVNQkVSX0tJTkQpLnRvKEdldE1lbWJlci5jbGFzcyk7CisgICAgcHV0KE1FTUJFUl9LSU5EKS50byhVcGRhdGVNZW1iZXIuY2xhc3MpOworICAgIGRlbGV0ZShNRU1CRVJfS0lORCkudG8oRGVsZXRlTWVtYmVyLmNsYXNzKTsKKworICAgIGNoaWxkKEdST1VQX0tJTkQsICJncm91cHMiKS50byhJbmNsdWRlZEdyb3Vwc0NvbGxlY3Rpb24uY2xhc3MpOworICAgIGdldChJTkNMVURFRF9HUk9VUF9LSU5EKS50byhHZXRJbmNsdWRlZEdyb3VwLmNsYXNzKTsKKyAgICBwdXQoSU5DTFVERURfR1JPVVBfS0lORCkudG8oVXBkYXRlSW5jbHVkZWRHcm91cC5jbGFzcyk7CisgICAgZGVsZXRlKElOQ0xVREVEX0dST1VQX0tJTkQpLnRvKERlbGV0ZUluY2x1ZGVkR3JvdXAuY2xhc3MpOworCisgICAgaW5zdGFsbChuZXcgRmFjdG9yeU1vZHVsZUJ1aWxkZXIoKS5idWlsZChDcmVhdGVHcm91cC5GYWN0b3J5LmNsYXNzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0RGVzY3JpcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0RGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MwYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXREZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuUHV0RGVzY3JpcHRpb24uSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBQdXREZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworCisgIEBJbmplY3QKKyAgUHV0RGVzY3JpcHRpb24oR3JvdXBDYWNoZSBncm91cENhY2hlLCBSZXZpZXdEYiBkYikgeworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwgTm9TdWNoR3JvdXBFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOyAvLyBEZWxldGUgd291bGQgc2V0IGRlc2NyaXB0aW9uIHRvIG51bGwuCisgICAgfQorCisgICAgaWYgKHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKCFyZXNvdXJjZS5nZXRDb250cm9sKCkuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiTm90IGdyb3VwIG93bmVyIik7CisgICAgfQorCisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gZGIuYWNjb3VudEdyb3VwcygpLmdldCgKKyAgICAgICAgcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKS5nZXRJZCgpKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBncm91cC5zZXREZXNjcmlwdGlvbihTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0LmRlc2NyaXB0aW9uKSk7CisgICAgZGIuYWNjb3VudEdyb3VwcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ3JvdXApKTsKKyAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKKworICAgIHJldHVybiBTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW5wdXQuZGVzY3JpcHRpb24pCisgICAgICAgID8gUmVzcG9uc2Uubm9uZSgpCisgICAgICAgIDogaW5wdXQuZGVzY3JpcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0R3JvdXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0R3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JlZDZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRHcm91cC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkNyZWF0ZUdyb3VwLklucHV0OworCitwdWJsaWMgY2xhc3MgUHV0R3JvdXAgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiR3JvdXAgYWxyZWFkeSBleGlzdHMiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXROYW1lLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgzMzdhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXROYW1lLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkludmFsaWROYW1lRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybVJlbmFtZUdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5QdXROYW1lLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgUHV0TmFtZSBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBuYW1lOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQZXJmb3JtUmVuYW1lR3JvdXAuRmFjdG9yeSBwZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5OworCisgIEBJbmplY3QKKyAgUHV0TmFtZShQZXJmb3JtUmVuYW1lR3JvdXAuRmFjdG9yeSBwZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5KSB7CisgICAgdGhpcy5wZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5ID0gcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChyZXNvdXJjZS50b0FjY291bnRHcm91cCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmICghcmVzb3VyY2UuZ2V0Q29udHJvbCgpLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIk5vdCBncm91cCBvd25lciIpOworICAgIH0gZWxzZSBpZiAoaW5wdXQgPT0gbnVsbCB8fCBTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW5wdXQubmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJuYW1lIGlzIHJlcXVpcmVkIik7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIG5ld05hbWUgPSBpbnB1dC5uYW1lLnRyaW0oKTsKKyAgICBpZiAocmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKS5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7CisgICAgICByZXR1cm4gbmV3TmFtZTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIHBlcmZvcm1SZW5hbWVHcm91cEZhY3RvcnkuY3JlYXRlKCkucmVuYW1lR3JvdXAoCisgICAgICAgICAgcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKS5nZXRJZCgpLCBuZXdOYW1lKS5ncm91cC5nZXROYW1lKCk7CisgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkTmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0T3B0aW9ucy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRPcHRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwNjBkZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0T3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuUHV0T3B0aW9ucy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworcHVibGljIGNsYXNzIFB1dE9wdGlvbnMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEJvb2xlYW4gdmlzaWJsZVRvQWxsOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisKKyAgQEluamVjdAorICBQdXRPcHRpb25zKEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwgUmV2aWV3RGIgZGIpIHsKKyAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOworICAgIHRoaXMuZGIgPSBkYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBPcHRpb25zSW5mbyBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAocmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAoIXJlc291cmNlLmdldENvbnRyb2woKS5pc093bmVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJOb3QgZ3JvdXAgb3duZXIiKTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIm9wdGlvbnMgYXJlIHJlcXVpcmVkIik7CisgICAgfQorICAgIGlmIChpbnB1dC52aXNpYmxlVG9BbGwgPT0gbnVsbCkgeworICAgICAgaW5wdXQudmlzaWJsZVRvQWxsID0gZmFsc2U7CisgICAgfQorCisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gZGIuYWNjb3VudEdyb3VwcygpLmdldCgKKyAgICAgICAgcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKS5nZXRJZCgpKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBncm91cC5zZXRWaXNpYmxlVG9BbGwoaW5wdXQudmlzaWJsZVRvQWxsKTsKKyAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOworICAgIGdyb3VwQ2FjaGUuZXZpY3QoZ3JvdXApOworCisgICAgcmV0dXJuIG5ldyBHcm91cE9wdGlvbnNJbmZvKGdyb3VwKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRPd25lci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRPd25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE93bmVyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLlB1dE93bmVyLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgUHV0T3duZXIgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgb3duZXI7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb247CisgIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgUHV0T3duZXIoUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbiwgR3JvdXBDYWNoZSBncm91cENhY2hlLAorICAgICAgUmV2aWV3RGIgZGIsIEdyb3VwSnNvbiBqc29uKSB7CisgICAgdGhpcy5ncm91cHNDb2xsZWN0aW9uID0gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwKKyAgICAgIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sCisgICAgICBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBncm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmICghcmVzb3VyY2UuZ2V0Q29udHJvbCgpLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIk5vdCBncm91cCBvd25lciIpOworICAgIH0KKworICAgIGlmIChpbnB1dCA9PSBudWxsIHx8IFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbnB1dC5vd25lcikpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJvd25lciBpcyByZXF1aXJlZCIpOworICAgIH0KKworICAgIGdyb3VwID0gZGIuYWNjb3VudEdyb3VwcygpLmdldChncm91cC5nZXRJZCgpKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIG93bmVyID0gZ3JvdXBzQ29sbGVjdGlvbi5nZXQoKS5wYXJzZShpbnB1dC5vd25lcik7CisgICAgaWYgKCFncm91cC5nZXRPd25lckdyb3VwVVVJRCgpLmVxdWFscyhvd25lci5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgIGdyb3VwLnNldE93bmVyR3JvdXBVVUlEKG93bmVyLmdldEdyb3VwVVVJRCgpKTsKKyAgICAgIGRiLmFjY291bnRHcm91cHMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdyb3VwKSk7CisgICAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKKyAgICB9CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KG93bmVyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0FiYW5kb25lZFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0FiYW5kb25lZFNlbmRlci5qYXZhCmluZGV4IDBlYjNkZmUuLjgzODdmNTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9BYmFuZG9uZWRTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWJhbmRvbmVkU2VuZGVyLmphdmEKQEAgLTE0LDkgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIApAQCAtMjgsOSArMjgsOCBAQAogICB9CiAKICAgQEluamVjdAotICBwdWJsaWMgQWJhbmRvbmVkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCAiYWJhbmRvbiIpOworICBwdWJsaWMgQWJhbmRvbmVkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYywgImFiYW5kb24iKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMzksNyArMzgsOCBAQAogCiAgICAgY2NBbGxBcHByb3ZhbHMoKTsKICAgICBiY2NTdGFycmVkQnkoKTsKLSAgICBiY2NXYXRjaGVzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5BQkFORE9ORURfQ0hBTkdFUyk7CisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0FkZFJldmlld2VyU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWRkUmV2aWV3ZXJTZW5kZXIuamF2YQppbmRleCBmN2FjZTI3Li5jMTgxYTljIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWRkUmV2aWV3ZXJTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWRkUmV2aWV3ZXJTZW5kZXIuamF2YQpAQCAtMTQsOSArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yNywxMCArMjYsOCBAQAogICB9CiAKICAgQEluamVjdAotICBwdWJsaWMgQWRkUmV2aWV3ZXJTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgU3NoSW5mbyBzc2hJbmZvLAotICAgICAgQEFzc2lzdGVkIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIHNzaEluZm8sIGMpOworICBwdWJsaWMgQWRkUmV2aWV3ZXJTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NoYW5nZUVtYWlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlRW1haWwuamF2YQppbmRleCA2YzMzOTQ5Li44ODVmMWFhIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlRW1haWwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlRW1haWwuamF2YQpAQCAtMTQsMTUgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKQEAgLTMwLDM1ICsyNCwzNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5TdGFycmVkQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk5vdGlmeUNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Qcm9qZWN0V2F0Y2guV2F0Y2hlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0RW50cnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUHJlZGljYXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5RdWVyeVBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZVF1ZXJ5QnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLlNpbmdsZUdyb3VwVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5UZW1wb3JhcnlCdWZmZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiAvKiogU2VuZHMgYW4gZW1haWwgdG8gb25lIG9yIG1vcmUgaW50ZXJlc3RlZCBwYXJ0aWVzLiAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZUVtYWlsIGV4dGVuZHMgT3V0Z29pbmdFbWFpbCB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlRW1haWwgZXh0ZW5kcyBOb3RpZmljYXRpb25FbWFpbCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGFuZ2VFbWFpbC5jbGFzcyk7CiAKICAgcHJvdGVjdGVkIGZpbmFsIENoYW5nZSBjaGFuZ2U7CkBAIC03MSwxMSArNjUsMTAgQEAKICAgcHJvdGVjdGVkIFNldDxBY2NvdW50LklkPiBhdXRob3JzOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBlbWFpbE9ubHlBdXRob3JzOwogCi0gIHByb3RlY3RlZCBDaGFuZ2VFbWFpbChFbWFpbEFyZ3VtZW50cyBlYSwgZmluYWwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsCi0gICAgICBmaW5hbCBDaGFuZ2UgYywgZmluYWwgU3RyaW5nIG1jKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIG1jKTsKKyAgcHJvdGVjdGVkIENoYW5nZUVtYWlsKEVtYWlsQXJndW1lbnRzIGVhLCBDaGFuZ2UgYywgU3RyaW5nIG1jKSB7CisgICAgc3VwZXIoZWEsIG1jLCBjLmdldFByb2plY3QoKSwgYy5nZXREZXN0KCkpOwogICAgIGNoYW5nZSA9IGM7Ci0gICAgY2hhbmdlRGF0YSA9IGNoYW5nZSAhPSBudWxsID8gbmV3IENoYW5nZURhdGEoY2hhbmdlKSA6IG51bGw7CisgICAgY2hhbmdlRGF0YSA9IG5ldyBDaGFuZ2VEYXRhKGNoYW5nZSk7CiAgICAgZW1haWxPbmx5QXV0aG9ycyA9IGZhbHNlOwogICB9CiAKQEAgLTEyMSwxMSArMTE0LDE2IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKICAgICB9CisgICAgZm9ybWF0Rm9vdGVyKCk7CiAgIH0KIAogICAvKiogRm9ybWF0IHRoZSBtZXNzYWdlIGJvZHkgYnkgY2FsbGluZyB7QGxpbmsgI2FwcGVuZFRleHQoU3RyaW5nKX0uICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdENoYW5nZSgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbjsKIAorICAvKiogRm9ybWF0IHRoZSBtZXNzYWdlIGZvb3RlciBieSBjYWxsaW5nIHtAbGluayAjYXBwZW5kVGV4dChTdHJpbmcpfS4gKi8KKyAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Rm9vdGVyKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKKyAgfQorCiAgIC8qKiBTZXR1cCB0aGUgbWVzc2FnZSBoZWFkZXJzIGFuZCBlbnZlbG9wZSAoVE8sIENDLCBCQ0MpLiAqLwogICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKICAgICBpZiAoYXJncy5wcm9qZWN0Q2FjaGUgIT0gbnVsbCkgewpAQCAtMTU4LDIzICsxNTYsMTAgQEAKICAgICB9CiAgICAgc2V0Q2hhbmdlU3ViamVjdEhlYWRlcigpOwogICAgIHNldEhlYWRlcigiWC1HZXJyaXQtQ2hhbmdlLUlkIiwgIiIgKyBjaGFuZ2UuZ2V0S2V5KCkuZ2V0KCkpOwotICAgIHNldExpc3RJZEhlYWRlcigpOwogICAgIHNldENoYW5nZVVybEhlYWRlcigpOwogICAgIHNldENvbW1pdElkSGVhZGVyKCk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgc2V0TGlzdElkSGVhZGVyKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKLSAgICAvLyBTZXQgYSByZWFzb25hYmxlIGxpc3QgaWQgc28gdGhhdCBmaWx0ZXJzIGNhbiBiZSB1c2VkIHRvIHNvcnQgbWVzc2FnZXMKLSAgICBzZXRWSGVhZGVyKCJMaXN0LUlkIiwgIjwkZW1haWwubGlzdElkLnJlcGxhY2UoJ0AnLCAnLicpPiIpOwotICAgIGlmIChnZXRTZXR0aW5nc1VybCgpICE9IG51bGwpIHsKLSAgICAgIHNldFZIZWFkZXIoIkxpc3QtVW5zdWJzY3JpYmUiLCAiPCRlbWFpbC5zZXR0aW5nc1VybD4iKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldExpc3RJZCgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHZlbG9jaWZ5KCJnZXJyaXQtJHByb2plY3ROYW1lLnJlcGxhY2UoJy8nLCAnLScpQCRlbWFpbC5nZXJyaXRIb3N0Iik7Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgc2V0Q2hhbmdlVXJsSGVhZGVyKCkgewogICAgIGZpbmFsIFN0cmluZyB1ID0gZ2V0Q2hhbmdlVXJsKCk7CiAgICAgaWYgKHUgIT0gbnVsbCkgewpAQCAtMTk2LDcgKzE4MSw3IEBACiAKICAgLyoqIEdldCBhIGxpbmsgdG8gdGhlIGNoYW5nZTsgbnVsbCBpZiB0aGUgc2VydmVyIGRvZXNuJ3Qga25vdyBpdHMgb3duIGFkZHJlc3MuICovCiAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlVXJsKCkgewotICAgIGlmIChjaGFuZ2UgIT0gbnVsbCAmJiBnZXRHZXJyaXRVcmwoKSAhPSBudWxsKSB7CisgICAgaWYgKGdldEdlcnJpdFVybCgpICE9IG51bGwpIHsKICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICByLmFwcGVuZChnZXRHZXJyaXRVcmwoKSk7CiAgICAgICByLmFwcGVuZChjaGFuZ2UuZ2V0Q2hhbmdlSWQoKSk7CkBAIC0zMTYsMTY0ICszMDEsMTAgQEAKICAgICB9CiAgIH0KIAotICAvKiogQkNDIHVzZXJzIGFuZCBncm91cHMgdGhhdCB3YW50IG5vdGlmaWNhdGlvbiBvZiBldmVudHMuICovCi0gIHByb3RlY3RlZCB2b2lkIGJjY1dhdGNoZXMoTm90aWZ5VHlwZSB0eXBlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFdhdGNoZXJzIG1hdGNoaW5nID0gZ2V0V2F0Y2hlcyh0eXBlKTsKLSAgICAgIGZvciAoQWNjb3VudC5JZCB1c2VyIDogbWF0Y2hpbmcuYWNjb3VudHMpIHsKLSAgICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQkNDLCB1c2VyKTsKLSAgICAgIH0KLSAgICAgIGZvciAoQWRkcmVzcyBhZGRyIDogbWF0Y2hpbmcuZW1haWxzKSB7Ci0gICAgICAgIGFkZChSZWNpcGllbnRUeXBlLkJDQywgYWRkcik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGVycikgewotICAgICAgLy8gSnVzdCBkb24ndCBDQyBldmVyeW9uZS4gQmV0dGVyIHRvIHNlbmQgYSBwYXJ0aWFsIG1lc3NhZ2UgdG8gdGhvc2UKLSAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBxdWV1ZWQgdXAgdGhlbiB0byBmYWlsIGRlbGl2ZXIgZW50aXJlbHkgdG8gcGVvcGxlCi0gICAgICAvLyB3aG8gaGF2ZSBhIGxvd2VyIGludGVyZXN0IGluIHRoZSBjaGFuZ2UuCi0gICAgICBsb2cud2FybigiQ2Fubm90IEJDQyB3YXRjaGVycyBmb3IgIiArIHR5cGUsIGVycik7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFJldHVybnMgYWxsIHdhdGNoZXMgdGhhdCBhcmUgcmVsZXZhbnQgKi8KLSAgcHJvdGVjdGVkIGZpbmFsIFdhdGNoZXJzIGdldFdhdGNoZXMoTm90aWZ5VHlwZSB0eXBlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBXYXRjaGVycyBtYXRjaGluZyA9IG5ldyBXYXRjaGVycygpOwotICAgIGlmIChjaGFuZ2VEYXRhID09IG51bGwpIHsKLSAgICAgIHJldHVybiBtYXRjaGluZzsKLSAgICB9Ci0KLSAgICBTZXQ8QWNjb3VudC5JZD4gcHJvamVjdFdhdGNoZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKLQotICAgIGZvciAoQWNjb3VudFByb2plY3RXYXRjaCB3IDogYXJncy5kYi5nZXQoKS5hY2NvdW50UHJvamVjdFdhdGNoZXMoKQotICAgICAgICAuYnlQcm9qZWN0KGNoYW5nZS5nZXRQcm9qZWN0KCkpKSB7Ci0gICAgICBwcm9qZWN0V2F0Y2hlcnMuYWRkKHcuZ2V0QWNjb3VudElkKCkpOwotICAgICAgaWYgKHcuaXNOb3RpZnkodHlwZSkpIHsKLSAgICAgICAgYWRkKG1hdGNoaW5nLCB3KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKEFjY291bnRQcm9qZWN0V2F0Y2ggdyA6IGFyZ3MuZGIuZ2V0KCkuYWNjb3VudFByb2plY3RXYXRjaGVzKCkKLSAgICAgICAgLmJ5UHJvamVjdChhcmdzLmFsbFByb2plY3RzTmFtZSkpIHsKLSAgICAgIGlmICghcHJvamVjdFdhdGNoZXJzLmNvbnRhaW5zKHcuZ2V0QWNjb3VudElkKCkpICYmIHcuaXNOb3RpZnkodHlwZSkpIHsKLSAgICAgICAgYWRkKG1hdGNoaW5nLCB3KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBQcm9qZWN0U3RhdGUgc3RhdGUgPSBwcm9qZWN0U3RhdGU7Ci0gICAgd2hpbGUgKHN0YXRlICE9IG51bGwpIHsKLSAgICAgIGZvciAoTm90aWZ5Q29uZmlnIG5jIDogc3RhdGUuZ2V0Q29uZmlnKCkuZ2V0Tm90aWZ5Q29uZmlncygpKSB7Ci0gICAgICAgIGlmIChuYy5pc05vdGlmeSh0eXBlKSkgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhZGQobWF0Y2hpbmcsIG5jLCBzdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKLSAgICAgICAgICB9IGNhdGNoIChRdWVyeVBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgIlByb2plY3QgJXMgaGFzIGludmFsaWQgbm90aWZ5ICVzIGZpbHRlciBcIiVzXCI6ICVzIiwKLSAgICAgICAgICAgICAgICBzdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBuYy5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgbmMuZ2V0RmlsdGVyKCksIGUuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdGF0ZSA9IHN0YXRlLmdldFBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoaW5nOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBXYXRjaGVycyB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxBY2NvdW50LklkPiBhY2NvdW50cyA9IFNldHMubmV3SGFzaFNldCgpOwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8QWRkcmVzcz4gZW1haWxzID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSB2b2lkIGFkZChXYXRjaGVycyBtYXRjaGluZywgTm90aWZ5Q29uZmlnIG5jLCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFF1ZXJ5UGFyc2VFeGNlcHRpb24gewotICAgIGZvciAoR3JvdXBSZWZlcmVuY2UgcmVmIDogbmMuZ2V0R3JvdXBzKCkpIHsKLSAgICAgIEFjY291bnRHcm91cCBncm91cCA9Ci0gICAgICAgICAgR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoYXJncy5ncm91cEJhY2tlbmQuZ2V0KHJlZi5nZXRVVUlEKCkpKTsKLSAgICAgIGlmIChncm91cCA9PSBudWxsKSB7Ci0gICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAiUHJvamVjdCAlcyBoYXMgaW52YWxpZCBncm91cCAlcyBpbiBub3RpZnkgc2VjdGlvbiAlcyIsCi0gICAgICAgICAgICBwcm9qZWN0LmdldCgpLCByZWYuZ2V0TmFtZSgpLCBuYy5nZXROYW1lKCkpKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChncm91cC5nZXRUeXBlKCkgIT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpIHsKLSAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICJQcm9qZWN0ICVzIGNhbm5vdCB1c2UgZ3JvdXAgJXMgb2YgdHlwZSAlcyBpbiBub3RpZnkgc2VjdGlvbiAlcyIsCi0gICAgICAgICAgICBwcm9qZWN0LmdldCgpLCByZWYuZ2V0TmFtZSgpLCBncm91cC5nZXRUeXBlKCksIG5jLmdldE5hbWUoKSkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgQ2hhbmdlUXVlcnlCdWlsZGVyIHFiID0gYXJncy5xdWVyeUJ1aWxkZXIuY3JlYXRlKG5ldyBTaW5nbGVHcm91cFVzZXIoCi0gICAgICAgICAgYXJncy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCi0gICAgICAgICAgcmVmLmdldFVVSUQoKSkpOwotICAgICAgcWIuc2V0QWxsb3dGaWxlKHRydWUpOwotICAgICAgUHJlZGljYXRlPENoYW5nZURhdGE+IHAgPSBxYi5pc192aXNpYmxlKCk7Ci0gICAgICBpZiAobmMuZ2V0RmlsdGVyKCkgIT0gbnVsbCkgewotICAgICAgICBwID0gUHJlZGljYXRlLmFuZChxYi5wYXJzZShuYy5nZXRGaWx0ZXIoKSksIHApOwotICAgICAgICBwID0gYXJncy5xdWVyeVJld3JpdGVyLmdldCgpLnJld3JpdGUocCk7Ci0gICAgICB9Ci0gICAgICBpZiAocC5tYXRjaChjaGFuZ2VEYXRhKSkgewotICAgICAgICByZWN1cnNpdmVseUFkZEFsbEFjY291bnRzKG1hdGNoaW5nLCBncm91cCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFuYy5nZXRBZGRyZXNzZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgIGlmIChuYy5nZXRGaWx0ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIENoYW5nZVF1ZXJ5QnVpbGRlciBxYiA9IGFyZ3MucXVlcnlCdWlsZGVyLmNyZWF0ZShhcmdzLmFub255bW91c1VzZXIpOwotICAgICAgICBxYi5zZXRBbGxvd0ZpbGUodHJ1ZSk7Ci0gICAgICAgIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBwID0gcWIucGFyc2UobmMuZ2V0RmlsdGVyKCkpOwotICAgICAgICBwID0gYXJncy5xdWVyeVJld3JpdGVyLmdldCgpLnJld3JpdGUocCk7Ci0gICAgICAgIGlmIChwLm1hdGNoKGNoYW5nZURhdGEpKSB7Ci0gICAgICAgICAgbWF0Y2hpbmcuZW1haWxzLmFkZEFsbChuYy5nZXRBZGRyZXNzZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hdGNoaW5nLmVtYWlscy5hZGRBbGwobmMuZ2V0QWRkcmVzc2VzKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZWN1cnNpdmVseUFkZEFsbEFjY291bnRzKFdhdGNoZXJzIG1hdGNoaW5nLCBBY2NvdW50R3JvdXAgZ3JvdXApCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBTZXQ8QWNjb3VudEdyb3VwLklkPiBzZWVuID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gICAgUXVldWU8QWNjb3VudEdyb3VwLklkPiBzY2FuID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOwotICAgIHNjYW4uYWRkKGdyb3VwLmdldElkKCkpOwotICAgIHNlZW4uYWRkKGdyb3VwLmdldElkKCkpOwotICAgIHdoaWxlICghc2Nhbi5pc0VtcHR5KCkpIHsKLSAgICAgIEFjY291bnRHcm91cC5JZCBuZXh0ID0gc2Nhbi5yZW1vdmUoKTsKLSAgICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyIG0gOiBhcmdzLmRiLmdldCgpLmFjY291bnRHcm91cE1lbWJlcnMoKQotICAgICAgICAgIC5ieUdyb3VwKG5leHQpKSB7Ci0gICAgICAgIG1hdGNoaW5nLmFjY291bnRzLmFkZChtLmdldEFjY291bnRJZCgpKTsKLSAgICAgIH0KLSAgICAgIGZvciAoQWNjb3VudEdyb3VwSW5jbHVkZSBtIDogYXJncy5kYi5nZXQoKS5hY2NvdW50R3JvdXBJbmNsdWRlcygpCi0gICAgICAgICAgLmJ5R3JvdXAobmV4dCkpIHsKLSAgICAgICAgaWYgKHNlZW4uYWRkKG0uZ2V0SW5jbHVkZUlkKCkpKSB7Ci0gICAgICAgICAgc2Nhbi5hZGQobS5nZXRJbmNsdWRlSWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSB2b2lkIGFkZChXYXRjaGVycyBtYXRjaGluZywgQWNjb3VudFByb2plY3RXYXRjaCB3KQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgSWRlbnRpZmllZFVzZXIgdXNlciA9Ci0gICAgICAgIGFyZ3MuaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShhcmdzLmRiLCB3LmdldEFjY291bnRJZCgpKTsKLSAgICBDaGFuZ2VRdWVyeUJ1aWxkZXIgcWIgPSBhcmdzLnF1ZXJ5QnVpbGRlci5jcmVhdGUodXNlcik7Ci0gICAgUHJlZGljYXRlPENoYW5nZURhdGE+IHAgPSBxYi5pc192aXNpYmxlKCk7Ci0gICAgaWYgKHcuZ2V0RmlsdGVyKCkgIT0gbnVsbCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgcWIuc2V0QWxsb3dGaWxlKHRydWUpOwotICAgICAgICBwID0gUHJlZGljYXRlLmFuZChxYi5wYXJzZSh3LmdldEZpbHRlcigpKSwgcCk7Ci0gICAgICAgIHAgPSBhcmdzLnF1ZXJ5UmV3cml0ZXIuZ2V0KCkucmV3cml0ZShwKTsKLSAgICAgICAgaWYgKHAubWF0Y2goY2hhbmdlRGF0YSkpIHsKLSAgICAgICAgICBtYXRjaGluZy5hY2NvdW50cy5hZGQody5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFF1ZXJ5UGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBJZ25vcmUgYnJva2VuIGZpbHRlciBleHByZXNzaW9ucy4KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHAubWF0Y2goY2hhbmdlRGF0YSkpIHsKLSAgICAgIG1hdGNoaW5nLmFjY291bnRzLmFkZCh3LmdldEFjY291bnRJZCgpKTsKLSAgICB9CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgZmluYWwgV2F0Y2hlcnMgZ2V0V2F0Y2hlcnMoTm90aWZ5VHlwZSB0eXBlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0V2F0Y2ggd2F0Y2ggPSBuZXcgUHJvamVjdFdhdGNoKGFyZ3MsIHByb2plY3QsIHByb2plY3RTdGF0ZSwgY2hhbmdlRGF0YSk7CisgICAgcmV0dXJuIHdhdGNoLmdldFdhdGNoZXJzKHR5cGUpOwogICB9CiAKICAgLyoqIEFueSB1c2VyIHdobyBoYXMgcHVibGlzaGVkIGNvbW1lbnRzIG9uIHRoaXMgY2hhbmdlLiAqLwpAQCAtNTA5LDcgKzM0MCw2IEBACiAKICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWaXNpYmxlVG8oZmluYWwgQWNjb3VudC5JZCB0bykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIHByb2plY3RTdGF0ZSA9PSBudWxsCi0gICAgICAgIHx8IGNoYW5nZSA9PSBudWxsCiAgICAgICAgIHx8IHByb2plY3RTdGF0ZS5jb250cm9sRm9yKGFyZ3MuaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZSh0bykpCiAgICAgICAgICAgICAuY29udHJvbEZvcihjaGFuZ2UpLmlzVmlzaWJsZShhcmdzLmRiLmdldCgpKTsKICAgfQpAQCAtNTM5LDExICszNjksNTQgQEAKICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJjaGFuZ2UiLCBjaGFuZ2UpOwogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImNoYW5nZUlkIiwgY2hhbmdlLmdldEtleSgpKTsKICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJjb3ZlckxldHRlciIsIGdldENvdmVyTGV0dGVyKCkpOwotICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImJyYW5jaCIsIGNoYW5nZS5nZXREZXN0KCkpOwogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImZyb21OYW1lIiwgZ2V0TmFtZUZvcihmcm9tSWQpKTsKLSAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJwcm9qZWN0TmFtZSIsIC8vCi0gICAgICAgIHByb2plY3RTdGF0ZSAhPSBudWxsID8gcHJvamVjdFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkgOiBudWxsKTsKICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJwYXRjaFNldCIsIHBhdGNoU2V0KTsKICAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJwYXRjaFNldEluZm8iLCBwYXRjaFNldEluZm8pOwogICB9CisKKyAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZURpZmYoKSB7CisgICAgcmV0dXJuIGFyZ3Muc2V0dGluZ3MuaW5jbHVkZURpZmY7CisgIH0KKworICAvKiogU2hvdyBwYXRjaCBzZXQgYXMgdW5pZmllZCBkaWZmZXJlbmNlLiAqLworICBwdWJsaWMgU3RyaW5nIGdldFVuaWZpZWREaWZmKCkgeworICAgIFBhdGNoTGlzdCBwYXRjaExpc3Q7CisgICAgdHJ5IHsKKyAgICAgIHBhdGNoTGlzdCA9IGdldFBhdGNoTGlzdCgpOworICAgICAgaWYgKHBhdGNoTGlzdC5nZXRPbGRJZCgpID09IG51bGwpIHsKKyAgICAgICAgLy8gT2N0b3B1cyBtZXJnZXMgYXJlIG5vdCB3ZWxsIHN1cHBvcnRlZCBmb3IgZGlmZiBvdXRwdXQgYnkgR2Vycml0LgorICAgICAgICAvLyBDdXJyZW50bHkgdGhlc2UgYWx3YXlzIGhhdmUgYSBudWxsIG9sZElkIGluIHRoZSBQYXRjaExpc3QuCisgICAgICAgIHJldHVybiAiW09jdG9wdXMgbWVyZ2U7IGNhbm5vdCBiZSBmb3JtYXR0ZWQgYXMgYSBkaWZmLl1cbiI7CisgICAgICB9CisgICAgfSBjYXRjaCAoUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGZvcm1hdCBwYXRjaCIsIGUpOworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9CisgICAgICAgIG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChhcmdzLnNldHRpbmdzLm1heGltdW1EaWZmU2l6ZSk7CisgICAgRGlmZkZvcm1hdHRlciBmbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihidWYpOworICAgIFJlcG9zaXRvcnkgZ2l0OworICAgIHRyeSB7CisgICAgICBnaXQgPSBhcmdzLnNlcnZlci5vcGVuUmVwb3NpdG9yeShjaGFuZ2UuZ2V0UHJvamVjdCgpKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBvcGVuIHJlcG9zaXRvcnkgdG8gZm9ybWF0IHBhdGNoIiwgZSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHRyeSB7CisgICAgICBmbXQuc2V0UmVwb3NpdG9yeShnaXQpOworICAgICAgZm10LnNldERldGVjdFJlbmFtZXModHJ1ZSk7CisgICAgICBmbXQuZm9ybWF0KHBhdGNoTGlzdC5nZXRPbGRJZCgpLCBwYXRjaExpc3QuZ2V0TmV3SWQoKSk7CisgICAgICByZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoYnVmLnRvQnl0ZUFycmF5KCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmIChKR2l0VGV4dC5nZXQoKS5pbk1lbW9yeUJ1ZmZlckxpbWl0RXhjZWVkZWQuZXF1YWxzKGUuZ2V0TWVzc2FnZSgpKSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgICB9CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBmb3JtYXQgcGF0Y2giLCBlKTsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZm10LnJlbGVhc2UoKTsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnRTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50U2VuZGVyLmphdmEKaW5kZXggZTdjYzFmZi4uYjE2YWIyYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnRTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudFNlbmRlci5qYXZhCkBAIC0xNCwxMSArMTQsMTIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBvc3RSZXZpZXcuTm90aWZ5SGFuZGxpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoRmlsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb247CkBAIC0zNywxNSArMzgsMTggQEAKIC8qKiBTZW5kIGNvbW1lbnRzLCBhZnRlciB0aGUgYXV0aG9yIG9mIHRoZW0gaGl0IHVzZWQgUHVibGlzaCBDb21tZW50cyBpbiB0aGUgVUkuICovCiBwdWJsaWMgY2xhc3MgQ29tbWVudFNlbmRlciBleHRlbmRzIFJlcGx5VG9DaGFuZ2VTZW5kZXIgewogICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBwdWJsaWMgQ29tbWVudFNlbmRlciBjcmVhdGUoQ2hhbmdlIGNoYW5nZSk7CisgICAgcHVibGljIENvbW1lbnRTZW5kZXIgY3JlYXRlKE5vdGlmeUhhbmRsaW5nIG5vdGlmeSwgQ2hhbmdlIGNoYW5nZSk7CiAgIH0KIAorICBwcml2YXRlIGZpbmFsIE5vdGlmeUhhbmRsaW5nIG5vdGlmeTsKICAgcHJpdmF0ZSBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGlubGluZUNvbW1lbnRzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAKICAgQEluamVjdAogICBwdWJsaWMgQ29tbWVudFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgImNvbW1lbnQiKTsKKyAgICAgIEBBc3Npc3RlZCBOb3RpZnlIYW5kbGluZyBub3RpZnksCisgICAgICBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYywgImNvbW1lbnQiKTsKKyAgICB0aGlzLm5vdGlmeSA9IG5vdGlmeTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldFBhdGNoTGluZUNvbW1lbnRzKGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gcGxjKSB7CkBAIC02Nyw5ICs3MSwxMyBAQAogICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKICAgICBzdXBlci5pbml0KCk7CiAKLSAgICBjY0FsbEFwcHJvdmFscygpOwotICAgIGJjY1N0YXJyZWRCeSgpOwotICAgIGJjY1dhdGNoZXMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOworICAgIGlmIChub3RpZnkuY29tcGFyZVRvKE5vdGlmeUhhbmRsaW5nLk9XTkVSX1JFVklFV0VSUykgPj0gMCkgeworICAgICAgY2NBbGxBcHByb3ZhbHMoKTsKKyAgICB9CisgICAgaWYgKG5vdGlmeS5jb21wYXJlVG8oTm90aWZ5SGFuZGxpbmcuQUxMKSA+PSAwKSB7CisgICAgICBiY2NTdGFycmVkQnkoKTsKKyAgICAgIGluY2x1ZGVXYXRjaGVycyhOb3RpZnlUeXBlLkFMTF9DT01NRU5UUyk7CisgICAgfQogICB9CiAKICAgQE92ZXJyaWRlCkBAIC03Nyw2ICs4NSwxNSBAQAogICAgIGFwcGVuZFRleHQodmVsb2NpZnlGaWxlKCJDb21tZW50LnZtIikpOwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGZvcm1hdEZvb3RlcigpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7CisgICAgYXBwZW5kVGV4dCh2ZWxvY2lmeUZpbGUoIkNvbW1lbnRGb290ZXIudm0iKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBoYXNJbmxpbmVDb21tZW50cygpIHsKKyAgICByZXR1cm4gIWlubGluZUNvbW1lbnRzLmlzRW1wdHkoKTsKKyAgfQorCiAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5saW5lQ29tbWVudHMoKSB7CiAgICAgcmV0dXJuIGdldElubGluZUNvbW1lbnRzKDEpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg4ZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworCitwdWJsaWMgY2xhc3MgQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlciBleHRlbmRzIFJlcGxhY2VQYXRjaFNldFNlbmRlciB7CisgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIgY3JlYXRlKENoYW5nZSBjaGFuZ2UpOworICB9CisKKyAgQEluamVjdAorICBwdWJsaWMgQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGZvcm1hdENoYW5nZSgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7CisgICAgYXBwZW5kVGV4dCh2ZWxvY2lmeUZpbGUoIkNvbW1pdE1lc3NhZ2VFZGl0ZWQudm0iKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DcmVhdGVDaGFuZ2VTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DcmVhdGVDaGFuZ2VTZW5kZXIuamF2YQppbmRleCA5YjgyYzcxLi4zYzlmMzljIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ3JlYXRlQ2hhbmdlU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NyZWF0ZUNoYW5nZVNlbmRlci5qYXZhCkBAIC0xNCwxMSArMTQsMTIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUHJvamVjdFdhdGNoLldhdGNoZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwpAQCAtMzYsMTAgKzM3LDggQEAKICAgfQogCiAgIEBJbmplY3QKLSAgcHVibGljIENyZWF0ZUNoYW5nZVNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBTc2hJbmZvIHNzaEluZm8sCi0gICAgICBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgc3NoSW5mbywgYyk7CisgIHB1YmxpYyBDcmVhdGVDaGFuZ2VTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNDcsMzEgKzQ2LDMzIEBACiAgICAgc3VwZXIuaW5pdCgpOwogCiAgICAgdHJ5IHsKLSAgICAgIC8vIEJDQyBhbnlvbmUgd2hvIGhhcyBpbnRlcmVzdCBpbiB0aGlzIHByb2plY3QncyBjaGFuZ2VzCi0gICAgICAvLyBUcnkgdG8gbWFyayBpbnRlcmVzdGVkIG93bmVycyB3aXRoIGEgVE8gYW5kIG5vdCBhIEJDQyBsaW5lLgotICAgICAgLy8KLSAgICAgIFdhdGNoZXJzIG1hdGNoaW5nID0gZ2V0V2F0Y2hlcyhOb3RpZnlUeXBlLk5FV19DSEFOR0VTKTsKLSAgICAgIGZvciAoQWNjb3VudC5JZCB1c2VyIDogbWF0Y2hpbmcuYWNjb3VudHMpIHsKKyAgICAgIC8vIFRyeSB0byBtYXJrIGludGVyZXN0ZWQgb3duZXJzIHdpdGggVE8gYW5kIENDIG9yIEJDQyBsaW5lLgorICAgICAgV2F0Y2hlcnMgbWF0Y2hpbmcgPSBnZXRXYXRjaGVycyhOb3RpZnlUeXBlLk5FV19DSEFOR0VTKTsKKyAgICAgIGZvciAoQWNjb3VudC5JZCB1c2VyIDogSXRlcmFibGVzLmNvbmNhdCgKKyAgICAgICAgICBtYXRjaGluZy50by5hY2NvdW50cywKKyAgICAgICAgICBtYXRjaGluZy5jYy5hY2NvdW50cywKKyAgICAgICAgICBtYXRjaGluZy5iY2MuYWNjb3VudHMpKSB7CiAgICAgICAgIGlmIChpc093bmVyT2ZQcm9qZWN0T3JCcmFuY2godXNlcikpIHsKICAgICAgICAgICBhZGQoUmVjaXBpZW50VHlwZS5UTywgdXNlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQkNDLCB1c2VyKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZm9yIChBZGRyZXNzIGFkZHIgOiBtYXRjaGluZy5lbWFpbHMpIHsKLSAgICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQkNDLCBhZGRyKTsKLSAgICAgIH0KKworICAgICAgLy8gQWRkIGV2ZXJ5b25lIGVsc2UuIE93bmVycyBhZGRlZCBhYm92ZSB3aWxsIG5vdCBiZSBkdXBsaWNhdGVkLgorICAgICAgYWRkKFJlY2lwaWVudFR5cGUuVE8sIG1hdGNoaW5nLnRvKTsKKyAgICAgIGFkZChSZWNpcGllbnRUeXBlLkNDLCBtYXRjaGluZy5jYyk7CisgICAgICBhZGQoUmVjaXBpZW50VHlwZS5CQ0MsIG1hdGNoaW5nLmJjYyk7CiAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGVycikgewogICAgICAgLy8gSnVzdCBkb24ndCBDQyBldmVyeW9uZS4gQmV0dGVyIHRvIHNlbmQgYSBwYXJ0aWFsIG1lc3NhZ2UgdG8gdGhvc2UKICAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBxdWV1ZWQgdXAgdGhlbiB0byBmYWlsIGRlbGl2ZXIgZW50aXJlbHkgdG8gcGVvcGxlCiAgICAgICAvLyB3aG8gaGF2ZSBhIGxvd2VyIGludGVyZXN0IGluIHRoZSBjaGFuZ2UuCi0gICAgICBsb2cud2FybigiQ2Fubm90IEJDQyB3YXRjaGVycyBmb3IgbmV3IGNoYW5nZSIsIGVycik7CisgICAgICBsb2cud2FybigiQ2Fubm90IG5vdGlmeSB3YXRjaGVycyBmb3IgbmV3IGNoYW5nZSIsIGVycik7CiAgICAgfQorCisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuTkVXX1BBVENIU0VUUyk7CiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gaXNPd25lck9mUHJvamVjdE9yQnJhbmNoKEFjY291bnQuSWQgdXNlcikgewogICAgIHJldHVybiBwcm9qZWN0U3RhdGUgIT0gbnVsbAotICAgICAgICAmJiBjaGFuZ2UgIT0gbnVsbAogICAgICAgICAmJiBwcm9qZWN0U3RhdGUuY29udHJvbEZvcihhcmdzLmlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUodXNlcikpCiAgICAgICAgICAgLmNvbnRyb2xGb3JSZWYoY2hhbmdlLmdldERlc3QoKSkKICAgICAgICAgICAuaXNPd25lcigpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsQXJndW1lbnRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxBcmd1bWVudHMuamF2YQppbmRleCBlNmVkYTgyLi4zZTUwMjgzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxBcmd1bWVudHMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxBcmd1bWVudHMuamF2YQpAQCAtMjEsNyArMjEsOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBJbmNsdWRlQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdENhY2hlOwpAQCAtMjksMTcgKzMxLDIxIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlCdWlsZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlSZXdyaXRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEFkdmVydGlzZWRBZGRyZXNzZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLlJ1bnRpbWVJbnN0YW5jZTsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogY2xhc3MgRW1haWxBcmd1bWVudHMgewogICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBzZXJ2ZXI7CiAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CiAgIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7CisgIGZpbmFsIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZXM7CiAgIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CiAgIGZpbmFsIFBhdGNoTGlzdENhY2hlIHBhdGNoTGlzdENhY2hlOwogICBmaW5hbCBGcm9tQWRkcmVzc0dlbmVyYXRvciBmcm9tQWRkcmVzc0dlbmVyYXRvcjsKQEAgLTQ4LDggKzU0LDEwIEBACiAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKICAgZmluYWwgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3Rvcnk7CiAgIGZpbmFsIEFub255bW91c1VzZXIgYW5vbnltb3VzVXNlcjsKKyAgZmluYWwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWU7CiAgIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7CiAgIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWU7CisgIGZpbmFsIExpc3Q8U3RyaW5nPiBzc2hBZGRyZXNzZXM7CiAKICAgZmluYWwgQ2hhbmdlUXVlcnlCdWlsZGVyLkZhY3RvcnkgcXVlcnlCdWlsZGVyOwogICBmaW5hbCBQcm92aWRlcjxDaGFuZ2VRdWVyeVJld3JpdGVyPiBxdWVyeVJld3JpdGVyOwpAQCAtNTksMjEgKzY3LDI1IEBACiAKICAgQEluamVjdAogICBFbWFpbEFyZ3VtZW50cyhHaXRSZXBvc2l0b3J5TWFuYWdlciBzZXJ2ZXIsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCi0gICAgICBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAorICAgICAgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZCwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlcywKKyAgICAgIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCiAgICAgICBQYXRjaExpc3RDYWNoZSBwYXRjaExpc3RDYWNoZSwgRnJvbUFkZHJlc3NHZW5lcmF0b3IgZnJvbUFkZHJlc3NHZW5lcmF0b3IsCiAgICAgICBFbWFpbFNlbmRlciBlbWFpbFNlbmRlciwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAogICAgICAgR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5LAogICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCiAgICAgICBBbm9ueW1vdXNVc2VyIGFub255bW91c1VzZXIsCisgICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCiAgICAgICBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lLAogICAgICAgQ2hhbmdlUXVlcnlCdWlsZGVyLkZhY3RvcnkgcXVlcnlCdWlsZGVyLAogICAgICAgUHJvdmlkZXI8Q2hhbmdlUXVlcnlSZXdyaXRlcj4gcXVlcnlSZXdyaXRlciwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLAogICAgICAgUnVudGltZUluc3RhbmNlIHZlbG9jaXR5UnVudGltZSwKLSAgICAgIEVtYWlsU2V0dGluZ3Mgc2V0dGluZ3MpIHsKKyAgICAgIEVtYWlsU2V0dGluZ3Mgc2V0dGluZ3MsCisgICAgICBAU3NoQWR2ZXJ0aXNlZEFkZHJlc3NlcyBMaXN0PFN0cmluZz4gc3NoQWRkcmVzc2VzKSB7CiAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CiAgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CiAgICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7CisgICAgdGhpcy5ncm91cEluY2x1ZGVzID0gZ3JvdXBJbmNsdWRlczsKICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKICAgICB0aGlzLnBhdGNoTGlzdENhY2hlID0gcGF0Y2hMaXN0Q2FjaGU7CiAgICAgdGhpcy5mcm9tQWRkcmVzc0dlbmVyYXRvciA9IGZyb21BZGRyZXNzR2VuZXJhdG9yOwpAQCAtODIsNiArOTQsNyBAQAogICAgIHRoaXMuaWRlbnRpZmllZFVzZXJGYWN0b3J5ID0gaWRlbnRpZmllZFVzZXJGYWN0b3J5OwogICAgIHRoaXMuY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5ID0gY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5OwogICAgIHRoaXMuYW5vbnltb3VzVXNlciA9IGFub255bW91c1VzZXI7CisgICAgdGhpcy5hbm9ueW1vdXNDb3dhcmROYW1lID0gYW5vbnltb3VzQ293YXJkTmFtZTsKICAgICB0aGlzLnVybFByb3ZpZGVyID0gdXJsUHJvdmlkZXI7CiAgICAgdGhpcy5hbGxQcm9qZWN0c05hbWUgPSBhbGxQcm9qZWN0c05hbWU7CiAgICAgdGhpcy5xdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXI7CkBAIC04OSw1ICsxMDIsNiBAQAogICAgIHRoaXMuZGIgPSBkYjsKICAgICB0aGlzLnZlbG9jaXR5UnVudGltZSA9IHZlbG9jaXR5UnVudGltZTsKICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgdGhpcy5zc2hBZGRyZXNzZXMgPSBzc2hBZGRyZXNzZXM7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2NiNjMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7Ci0KLXB1YmxpYyBjbGFzcyBFbWFpbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIHB1YmxpYyBFbWFpbEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0gICAgc3VwZXIobXNnKTsKLSAgfQotCi0gIHB1YmxpYyBFbWFpbEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgd2h5KSB7Ci0gICAgc3VwZXIobXNnLCB3aHkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbE1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGY1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxNb2R1bGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkZhY3RvcnlNb2R1bGU7CisKK3B1YmxpYyBjbGFzcyBFbWFpbE1vZHVsZSBleHRlbmRzIEZhY3RvcnlNb2R1bGUgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGZhY3RvcnkoQWJhbmRvbmVkU2VuZGVyLkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoQ29tbWVudFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KFJldmVydGVkU2VuZGVyLkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoUmVzdG9yZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsU2VuZGVyLmphdmEKaW5kZXggOWM0ZjRjNC4uYTdhMTAyOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsU2VuZGVyLmphdmEKQEAgLTE0LDYgKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CisKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWFpbFV0aWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NYWlsVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmM2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWFpbFV0aWwuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hBY2NvdW50RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50UmVzb2x2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJLZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlckxpbmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIE1haWxVdGlsIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFJFVklFV0VEX0JZID0gbmV3IEZvb3RlcktleSgiUmV2aWV3ZWQtYnkiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFRFU1RFRF9CWSA9IG5ldyBGb290ZXJLZXkoIlRlc3RlZC1ieSIpOworCisgIHB1YmxpYyBzdGF0aWMgTWFpbFJlY2lwaWVudHMgZ2V0UmVjaXBpZW50c0Zyb21Gb290ZXJzKAorICAgICAgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlciwgZmluYWwgUGF0Y2hTZXQgcHMsCisgICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyByZWNpcGllbnRzID0gbmV3IE1haWxSZWNpcGllbnRzKCk7CisgICAgaWYgKCFwcy5pc0RyYWZ0KCkpIHsKKyAgICAgIGZvciAoZmluYWwgRm9vdGVyTGluZSBmb290ZXJMaW5lIDogZm9vdGVyTGluZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoaXNSZXZpZXdlcihmb290ZXJMaW5lKSkgeworICAgICAgICAgICAgcmVjaXBpZW50cy5yZXZpZXdlcnMuYWRkKHRvQWNjb3VudElkKGFjY291bnRSZXNvbHZlciwgZm9vdGVyTGluZQorICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRyaW0oKSkpOworICAgICAgICAgIH0gZWxzZSBpZiAoZm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5DQykpIHsKKyAgICAgICAgICAgIHJlY2lwaWVudHMuY2MuYWRkKHRvQWNjb3VudElkKGFjY291bnRSZXNvbHZlciwgZm9vdGVyTGluZQorICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRyaW0oKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWNjb3VudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlY2lwaWVudHM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIE1haWxSZWNpcGllbnRzIGdldFJlY2lwaWVudHNGcm9tQXBwcm92YWxzKAorICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMpIHsKKyAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyByZWNpcGllbnRzID0gbmV3IE1haWxSZWNpcGllbnRzKCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMpIHsKKyAgICAgIGlmIChhLmdldFZhbHVlKCkgIT0gMCkgeworICAgICAgICByZWNpcGllbnRzLnJldmlld2Vycy5hZGQoYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWNpcGllbnRzLmNjLmFkZChhLmdldEFjY291bnRJZCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlY2lwaWVudHM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBBY2NvdW50LklkIHRvQWNjb3VudElkKGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXIsCisgICAgICBmaW5hbCBTdHJpbmcgbmFtZU9yRW1haWwpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaEFjY291bnRFeGNlcHRpb24geworICAgIGZpbmFsIEFjY291bnQgYSA9IGFjY291bnRSZXNvbHZlci5maW5kQnlOYW1lT3JFbWFpbChuYW1lT3JFbWFpbCk7CisgICAgaWYgKGEgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaEFjY291bnRFeGNlcHRpb24oIlwiIiArIG5hbWVPckVtYWlsCisgICAgICAgICAgKyAiXCIgaXMgbm90IHJlZ2lzdGVyZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGEuZ2V0SWQoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZXZpZXdlcihmaW5hbCBGb290ZXJMaW5lIGNhbmRpZGF0ZUZvb3RlckxpbmUpIHsKKyAgICByZXR1cm4gY2FuZGlkYXRlRm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5TSUdORURfT0ZGX0JZKQorICAgICAgICB8fCBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoRm9vdGVyS2V5LkFDS0VEX0JZKQorICAgICAgICB8fCBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoUkVWSUVXRURfQlkpCisgICAgICAgIHx8IGNhbmRpZGF0ZUZvb3RlckxpbmUubWF0Y2hlcyhURVNURURfQlkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBNYWlsUmVjaXBpZW50cyB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzOworICAgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnQuSWQ+IGNjOworCisgICAgcHVibGljIE1haWxSZWNpcGllbnRzKCkgeworICAgICAgdGhpcy5yZXZpZXdlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworICAgICAgdGhpcy5jYyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CisgICAgfQorCisgICAgcHVibGljIE1haWxSZWNpcGllbnRzKGZpbmFsIFNldDxBY2NvdW50LklkPiByZXZpZXdlcnMsCisgICAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBjYykgeworICAgICAgdGhpcy5yZXZpZXdlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPihyZXZpZXdlcnMpOworICAgICAgdGhpcy5jYyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KGNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoZmluYWwgTWFpbFJlY2lwaWVudHMgcmVjaXBpZW50cykgeworICAgICAgcmV2aWV3ZXJzLmFkZEFsbChyZWNpcGllbnRzLnJldmlld2Vycyk7CisgICAgICBjYy5hZGRBbGwocmVjaXBpZW50cy5jYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKGZpbmFsIEFjY291bnQuSWQgdG9SZW1vdmUpIHsKKyAgICAgIHJldmlld2Vycy5yZW1vdmUodG9SZW1vdmUpOworICAgICAgY2MucmVtb3ZlKHRvUmVtb3ZlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEFjY291bnQuSWQ+IGdldFJldmlld2VycygpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocmV2aWV3ZXJzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEFjY291bnQuSWQ+IGdldENjT25seSgpIHsKKyAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBjYyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KHRoaXMuY2MpOworICAgICAgY2MucmVtb3ZlQWxsKHJldmlld2Vycyk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PEFjY291bnQuSWQ+IGdldEFsbCgpIHsKKyAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBhbGwgPQorICAgICAgICAgIG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KHJldmlld2Vycy5zaXplKCkgKyBjYy5zaXplKCkpOworICAgICAgYWxsLmFkZEFsbChyZXZpZXdlcnMpOworICAgICAgYWxsLmFkZEFsbChjYyk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGFsbCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VGYWlsU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VGYWlsU2VuZGVyLmphdmEKaW5kZXggYjY5NWZiNC4uM2E1ZjdlYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlRmFpbFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZUZhaWxTZW5kZXIuamF2YQpAQCAtMTQsOCArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKQEAgLTI2LDkgKzI2LDggQEAKICAgfQogCiAgIEBJbmplY3QKLSAgcHVibGljIE1lcmdlRmFpbFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgIm1lcmdlLWZhaWxlZCIpOworICBwdWJsaWMgTWVyZ2VGYWlsU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYywgIm1lcmdlLWZhaWxlZCIpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkU2VuZGVyLmphdmEKaW5kZXggNzBiMmQ3Zi4uMzdkODAwZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZWRTZW5kZXIuamF2YQpAQCAtMTQsMzYgKzE0LDMyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hCYXNlZFRhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQogLyoqIFNlbmQgbm90aWNlIGFib3V0IGEgY2hhbmdlIHN1Y2Nlc3NmdWxseSBtZXJnZWQuICovCiBwdWJsaWMgY2xhc3MgTWVyZ2VkU2VuZGVyIGV4dGVuZHMgUmVwbHlUb0NoYW5nZVNlbmRlciB7CiAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIHB1YmxpYyBNZXJnZWRTZW5kZXIgY3JlYXRlKENoYW5nZSBjaGFuZ2UpOworICAgIHB1YmxpYyBNZXJnZWRTZW5kZXIgY3JlYXRlKENoYW5nZUNvbnRyb2wgY2hhbmdlKTsKICAgfQogCi0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOworICBwcml2YXRlIGZpbmFsIExhYmVsVHlwZXMgbGFiZWxUeXBlczsKIAogICBASW5qZWN0Ci0gIHB1YmxpYyBNZXJnZWRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgQXBwcm92YWxUeXBlcyBhdCwKLSAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCAibWVyZ2VkIik7Ci0gICAgYXBwcm92YWxUeXBlcyA9IGF0OworICBwdWJsaWMgTWVyZ2VkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlQ29udHJvbCBjKSB7CisgICAgc3VwZXIoZWEsIGMuZ2V0Q2hhbmdlKCksICJtZXJnZWQiKTsKKyAgICBsYWJlbFR5cGVzID0gYy5nZXRMYWJlbFR5cGVzKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTUyLDggKzQ4LDggQEAKIAogICAgIGNjQWxsQXBwcm92YWxzKCk7CiAgICAgYmNjU3RhcnJlZEJ5KCk7Ci0gICAgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlLkFMTF9DT01NRU5UUyk7Ci0gICAgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlLlNVQk1JVFRFRF9DSEFOR0VTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOworICAgIGluY2x1ZGVXYXRjaGVycyhOb3RpZnlUeXBlLlNVQk1JVFRFRF9DSEFOR0VTKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNjMsMTggKzU5LDE4IEBACiAKICAgcHVibGljIFN0cmluZyBnZXRBcHByb3ZhbHMoKSB7CiAgICAgdHJ5IHsKLSAgICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4+IHBvcyA9Ci0gICAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudC5JZCwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+PigpOwotCi0gICAgICBmaW5hbCBNYXA8QWNjb3VudC5JZCwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+PiBuZWcgPQotICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4oKTsKLQorICAgICAgVGFibGU8QWNjb3VudC5JZCwgU3RyaW5nLCBQYXRjaFNldEFwcHJvdmFsPiBwb3MgPSBIYXNoQmFzZWRUYWJsZS5jcmVhdGUoKTsKKyAgICAgIFRhYmxlPEFjY291bnQuSWQsIFN0cmluZywgUGF0Y2hTZXRBcHByb3ZhbD4gbmVnID0gSGFzaEJhc2VkVGFibGUuY3JlYXRlKCk7CiAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgY2EgOiBhcmdzLmRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkKICAgICAgICAgICAuYnlQYXRjaFNldChwYXRjaFNldC5nZXRJZCgpKSkgeworICAgICAgICBMYWJlbFR5cGUgbHQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoY2EuZ2V0TGFiZWxJZCgpKTsKKyAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKLSAgICAgICAgICBpbnNlcnQocG9zLCBjYSk7CisgICAgICAgICAgcG9zLnB1dChjYS5nZXRBY2NvdW50SWQoKSwgbHQuZ2V0TmFtZSgpLCBjYSk7CiAgICAgICAgIH0gZWxzZSBpZiAoY2EuZ2V0VmFsdWUoKSA8IDApIHsKLSAgICAgICAgICBpbnNlcnQobmVnLCBjYSk7CisgICAgICAgICAgbmVnLnB1dChjYS5nZXRBY2NvdW50SWQoKSwgbHQuZ2V0TmFtZSgpLCBjYSk7CiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtODUsMjIgKzgxLDIwIEBACiAgICAgcmV0dXJuICIiOwogICB9CiAKLSAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGZpbmFsIFN0cmluZyB0eXBlLAotICAgICAgZmluYWwgTWFwPEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4gbGlzdCkgeworICBwcml2YXRlIFN0cmluZyBmb3JtYXQoU3RyaW5nIHR5cGUsCisgICAgICBUYWJsZTxBY2NvdW50LklkLCBTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscykgewogICAgIFN0cmluZ0J1aWxkZXIgdHh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBpZiAobGlzdC5pc0VtcHR5KCkpIHsKKyAgICBpZiAoYXBwcm92YWxzLmlzRW1wdHkoKSkgewogICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICB0eHQuYXBwZW5kKHR5cGUgKyAiOlxuIik7Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8QWNjb3VudC5JZCwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+PiBlbnQgOiBsaXN0Ci0gICAgICAgIC5lbnRyeVNldCgpKSB7Ci0gICAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gbCA9IGVudC5nZXRWYWx1ZSgpOworICAgIHR4dC5hcHBlbmQodHlwZSkuYXBwZW5kKCI6XG4iKTsKKyAgICBmb3IgKEFjY291bnQuSWQgaWQgOiBhcHByb3ZhbHMucm93S2V5U2V0KCkpIHsKICAgICAgIHR4dC5hcHBlbmQoIiAgIik7Ci0gICAgICB0eHQuYXBwZW5kKGdldE5hbWVGb3IoZW50LmdldEtleSgpKSk7CisgICAgICB0eHQuYXBwZW5kKGdldE5hbWVGb3IoaWQpKTsKICAgICAgIHR4dC5hcHBlbmQoIjogIik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoQXBwcm92YWxUeXBlIGF0IDogYXBwcm92YWxUeXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSA9IGwuZ2V0KGF0LmdldENhdGVnb3J5KCkuZ2V0SWQoKSk7CisgICAgICBmb3IgKExhYmVsVHlwZSBsdCA6IGxhYmVsVHlwZXMuZ2V0TGFiZWxUeXBlcygpKSB7CisgICAgICAgIFBhdGNoU2V0QXBwcm92YWwgY2EgPSBhcHByb3ZhbHMuZ2V0KGlkLCBsdC5nZXROYW1lKCkpOwogICAgICAgICBpZiAoY2EgPT0gbnVsbCkgewogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0xMTEsMzIgKzEwNSwxOCBAQAogICAgICAgICAgIHR4dC5hcHBlbmQoIjsgIik7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgdiA9IGF0LmdldFZhbHVlKGNhKTsKKyAgICAgICAgTGFiZWxWYWx1ZSB2ID0gbHQuZ2V0VmFsdWUoY2EpOwogICAgICAgICBpZiAodiAhPSBudWxsKSB7Ci0gICAgICAgICAgdHh0LmFwcGVuZCh2LmdldE5hbWUoKSk7CisgICAgICAgICAgdHh0LmFwcGVuZCh2LmdldFRleHQoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdHh0LmFwcGVuZChhdC5nZXRDYXRlZ29yeSgpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgdHh0LmFwcGVuZCgiPSIpOwotICAgICAgICAgIGlmIChjYS5nZXRWYWx1ZSgpID4gMCkgewotICAgICAgICAgICAgdHh0LmFwcGVuZCgiKyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0eHQuYXBwZW5kKCIiICsgY2EuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgdHh0LmFwcGVuZChsdC5nZXROYW1lKCkpOworICAgICAgICAgIHR4dC5hcHBlbmQoJz0nKTsKKyAgICAgICAgICB0eHQuYXBwZW5kKExhYmVsVmFsdWUuZm9ybWF0VmFsdWUoY2EuZ2V0VmFsdWUoKSkpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICB0eHQuYXBwZW5kKCJcbiIpOworICAgICAgdHh0LmFwcGVuZCgnXG4nKTsKICAgICB9Ci0gICAgdHh0LmFwcGVuZCgiXG4iKTsKKyAgICB0eHQuYXBwZW5kKCdcbicpOwogICAgIHJldHVybiB0eHQudG9TdHJpbmcoKTsKICAgfQotCi0gIHByaXZhdGUgdm9pZCBpbnNlcnQoCi0gICAgICBmaW5hbCBNYXA8QWNjb3VudC5JZCwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+PiBsaXN0LAotICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSkgewotICAgIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiBtID0gbGlzdC5nZXQoY2EuZ2V0QWNjb3VudElkKCkpOwotICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgIG0gPSBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPigpOwotICAgICAgbGlzdC5wdXQoY2EuZ2V0QWNjb3VudElkKCksIG0pOwotICAgIH0KLSAgICBtLnB1dChjYS5nZXRDYXRlZ29yeUlkKCksIGNhKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL05ld0NoYW5nZVNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL05ld0NoYW5nZVNlbmRlci5qYXZhCmluZGV4IDgyYzE0MDUuLjlmZjBkYmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9OZXdDaGFuZ2VTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTmV3Q2hhbmdlU2VuZGVyLmphdmEKQEAgLTE0LDIzICsxNCwxMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiAKLWltcG9ydCBjb20uamNyYWZ0LmpzY2guSG9zdEtleTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5EaWZmRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuSkdpdFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmF3UGFyc2VVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zOSwxNyArMjYsMTEgQEAKIAogLyoqIFNlbmRzIGFuIGVtYWlsIGFsZXJ0aW5nIGEgdXNlciB0byBhIG5ldyBjaGFuZ2UgZm9yIHRoZW0gdG8gcmV2aWV3LiAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld0NoYW5nZVNlbmRlciBleHRlbmRzIENoYW5nZUVtYWlsIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9Ci0gICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihOZXdDaGFuZ2VTZW5kZXIuY2xhc3MpOwotCi0gIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOwogICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50LklkPiByZXZpZXdlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwogICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50LklkPiBleHRyYUNDID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKIAotICBwcm90ZWN0ZWQgTmV3Q2hhbmdlU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIFNzaEluZm8gc3NoSW5mbywgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgIm5ld2NoYW5nZSIpOwotICAgIHRoaXMuc3NoSW5mbyA9IHNzaEluZm87CisgIHByb3RlY3RlZCBOZXdDaGFuZ2VTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMsICJuZXdjaGFuZ2UiKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZFJldmlld2VycyhmaW5hbCBDb2xsZWN0aW9uPEFjY291bnQuSWQ+IGNjKSB7CkBAIC04Niw2MyArNjcsNCBAQAogICAgIH0KICAgICByZXR1cm4gbmFtZXM7CiAgIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFNzaEhvc3QoKSB7Ci0gICAgZmluYWwgTGlzdDxIb3N0S2V5PiBob3N0S2V5cyA9IHNzaEluZm8uZ2V0SG9zdEtleXMoKTsKLSAgICBpZiAoaG9zdEtleXMuaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBmaW5hbCBTdHJpbmcgaG9zdCA9IGhvc3RLZXlzLmdldCgwKS5nZXRIb3N0KCk7Ci0gICAgaWYgKGhvc3Quc3RhcnRzV2l0aCgiKjoiKSkgewotICAgICAgcmV0dXJuIGdldEdlcnJpdEhvc3QoKSArIGhvc3Quc3Vic3RyaW5nKDEpOwotICAgIH0KLSAgICByZXR1cm4gaG9zdDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVEaWZmKCkgewotICAgIHJldHVybiBhcmdzLnNldHRpbmdzLmluY2x1ZGVEaWZmOwotICB9Ci0KLSAgLyoqIFNob3cgcGF0Y2ggc2V0IGFzIHVuaWZpZWQgZGlmZmVyZW5jZS4gICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VW5pZmllZERpZmYoKSB7Ci0gICAgUGF0Y2hMaXN0IHBhdGNoTGlzdDsKLSAgICB0cnkgewotICAgICAgcGF0Y2hMaXN0ID0gZ2V0UGF0Y2hMaXN0KCk7Ci0gICAgICBpZiAocGF0Y2hMaXN0LmdldE9sZElkKCkgPT0gbnVsbCkgewotICAgICAgICAvLyBPY3RvcHVzIG1lcmdlcyBhcmUgbm90IHdlbGwgc3VwcG9ydGVkIGZvciBkaWZmIG91dHB1dCBieSBHZXJyaXQuCi0gICAgICAgIC8vIEN1cnJlbnRseSB0aGVzZSBhbHdheXMgaGF2ZSBhIG51bGwgb2xkSWQgaW4gdGhlIFBhdGNoTGlzdC4KLSAgICAgICAgcmV0dXJuICIiOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuZXJyb3IoIkNhbm5vdCBmb3JtYXQgcGF0Y2giLCBlKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPQotICAgICAgICBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoYXJncy5zZXR0aW5ncy5tYXhpbXVtRGlmZlNpemUpOwotICAgIERpZmZGb3JtYXR0ZXIgZm10ID0gbmV3IERpZmZGb3JtYXR0ZXIoYnVmKTsKLSAgICBSZXBvc2l0b3J5IGdpdDsKLSAgICB0cnkgewotICAgICAgZ2l0ID0gYXJncy5zZXJ2ZXIub3BlblJlcG9zaXRvcnkoY2hhbmdlLmdldFByb2plY3QoKSk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgb3BlbiByZXBvc2l0b3J5IHRvIGZvcm1hdCBwYXRjaCIsIGUpOwotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICB0cnkgewotICAgICAgZm10LnNldFJlcG9zaXRvcnkoZ2l0KTsKLSAgICAgIGZtdC5zZXREZXRlY3RSZW5hbWVzKHRydWUpOwotICAgICAgZm10LmZvcm1hdChwYXRjaExpc3QuZ2V0T2xkSWQoKSwgcGF0Y2hMaXN0LmdldE5ld0lkKCkpOwotICAgICAgcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKGJ1Zi50b0J5dGVBcnJheSgpKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBpZiAoSkdpdFRleHQuZ2V0KCkuaW5NZW1vcnlCdWZmZXJMaW1pdEV4Y2VlZGVkLmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpIHsKLSAgICAgICAgcmV0dXJuICIiOwotICAgICAgfQotICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZm9ybWF0IHBhdGNoIiwgZSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGZtdC5yZWxlYXNlKCk7Ci0gICAgICBnaXQuY2xvc2UoKTsKLSAgICB9Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Ob3RpZmljYXRpb25FbWFpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL05vdGlmaWNhdGlvbkVtYWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNDNkMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Ob3RpZmljYXRpb25FbWFpbC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Qcm9qZWN0V2F0Y2guV2F0Y2hlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogQ29tbW9uIGNsYXNzIGZvciBub3RpZmljYXRpb25zIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBwcm9qZWN0IGFuZCBicmFuY2gKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIE5vdGlmaWNhdGlvbkVtYWlsIGV4dGVuZHMgT3V0Z29pbmdFbWFpbCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQorICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTm90aWZpY2F0aW9uRW1haWwuY2xhc3MpOworCisgIHByb3RlY3RlZCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDsKKyAgcHJvdGVjdGVkIEJyYW5jaC5OYW1lS2V5IGJyYW5jaDsKKworICBwcm90ZWN0ZWQgTm90aWZpY2F0aW9uRW1haWwoRW1haWxBcmd1bWVudHMgZWEsCisgICAgICBTdHJpbmcgbWMsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBCcmFuY2guTmFtZUtleSBicmFuY2gpIHsKKyAgICBzdXBlcihlYSwgbWMpOworCisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB0aGlzLmJyYW5jaCA9IGJyYW5jaDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBzdXBlci5pbml0KCk7CisgICAgc2V0TGlzdElkSGVhZGVyKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0TGlzdElkSGVhZGVyKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKKyAgICAvLyBTZXQgYSByZWFzb25hYmxlIGxpc3QgaWQgc28gdGhhdCBmaWx0ZXJzIGNhbiBiZSB1c2VkIHRvIHNvcnQgbWVzc2FnZXMKKyAgICBzZXRWSGVhZGVyKCJMaXN0LUlkIiwgIjwkZW1haWwubGlzdElkLnJlcGxhY2UoJ0AnLCAnLicpPiIpOworICAgIGlmIChnZXRTZXR0aW5nc1VybCgpICE9IG51bGwpIHsKKyAgICAgIHNldFZIZWFkZXIoIkxpc3QtVW5zdWJzY3JpYmUiLCAiPCRlbWFpbC5zZXR0aW5nc1VybD4iKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldExpc3RJZCgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHZlbG9jaWZ5KCJnZXJyaXQtJHByb2plY3ROYW1lLnJlcGxhY2UoJy8nLCAnLScpQCRlbWFpbC5nZXJyaXRIb3N0Iik7CisgIH0KKworICAvKiogSW5jbHVkZSB1c2VycyBhbmQgZ3JvdXBzIHRoYXQgd2FudCBub3RpZmljYXRpb24gb2YgZXZlbnRzLiAqLworICBwcm90ZWN0ZWQgdm9pZCBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZSB0eXBlKSB7CisgICAgdHJ5IHsKKyAgICAgIFdhdGNoZXJzIG1hdGNoaW5nID0gZ2V0V2F0Y2hlcnModHlwZSk7CisgICAgICBhZGQoUmVjaXBpZW50VHlwZS5UTywgbWF0Y2hpbmcudG8pOworICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQ0MsIG1hdGNoaW5nLmNjKTsKKyAgICAgIGFkZChSZWNpcGllbnRUeXBlLkJDQywgbWF0Y2hpbmcuYmNjKTsKKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CisgICAgICAvLyBKdXN0IGRvbid0IENDIGV2ZXJ5b25lLiBCZXR0ZXIgdG8gc2VuZCBhIHBhcnRpYWwgbWVzc2FnZSB0byB0aG9zZQorICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIHF1ZXVlZCB1cCB0aGVuIHRvIGZhaWwgZGVsaXZlciBlbnRpcmVseSB0byBwZW9wbGUKKyAgICAgIC8vIHdobyBoYXZlIGEgbG93ZXIgaW50ZXJlc3QgaW4gdGhlIGNoYW5nZS4KKyAgICAgIGxvZy53YXJuKCJDYW5ub3QgQkNDIHdhdGNoZXJzIGZvciAiICsgdHlwZSwgZXJyKTsKKyAgICB9CisgIH0KKworICAvKiogUmV0dXJucyBhbGwgd2F0Y2hlcnMgdGhhdCBhcmUgcmVsZXZhbnQgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IFdhdGNoZXJzIGdldFdhdGNoZXJzKE5vdGlmeVR5cGUgdHlwZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKworICAvKiogQWRkIHVzZXJzIG9yIGVtYWlsIGFkZHJlc3NlcyB0byB0aGUgVE8sIENDLCBvciBCQ0MgbGlzdC4gKi8KKyAgcHJvdGVjdGVkIHZvaWQgYWRkKFJlY2lwaWVudFR5cGUgdHlwZSwgV2F0Y2hlcnMuTGlzdCBsaXN0KSB7CisgICAgZm9yIChBY2NvdW50LklkIHVzZXIgOiBsaXN0LmFjY291bnRzKSB7CisgICAgICBhZGQodHlwZSwgdXNlcik7CisgICAgfQorICAgIGZvciAoQWRkcmVzcyBhZGRyIDogbGlzdC5lbWFpbHMpIHsKKyAgICAgIGFkZCh0eXBlLCBhZGRyKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldFNzaEhvc3QoKSB7CisgICAgU3RyaW5nIGhvc3QgPSBJdGVyYWJsZXMuZ2V0Rmlyc3QoYXJncy5zc2hBZGRyZXNzZXMsIG51bGwpOworICAgIGlmIChob3N0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBpZiAoaG9zdC5zdGFydHNXaXRoKCIqOiIpKSB7CisgICAgICByZXR1cm4gZ2V0R2Vycml0SG9zdCgpICsgaG9zdC5zdWJzdHJpbmcoMSk7CisgICAgfQorICAgIHJldHVybiBob3N0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldHVwVmVsb2NpdHlDb250ZXh0KCkgeworICAgIHN1cGVyLnNldHVwVmVsb2NpdHlDb250ZXh0KCk7CisgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgicHJvamVjdE5hbWUiLCBwcm9qZWN0LmdldCgpKTsKKyAgICB2ZWxvY2l0eUNvbnRleHQucHV0KCJicmFuY2giLCBicmFuY2gpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvT3V0Z29pbmdFbWFpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL091dGdvaW5nRW1haWwuamF2YQppbmRleCBjYWE0NDFkLi45OTdiYzAzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvT3V0Z29pbmdFbWFpbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9PdXRnb2luZ0VtYWlsLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuVXNlcklkZW50aXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRTdGF0ZTsKQEAgLTU5LDE0ICs2MCwxMSBAQAogICBwcm90ZWN0ZWQgVmVsb2NpdHlDb250ZXh0IHZlbG9jaXR5Q29udGV4dDsKIAogICBwcm90ZWN0ZWQgZmluYWwgRW1haWxBcmd1bWVudHMgYXJnczsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZTsKICAgcHJvdGVjdGVkIEFjY291bnQuSWQgZnJvbUlkOwogCiAKLSAgcHJvdGVjdGVkIE91dGdvaW5nRW1haWwoRW1haWxBcmd1bWVudHMgZWEsIGZpbmFsIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLAotICAgICAgZmluYWwgU3RyaW5nIG1jKSB7CisgIHByb3RlY3RlZCBPdXRnb2luZ0VtYWlsKEVtYWlsQXJndW1lbnRzIGVhLCBTdHJpbmcgbWMpIHsKICAgICBhcmdzID0gZWE7Ci0gICAgdGhpcy5hbm9ueW1vdXNDb3dhcmROYW1lID0gYW5vbnltb3VzQ293YXJkTmFtZTsKICAgICBtZXNzYWdlQ2xhc3MgPSBtYzsKICAgICBoZWFkZXJzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBFbWFpbEhlYWRlcj4oKTsKICAgfQpAQCAtMjM1LDcgKzIzMyw3IEBACiAgIC8qKiBMb29rdXAgYSBodW1hbiByZWFkYWJsZSBuYW1lIGZvciBhbiBhY2NvdW50LCB1c3VhbGx5IHRoZSAiZnVsbCBuYW1lIi4gKi8KICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRm9yKGZpbmFsIEFjY291bnQuSWQgYWNjb3VudElkKSB7CiAgICAgaWYgKGFjY291bnRJZCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gYW5vbnltb3VzQ293YXJkTmFtZTsKKyAgICAgIHJldHVybiBhcmdzLmFub255bW91c0Nvd2FyZE5hbWU7CiAgICAgfQogCiAgICAgZmluYWwgQWNjb3VudCB1c2VyQWNjb3VudCA9IGFyZ3MuYWNjb3VudENhY2hlLmdldChhY2NvdW50SWQpLmdldEFjY291bnQoKTsKQEAgLTI0NCw3ICsyNDIsNyBAQAogICAgICAgbmFtZSA9IHVzZXJBY2NvdW50LmdldFByZWZlcnJlZEVtYWlsKCk7CiAgICAgfQogICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgIG5hbWUgPSBhbm9ueW1vdXNDb3dhcmROYW1lICsgIiAjIiArIGFjY291bnRJZDsKKyAgICAgIG5hbWUgPSBhcmdzLmFub255bW91c0Nvd2FyZE5hbWUgKyAiICMiICsgYWNjb3VudElkOwogICAgIH0KICAgICByZXR1cm4gbmFtZTsKICAgfQpAQCAtMjYzLDcgKzI2MSw3IEBACiAgICAgICByZXR1cm4gZW1haWw7CiAKICAgICB9IGVsc2UgLyogKG5hbWUgPT0gbnVsbCAmJiBlbWFpbCA9PSBudWxsKSAqL3sKLSAgICAgIHJldHVybiBhbm9ueW1vdXNDb3dhcmROYW1lICsgIiAjIiArIGFjY291bnRJZDsKKyAgICAgIHJldHVybiBhcmdzLmFub255bW91c0Nvd2FyZE5hbWUgKyAiICMiICsgYWNjb3VudElkOwogICAgIH0KICAgfQogCkBAIC0zMzIsNiArMzMwLDggQEAKICAgICAgICAgICAgIGNhc2UgQ0M6CiAgICAgICAgICAgICAgICgoRW1haWxIZWFkZXIuQWRkcmVzc0xpc3QpIGhlYWRlcnMuZ2V0KEhEUl9DQykpLmFkZChhZGRyKTsKICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJDQzoKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Byb2plY3RXYXRjaC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Byb2plY3RXYXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzA0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUHJvamVjdFdhdGNoLmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTm90aWZ5Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5RdWVyeVBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZVF1ZXJ5QnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLlNpbmdsZUdyb3VwVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0V2F0Y2ggeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvamVjdFdhdGNoLmNsYXNzKTsKKworICBwcm90ZWN0ZWQgZmluYWwgRW1haWxBcmd1bWVudHMgYXJnczsKKyAgcHJvdGVjdGVkIGZpbmFsIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGU7CisgIHByb3RlY3RlZCBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDsKKyAgcHJvdGVjdGVkIGZpbmFsIENoYW5nZURhdGEgY2hhbmdlRGF0YTsKKworICBwdWJsaWMgUHJvamVjdFdhdGNoKEVtYWlsQXJndW1lbnRzIGFyZ3MsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LAorICAgIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGUsIENoYW5nZURhdGEgY2hhbmdlRGF0YSkgeworICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB0aGlzLnByb2plY3RTdGF0ZSA9IHByb2plY3RTdGF0ZTsKKyAgICB0aGlzLmNoYW5nZURhdGEgPSBjaGFuZ2VEYXRhOworICB9CisKKyAgLyoqIFJldHVybnMgYWxsIHdhdGNoZXJzIHRoYXQgYXJlIHJlbGV2YW50ICovCisgIHB1YmxpYyBmaW5hbCBXYXRjaGVycyBnZXRXYXRjaGVycyhOb3RpZnlUeXBlIHR5cGUpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFdhdGNoZXJzIG1hdGNoaW5nID0gbmV3IFdhdGNoZXJzKCk7CisgICAgU2V0PEFjY291bnQuSWQ+IHByb2plY3RXYXRjaGVycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CisKKyAgICBmb3IgKEFjY291bnRQcm9qZWN0V2F0Y2ggdyA6IGFyZ3MuZGIuZ2V0KCkuYWNjb3VudFByb2plY3RXYXRjaGVzKCkKKyAgICAgICAgLmJ5UHJvamVjdChwcm9qZWN0KSkgeworICAgICAgaWYgKHcuaXNOb3RpZnkodHlwZSkpIHsKKyAgICAgICAgcHJvamVjdFdhdGNoZXJzLmFkZCh3LmdldEFjY291bnRJZCgpKTsKKyAgICAgICAgYWRkKG1hdGNoaW5nLCB3KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKEFjY291bnRQcm9qZWN0V2F0Y2ggdyA6IGFyZ3MuZGIuZ2V0KCkuYWNjb3VudFByb2plY3RXYXRjaGVzKCkKKyAgICAgICAgLmJ5UHJvamVjdChhcmdzLmFsbFByb2plY3RzTmFtZSkpIHsKKyAgICAgIGlmICghcHJvamVjdFdhdGNoZXJzLmNvbnRhaW5zKHcuZ2V0QWNjb3VudElkKCkpICYmIHcuaXNOb3RpZnkodHlwZSkpIHsKKyAgICAgICAgYWRkKG1hdGNoaW5nLCB3KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBzdGF0ZSA6IHByb2plY3RTdGF0ZS50cmVlKCkpIHsKKyAgICAgIGZvciAoTm90aWZ5Q29uZmlnIG5jIDogc3RhdGUuZ2V0Q29uZmlnKCkuZ2V0Tm90aWZ5Q29uZmlncygpKSB7CisgICAgICAgIGlmIChuYy5pc05vdGlmeSh0eXBlKSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZGQobWF0Y2hpbmcsIG5jLCBzdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICAgICAgICB9IGNhdGNoIChRdWVyeVBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIlByb2plY3QgJXMgaGFzIGludmFsaWQgbm90aWZ5ICVzIGZpbHRlciBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICBzdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBuYy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgbmMuZ2V0RmlsdGVyKCksIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoaW5nOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBXYXRjaGVycyB7CisgICAgc3RhdGljIGNsYXNzIExpc3QgeworICAgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxBY2NvdW50LklkPiBhY2NvdW50cyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgcHJvdGVjdGVkIGZpbmFsIFNldDxBZGRyZXNzPiBlbWFpbHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICB9CisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3QgdG8gPSBuZXcgTGlzdCgpOworICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0IGNjID0gbmV3IExpc3QoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdCBiY2MgPSBuZXcgTGlzdCgpOworCisgICAgTGlzdCBsaXN0KE5vdGlmeUNvbmZpZy5IZWFkZXIgaGVhZGVyKSB7CisgICAgICBzd2l0Y2ggKGhlYWRlcikgeworICAgICAgICBjYXNlIFRPOgorICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgY2FzZSBDQzoKKyAgICAgICAgICByZXR1cm4gY2M7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgQkNDOgorICAgICAgICAgIHJldHVybiBiY2M7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZChXYXRjaGVycyBtYXRjaGluZywgTm90aWZ5Q29uZmlnIG5jLCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFF1ZXJ5UGFyc2VFeGNlcHRpb24geworICAgIGZvciAoR3JvdXBSZWZlcmVuY2UgcmVmIDogbmMuZ2V0R3JvdXBzKCkpIHsKKyAgICAgIEN1cnJlbnRVc2VyIHVzZXIgPSBuZXcgU2luZ2xlR3JvdXBVc2VyKGFyZ3MuY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LAorICAgICAgICAgIHJlZi5nZXRVVUlEKCkpOworICAgICAgaWYgKGZpbHRlck1hdGNoKHVzZXIsIG5jLmdldEZpbHRlcigpKSkgeworICAgICAgICBkZWxpdmVyVG9NZW1iZXJzKG1hdGNoaW5nLmxpc3QobmMuZ2V0SGVhZGVyKCkpLCByZWYuZ2V0VVVJRCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW5jLmdldEFkZHJlc3NlcygpLmlzRW1wdHkoKSkgeworICAgICAgaWYgKGZpbHRlck1hdGNoKG51bGwsIG5jLmdldEZpbHRlcigpKSkgeworICAgICAgICBtYXRjaGluZy5saXN0KG5jLmdldEhlYWRlcigpKS5lbWFpbHMuYWRkQWxsKG5jLmdldEFkZHJlc3NlcygpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVsaXZlclRvTWVtYmVycygKKyAgICAgIFdhdGNoZXJzLkxpc3QgbWF0Y2hpbmcsCisgICAgICBBY2NvdW50R3JvdXAuVVVJRCBzdGFydFVVSUQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFJldmlld0RiIGRiID0gYXJncy5kYi5nZXQoKTsKKyAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHNlZW4gPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBMaXN0PEFjY291bnRHcm91cC5VVUlEPiBxID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBzZWVuLmFkZChzdGFydFVVSUQpOworICAgIHEuYWRkKHN0YXJ0VVVJRCk7CisKKyAgICB3aGlsZSAoIXEuaXNFbXB0eSgpKSB7CisgICAgICBBY2NvdW50R3JvdXAuVVVJRCB1dWlkID0gcS5yZW1vdmUocS5zaXplKCkgLSAxKTsKKyAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ3JvdXAgPSBhcmdzLmdyb3VwQmFja2VuZC5nZXQodXVpZCk7CisgICAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShncm91cC5nZXRFbWFpbEFkZHJlc3MoKSkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGdyb3VwIGhhcyBhbiBlbWFpbCBhZGRyZXNzLCBkbyBub3QgZXhwYW5kIG1lbWJlcnNoaXAuCisgICAgICAgIG1hdGNoaW5nLmVtYWlscy5hZGQobmV3IEFkZHJlc3MoZ3JvdXAuZ2V0RW1haWxBZGRyZXNzKCkpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIEFjY291bnRHcm91cCBpZyA9IEdyb3VwRGVzY3JpcHRpb25zLnRvQWNjb3VudEdyb3VwKGdyb3VwKTsKKyAgICAgIGlmIChpZyA9PSBudWxsKSB7CisgICAgICAgIC8vIE5vbi1pbnRlcm5hbCBncm91cHMgY2Fubm90IGJlIGV4cGFuZGVkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmb3IgKEFjY291bnRHcm91cE1lbWJlciBtIDogZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmJ5R3JvdXAoaWcuZ2V0SWQoKSkpIHsKKyAgICAgICAgbWF0Y2hpbmcuYWNjb3VudHMuYWRkKG0uZ2V0QWNjb3VudElkKCkpOworICAgICAgfQorICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBtIDogYXJncy5ncm91cEluY2x1ZGVzLm1lbWJlcnNPZih1dWlkKSkgeworICAgICAgICBpZiAoc2Vlbi5hZGQobSkpIHsKKyAgICAgICAgICBxLmFkZChtKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGQoV2F0Y2hlcnMgbWF0Y2hpbmcsIEFjY291bnRQcm9qZWN0V2F0Y2ggdykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPQorICAgICAgICBhcmdzLmlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYXJncy5kYiwgdy5nZXRBY2NvdW50SWQoKSk7CisKKyAgICB0cnkgeworICAgICAgaWYgKGZpbHRlck1hdGNoKHVzZXIsIHcuZ2V0RmlsdGVyKCkpKSB7CisgICAgICAgIG1hdGNoaW5nLmJjYy5hY2NvdW50cy5hZGQody5nZXRBY2NvdW50SWQoKSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUXVlcnlQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBJZ25vcmUgYnJva2VuIGZpbHRlciBleHByZXNzaW9ucy4KKyAgICB9CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSBib29sZWFuIGZpbHRlck1hdGNoKEN1cnJlbnRVc2VyIHVzZXIsIFN0cmluZyBmaWx0ZXIpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBRdWVyeVBhcnNlRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VRdWVyeUJ1aWxkZXIgcWI7CisgICAgUHJlZGljYXRlPENoYW5nZURhdGE+IHAgPSBudWxsOworCisgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgcWIgPSBhcmdzLnF1ZXJ5QnVpbGRlci5jcmVhdGUoYXJncy5hbm9ueW1vdXNVc2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgcWIgPSBhcmdzLnF1ZXJ5QnVpbGRlci5jcmVhdGUodXNlcik7CisgICAgICBwID0gcWIuaXNfdmlzaWJsZSgpOworICAgIH0KKworICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgeworICAgICAgcWIuc2V0QWxsb3dGaWxlKHRydWUpOworICAgICAgUHJlZGljYXRlPENoYW5nZURhdGE+IGZpbHRlclByZWRpY2F0ZSA9IHFiLnBhcnNlKGZpbHRlcik7CisgICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICAgIHAgPSBmaWx0ZXJQcmVkaWNhdGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBwID0gUHJlZGljYXRlLmFuZChmaWx0ZXJQcmVkaWNhdGUsIHApOworICAgICAgfQorICAgICAgcCA9IGFyZ3MucXVlcnlSZXdyaXRlci5nZXQoKS5yZXdyaXRlKHApOworICAgIH0KKyAgICByZXR1cm4gcCA9PSBudWxsID8gdHJ1ZSA6IHAubWF0Y2goY2hhbmdlRGF0YSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWJhc2VkUGF0Y2hTZXRTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWJhc2VkUGF0Y2hTZXRTZW5kZXIuamF2YQppbmRleCA4ZmM4MjM4Li5mOWE4NWI5IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmViYXNlZFBhdGNoU2V0U2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlYmFzZWRQYXRjaFNldFNlbmRlci5qYXZhCkBAIC0xNCw5ICsxNCw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKQEAgLTI3LDEwICsyNiw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBSZWJhc2VkUGF0Y2hTZXRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgU3NoSW5mbyBzaSwKLSAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBzaSwgYyk7CisgIHB1YmxpYyBSZWJhc2VkUGF0Y2hTZXRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlZ2lzdGVyTmV3RW1haWxTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWdpc3Rlck5ld0VtYWlsU2VuZGVyLmphdmEKaW5kZXggMTdmZTljNi4uZWIzMjcwMCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlZ2lzdGVyTmV3RW1haWxTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVnaXN0ZXJOZXdFbWFpbFNlbmRlci5qYXZhCkBAIC0xNCw4ICsxNCw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0zMiwxMCArMzIsOSBAQAogICBASW5qZWN0CiAgIHB1YmxpYyBSZWdpc3Rlck5ld0VtYWlsU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAogICAgICAgRW1haWxUb2tlblZlcmlmaWVyIGV0diwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLAogICAgICAgSWRlbnRpZmllZFVzZXIgY2FsbGluZ1VzZXIsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgU3RyaW5nIGFkZHJlc3MpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgInJlZ2lzdGVybmV3ZW1haWwiKTsKKyAgICBzdXBlcihlYSwgInJlZ2lzdGVybmV3ZW1haWwiKTsKICAgICB0b2tlblZlcmlmaWVyID0gZXR2OwogICAgIHVzZXIgPSBjYWxsaW5nVXNlcjsKICAgICBhZGRyID0gYWRkcmVzczsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBsYWNlUGF0Y2hTZXRTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBsYWNlUGF0Y2hTZXRTZW5kZXIuamF2YQppbmRleCA5NzA1YjhhLi5kODBmYjUwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbGFjZVBhdGNoU2V0U2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlcGxhY2VQYXRjaFNldFNlbmRlci5qYXZhCkBAIC0xNCwxNSArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCi1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkhvc3RLZXk7Ci0KIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMzcsMTQgKzM1LDEwIEBACiAKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gZXh0cmFDQyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7Ci0gIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOwogCiAgIEBJbmplY3QKLSAgcHVibGljIFJlcGxhY2VQYXRjaFNldFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBTc2hJbmZvIHNpLAotICAgICAgQEFzc2lzdGVkIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIGMsICJuZXdwYXRjaHNldCIpOwotICAgIHNzaEluZm8gPSBzaTsKKyAgcHVibGljIFJlcGxhY2VQYXRjaFNldFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMsICJuZXdwYXRjaHNldCIpOwogICB9CiAKICAgcHVibGljIHZvaWQgYWRkUmV2aWV3ZXJzKGZpbmFsIENvbGxlY3Rpb248QWNjb3VudC5JZD4gY2MpIHsKQEAgLTY4LDYgKzYyLDcgQEAKICAgICBhZGQoUmVjaXBpZW50VHlwZS5DQywgZXh0cmFDQyk7CiAgICAgcmNwdFRvQXV0aG9ycyhSZWNpcGllbnRUeXBlLkNDKTsKICAgICBiY2NTdGFycmVkQnkoKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5ORVdfUEFUQ0hTRVRTKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtODUsMTcgKzgwLDQgQEAKICAgICB9CiAgICAgcmV0dXJuIG5hbWVzOwogICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTc2hIb3N0KCkgewotICAgIGZpbmFsIExpc3Q8SG9zdEtleT4gaG9zdEtleXMgPSBzc2hJbmZvLmdldEhvc3RLZXlzKCk7Ci0gICAgaWYgKGhvc3RLZXlzLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIGhvc3QgPSBob3N0S2V5cy5nZXQoMCkuZ2V0SG9zdCgpOwotICAgIGlmIChob3N0LnN0YXJ0c1dpdGgoIio6IikpIHsKLSAgICAgIHJldHVybiBnZXRHZXJyaXRIb3N0KCkgKyBob3N0LnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhvc3Q7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBseVRvQ2hhbmdlU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbHlUb0NoYW5nZVNlbmRlci5qYXZhCmluZGV4IDJhNzdkMzkuLjQyYWM5MTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBseVRvQ2hhbmdlU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlcGx5VG9DaGFuZ2VTZW5kZXIuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogCiAvKiogQWxlcnQgYSB1c2VyIHRvIGEgcmVwbHkgdG8gYSBjaGFuZ2UsIHVzdWFsbHkgY29tbWVudGFyeSBtYWRlIGR1cmluZyByZXZpZXcuICovCkBAIC0yMiw5ICsyMyw4IEBACiAgICAgcHVibGljIFQgY3JlYXRlKENoYW5nZSBjaGFuZ2UpOwogICB9CiAKLSAgcHJvdGVjdGVkIFJlcGx5VG9DaGFuZ2VTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLAotICAgICAgQ2hhbmdlIGMsIFN0cmluZyBtYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCBtYyk7CisgIHByb3RlY3RlZCBSZXBseVRvQ2hhbmdlU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBDaGFuZ2UgYywgU3RyaW5nIG1jKSB7CisgICAgc3VwZXIoZWEsIGMsIG1jKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Jlc3RvcmVkU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVzdG9yZWRTZW5kZXIuamF2YQppbmRleCA5NDZjMjlmLi43ZjQ2NGY3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVzdG9yZWRTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVzdG9yZWRTZW5kZXIuamF2YQpAQCAtMTQsOSArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yOCw5ICsyOCw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBSZXN0b3JlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgInJlc3RvcmUiKTsKKyAgcHVibGljIFJlc3RvcmVkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYywgInJlc3RvcmUiKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMzksNyArMzgsNyBAQAogCiAgICAgY2NBbGxBcHByb3ZhbHMoKTsKICAgICBiY2NTdGFycmVkQnkoKTsKLSAgICBiY2NXYXRjaGVzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmV2ZXJ0ZWRTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXZlcnRlZFNlbmRlci5qYXZhCmluZGV4IDAzM2JkNTYuLmQxMzg5ZmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXZlcnRlZFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXZlcnRlZFNlbmRlci5qYXZhCkBAIC0xNCw5ICsxNCw5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKQEAgLTI3LDkgKzI3LDggQEAKICAgfQogCiAgIEBJbmplY3QKLSAgcHVibGljIFJldmVydGVkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCAicmV2ZXJ0Iik7CisgIHB1YmxpYyBSZXZlcnRlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMsICJyZXZlcnQiKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMzgsNyArMzcsNyBAQAogCiAgICAgY2NBbGxBcHByb3ZhbHMoKTsKICAgICBiY2NTdGFycmVkQnkoKTsKLSAgICBiY2NXYXRjaGVzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvU210cEVtYWlsU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvU210cEVtYWlsU2VuZGVyLmphdmEKaW5kZXggY2U0NWZmZS4uNzJkZjU2MCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1NtdHBFbWFpbFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9TbXRwRW1haWxTZW5kZXIuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5WZXJzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9BZGRSZXZpZXdlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9BZGRSZXZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjkzODUyLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvQWRkUmV2aWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2g7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdlclJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkFkZFJldmlld2VyU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBZGRSZXZpZXdlciBpbXBsZW1lbnRzIENhbGxhYmxlPFJldmlld2VyUmVzdWx0PiB7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfTUFYX1JFVklFV0VSU19XSVRIT1VUX0NIRUNLID0gMTA7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfTUFYX1JFVklFV0VSUyA9IDIwOwotCi0gIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgQWRkUmV2aWV3ZXIgY3JlYXRlKENoYW5nZS5JZCBjaGFuZ2VJZCwKLSAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IHVzZXJOYW1lT3JFbWFpbE9yR3JvdXBOYW1lcywgYm9vbGVhbiBjb25maXJtZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBZGRSZXZpZXdlclNlbmRlci5GYWN0b3J5IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOwotICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBHcm91cE1lbWJlcnMuRmFjdG9yeSBncm91cE1lbWJlcnNGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBhZGRSZXZpZXdlckNhdGVnb3J5SWQ7Ci0gIHByaXZhdGUgZmluYWwgQ29uZmlnIGNmZzsKLQotICBwcml2YXRlIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZDsKLSAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcmV2aWV3ZXJzOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29uZmlybWVkOwotCi0gIEBJbmplY3QKLSAgQWRkUmV2aWV3ZXIoZmluYWwgQWRkUmV2aWV3ZXJTZW5kZXIuRmFjdG9yeSBhZGRSZXZpZXdlclNlbmRlckZhY3RvcnksCi0gICAgICBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLCBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCi0gICAgICBmaW5hbCBHcm91cE1lbWJlcnMuRmFjdG9yeSBncm91cE1lbWJlcnNGYWN0b3J5LAotICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LCBmaW5hbCBSZXZpZXdEYiBkYiwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLCBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsIEBBc3Npc3RlZCBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQsCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHJldmlld2VycywKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBib29sZWFuIGNvbmZpcm1lZCkgewotICAgIHRoaXMuYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5ID0gYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5OwotICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOwotICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7Ci0gICAgdGhpcy5ncm91cE1lbWJlcnNGYWN0b3J5ID0gZ3JvdXBNZW1iZXJzRmFjdG9yeTsKLSAgICB0aGlzLmRiID0gZGI7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMuaWRlbnRpZmllZFVzZXJGYWN0b3J5ID0gaWRlbnRpZmllZFVzZXJGYWN0b3J5OwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLmNmZyA9IGNmZzsKLQotICAgIGZpbmFsIExpc3Q8QXBwcm92YWxUeXBlPiBhbGxUeXBlcyA9IGFwcHJvdmFsVHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpOwotICAgIGFkZFJldmlld2VyQ2F0ZWdvcnlJZCA9Ci0gICAgICAgIGFsbFR5cGVzLmdldChhbGxUeXBlcy5zaXplKCkgLSAxKS5nZXRDYXRlZ29yeSgpLmdldElkKCk7Ci0KLSAgICB0aGlzLmNoYW5nZUlkID0gY2hhbmdlSWQ7Ci0gICAgdGhpcy5yZXZpZXdlcnMgPSByZXZpZXdlcnM7Ci0gICAgdGhpcy5jb25maXJtZWQgPSBjb25maXJtZWQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFJldmlld2VyUmVzdWx0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJJZHMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLQotICAgIGZpbmFsIFJldmlld2VyUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXZpZXdlclJlc3VsdCgpOwotICAgIGZvciAoZmluYWwgU3RyaW5nIHJldmlld2VyIDogcmV2aWV3ZXJzKSB7Ci0gICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBhY2NvdW50UmVzb2x2ZXIuZmluZChyZXZpZXdlcik7Ci0gICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7Ci0gICAgICAgIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShyZXZpZXdlcikpOwotCi0gICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdlclJlc3VsdC5FcnJvcigKLSAgICAgICAgICAgICAgUmV2aWV3ZXJSZXN1bHQuRXJyb3IuVHlwZS5SRVZJRVdFUl9OT1RfRk9VTkQsIHJldmlld2VyKSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzTGVnYWxSZXZpZXdlckdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSkgewotICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3ZXJSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICAgIFJldmlld2VyUmVzdWx0LkVycm9yLlR5cGUuR1JPVVBfTk9UX0FMTE9XRUQsIHJldmlld2VyKSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudD4gbWVtYmVycyA9Ci0gICAgICAgICAgICBncm91cE1lbWJlcnNGYWN0b3J5LmNyZWF0ZSgpLmxpc3RBY2NvdW50cyhncm91cC5nZXRHcm91cFVVSUQoKSwKLSAgICAgICAgICAgICAgICBjb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOwotICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsIHx8IG1lbWJlcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgICBSZXZpZXdlclJlc3VsdC5FcnJvci5UeXBlLkdST1VQX0VNUFRZLCByZXZpZXdlcikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbWF4QWxsb3dlZCBpcyBzZXQgdG8gMCwgaXQgaXMgYWxsb3dlZCB0byBhZGQgYW55IG51bWJlciBvZgotICAgICAgICAvLyByZXZpZXdlcnMKLSAgICAgICAgZmluYWwgaW50IG1heEFsbG93ZWQgPQotICAgICAgICAgICAgY2ZnLmdldEludCgiYWRkcmV2aWV3ZXIiLCAibWF4QWxsb3dlZCIsIERFRkFVTFRfTUFYX1JFVklFV0VSUyk7Ci0gICAgICAgIGlmIChtYXhBbGxvd2VkID4gMCAmJiBtZW1iZXJzLnNpemUoKSA+IG1heEFsbG93ZWQpIHsKLSAgICAgICAgICByZXN1bHQuc2V0TWVtYmVyQ291bnQobWVtYmVycy5zaXplKCkpOwotICAgICAgICAgIHJlc3VsdC5zZXRBc2tGb3JDb25maXJtYXRpb24oZmFsc2UpOwotICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3ZXJSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICAgIFJldmlld2VyUmVzdWx0LkVycm9yLlR5cGUuR1JPVVBfSEFTX1RPT19NQU5ZX01FTUJFUlMsIHJldmlld2VyKSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBtYXhXaXRob3V0Q2hlY2sgaXMgc2V0IHRvIDAsIHdlIG5ldmVyIGFzayBmb3IgY29uZmlybWF0aW9uCi0gICAgICAgIGZpbmFsIGludCBtYXhXaXRob3V0Q29uZmlybWF0aW9uID0KLSAgICAgICAgICAgIGNmZy5nZXRJbnQoImFkZHJldmlld2VyIiwgIm1heFdpdGhvdXRDb25maXJtYXRpb24iLAotICAgICAgICAgICAgICAgIERFRkFVTFRfTUFYX1JFVklFV0VSU19XSVRIT1VUX0NIRUNLKTsKLSAgICAgICAgaWYgKCFjb25maXJtZWQgJiYgbWF4V2l0aG91dENvbmZpcm1hdGlvbiA+IDAKLSAgICAgICAgICAgICYmIG1lbWJlcnMuc2l6ZSgpID4gbWF4V2l0aG91dENvbmZpcm1hdGlvbikgewotICAgICAgICAgIHJlc3VsdC5zZXRNZW1iZXJDb3VudChtZW1iZXJzLnNpemUoKSk7Ci0gICAgICAgICAgcmVzdWx0LnNldEFza0ZvckNvbmZpcm1hdGlvbih0cnVlKTsKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgICBSZXZpZXdlclJlc3VsdC5FcnJvci5UeXBlLkdST1VQX0hBU19UT09fTUFOWV9NRU1CRVJTLCByZXZpZXdlcikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChmaW5hbCBBY2NvdW50IG1lbWJlciA6IG1lbWJlcnMpIHsKLSAgICAgICAgICBpZiAobWVtYmVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIgPQotICAgICAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUobWVtYmVyLmdldElkKCkpOwotICAgICAgICAgICAgLy8gRG9lcyBub3QgYWNjb3VudCBmb3IgZHJhZnQgc3RhdHVzIGFzIGEgdXNlciBtaWdodCB3YW50IHRvIGxldCBhCi0gICAgICAgICAgICAvLyByZXZpZXdlciBzZWUgYSBkcmFmdC4KLSAgICAgICAgICAgIGlmIChjb250cm9sLmZvclVzZXIodXNlcikuaXNSZWZWaXNpYmxlKCkpIHsKLSAgICAgICAgICAgICAgcmV2aWV3ZXJJZHMuYWRkKG1lbWJlci5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghYWNjb3VudC5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3ZXJSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICBSZXZpZXdlclJlc3VsdC5FcnJvci5UeXBlLkFDQ09VTlRfSU5BQ1RJVkUsCi0gICAgICAgICAgICBmb3JtYXRVc2VyKGFjY291bnQsIHJldmlld2VyKSkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlciA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYWNjb3VudC5nZXRJZCgpKTsKLSAgICAgIC8vIERvZXMgbm90IGFjY291bnQgZm9yIGRyYWZ0IHN0YXR1cyBhcyBhIHVzZXIgbWlnaHQgd2FudCB0byBsZXQgYQotICAgICAgLy8gcmV2aWV3ZXIgc2VlIGEgZHJhZnQuCi0gICAgICBpZiAoIWNvbnRyb2wuZm9yVXNlcih1c2VyKS5pc1JlZlZpc2libGUoKSkgewotICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgUmV2aWV3ZXJSZXN1bHQuRXJyb3IuVHlwZS5DSEFOR0VfTk9UX1ZJU0lCTEUsCi0gICAgICAgICAgICBmb3JtYXRVc2VyKGFjY291bnQsIHJldmlld2VyKSkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgcmV2aWV3ZXJJZHMuYWRkKGFjY291bnQuZ2V0SWQoKSk7Ci0gICAgfQotCi0gICAgaWYgKHJldmlld2VySWRzLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBBZGQgdGhlIHJldmlld2VycyB0byB0aGUgZGF0YWJhc2UKLSAgICAvLwotICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBhZGRlZCA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7Ci0gICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiB0b0luc2VydCA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICBmaW5hbCBQYXRjaFNldC5JZCBwc2lkID0gY29udHJvbC5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgIGZvciAoZmluYWwgQWNjb3VudC5JZCByZXZpZXdlciA6IHJldmlld2VySWRzKSB7Ci0gICAgICBpZiAoIWV4aXN0cyhwc2lkLCByZXZpZXdlcikpIHsKLSAgICAgICAgLy8gVGhpcyByZXZpZXdlciBoYXMgbm90IGVudGVyZWQgYW4gYXBwcm92YWwgZm9yIHRoaXMgY2hhbmdlIHlldC4KLSAgICAgICAgLy8KLSAgICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBteWNhID0KLSAgICAgICAgICAgIGR1bW15QXBwcm92YWwoY29udHJvbC5nZXRDaGFuZ2UoKSwgcHNpZCwgcmV2aWV3ZXIpOwotICAgICAgICB0b0luc2VydC5hZGQobXljYSk7Ci0gICAgICAgIGFkZGVkLmFkZChyZXZpZXdlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KHRvSW5zZXJ0KTsKLQotICAgIC8vIEVtYWlsIHRoZSByZXZpZXdlcnMKLSAgICAvLwotICAgIC8vIFRoZSB1c2VyIGtub3dzIHRoZXkgYWRkZWQgdGhlbXNlbHZlcywgZG9uJ3QgYm90aGVyIGVtYWlsaW5nIHRoZW0uCi0gICAgYWRkZWQucmVtb3ZlKGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpKTsKLSAgICBpZiAoIWFkZGVkLmlzRW1wdHkoKSkgewotICAgICAgZmluYWwgQWRkUmV2aWV3ZXJTZW5kZXIgY207Ci0KLSAgICAgIGNtID0gYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5LmNyZWF0ZShjb250cm9sLmdldENoYW5nZSgpKTsKLSAgICAgIGNtLnNldEZyb20oY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCkpOwotICAgICAgY20uYWRkUmV2aWV3ZXJzKGFkZGVkKTsKLSAgICAgIGNtLnNlbmQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0VXNlcihBY2NvdW50IGFjY291bnQsIFN0cmluZyBuYW1lT3JFbWFpbCkgewotICAgIGlmIChuYW1lT3JFbWFpbC5tYXRjaGVzKCJeWzEtOV1bMC05XSokIikpIHsKLSAgICAgIHJldHVybiBSZW1vdmVSZXZpZXdlci5mb3JtYXRVc2VyKGFjY291bnQsIG5hbWVPckVtYWlsKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5hbWVPckVtYWlsOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBleGlzdHMoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKLSAgICAgIGZpbmFsIEFjY291bnQuSWQgcmV2aWV3ZXJJZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldFVzZXIocGF0Y2hTZXRJZCwgcmV2aWV3ZXJJZCkKLSAgICAgICAgLml0ZXJhdG9yKCkuaGFzTmV4dCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBQYXRjaFNldEFwcHJvdmFsIGR1bW15QXBwcm92YWwoZmluYWwgQ2hhbmdlIGNoYW5nZSwKLSAgICAgIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIEFjY291bnQuSWQgcmV2aWV3ZXJJZCkgewotICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgZHVtbXlBcHByb3ZhbCA9Ci0gICAgICAgIG5ldyBQYXRjaFNldEFwcHJvdmFsKG5ldyBQYXRjaFNldEFwcHJvdmFsLktleShwYXRjaFNldElkLCByZXZpZXdlcklkLAotICAgICAgICAgICAgYWRkUmV2aWV3ZXJDYXRlZ29yeUlkKSwgKHNob3J0KSAwKTsKLSAgICBkdW1teUFwcHJvdmFsLmNhY2hlKGNoYW5nZSk7Ci0gICAgcmV0dXJuIGR1bW15QXBwcm92YWw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhbFJldmlld2VyR3JvdXAoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlEKSB7Ci0gICAgcmV0dXJuICEoQWNjb3VudEdyb3VwLkFOT05ZTU9VU19VU0VSUy5lcXVhbHMoZ3JvdXBVVUlEKQotICAgICAgICAgICAgIHx8IEFjY291bnRHcm91cC5SRUdJU1RFUkVEX1VTRVJTLmVxdWFscyhncm91cFVVSUQpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVEaWZmS2V5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZURpZmZLZXkuamF2YQppbmRleCA2MmVkNWU0Li41YjM3YjkyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZURpZmZLZXkuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZURpZmZLZXkuamF2YQpAQCAtODIsNiArODIsMTAgQEAKICAgICByZXR1cm4gYklkOwogICB9CiAKKyAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVXaGl0ZXNwYWNlKCkgeworICAgIHJldHVybiBpZ25vcmVXaGl0ZXNwYWNlOworICB9CisKICAgUHJvamVjdC5OYW1lS2V5IGdldFByb2plY3QoKSB7CiAgICAgcmV0dXJuIHByb2plY3RLZXk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lTG9hZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZUxvYWRlci5qYXZhCmluZGV4IDViNjU5MjAuLmI5NTk5NGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lTG9hZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVMb2FkZXIuamF2YQpAQCAtMjksMTAgKzI5LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGNsYXNzIEludHJhTGluZUxvYWRlciBleHRlbmRzIENhY2hlTG9hZGVyPEludHJhTGluZURpZmZLZXksIEludHJhTGluZURpZmY+IHsKQEAgLTQ0LDE2ICs0MSwxMiBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIENPTlRST0xfQkxPQ0tfU1RBUlRfUkUgPSBQYXR0ZXJuCiAgICAgICAuY29tcGlsZSgiW3s6XVsgXFx0XSokIik7CiAKLSAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFdvcmtlcj4gd29ya2VyUG9vbDsKKyAgcHJpdmF0ZSBmaW5hbCBJbnRyYUxpbmVXb3JrZXJQb29sIHdvcmtlclBvb2w7CiAgIHByaXZhdGUgZmluYWwgbG9uZyB0aW1lb3V0TWlsbGlzOwogCiAgIEBJbmplY3QKLSAgSW50cmFMaW5lTG9hZGVyKGZpbmFsIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgewotICAgIGZpbmFsIGludCB3b3JrZXJzID0KLSAgICAgICAgY2ZnLmdldEludCgiY2FjaGUiLCBQYXRjaExpc3RDYWNoZUltcGwuSU5UUkFfTkFNRSwgIm1heElkbGVXb3JrZXJzIiwKLSAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSAqIDMgLyAyKTsKLSAgICB3b3JrZXJQb29sID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxXb3JrZXI+KHdvcmtlcnMsIHRydWUgLyogZmFpciAqLyk7Ci0KKyAgSW50cmFMaW5lTG9hZGVyKEludHJhTGluZVdvcmtlclBvb2wgcG9vbCwgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnKSB7CisgICAgd29ya2VyUG9vbCA9IHBvb2w7CiAgICAgdGltZW91dE1pbGxpcyA9CiAgICAgICAgIENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLCAiY2FjaGUiLCBQYXRjaExpc3RDYWNoZUltcGwuSU5UUkFfTkFNRSwKICAgICAgICAgICAgICJ0aW1lb3V0IiwgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoNSwgVGltZVVuaXQuU0VDT05EUyksCkBAIC02MiwyNiArNTUsMTcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIEludHJhTGluZURpZmYgbG9hZChJbnRyYUxpbmVEaWZmS2V5IGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgV29ya2VyIHcgPSB3b3JrZXJQb29sLnBvbGwoKTsKLSAgICBpZiAodyA9PSBudWxsKSB7Ci0gICAgICB3ID0gbmV3IFdvcmtlcigpOwotICAgIH0KKyAgICBJbnRyYUxpbmVXb3JrZXJQb29sLldvcmtlciB3ID0gd29ya2VyUG9vbC5hY3F1aXJlKCk7CisgICAgSW50cmFMaW5lV29ya2VyUG9vbC5Xb3JrZXIuUmVzdWx0IHIgPSB3LmNvbXB1dGVXaXRoVGltZW91dChrZXksIHRpbWVvdXRNaWxsaXMpOwogCi0gICAgV29ya2VyLlJlc3VsdCByID0gdy5jb21wdXRlV2l0aFRpbWVvdXQoa2V5LCB0aW1lb3V0TWlsbGlzKTsKLQotICAgIGlmIChyID09IFdvcmtlci5SZXN1bHQuVElNRU9VVCkgeworICAgIGlmIChyID09IEludHJhTGluZVdvcmtlclBvb2wuV29ya2VyLlJlc3VsdC5USU1FT1VUKSB7CiAgICAgICAvLyBEb24ndCBrZWVwIHRoaXMgdGhyZWFkLiBXZSBoYXZlIHRvIG11cmRlciBpdCB1bnNhZmVseSwgd2hpY2gKICAgICAgIC8vIG1lYW5zIGl0cyB1bmFibGUgdG8gYmUgcmV1c2VkIGluIHRoZSBmdXR1cmUuIFJldHVybiBiYWNrIGEKICAgICAgIC8vIG51bGwgcmVzdWx0LCBpbmRpY2F0aW5nIHRoZSBjYWNoZSBjYW5ub3QgbG9hZCB0aGlzIGtleS4KICAgICAgIC8vCiAgICAgICByZXR1cm4gbmV3IEludHJhTGluZURpZmYoSW50cmFMaW5lRGlmZi5TdGF0dXMuVElNRU9VVCk7CiAgICAgfQotCi0gICAgaWYgKCF3b3JrZXJQb29sLm9mZmVyKHcpKSB7Ci0gICAgICAvLyBJZiB0aGUgaWRsZSB3b3JrZXIgcG9vbCBpcyBmdWxsLCB0ZXJtaW5hdGUgdGhpcyB0aHJlYWQuCi0gICAgICAvLwotICAgICAgdy5lbmQoKTsKLSAgICB9CisgICAgd29ya2VyUG9vbC5yZWxlYXNlKHcpOwogCiAgICAgaWYgKHIuZXJyb3IgIT0gbnVsbCkgewogICAgICAgLy8gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0LCBjYXJyeSBpdApAQCAtOTMsMTI3ICs3Nyw3IEBACiAgICAgcmV0dXJuIHIuZGlmZjsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmtlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8SW5wdXQ+IGlucHV0OwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPFJlc3VsdD4gcmVzdWx0OwotICAgIHByaXZhdGUgZmluYWwgVGhyZWFkIHRocmVhZDsKLQotICAgIFdvcmtlcigpIHsKLSAgICAgIGlucHV0ID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxJbnB1dD4oMSk7Ci0gICAgICByZXN1bHQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJlc3VsdD4oMSk7Ci0KLSAgICAgIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgd29ya2VyTG9vcCgpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIHRocmVhZC5zZXROYW1lKCJJbnRyYUxpbmVEaWZmLSIgKyBjb3VudC5nZXRBbmRJbmNyZW1lbnQoKSk7Ci0gICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgICAgdGhyZWFkLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgUmVzdWx0IGNvbXB1dGVXaXRoVGltZW91dChJbnRyYUxpbmVEaWZmS2V5IGtleSwgbG9uZyB0aW1lb3V0TWlsbGlzKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIGlmICghaW5wdXQub2ZmZXIobmV3IElucHV0KGtleSkpKSB7Ci0gICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVucXVldWUgdGFzayB0byB0aHJlYWQgIiArIHRocmVhZC5nZXROYW1lKCkpOwotICAgICAgICByZXR1cm4gUmVzdWx0LlRJTUVPVVQ7Ci0gICAgICB9Ci0KLSAgICAgIFJlc3VsdCByID0gcmVzdWx0LnBvbGwodGltZW91dE1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsb2cud2Fybih0aW1lb3V0TWlsbGlzICsgIiBtcyB0aW1lb3V0IHJlYWNoZWQgZm9yIEludHJhTGluZURpZmYiCi0gICAgICAgICAgICArICIgaW4gcHJvamVjdCAiICsga2V5LmdldFByb2plY3QoKS5nZXQoKSAvLwotICAgICAgICAgICAgKyAiIG9uIGNvbW1pdCAiICsga2V5LmdldENvbW1pdCgpLm5hbWUoKSAvLwotICAgICAgICAgICAgKyAiIGZvciBwYXRoICIgKyBrZXkuZ2V0UGF0aCgpIC8vCi0gICAgICAgICAgICArICIgY29tcGFyaW5nICIgKyBrZXkuZ2V0QmxvYkEoKS5uYW1lKCkgLy8KLSAgICAgICAgICAgICsgIi4uIiArIGtleS5nZXRCbG9iQigpLm5hbWUoKSAvLwotICAgICAgICAgICAgKyAiLiAgS2lsbGluZyAiICsgdGhyZWFkLmdldE5hbWUoKSk7Ci0gICAgICAgIGZvcmNlZnVsbHlLaWxsVGhyZWFkSW5BblVnbHlXYXkoKTsKLSAgICAgICAgcmV0dXJuIFJlc3VsdC5USU1FT1VUOwotICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHJpdmF0ZSB2b2lkIGZvcmNlZnVsbHlLaWxsVGhyZWFkSW5BblVnbHlXYXkoKSB7Ci0gICAgICB0cnkgewotICAgICAgICB0aHJlYWQuc3RvcCgpOwotICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGVycm9yKSB7Ci0gICAgICAgIC8vIElnbm9yZSBhbnkgcmVhc29uIHRoZSB0aHJlYWQgd29uJ3Qgc3RvcC4KLSAgICAgICAgbG9nLmVycm9yKCJDYW5ub3Qgc3RvcCBydW5hd2F5IHRocmVhZCAiICsgdGhyZWFkLmdldE5hbWUoKSwgZXJyb3IpOwotICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZW5kKCkgewotICAgICAgaWYgKCFpbnB1dC5vZmZlcihJbnB1dC5FTkRfVEhSRUFEKSkgewotICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBncmFjZWZ1bGx5IHN0b3AgdGhyZWFkICIgKyB0aHJlYWQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd29ya2VyTG9vcCgpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICBJbnB1dCBpbjsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBpbnB1dC50YWtlKCk7Ci0gICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJVbmV4cGVjdGVkIGludGVycnVwdCBvbiAiICsgdGhyZWFkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoaW4gPT0gSW5wdXQuRU5EX1RIUkVBRCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLQotICAgICAgICAgIFJlc3VsdCByOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByID0gbmV3IFJlc3VsdChJbnRyYUxpbmVMb2FkZXIuY29tcHV0ZShpbi5rZXkpKTsKLSAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXJyb3IpIHsKLSAgICAgICAgICAgIHIgPSBuZXcgUmVzdWx0KGVycm9yKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIXJlc3VsdC5vZmZlcihyKSkgewotICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcmV0dXJuIHJlc3VsdCBmcm9tICIgKyB0aHJlYWQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRocmVhZERlYXRoIGlIYXZlQmVlblNob3QpIHsKLSAgICAgICAgLy8gSGFuZGxlIHRocmVhZCBkZWF0aCBieSBncmFjZWZ1bGx5IHJldHVybmluZyB0byB0aGUgY2FsbGVyLAotICAgICAgICAvLyBhbGxvd2luZyB0aGUgdGhyZWFkIHRvIGJlIGRlc3Ryb3llZC4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnB1dCB7Ci0gICAgICBzdGF0aWMgZmluYWwgSW5wdXQgRU5EX1RIUkVBRCA9IG5ldyBJbnB1dChudWxsKTsKLQotICAgICAgZmluYWwgSW50cmFMaW5lRGlmZktleSBrZXk7Ci0KLSAgICAgIElucHV0KEludHJhTGluZURpZmZLZXkga2V5KSB7Ci0gICAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBSZXN1bHQgewotICAgICAgc3RhdGljIGZpbmFsIFJlc3VsdCBUSU1FT1VUID0gbmV3IFJlc3VsdCgoSW50cmFMaW5lRGlmZikgbnVsbCk7Ci0KLSAgICAgIGZpbmFsIEludHJhTGluZURpZmYgZGlmZjsKLSAgICAgIGZpbmFsIEV4Y2VwdGlvbiBlcnJvcjsKLQotICAgICAgUmVzdWx0KEludHJhTGluZURpZmYgZGlmZikgewotICAgICAgICB0aGlzLmRpZmYgPSBkaWZmOwotICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKLSAgICAgIH0KLQotICAgICAgUmVzdWx0KEV4Y2VwdGlvbiBlcnJvcikgewotICAgICAgICB0aGlzLmRpZmYgPSBudWxsOwotICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgSW50cmFMaW5lRGlmZiBjb21wdXRlKEludHJhTGluZURpZmZLZXkga2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgc3RhdGljIEludHJhTGluZURpZmYgY29tcHV0ZShJbnRyYUxpbmVEaWZmS2V5IGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgTGlzdDxFZGl0PiBlZGl0cyA9IG5ldyBBcnJheUxpc3Q8RWRpdD4oa2V5LmdldEVkaXRzKCkpOwogICAgIFRleHQgYUNvbnRlbnQgPSBrZXkuZ2V0VGV4dEEoKTsKICAgICBUZXh0IGJDb250ZW50ID0ga2V5LmdldFRleHRCKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZVdvcmtlclBvb2wuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lV29ya2VyUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNjMzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVXb3JrZXJQb29sLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5JbnRyYUxpbmVMb2FkZXIubG9nOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgSW50cmFMaW5lV29ya2VyUG9vbCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgIGJpbmQoSW50cmFMaW5lV29ya2VyUG9vbC5jbGFzcyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPFdvcmtlcj4gd29ya2VyUG9vbDsKKworICBASW5qZWN0CisgIHB1YmxpYyBJbnRyYUxpbmVXb3JrZXJQb29sKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgeworICAgIGludCB3b3JrZXJzID0gY2ZnLmdldEludCgKKyAgICAgICAgImNhY2hlIiwgUGF0Y2hMaXN0Q2FjaGVJbXBsLklOVFJBX05BTUUsICJtYXhJZGxlV29ya2VycyIsCisgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSAqIDMgLyAyKTsKKyAgICB3b3JrZXJQb29sID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxXb3JrZXI+KHdvcmtlcnMsIHRydWUgLyogZmFpciAqLyk7CisgIH0KKworICBXb3JrZXIgYWNxdWlyZSgpIHsKKyAgICBXb3JrZXIgdyA9IHdvcmtlclBvb2wucG9sbCgpOworICAgIGlmICh3ID09IG51bGwpIHsKKyAgICAgIC8vIElmIG5vIHdvcmtlciBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUsIHN0YXJ0IGEgbmV3IG9uZS4KKyAgICAgIC8vIE1heGltdW0gcGFyYWxsZWxpc20gaXMgY29udHJvbGxlZCBieSB0aGUgd2ViIHNlcnZlci4KKyAgICAgIHcgPSBuZXcgV29ya2VyKCk7CisgICAgICB3LnN0YXJ0KCk7CisgICAgfQorICAgIHJldHVybiB3OworICB9CisKKyAgdm9pZCByZWxlYXNlKFdvcmtlciB3KSB7CisgICAgaWYgKCF3b3JrZXJQb29sLm9mZmVyKHcpKSB7CisgICAgICAvLyBJZiB0aGUgaWRsZSB3b3JrZXIgcG9vbCBpcyBmdWxsLCB0ZXJtaW5hdGUgdGhlIHdvcmtlci4KKyAgICAgIHcuc2h1dGRvd25HcmFjZWZ1bGx5KCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIFdvcmtlciBleHRlbmRzIFRocmVhZCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUJsb2NraW5nUXVldWU8SW5wdXQ+IGlucHV0OworICAgIHByaXZhdGUgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPFJlc3VsdD4gcmVzdWx0OworCisgICAgV29ya2VyKCkgeworICAgICAgaW5wdXQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPElucHV0PigxKTsKKyAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8UmVzdWx0PigxKTsKKworICAgICAgc2V0TmFtZSgiSW50cmFMaW5lRGlmZi0iICsgY291bnQuZ2V0QW5kSW5jcmVtZW50KCkpOworICAgICAgc2V0RGFlbW9uKHRydWUpOworICAgIH0KKworICAgIFJlc3VsdCBjb21wdXRlV2l0aFRpbWVvdXQoSW50cmFMaW5lRGlmZktleSBrZXksIGxvbmcgdGltZW91dE1pbGxpcykKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBpZiAoIWlucHV0Lm9mZmVyKG5ldyBJbnB1dChrZXkpKSkgeworICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbnF1ZXVlIHRhc2sgdG8gdGhyZWFkICIgKyBnZXROYW1lKCkpOworICAgICAgICByZXR1cm4gUmVzdWx0LlRJTUVPVVQ7CisgICAgICB9CisKKyAgICAgIFJlc3VsdCByID0gcmVzdWx0LnBvbGwodGltZW91dE1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2cud2Fybih0aW1lb3V0TWlsbGlzICsgIiBtcyB0aW1lb3V0IHJlYWNoZWQgZm9yIEludHJhTGluZURpZmYiCisgICAgICAgICAgICArICIgaW4gcHJvamVjdCAiICsga2V5LmdldFByb2plY3QoKS5nZXQoKQorICAgICAgICAgICAgKyAiIG9uIGNvbW1pdCAiICsga2V5LmdldENvbW1pdCgpLm5hbWUoKQorICAgICAgICAgICAgKyAiIGZvciBwYXRoICIgKyBrZXkuZ2V0UGF0aCgpCisgICAgICAgICAgICArICIgY29tcGFyaW5nICIgKyBrZXkuZ2V0QmxvYkEoKS5uYW1lKCkKKyAgICAgICAgICAgICsgIi4uIiArIGtleS5nZXRCbG9iQigpLm5hbWUoKQorICAgICAgICAgICAgKyAiLiAgS2lsbGluZyAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgZm9yY2VmdWxseUtpbGxUaHJlYWRJbkFuVWdseVdheSgpOworICAgICAgICByZXR1cm4gUmVzdWx0LlRJTUVPVVQ7CisgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHZvaWQgZm9yY2VmdWxseUtpbGxUaHJlYWRJbkFuVWdseVdheSgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0b3AoKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAvLyBJZ25vcmUgYW55IHJlYXNvbiB0aGUgdGhyZWFkIHdvbid0IHN0b3AuCisgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHN0b3AgcnVuYXdheSB0aHJlYWQgIiArIGdldE5hbWUoKSwgZXJyb3IpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bkdyYWNlZnVsbHkoKSB7CisgICAgICBpZiAoIWlucHV0Lm9mZmVyKElucHV0LkVORF9USFJFQUQpKSB7CisgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGdyYWNlZnVsbHkgc3RvcCB0aHJlYWQgIiArIGdldE5hbWUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgIElucHV0IGluOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbiA9IGlucHV0LnRha2UoKTsKKyAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIlVuZXhwZWN0ZWQgaW50ZXJydXB0IG9uICIgKyBnZXROYW1lKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKGluID09IElucHV0LkVORF9USFJFQUQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBSZXN1bHQgcjsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgciA9IG5ldyBSZXN1bHQoSW50cmFMaW5lTG9hZGVyLmNvbXB1dGUoaW4ua2V5KSk7CisgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgICAgICByID0gbmV3IFJlc3VsdChlcnJvcik7CisgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKCFyZXN1bHQub2ZmZXIocikpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJldHVybiByZXN1bHQgZnJvbSAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFRocmVhZERlYXRoIGlIYXZlQmVlblNob3QpIHsKKyAgICAgICAgLy8gSGFuZGxlIHRocmVhZCBkZWF0aCBieSBncmFjZWZ1bGx5IHJldHVybmluZyB0byB0aGUgY2FsbGVyLAorICAgICAgICAvLyBhbGxvd2luZyB0aGUgdGhyZWFkIHRvIGJlIGRlc3Ryb3llZC4KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgICBzdGF0aWMgZmluYWwgSW5wdXQgRU5EX1RIUkVBRCA9IG5ldyBJbnB1dChudWxsKTsKKworICAgICAgZmluYWwgSW50cmFMaW5lRGlmZktleSBrZXk7CisKKyAgICAgIElucHV0KEludHJhTGluZURpZmZLZXkga2V5KSB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBSZXN1bHQgeworICAgICAgc3RhdGljIGZpbmFsIFJlc3VsdCBUSU1FT1VUID0gbmV3IFJlc3VsdCgoSW50cmFMaW5lRGlmZikgbnVsbCk7CisKKyAgICAgIGZpbmFsIEludHJhTGluZURpZmYgZGlmZjsKKyAgICAgIGZpbmFsIEV4Y2VwdGlvbiBlcnJvcjsKKworICAgICAgUmVzdWx0KEludHJhTGluZURpZmYgZGlmZikgeworICAgICAgICB0aGlzLmRpZmYgPSBkaWZmOworICAgICAgICB0aGlzLmVycm9yID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgUmVzdWx0KEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICB0aGlzLmRpZmYgPSBudWxsOworICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL1B1Ymxpc2hDb21tZW50cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9QdWJsaXNoQ29tbWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYmNhYS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL1B1Ymxpc2hDb21tZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2g7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ29tbWVudFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RTY29wZVByb3BhZ2F0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkZ1bmN0aW9uU3RhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLQotcHVibGljIGNsYXNzIFB1Ymxpc2hDb21tZW50cyBpbXBsZW1lbnRzIENhbGxhYmxlPFZvaWRSZXN1bHQ+IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9Ci0gICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQdWJsaXNoQ29tbWVudHMuY2xhc3MpOwotCi0gIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUHVibGlzaENvbW1lbnRzIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZVRleHQsCi0gICAgICAgIFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFscywgYm9vbGVhbiBmb3JjZU1lc3NhZ2UpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyB0eXBlczsKLSAgcHJpdmF0ZSBmaW5hbCBDb21tZW50U2VuZGVyLkZhY3RvcnkgY29tbWVudFNlbmRlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZUZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7Ci0gIHByaXZhdGUgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yIHJlcXVlc3RTY29wZVByb3BhZ2F0b3I7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlVGV4dDsKLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbHM7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmb3JjZU1lc3NhZ2U7Ci0KLSAgcHJpdmF0ZSBDaGFuZ2UgY2hhbmdlOwotICBwcml2YXRlIFBhdGNoU2V0IHBhdGNoU2V0OwotICBwcml2YXRlIENoYW5nZU1lc3NhZ2UgbWVzc2FnZTsKLSAgcHJpdmF0ZSBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGRyYWZ0czsKLQotICBASW5qZWN0Ci0gIFB1Ymxpc2hDb21tZW50cyhmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZiwgZmluYWwgUmV2aWV3RGIgZGIsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLAotICAgICAgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzLAotICAgICAgZmluYWwgQ29tbWVudFNlbmRlci5GYWN0b3J5IGNvbW1lbnRTZW5kZXJGYWN0b3J5LAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAotICAgICAgZmluYWwgRnVuY3Rpb25TdGF0ZS5GYWN0b3J5IGZ1bmN0aW9uU3RhdGVGYWN0b3J5LAotICAgICAgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MsCi0gICAgICBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlLAotICAgICAgZmluYWwgUmVxdWVzdFNjb3BlUHJvcGFnYXRvciByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLAotCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBTdHJpbmcgbWVzc2FnZVRleHQsCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzLAotICAgICAgQEFzc2lzdGVkIGZpbmFsIGJvb2xlYW4gZm9yY2VNZXNzYWdlKSB7Ci0gICAgdGhpcy5zY2hlbWFGYWN0b3J5ID0gc2Y7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMudXNlciA9IHVzZXI7Ci0gICAgdGhpcy50eXBlcyA9IGFwcHJvdmFsVHlwZXM7Ci0gICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgICB0aGlzLmNvbW1lbnRTZW5kZXJGYWN0b3J5ID0gY29tbWVudFNlbmRlckZhY3Rvcnk7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMuZnVuY3Rpb25TdGF0ZUZhY3RvcnkgPSBmdW5jdGlvblN0YXRlRmFjdG9yeTsKLSAgICB0aGlzLmhvb2tzID0gaG9va3M7Ci0gICAgdGhpcy53b3JrUXVldWUgPSB3b3JrUXVldWU7Ci0gICAgdGhpcy5yZXF1ZXN0U2NvcGVQcm9wYWdhdG9yID0gcmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKLQotICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7Ci0gICAgdGhpcy5tZXNzYWdlVGV4dCA9IG1lc3NhZ2VUZXh0OwotICAgIHRoaXMuYXBwcm92YWxzID0gYXBwcm92YWxzOwotICAgIHRoaXMuZm9yY2VNZXNzYWdlID0gZm9yY2VNZXNzYWdlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBWb2lkUmVzdWx0IGNhbGwoKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY3RsID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwotICAgIGNoYW5nZSA9IGN0bC5nZXRDaGFuZ2UoKTsKLSAgICBwYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICBpZiAocGF0Y2hTZXQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7Ci0gICAgfQotICAgIGRyYWZ0cyA9IGRyYWZ0cygpOwotCi0gICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlSWQpOwotICAgIHRyeSB7Ci0gICAgICBwdWJsaXNoRHJhZnRzKCk7Ci0KLSAgICAgIGZpbmFsIGJvb2xlYW4gaXNDdXJyZW50ID0gcGF0Y2hTZXRJZC5lcXVhbHMoY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOwotICAgICAgaWYgKGlzQ3VycmVudCAmJiBjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgcHVibGlzaEFwcHJvdmFscyhjdGwpOwotICAgICAgfSBlbHNlIGlmIChhcHByb3ZhbHMuaXNFbXB0eSgpIHx8IGZvcmNlTWVzc2FnZSkgewotICAgICAgICBwdWJsaXNoTWVzc2FnZU9ubHkoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKCJDaGFuZ2UgaXMgY2xvc2VkIik7Ci0gICAgICB9Ci0KLSAgICAgIHRvdWNoQ2hhbmdlKCk7Ci0gICAgICBkYi5jb21taXQoKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgZGIucm9sbGJhY2soKTsKLSAgICB9Ci0KLSAgICBlbWFpbCgpOwotICAgIGZpcmVIb29rKCk7Ci0gICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHVibGlzaERyYWZ0cygpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZvciAoZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBjIDogZHJhZnRzKSB7Ci0gICAgICBjLnNldFN0YXR1cyhQYXRjaExpbmVDb21tZW50LlN0YXR1cy5QVUJMSVNIRUQpOwotICAgICAgYy51cGRhdGVkKCk7Ci0gICAgfQotICAgIGRiLnBhdGNoQ29tbWVudHMoKS51cGRhdGUoZHJhZnRzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwdWJsaXNoQXBwcm92YWxzKENoYW5nZUNvbnRyb2wgY3RsKQotICAgICAgdGhyb3dzIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7Ci0gICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7Ci0KLSAgICBmaW5hbCBTZXQ8QXBwcm92YWxDYXRlZ29yeS5JZD4gZGlydHkgPSBuZXcgSGFzaFNldDxBcHByb3ZhbENhdGVnb3J5LklkPigpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gaW5zID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFwcHJvdmFsPigpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gdXBkID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFwcHJvdmFsPigpOwotICAgIGZpbmFsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYWxsID0KLSAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KHBhdGNoU2V0SWQpLnRvTGlzdCgpOwotICAgIGZpbmFsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiBtaW5lID0gbWluZShhbGwpOwotCi0gICAgLy8gRW5zdXJlIGFueSBuZXcgYXBwcm92YWxzIGFyZSBzdG9yZWQgcHJvcGVybHkuCi0gICAgLy8KLSAgICBmb3IgKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZCB3YW50IDogYXBwcm92YWxzKSB7Ci0gICAgICBQYXRjaFNldEFwcHJvdmFsIGEgPSBtaW5lLmdldCh3YW50LmdldFBhcmVudEtleSgpKTsKLSAgICAgIGlmIChhID09IG51bGwpIHsKLSAgICAgICAgYSA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKG5ldyBQYXRjaFNldEFwcHJvdmFsLktleSgvLwotICAgICAgICAgICAgcGF0Y2hTZXRJZCwgdXNlci5nZXRBY2NvdW50SWQoKSwgd2FudC5nZXRQYXJlbnRLZXkoKSksIHdhbnQuZ2V0KCkpOwotICAgICAgICBhLmNhY2hlKGNoYW5nZSk7Ci0gICAgICAgIGlucy5hZGQoYSk7Ci0gICAgICAgIGFsbC5hZGQoYSk7Ci0gICAgICAgIG1pbmUucHV0KGEuZ2V0Q2F0ZWdvcnlJZCgpLCBhKTsKLSAgICAgICAgZGlydHkuYWRkKGEuZ2V0Q2F0ZWdvcnlJZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3JtYWxpemUgYWxsIG9mIHRoZSBpdGVtcyB0aGUgdXNlciBpcyBjaGFuZ2luZy4KLSAgICAvLwotICAgIGZpbmFsIEZ1bmN0aW9uU3RhdGUgZnVuY3Rpb25TdGF0ZSA9Ci0gICAgICAgIGZ1bmN0aW9uU3RhdGVGYWN0b3J5LmNyZWF0ZShjdGwsIHBhdGNoU2V0SWQsIGFsbCk7Ci0gICAgZm9yIChmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQgd2FudCA6IGFwcHJvdmFscykgewotICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhID0gbWluZS5nZXQod2FudC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICBmaW5hbCBzaG9ydCBvID0gYS5nZXRWYWx1ZSgpOwotICAgICAgYS5zZXRWYWx1ZSh3YW50LmdldCgpKTsKLSAgICAgIGEuY2FjaGUoY2hhbmdlKTsKLSAgICAgIGlmICghQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKSkgewotICAgICAgICBmdW5jdGlvblN0YXRlLm5vcm1hbGl6ZSh0eXBlcy5ieUlkKGEuZ2V0Q2F0ZWdvcnlJZCgpKSwgYSk7Ci0gICAgICB9Ci0gICAgICBpZiAod2FudC5nZXQoKSAhPSBhLmdldFZhbHVlKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICB0eXBlcy5ieUlkKGEuZ2V0Q2F0ZWdvcnlJZCgpKS5nZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpCi0gICAgICAgICAgICArICI9IiArIHdhbnQuZ2V0KCkgKyAiIG5vdCBwZXJtaXR0ZWQiKTsKLSAgICAgIH0KLSAgICAgIGlmIChvICE9IGEuZ2V0VmFsdWUoKSkgewotICAgICAgICAvLyBWYWx1ZSBjaGFuZ2VkLCBlbnN1cmUgd2UgdXBkYXRlIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgLy8KLSAgICAgICAgYS5zZXRHcmFudGVkKCk7Ci0gICAgICAgIGRpcnR5LmFkZChhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWlucy5jb250YWlucyhhKSkgewotICAgICAgICB1cGQuYWRkKGEpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEZvcm1hdCBhIG1lc3NhZ2UgZXhwbGFpbmluZyB0aGUgYWN0aW9ucyB0YWtlbi4KLSAgICAvLwotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBmb3IgKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCA6IHR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgaWYgKGRpcnR5LmNvbnRhaW5zKGF0LmdldENhdGVnb3J5KCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhID0gbWluZS5nZXQoYXQuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpKTsKLSAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSA9PSAwICYmIGlucy5jb250YWlucyhhKSkgewotICAgICAgICAgIC8vIERvbid0IHNheSAibm8gc2NvcmUiIGZvciBhbiBpbml0aWFsIGVudHJ5LgotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHZhbCA9IGF0LmdldFZhbHVlKGEpOwotICAgICAgICBpZiAobXNnYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoIjsgIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHZhbC5nZXROYW1lKCkgIT0gbnVsbCAmJiAhdmFsLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKHZhbC5nZXROYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoYXQuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCkpOwotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoIiAiKTsKLSAgICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpID4gMCkgbXNnYnVmLmFwcGVuZCgnKycpOwotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoYS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFVwZGF0ZSBkYXNoYm9hcmRzIGZvciBldmVyeW9uZSBlbHNlLgotICAgIC8vCi0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhbGwpIHsKLSAgICAgIGlmICghdXNlci5nZXRBY2NvdW50SWQoKS5lcXVhbHMoYS5nZXRBY2NvdW50SWQoKSkpIHsKLSAgICAgICAgYS5jYWNoZShjaGFuZ2UpOwotICAgICAgICB1cGQuYWRkKGEpOwotICAgICAgfQotICAgIH0KLQotICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkudXBkYXRlKHVwZCk7Ci0gICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5pbnNlcnQoaW5zKTsKLQotICAgIHN1bW1hcml6ZUlubGluZUNvbW1lbnRzKG1zZ2J1Zik7Ci0gICAgbWVzc2FnZShtc2didWYudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHVibGlzaE1lc3NhZ2VPbmx5KCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nQnVpbGRlciBtc2didWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHN1bW1hcml6ZUlubGluZUNvbW1lbnRzKG1zZ2J1Zik7Ci0gICAgbWVzc2FnZShtc2didWYudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbWVzc2FnZShTdHJpbmcgYWN0aW9ucykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgaWYgKChhY3Rpb25zID09IG51bGwgfHwgYWN0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICYmIChtZXNzYWdlVGV4dCA9PSBudWxsIHx8IG1lc3NhZ2VUZXh0LmlzRW1wdHkoKSkpIHsKLSAgICAgIC8vIFRoZXkgaGFkIG5vdGhpbmcgdG8gc2F5PwotICAgICAgLy8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ2J1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgbXNnYnVmLmFwcGVuZCgiUGF0Y2ggU2V0ICIgKyBwYXRjaFNldElkLmdldCgpICsgIjoiKTsKLSAgICBpZiAoYWN0aW9ucyAhPSBudWxsICYmICFhY3Rpb25zLmlzRW1wdHkoKSkgewotICAgICAgbXNnYnVmLmFwcGVuZCgiICIpOwotICAgICAgbXNnYnVmLmFwcGVuZChhY3Rpb25zKTsKLSAgICB9Ci0gICAgbXNnYnVmLmFwcGVuZCgiXG5cbiIpOwotICAgIG1zZ2J1Zi5hcHBlbmQobWVzc2FnZVRleHQgIT0gbnVsbCA/IG1lc3NhZ2VUZXh0IDogIiIpOwotCi0gICAgbWVzc2FnZSA9IG5ldyBDaGFuZ2VNZXNzYWdlKG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2UuZ2V0SWQoKSwvLwotICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksIHVzZXIuZ2V0QWNjb3VudElkKCksIHBhdGNoU2V0SWQpOwotICAgIG1lc3NhZ2Uuc2V0TWVzc2FnZShtc2didWYudG9TdHJpbmcoKSk7Ci0gICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lc3NhZ2UpKTsKLSAgfQotCi0gIHByaXZhdGUgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IG1pbmUoCi0gICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFsbCkgewotICAgIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiByID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFsbCkgewotICAgICAgaWYgKHVzZXIuZ2V0QWNjb3VudElkKCkuZXF1YWxzKGEuZ2V0QWNjb3VudElkKCkpKSB7Ci0gICAgICAgIHIucHV0KGEuZ2V0Q2F0ZWdvcnlJZCgpLCBhKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdG91Y2hDaGFuZ2UoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIENoYW5nZVV0aWwudG91Y2goY2hhbmdlLCBkYik7Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZHJhZnRzKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGRiLnBhdGNoQ29tbWVudHMoKS5kcmFmdEJ5UGF0Y2hTZXRBdXRob3IocGF0Y2hTZXRJZCwgdXNlci5nZXRBY2NvdW50SWQoKSkudG9MaXN0KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZW1haWwoKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdvcmtRdWV1ZS5nZXREZWZhdWx0UXVldWUoKQotICAgICAgICAuc3VibWl0KHJlcXVlc3RTY29wZVByb3BhZ2F0b3Iud3JhcChuZXcgUnVubmFibGUoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgUGF0Y2hTZXRJbmZvIHBhdGNoU2V0SW5mbzsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBSZXZpZXdEYiByZXZpZXdEYiA9IHNjaGVtYUZhY3Rvcnkub3BlbigpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXRjaFNldEluZm8gPSBwYXRjaFNldEluZm9GYWN0b3J5LmdldChyZXZpZXdEYiwgcGF0Y2hTZXRJZCk7Ci0gICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHJldmlld0RiLmNsb3NlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJlYWQgUGF0Y2hTZXRJbmZvIG9mICIgKyBwYXRjaFNldElkLCBlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZW1haWwgY29tbWVudHMgZm9yICIgKyBwYXRjaFNldElkLCBlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgIGZpbmFsIENvbW1lbnRTZW5kZXIgY20gPSBjb21tZW50U2VuZGVyRmFjdG9yeS5jcmVhdGUoY2hhbmdlKTsKLSAgICAgICAgICBjbS5zZXRGcm9tKHVzZXIuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICAgIGNtLnNldFBhdGNoU2V0KHBhdGNoU2V0LCBwYXRjaFNldEluZm8pOwotICAgICAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgY20uc2V0UGF0Y2hMaW5lQ29tbWVudHMoZHJhZnRzKTsKLSAgICAgICAgICBjbS5zZW5kKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZW1haWwgY29tbWVudHMgZm9yICIgKyBwYXRjaFNldElkLCBlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAic2VuZC1lbWFpbCBjb21tZW50cyI7Ci0gICAgICB9Ci0gICAgfSkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGZpcmVIb29rKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gY2hhbmdlZCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4oKTsKLSAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZCB2IDogYXBwcm92YWxzKSB7Ci0gICAgICBjaGFuZ2VkLnB1dCh2LmdldFBhcmVudEtleSgpLCB2KTsKLSAgICB9Ci0KLSAgICBob29rcy5kb0NvbW1lbnRBZGRlZEhvb2soY2hhbmdlLCB1c2VyLmdldEFjY291bnQoKSwgcGF0Y2hTZXQsIG1lc3NhZ2VUZXh0LCBjaGFuZ2VkLCBkYik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc3VtbWFyaXplSW5saW5lQ29tbWVudHMoU3RyaW5nQnVpbGRlciBpbikgewotICAgIGlmICghZHJhZnRzLmlzRW1wdHkoKSkgewotICAgICAgaWYgKGluLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgaW4uYXBwZW5kKCJcblxuIik7Ci0gICAgICB9Ci0gICAgICBpZiAoZHJhZnRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIGluLmFwcGVuZCgiKDEgaW5saW5lIGNvbW1lbnQpIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbi5hcHBlbmQoIigiICsgZHJhZnRzLnNpemUoKSArICIgaW5saW5lIGNvbW1lbnRzKSIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3Rlck1vZHVsZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9BdXRvUmVnaXN0ZXJNb2R1bGVzLmphdmEKaW5kZXggZThhZjA2MC4uNjA2MmFlOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3Rlck1vZHVsZXMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQXV0b1JlZ2lzdGVyTW9kdWxlcy5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuQXV0b1JlZ2lzdGVyVXRpbC5jYWxjdWxhdGVCaW5kQW5ub3RhdGlvbjsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luR3VpY2VFbnZpcm9ubWVudC5pczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOwpAQCAtMjYsNyArMjcsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TY29wZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuaW50ZXJuYWwuVW5pcXVlQW5ub3RhdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CkBAIC0xMTYsMTYgKzExNiw3IEBACiAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgICAgQ2xhc3M8T2JqZWN0PiBpbXBsID0gKENsYXNzPE9iamVjdD4pIGUuZ2V0VmFsdWUoKTsKIAotICAgICAgICAgIEFubm90YXRpb24gbiA9IGltcGwuZ2V0QW5ub3RhdGlvbihFeHBvcnQuY2xhc3MpOwotICAgICAgICAgIGlmIChuID09IG51bGwpIHsKLSAgICAgICAgICAgIG4gPSBpbXBsLmdldEFubm90YXRpb24oamF2YXguaW5qZWN0Lk5hbWVkLmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG4gPT0gbnVsbCkgewotICAgICAgICAgICAgbiA9IGltcGwuZ2V0QW5ub3RhdGlvbihjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVkLmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG4gPT0gbnVsbCkgewotICAgICAgICAgICAgbiA9IFVuaXF1ZUFubm90YXRpb25zLmNyZWF0ZSgpOwotICAgICAgICAgIH0KKyAgICAgICAgICBBbm5vdGF0aW9uIG4gPSBjYWxjdWxhdGVCaW5kQW5ub3RhdGlvbihpbXBsKTsKICAgICAgICAgICBiaW5kKHR5cGUpLmFubm90YXRlZFdpdGgobikudG8oaW1wbCk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTI0NSw5ICsyMzYsMTYgQEAKIAogICAgICAgaWYgKHJhd1R5cGUuZ2V0QW5ub3RhdGlvbihFeHRlbnNpb25Qb2ludC5jbGFzcykgIT0gbnVsbCkgewogICAgICAgICBUeXBlTGl0ZXJhbDw/PiB0bCA9IFR5cGVMaXRlcmFsLmdldCh0eXBlKTsKLSAgICAgICAgaWYgKGVudi5oYXNEeW5hbWljU2V0KHRsKSkgeworICAgICAgICBpZiAoZW52Lmhhc0R5bmFtaWNJdGVtKHRsKSkgewogICAgICAgICAgIHN5c1NpbmdsZXRvbnMuYWRkKGNsYXp6KTsKICAgICAgICAgICBzeXNMaXN0ZW4ucHV0KHRsLCBjbGF6eik7CisgICAgICAgICAgaHR0cEdlbi5saXN0ZW4odGwsIGNsYXp6KTsKKyAgICAgICAgICBzc2hHZW4ubGlzdGVuKHRsLCBjbGF6eik7CisgICAgICAgIH0gZWxzZSBpZiAoZW52Lmhhc0R5bmFtaWNTZXQodGwpKSB7CisgICAgICAgICAgc3lzU2luZ2xldG9ucy5hZGQoY2xhenopOworICAgICAgICAgIHN5c0xpc3Rlbi5wdXQodGwsIGNsYXp6KTsKKyAgICAgICAgICBodHRwR2VuLmxpc3Rlbih0bCwgY2xhenopOworICAgICAgICAgIHNzaEdlbi5saXN0ZW4odGwsIGNsYXp6KTsKICAgICAgICAgfSBlbHNlIGlmIChlbnYuaGFzRHluYW1pY01hcCh0bCkpIHsKICAgICAgICAgICBpZiAoY2xhenouZ2V0QW5ub3RhdGlvbihFeHBvcnQuY2xhc3MpID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGx1Z2luRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCkBAIC0yNTYsNiArMjU0LDggQEAKICAgICAgICAgICB9CiAgICAgICAgICAgc3lzU2luZ2xldG9ucy5hZGQoY2xhenopOwogICAgICAgICAgIHN5c0xpc3Rlbi5wdXQodGwsIGNsYXp6KTsKKyAgICAgICAgICBodHRwR2VuLmxpc3Rlbih0bCwgY2xhenopOworICAgICAgICAgIHNzaEdlbi5saXN0ZW4odGwsIGNsYXp6KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyICVzLCBzZXJ2ZXIgZG9lcyBub3QgYWNjZXB0ICVzIiwKQEAgLTI5OSw3ICsyOTksNyBAQAogICAgIHJldHVybiBkYXRhOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NEYXRhIGltcGxlbWVudHMgQ2xhc3NWaXNpdG9yIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xhc3NEYXRhIGV4dGVuZHMgQ2xhc3NWaXNpdG9yIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUID0gVHlwZS5nZXRUeXBlKEV4cG9ydC5jbGFzcykuZ2V0RGVzY3JpcHRvcigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNURU4gPSBUeXBlLmdldFR5cGUoTGlzdGVuLmNsYXNzKS5nZXREZXNjcmlwdG9yKCk7CiAKQEAgLTMwOCw2ICszMDgsMTAgQEAKICAgICBTdHJpbmcgZXhwb3J0ZWRBc05hbWU7CiAgICAgYm9vbGVhbiBsaXN0ZW47CiAKKyAgICBDbGFzc0RhdGEoKSB7CisgICAgICBzdXBlcihPcGNvZGVzLkFTTTQpOworICAgIH0KKwogICAgIGJvb2xlYW4gaXNDb25jcmV0ZSgpIHsKICAgICAgIHJldHVybiAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QpID09IDAKICAgICAgICAgICAmJiAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfSU5URVJGQUNFKSA9PSAwOwpAQCAtMzcwLDggKzM3NCwxMiBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZpc2l0b3IgaW1wbGVtZW50cworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WaXNpdG9yIGV4dGVuZHMKICAgICAgIEFubm90YXRpb25WaXNpdG9yIHsKKyAgICBBYnN0cmFjdEFubm90YXRpb25WaXNpdG9yKCkgeworICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000KTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSkgewogICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQXV0b1JlZ2lzdGVyVXRpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3RlclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjU2ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3RlclV0aWwuamF2YQpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5pbnRlcm5hbC5VbmlxdWVBbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBdXRvUmVnaXN0ZXJVdGlsIHsKKworICBwdWJsaWMgc3RhdGljIEFubm90YXRpb24gY2FsY3VsYXRlQmluZEFubm90YXRpb24oQ2xhc3M8T2JqZWN0PiBpbXBsKSB7CisgICAgQW5ub3RhdGlvbiBuID0gaW1wbC5nZXRBbm5vdGF0aW9uKEV4cG9ydC5jbGFzcyk7CisgICAgaWYgKG4gPT0gbnVsbCkgeworICAgICAgbiA9IGltcGwuZ2V0QW5ub3RhdGlvbihqYXZheC5pbmplY3QuTmFtZWQuY2xhc3MpOworICAgIH0KKyAgICBpZiAobiA9PSBudWxsKSB7CisgICAgICBuID0gaW1wbC5nZXRBbm5vdGF0aW9uKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZWQuY2xhc3MpOworICAgIH0KKyAgICBpZiAobiA9PSBudWxsKSB7CisgICAgICBuID0gVW5pcXVlQW5ub3RhdGlvbnMuY3JlYXRlKCk7CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyAgcHJpdmF0ZSBBdXRvUmVnaXN0ZXJVdGlsKCkgeworICAgIC8vIGhpZGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ2xlYW51cEhhbmRsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0NsZWFudXBIYW5kbGUuamF2YQppbmRleCA3MDE4YTNiLi5iMDRmMzM3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ2xlYW51cEhhbmRsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9DbGVhbnVwSGFuZGxlLmphdmEKQEAgLTE2LDE5ICsxNiwxNCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogCi1jbGFzcyBDbGVhbnVwSGFuZGxlIGV4dGVuZHMgV2Vha1JlZmVyZW5jZTxDbGFzc0xvYWRlcj4geworY2xhc3MgQ2xlYW51cEhhbmRsZSB7CiAgIHByaXZhdGUgZmluYWwgRmlsZSB0bXBGaWxlOwogICBwcml2YXRlIGZpbmFsIEphckZpbGUgamFyRmlsZTsKIAogICBDbGVhbnVwSGFuZGxlKEZpbGUgdG1wRmlsZSwKLSAgICAgIEphckZpbGUgamFyRmlsZSwKLSAgICAgIENsYXNzTG9hZGVyIHJlZiwKLSAgICAgIFJlZmVyZW5jZVF1ZXVlPENsYXNzTG9hZGVyPiBxdWV1ZSkgewotICAgIHN1cGVyKHJlZiwgcXVldWUpOworICAgICAgSmFyRmlsZSBqYXJGaWxlKSB7CiAgICAgdGhpcy50bXBGaWxlID0gdG1wRmlsZTsKICAgICB0aGlzLmphckZpbGUgPSBqYXJGaWxlOwogICB9CkBAIC0zOSw3ICszNCw5IEBACiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CiAgICAgfQogICAgIGlmICghdG1wRmlsZS5kZWxldGUoKSAmJiB0bXBGaWxlLmV4aXN0cygpKSB7Ci0gICAgICBQbHVnaW5Mb2FkZXIubG9nLndhcm4oIkNhbm5vdCBkZWxldGUgIiArIHRtcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgUGx1Z2luTG9hZGVyLmxvZy53YXJuKCJDYW5ub3QgZGVsZXRlICIgKyB0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpCisgICAgICAgICAgKyAiLCByZXRyeWluZyB0byBkZWxldGUgaXQgb24gdGVybWluYXRpb24gb2YgdGhlIHZpcnR1YWwgbWFjaGluZSIpOworICAgICAgdG1wRmlsZS5kZWxldGVPbkV4aXQoKTsKICAgICB9IGVsc2UgewogICAgICAgUGx1Z2luTG9hZGVyLmxvZy5pbmZvKCJDbGVhbmVkIHBsdWdpbiAiICsgdG1wRmlsZS5nZXROYW1lKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9Db3B5Q29uZmlnTW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ29weUNvbmZpZ01vZHVsZS5qYXZhCmluZGV4IGYzNDgyNmQuLjY3ZWU3YjQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9Db3B5Q29uZmlnTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0NvcHlDb25maWdNb2R1bGUuamF2YQpAQCAtMTUsNiArMTUsOSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50UHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CkBAIC0yNyw2ICszMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCkBAIC05Myw2ICs5NywyNSBAQAogICB9CiAKICAgQEluamVjdAorICBAQW5vbnltb3VzQ293YXJkTmFtZQorICBwcml2YXRlIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOworCisgIEBQcm92aWRlcworICBAQW5vbnltb3VzQ293YXJkTmFtZQorICBTdHJpbmcgZ2V0QW5vbnltb3VzQ293YXJkTmFtZSgpIHsKKyAgICByZXR1cm4gYW5vbnltb3VzQ293YXJkTmFtZTsKKyAgfQorCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHZXJyaXRQZXJzb25JZGVudFByb3ZpZGVyIHNlcnZlcklkZW50UHJvdmlkZXI7CisKKyAgQFByb3ZpZGVzCisgIEBHZXJyaXRQZXJzb25JZGVudAorICBQZXJzb25JZGVudCBnZXRTZXJ2ZXJJZGVudCgpIHsKKyAgICByZXR1cm4gc2VydmVySWRlbnRQcm92aWRlci5nZXQoKTsKKyAgfQorCisgIEBJbmplY3QKICAgQ29weUNvbmZpZ01vZHVsZSgpIHsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvRGlzYWJsZVBsdWdpbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0Rpc2FibGVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU1Y2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0Rpc2FibGVQbHVnaW4uamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5EaXNhYmxlUGx1Z2luLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitjbGFzcyBEaXNhYmxlUGx1Z2luIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGx1Z2luUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisKKyAgQEluamVjdAorICBEaXNhYmxlUGx1Z2luKFBsdWdpbkxvYWRlciBsb2FkZXIpIHsKKyAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFBsdWdpblJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkgeworICAgIFN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOworICAgIGxvYWRlci5kaXNhYmxlUGx1Z2lucyhJbW11dGFibGVTZXQub2YobmFtZSkpOworICAgIHJldHVybiBuZXcgTGlzdFBsdWdpbnMuUGx1Z2luSW5mbyhsb2FkZXIuZ2V0KG5hbWUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0VuYWJsZVBsdWdpbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0VuYWJsZVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzM2Q4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvRW5hYmxlUGx1Z2luLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuRW5hYmxlUGx1Z2luLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorY2xhc3MgRW5hYmxlUGx1Z2luIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGx1Z2luUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisKKyAgQEluamVjdAorICBFbmFibGVQbHVnaW4oUGx1Z2luTG9hZGVyIGxvYWRlcikgeworICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUGx1Z2luUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24geworICAgIFN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOworICAgIHRyeSB7CisgICAgICBsb2FkZXIuZW5hYmxlUGx1Z2lucyhJbW11dGFibGVTZXQub2YobmFtZSkpOworICAgIH0gY2F0Y2ggKFBsdWdpbkluc3RhbGxFeGNlcHRpb24gZSkgeworICAgICAgU3RyaW5nV3JpdGVyIGJ1ZiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgIGJ1Zi53cml0ZShTdHJpbmcuZm9ybWF0KCJjYW5ub3QgZW5hYmxlICVzXG4iLCBuYW1lKSk7CisgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihidWYpOworICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOworICAgICAgcHcuZmx1c2goKTsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBMaXN0UGx1Z2lucy5QbHVnaW5JbmZvKGxvYWRlci5nZXQobmFtZSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvR2V0U3RhdHVzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvR2V0U3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwN2QzNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9HZXRTdGF0dXMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworCitjbGFzcyBHZXRTdGF0dXMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UGx1Z2luUmVzb3VyY2U+IHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUGx1Z2luUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gbmV3IExpc3RQbHVnaW5zLlBsdWdpbkluZm8ocmVzb3VyY2UuZ2V0UGx1Z2luKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvSW5zdGFsbFBsdWdpbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0luc3RhbGxQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNhYzZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0luc3RhbGxQbHVnaW4uamF2YQpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5QdXRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkluc3RhbGxQbHVnaW4uSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKKworQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitjbGFzcyBJbnN0YWxsUGx1Z2luIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8VG9wTGV2ZWxSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIHVybDsKKyAgICBQdXRJbnB1dCByYXc7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjcmVhdGVkOworCisgIEluc3RhbGxQbHVnaW4oUGx1Z2luTG9hZGVyIGxvYWRlciwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY3JlYXRlZCkgeworICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5jcmVhdGVkID0gY3JlYXRlZDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzcG9uc2U8TGlzdFBsdWdpbnMuUGx1Z2luSW5mbz4gYXBwbHkoVG9wTGV2ZWxSZXNvdXJjZSByZXNvdXJjZSwKKyAgICAgIElucHV0IGlucHV0KSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBJbnB1dFN0cmVhbSBpbjsKKyAgICAgIGlmIChpbnB1dC5yYXcgIT0gbnVsbCkgeworICAgICAgICBpbiA9IGlucHV0LnJhdy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpbiA9IG5ldyBVUkwoaW5wdXQudXJsKS5vcGVuU3RyZWFtKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBsb2FkZXIuaW5zdGFsbFBsdWdpbkZyb21TdHJlYW0obmFtZSwgaW4pOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChQbHVnaW5JbnN0YWxsRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN0cmluZ1dyaXRlciBidWYgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICBidWYud3JpdGUoU3RyaW5nLmZvcm1hdCgiY2Fubm90IGluc3RhbGwgJXMiLCBuYW1lKSk7CisgICAgICBpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgWmlwRXhjZXB0aW9uKSB7CisgICAgICAgIGJ1Zi53cml0ZSgiOiAiKTsKKyAgICAgICAgYnVmLndyaXRlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmLndyaXRlKCI6XG4iKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoYnVmKTsKKyAgICAgICAgZS5wcmludFN0YWNrVHJhY2UocHcpOworICAgICAgICBwdy5mbHVzaCgpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIExpc3RQbHVnaW5zLlBsdWdpbkluZm8gaW5mbyA9IG5ldyBMaXN0UGx1Z2lucy5QbHVnaW5JbmZvKGxvYWRlci5nZXQobmFtZSkpOworICAgIHJldHVybiBjcmVhdGVkID8gUmVzcG9uc2UuY3JlYXRlZChpbmZvKSA6IFJlc3BvbnNlLm9rKGluZm8pOworICB9CisKKyAgQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCisgIHN0YXRpYyBjbGFzcyBPdmVyd3JpdGUgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQbHVnaW5SZXNvdXJjZSwgSW5wdXQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisKKyAgICBASW5qZWN0CisgICAgT3ZlcndyaXRlKFBsdWdpbkxvYWRlciBsb2FkZXIpIHsKKyAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZTxMaXN0UGx1Z2lucy5QbHVnaW5JbmZvPiBhcHBseShQbHVnaW5SZXNvdXJjZSByZXNvdXJjZSwKKyAgICAgICAgSW5wdXQgaW5wdXQpIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gbmV3IEluc3RhbGxQbHVnaW4obG9hZGVyLCByZXNvdXJjZS5nZXROYW1lKCksIGZhbHNlKQorICAgICAgICAuYXBwbHkoVG9wTGV2ZWxSZXNvdXJjZS5JTlNUQU5DRSwgaW5wdXQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0xpc3RQbHVnaW5zLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTGlzdFBsdWdpbnMuamF2YQppbmRleCAzZjdiYzk3Li5jYjY1ZThjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTGlzdFBsdWdpbnMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTGlzdFBsdWdpbnMuamF2YQpAQCAtMTcsNyArMTcsMTYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtMzQsMTAgKzQzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIExpc3QgdGhlIGluc3RhbGxlZCBwbHVnaW5zLiAqLwotcHVibGljIGNsYXNzIExpc3RQbHVnaW5zIHsKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorcHVibGljIGNsYXNzIExpc3RQbHVnaW5zIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFRvcExldmVsUmVzb3VyY2U+IHsKICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Mb2FkZXIgcGx1Z2luTG9hZGVyOwogCi0gIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIG1ldGFWYXIgPSAiRk1UIiwgdXNhZ2UgPSAiT3V0cHV0IGRpc3BsYXkgZm9ybWF0IikKKyAgQERlcHJlY2F0ZWQKKyAgQE9wdGlvbihuYW1lID0gIi0tZm9ybWF0IiwgdXNhZ2UgPSAiKGRlcHJlY2F0ZWQpIG91dHB1dCBmb3JtYXQiKQogICBwcml2YXRlIE91dHB1dEZvcm1hdCBmb3JtYXQgPSBPdXRwdXRGb3JtYXQuVEVYVDsKIAogICBAT3B0aW9uKG5hbWUgPSAiLS1hbGwiLCBhbGlhc2VzID0geyItYSJ9LCB1c2FnZSA9ICJMaXN0IGFsbCBwbHVnaW5zLCBpbmNsdWRpbmcgZGlzYWJsZWQgcGx1Z2lucyIpCkBAIC01NywxOSArNjgsMjYgQEAKICAgICByZXR1cm4gdGhpczsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoT3V0cHV0U3RyZWFtIG91dCkgewotICAgIGZpbmFsIFByaW50V3JpdGVyIHN0ZG91dDsKLSAgICB0cnkgewotICAgICAgc3Rkb3V0ID0KLSAgICAgICAgICBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LAotICAgICAgICAgICAgICAiVVRGLTgiKSkpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgLy8gT3VyIGVuY29kaW5nIGlzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIHJ1bnRpbWUuCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIGxhY2tzIFVURi04IGVuY29kaW5nIiwgZSk7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICBmb3JtYXQgPSBPdXRwdXRGb3JtYXQuSlNPTjsKKyAgICByZXR1cm4gZGlzcGxheShudWxsKTsKKyAgfQorCisgIHB1YmxpYyBKc29uRWxlbWVudCBkaXNwbGF5KE91dHB1dFN0cmVhbSBkaXNwbGF5T3V0cHV0U3RyZWFtKQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIFByaW50V3JpdGVyIHN0ZG91dCA9IG51bGw7CisgICAgaWYgKGRpc3BsYXlPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc3Rkb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZGlzcGxheU91dHB1dFN0cmVhbSwgIlVURi04IikpKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIGxhY2tzIFVURi04IGVuY29kaW5nIiwgZSk7CisgICAgICB9CiAgICAgfQogCiAgICAgTWFwPFN0cmluZywgUGx1Z2luSW5mbz4gb3V0cHV0ID0gTWFwcy5uZXdUcmVlTWFwKCk7Ci0KICAgICBMaXN0PFBsdWdpbj4gcGx1Z2lucyA9IExpc3RzLm5ld0FycmF5TGlzdChwbHVnaW5Mb2FkZXIuZ2V0UGx1Z2lucyhhbGwpKTsKICAgICBDb2xsZWN0aW9ucy5zb3J0KHBsdWdpbnMsIG5ldyBDb21wYXJhdG9yPFBsdWdpbj4oKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTgwLDE1ICs5OCwxMSBAQAogCiAgICAgaWYgKCFmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgIHN0ZG91dC5mb3JtYXQoIiUtMzBzICUtMTBzICUtOHNcbiIsICJOYW1lIiwgIlZlcnNpb24iLCAiU3RhdHVzIik7Ci0gICAgICBzdGRvdXQKLSAgICAgICAgICAucHJpbnQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgc3Rkb3V0LnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICB9CiAKICAgICBmb3IgKFBsdWdpbiBwIDogcGx1Z2lucykgewotICAgICAgUGx1Z2luSW5mbyBpbmZvID0gbmV3IFBsdWdpbkluZm8oKTsKLSAgICAgIGluZm8udmVyc2lvbiA9IHAuZ2V0VmVyc2lvbigpOwotICAgICAgaW5mby5kaXNhYmxlZCA9IHAuaXNEaXNhYmxlZCgpID8gdHJ1ZSA6IG51bGw7Ci0KKyAgICAgIFBsdWdpbkluZm8gaW5mbyA9IG5ldyBQbHVnaW5JbmZvKHApOwogICAgICAgaWYgKGZvcm1hdC5pc0pzb24oKSkgewogICAgICAgICBvdXRwdXQucHV0KHAuZ2V0TmFtZSgpLCBpbmZvKTsKICAgICAgIH0gZWxzZSB7CkBAIC05OCwxOSArMTEyLDI5IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZvcm1hdC5pc0pzb24oKSkgeworICAgIGlmIChzdGRvdXQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIE91dHB1dEZvcm1hdC5KU09OLm5ld0dzb24oKS50b0pzb25UcmVlKAorICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIE9iamVjdD4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdC5pc0pzb24oKSkgewogICAgICAgZm9ybWF0Lm5ld0dzb24oKS50b0pzb24ob3V0cHV0LAogICAgICAgICAgIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgUGx1Z2luSW5mbz4+KCkge30uZ2V0VHlwZSgpLCBzdGRvdXQpOwogICAgICAgc3Rkb3V0LnByaW50KCdcbicpOwogICAgIH0KICAgICBzdGRvdXQuZmx1c2goKTsKKyAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFBsdWdpbkluZm8geworICBzdGF0aWMgY2xhc3MgUGx1Z2luSW5mbyB7CisgICAgZmluYWwgU3RyaW5nIGtpbmQgPSAiZ2Vycml0Y29kZXJldmlldyNwbHVnaW4iOworICAgIFN0cmluZyBpZDsKICAgICBTdHJpbmcgdmVyc2lvbjsKLSAgICAvLyBkaXNhYmxlZCBpcyBvbmx5IHJlYWQgdmlhIHJlZmxlY3Rpb24gd2hlbiBidWlsZGluZyB0aGUganNvbiBvdXRwdXQuICBXZQotICAgIC8vIGRvIG5vdCB3YW50IHRvIHNob3cgYSBjb21waWxlciBlcnJvciB0aGF0IGl0IGlzbid0IHVzZWQuCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgQm9vbGVhbiBkaXNhYmxlZDsKKworICAgIFBsdWdpbkluZm8oUGx1Z2luIHApIHsKKyAgICAgIGlkID0gVXJsLmVuY29kZShwLmdldE5hbWUoKSk7CisgICAgICB2ZXJzaW9uID0gcC5nZXRWZXJzaW9uKCk7CisgICAgICBkaXNhYmxlZCA9IHAuaXNEaXNhYmxlZCgpID8gdHJ1ZSA6IG51bGw7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTW9kdWxlR2VuZXJhdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTW9kdWxlR2VuZXJhdG9yLmphdmEKaW5kZXggOTJlM2IxZC4uMjAxMWU5ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL01vZHVsZUdlbmVyYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9Nb2R1bGVHZW5lcmF0b3IuamF2YQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CiAKIHB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlR2VuZXJhdG9yIHsKICAgdm9pZCBzZXRQbHVnaW5OYW1lKFN0cmluZyBuYW1lKTsKIAogICB2b2lkIGV4cG9ydChFeHBvcnQgZXhwb3J0LCBDbGFzczw/PiB0eXBlKSB0aHJvd3MgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbjsKIAorICB2b2lkIGxpc3RlbihUeXBlTGl0ZXJhbDw/PiB0bCwgQ2xhc3M8Pz4gY2xhenopOworCiAgIE1vZHVsZSBjcmVhdGUoKSB0aHJvd3MgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW4uamF2YQppbmRleCA5MWZmYmJhLi44ZTcxOTJlIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbi5qYXZhCkBAIC0yMCw4ICsyMCw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5QbHVnaW5OYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlJlZ2lzdHJhdGlvbkhhbmRsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5SZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuc3lzdGVtc3RhdHVzLlNlcnZlckluZm9ybWF0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmxpZmVjeWNsZS5MaWZlY3ljbGVNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QbHVnaW5Vc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwpAQCAtMjksNyArMzAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVTbmFwc2hvdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5GaWxlU25hcHNob3Q7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDIsNyArNDMsNyBAQAogCiBwdWJsaWMgY2xhc3MgUGx1Z2luIHsKICAgcHVibGljIHN0YXRpYyBlbnVtIEFwaVR5cGUgewotICAgIEVYVEVOU0lPTiwgUExVR0lOOworICAgIEVYVEVOU0lPTiwgUExVR0lOLCBKUzsKICAgfQogCiAgIC8qKiBVbmlxdWUga2V5IHRoYXQgY2hhbmdlcyB3aGVuZXZlciBhIHBsdWdpbiByZWxvYWRzLiAqLwpAQCAtNzUsNiArNzYsOCBAQAogICAgICAgcmV0dXJuIEFwaVR5cGUuRVhURU5TSU9OOwogICAgIH0gZWxzZSBpZiAoQXBpVHlwZS5QTFVHSU4ubmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodikpIHsKICAgICAgIHJldHVybiBBcGlUeXBlLlBMVUdJTjsKKyAgICB9IGVsc2UgaWYgKEFwaVR5cGUuSlMubmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodikpIHsKKyAgICAgIHJldHVybiBBcGlUeXBlLkpTOwogICAgIH0gZWxzZSB7CiAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbigiSW52YWxpZCBHZXJyaXQtQXBpVHlwZTogIiArIHYpOwogICAgIH0KQEAgLTgyLDYgKzg1LDcgQEAKIAogICBwcml2YXRlIGZpbmFsIENhY2hlS2V5IGNhY2hlS2V5OwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICBwcml2YXRlIGZpbmFsIFBsdWdpblVzZXIgcGx1Z2luVXNlcjsKICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHNyY0phcjsKICAgcHJpdmF0ZSBmaW5hbCBGaWxlU25hcHNob3Qgc25hcHNob3Q7CiAgIHByaXZhdGUgZmluYWwgSmFyRmlsZSBqYXJGaWxlOwpAQCAtMTAxLDYgKzEwNSw3IEBACiAgIHByaXZhdGUgTGlzdDxSZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlPD8+PiByZWxvYWRhYmxlSGFuZGxlczsKIAogICBwdWJsaWMgUGx1Z2luKFN0cmluZyBuYW1lLAorICAgICAgUGx1Z2luVXNlciBwbHVnaW5Vc2VyLAogICAgICAgRmlsZSBzcmNKYXIsCiAgICAgICBGaWxlU25hcHNob3Qgc25hcHNob3QsCiAgICAgICBKYXJGaWxlIGphckZpbGUsCkBAIC0xMTIsNiArMTE3LDcgQEAKICAgICAgIEBOdWxsYWJsZSBDbGFzczw/IGV4dGVuZHMgTW9kdWxlPiBzc2hNb2R1bGUsCiAgICAgICBATnVsbGFibGUgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gaHR0cE1vZHVsZSkgewogICAgIHRoaXMuY2FjaGVLZXkgPSBuZXcgQ2FjaGVLZXkobmFtZSk7CisgICAgdGhpcy5wbHVnaW5Vc2VyID0gcGx1Z2luVXNlcjsKICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgIHRoaXMuc3JjSmFyID0gc3JjSmFyOwogICAgIHRoaXMuc25hcHNob3QgPSBzbmFwc2hvdDsKQEAgLTEzMCw2ICsxMzYsMTAgQEAKICAgICByZXR1cm4gc3JjSmFyOwogICB9CiAKKyAgUGx1Z2luVXNlciBnZXRQbHVnaW5Vc2VyKCkgeworICAgIHJldHVybiBwbHVnaW5Vc2VyOworICB9CisKICAgcHVibGljIENhY2hlS2V5IGdldENhY2hlS2V5KCkgewogICAgIHJldHVybiBjYWNoZUtleTsKICAgfQpAQCAtMTcxLDcgKzE4MSwxNiBAQAogICAgIHJldHVybiBkaXNhYmxlZDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KFBsdWdpbkd1aWNlRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgdm9pZCBzdGFydChQbHVnaW5HdWljZUVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IGVudi5lbnRlcih0aGlzKTsKKyAgICB0cnkgeworICAgICAgc3RhcnRQbHVnaW4oZW52KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZW52LmV4aXQob2xkQ29udGV4dCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHN0YXJ0UGx1Z2luKFBsdWdpbkd1aWNlRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBJbmplY3RvciByb290ID0gbmV3Um9vdEluamVjdG9yKGVudik7CiAgICAgbWFuYWdlciA9IG5ldyBMaWZlY3ljbGVNYW5hZ2VyKCk7CiAKQEAgLTIyOCwyMCArMjQ3LDEzIEBACiAKICAgcHJpdmF0ZSBJbmplY3RvciBuZXdSb290SW5qZWN0b3IoZmluYWwgUGx1Z2luR3VpY2VFbnZpcm9ubWVudCBlbnYpIHsKICAgICBMaXN0PE1vZHVsZT4gbW9kdWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSg0KTsKLSAgICBtb2R1bGVzLmFkZChlbnYuZ2V0U3lzTW9kdWxlKCkpOwogICAgIGlmIChhcGlUeXBlID09IEFwaVR5cGUuUExVR0lOKSB7CiAgICAgICBtb2R1bGVzLmFkZChlbnYuZ2V0U3lzTW9kdWxlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtb2R1bGVzLmFkZChuZXcgQWJzdHJhY3RNb2R1bGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICAgICAgYmluZChTZXJ2ZXJJbmZvcm1hdGlvbi5jbGFzcykudG9JbnN0YW5jZShlbnYuZ2V0U2VydmVySW5mb3JtYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwogICAgIH0KICAgICBtb2R1bGVzLmFkZChuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChQbHVnaW5Vc2VyLmNsYXNzKS50b0luc3RhbmNlKHBsdWdpblVzZXIpOwogICAgICAgICBiaW5kKFN0cmluZy5jbGFzcykKICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChQbHVnaW5OYW1lLmNsYXNzKQogICAgICAgICAgIC50b0luc3RhbmNlKG5hbWUpOwpAQCAtMjcxLDkgKzI4MywxNCBAQAogICAgIHJldHVybiBHdWljZS5jcmVhdGVJbmplY3Rvcihtb2R1bGVzKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgIHZvaWQgc3RvcChQbHVnaW5HdWljZUVudmlyb25tZW50IGVudikgewogICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgIG1hbmFnZXIuc3RvcCgpOworICAgICAgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IGVudi5lbnRlcih0aGlzKTsKKyAgICAgIHRyeSB7CisgICAgICAgIG1hbmFnZXIuc3RvcCgpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZW52LmV4aXQob2xkQ29udGV4dCk7CisgICAgICB9CiAgICAgICBtYW5hZ2VyID0gbnVsbDsKICAgICAgIHN5c0luamVjdG9yID0gbnVsbDsKICAgICAgIHNzaEluamVjdG9yID0gbnVsbDsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5HdWljZUVudmlyb25tZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luR3VpY2VFbnZpcm9ubWVudC5qYXZhCmluZGV4IDE4NDYwZmYuLjM4N2ZmYTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5HdWljZUVudmlyb25tZW50LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbkd1aWNlRW52aXJvbm1lbnQuamF2YQpAQCAtMTMsNiArMTMsOCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMuZHluYW1pY0l0ZW1zT2Y7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzLmR5bmFtaWNNYXBzT2Y7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzLmR5bmFtaWNTZXRzT2Y7CiAKQEAgLTIyLDYgKzI0LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNJdGVtOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNNYXBJbXBsOwpAQCAtMjksNiArMzIsOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlJlZ2lzdHJhdGlvbkhhbmRsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5SZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuc3lzdGVtc3RhdHVzLlNlcnZlckluZm9ybWF0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlBsdWdpblJlcXVlc3RDb250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RDb250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlRocmVhZExvY2FsUmVxdWVzdENvbnRleHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKQEAgLTYyLDYgKzY4LDcgQEAKIHB1YmxpYyBjbGFzcyBQbHVnaW5HdWljZUVudmlyb25tZW50IHsKICAgcHJpdmF0ZSBmaW5hbCBJbmplY3RvciBzeXNJbmplY3RvcjsKICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJJbmZvcm1hdGlvbiBzcnZJbmZvOworICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWw7CiAgIHByaXZhdGUgZmluYWwgQ29weUNvbmZpZ01vZHVsZSBjb3B5Q29uZmlnTW9kdWxlOwogICBwcml2YXRlIGZpbmFsIFNldDxLZXk8Pz4+IGNvcHlDb25maWdLZXlzOwogICBwcml2YXRlIGZpbmFsIExpc3Q8U3RhcnRQbHVnaW5MaXN0ZW5lcj4gb25TdGFydDsKQEAgLTc0LDYgKzgxLDggQEAKICAgcHJpdmF0ZSBQcm92aWRlcjxNb2R1bGVHZW5lcmF0b3I+IHNzaEdlbjsKICAgcHJpdmF0ZSBQcm92aWRlcjxNb2R1bGVHZW5lcmF0b3I+IGh0dHBHZW47CiAKKyAgcHJpdmF0ZSBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNJdGVtPD8+PiBzeXNJdGVtczsKKwogICBwcml2YXRlIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY1NldDw/Pj4gc3lzU2V0czsKICAgcHJpdmF0ZSBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNTZXQ8Pz4+IHNzaFNldHM7CiAgIHByaXZhdGUgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljU2V0PD8+PiBodHRwU2V0czsKQEAgLTg1LDEwICs5NCwxMiBAQAogICBASW5qZWN0CiAgIFBsdWdpbkd1aWNlRW52aXJvbm1lbnQoCiAgICAgICBJbmplY3RvciBzeXNJbmplY3RvciwKKyAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwsCiAgICAgICBTZXJ2ZXJJbmZvcm1hdGlvbiBzcnZJbmZvLAogICAgICAgQ29weUNvbmZpZ01vZHVsZSBjY20pIHsKICAgICB0aGlzLnN5c0luamVjdG9yID0gc3lzSW5qZWN0b3I7CiAgICAgdGhpcy5zcnZJbmZvID0gc3J2SW5mbzsKKyAgICB0aGlzLmxvY2FsID0gbG9jYWw7CiAgICAgdGhpcy5jb3B5Q29uZmlnTW9kdWxlID0gY2NtOwogICAgIHRoaXMuY29weUNvbmZpZ0tleXMgPSBHdWljZS5jcmVhdGVJbmplY3RvcihjY20pLmdldEFsbEJpbmRpbmdzKCkua2V5U2V0KCk7CiAKQEAgLTk4LDYgKzEwOSw3IEBACiAgICAgb25SZWxvYWQgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8UmVsb2FkUGx1Z2luTGlzdGVuZXI+KCk7CiAgICAgb25SZWxvYWQuYWRkQWxsKGxpc3RlbmVycyhzeXNJbmplY3RvciwgUmVsb2FkUGx1Z2luTGlzdGVuZXIuY2xhc3MpKTsKIAorICAgIHN5c0l0ZW1zID0gZHluYW1pY0l0ZW1zT2Yoc3lzSW5qZWN0b3IpOwogICAgIHN5c1NldHMgPSBkeW5hbWljU2V0c09mKHN5c0luamVjdG9yKTsKICAgICBzeXNNYXBzID0gZHluYW1pY01hcHNPZihzeXNJbmplY3Rvcik7CiAgIH0KQEAgLTEwNiw2ICsxMTgsMTAgQEAKICAgICByZXR1cm4gc3J2SW5mbzsKICAgfQogCisgIGJvb2xlYW4gaGFzRHluYW1pY0l0ZW0oVHlwZUxpdGVyYWw8Pz4gdHlwZSkgeworICAgIHJldHVybiBzeXNJdGVtcy5jb250YWluc0tleSh0eXBlKTsKKyAgfQorCiAgIGJvb2xlYW4gaGFzRHluYW1pY1NldChUeXBlTGl0ZXJhbDw/PiB0eXBlKSB7CiAgICAgcmV0dXJuIHN5c1NldHMuY29udGFpbnNLZXkodHlwZSkKICAgICAgICAgfHwgKHNzaFNldHMgIT0gbnVsbCAmJiBzc2hTZXRzLmNvbnRhaW5zS2V5KHR5cGUpKQpAQCAtMTc3LDE4ICsxOTMsNDIgQEAKICAgICByZXR1cm4gaHR0cEdlbi5nZXQoKTsKICAgfQogCisgIFJlcXVlc3RDb250ZXh0IGVudGVyKFBsdWdpbiBwbHVnaW4pIHsKKyAgICByZXR1cm4gbG9jYWwuc2V0Q29udGV4dChuZXcgUGx1Z2luUmVxdWVzdENvbnRleHQocGx1Z2luLmdldFBsdWdpblVzZXIoKSkpOworICB9CisKKyAgdm9pZCBleGl0KFJlcXVlc3RDb250ZXh0IG9sZCkgeworICAgIGxvY2FsLnNldENvbnRleHQob2xkKTsKKyAgfQorCiAgIHZvaWQgb25TdGFydFBsdWdpbihQbHVnaW4gcGx1Z2luKSB7CiAgICAgZm9yIChTdGFydFBsdWdpbkxpc3RlbmVyIGwgOiBvblN0YXJ0KSB7CiAgICAgICBsLm9uU3RhcnRQbHVnaW4ocGx1Z2luKTsKICAgICB9CiAKLSAgICBhdHRhY2hTZXQoc3lzU2V0cywgcGx1Z2luLmdldFN5c0luamVjdG9yKCksIHBsdWdpbik7Ci0gICAgYXR0YWNoU2V0KHNzaFNldHMsIHBsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBwbHVnaW4pOwotICAgIGF0dGFjaFNldChodHRwU2V0cywgcGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBwbHVnaW4pOworICAgIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSBlbnRlcihwbHVnaW4pOworICAgIHRyeSB7CisgICAgICBhdHRhY2hJdGVtKHN5c0l0ZW1zLCBwbHVnaW4uZ2V0U3lzSW5qZWN0b3IoKSwgcGx1Z2luKTsKIAotICAgIGF0dGFjaE1hcChzeXNNYXBzLCBwbHVnaW4uZ2V0U3lzSW5qZWN0b3IoKSwgcGx1Z2luKTsKLSAgICBhdHRhY2hNYXAoc3NoTWFwcywgcGx1Z2luLmdldFNzaEluamVjdG9yKCksIHBsdWdpbik7Ci0gICAgYXR0YWNoTWFwKGh0dHBNYXBzLCBwbHVnaW4uZ2V0SHR0cEluamVjdG9yKCksIHBsdWdpbik7CisgICAgICBhdHRhY2hTZXQoc3lzU2V0cywgcGx1Z2luLmdldFN5c0luamVjdG9yKCksIHBsdWdpbik7CisgICAgICBhdHRhY2hTZXQoc3NoU2V0cywgcGx1Z2luLmdldFNzaEluamVjdG9yKCksIHBsdWdpbik7CisgICAgICBhdHRhY2hTZXQoaHR0cFNldHMsIHBsdWdpbi5nZXRIdHRwSW5qZWN0b3IoKSwgcGx1Z2luKTsKKworICAgICAgYXR0YWNoTWFwKHN5c01hcHMsIHBsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBwbHVnaW4pOworICAgICAgYXR0YWNoTWFwKHNzaE1hcHMsIHBsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBwbHVnaW4pOworICAgICAgYXR0YWNoTWFwKGh0dHBNYXBzLCBwbHVnaW4uZ2V0SHR0cEluamVjdG9yKCksIHBsdWdpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGV4aXQob2xkQ29udGV4dCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGF0dGFjaEl0ZW0oTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gaXRlbXMsCisgICAgICBATnVsbGFibGUgSW5qZWN0b3Igc3JjLAorICAgICAgUGx1Z2luIHBsdWdpbikgeworICAgIGZvciAoUmVnaXN0cmF0aW9uSGFuZGxlIGggOiBQcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcworICAgICAgICAuYXR0YWNoSXRlbXMoc3JjLCBpdGVtcywgcGx1Z2luLmdldE5hbWUoKSkpIHsKKyAgICAgIHBsdWdpbi5hZGQoaCk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGF0dGFjaFNldChNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNTZXQ8Pz4+IHNldHMsCkBAIC0yMjMsMTMgKzI2MywyMCBAQAogICAgICAgb2xkLnB1dChoLmdldEtleSgpLmdldFR5cGVMaXRlcmFsKCksIGgpOwogICAgIH0KIAotICAgIHJlYXR0YWNoTWFwKG9sZCwgc3lzTWFwcywgbmV3UGx1Z2luLmdldFN5c0luamVjdG9yKCksIG5ld1BsdWdpbik7Ci0gICAgcmVhdHRhY2hNYXAob2xkLCBzc2hNYXBzLCBuZXdQbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKLSAgICByZWF0dGFjaE1hcChvbGQsIGh0dHBNYXBzLCBuZXdQbHVnaW4uZ2V0SHR0cEluamVjdG9yKCksIG5ld1BsdWdpbik7CisgICAgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IGVudGVyKG5ld1BsdWdpbik7CisgICAgdHJ5IHsKKyAgICAgIHJlYXR0YWNoTWFwKG9sZCwgc3lzTWFwcywgbmV3UGx1Z2luLmdldFN5c0luamVjdG9yKCksIG5ld1BsdWdpbik7CisgICAgICByZWF0dGFjaE1hcChvbGQsIHNzaE1hcHMsIG5ld1BsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgICAgcmVhdHRhY2hNYXAob2xkLCBodHRwTWFwcywgbmV3UGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBuZXdQbHVnaW4pOwogCi0gICAgcmVhdHRhY2hTZXQob2xkLCBzeXNTZXRzLCBuZXdQbHVnaW4uZ2V0U3lzSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKLSAgICByZWF0dGFjaFNldChvbGQsIHNzaFNldHMsIG5ld1BsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBuZXdQbHVnaW4pOwotICAgIHJlYXR0YWNoU2V0KG9sZCwgaHR0cFNldHMsIG5ld1BsdWdpbi5nZXRIdHRwSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKKyAgICAgIHJlYXR0YWNoU2V0KG9sZCwgc3lzU2V0cywgbmV3UGx1Z2luLmdldFN5c0luamVjdG9yKCksIG5ld1BsdWdpbik7CisgICAgICByZWF0dGFjaFNldChvbGQsIHNzaFNldHMsIG5ld1BsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgICAgcmVhdHRhY2hTZXQob2xkLCBodHRwU2V0cywgbmV3UGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBuZXdQbHVnaW4pOworCisgICAgICByZWF0dGFjaEl0ZW0ob2xkLCBzeXNJdGVtcywgbmV3UGx1Z2luLmdldFN5c0luamVjdG9yKCksIG5ld1BsdWdpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGV4aXQob2xkQ29udGV4dCk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHJlYXR0YWNoTWFwKApAQCAtMzUwLDYgKzM5Nyw0MSBAQAogICAgICAgfQogICAgIH0KICAgfQorICBwcml2YXRlIHZvaWQgcmVhdHRhY2hJdGVtKAorICAgICAgTGlzdE11bHRpbWFwPFR5cGVMaXRlcmFsPD8+LCBSZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlPD8+PiBvbGRIYW5kbGVzLAorICAgICAgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gaXRlbXMsCisgICAgICBATnVsbGFibGUgSW5qZWN0b3Igc3JjLAorICAgICAgUGx1Z2luIG5ld1BsdWdpbikgeworICAgIGlmIChzcmMgPT0gbnVsbCB8fCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoTWFwLkVudHJ5PFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gZSA6IGl0ZW1zLmVudHJ5U2V0KCkpIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgVHlwZUxpdGVyYWw8T2JqZWN0PiB0eXBlID0gKFR5cGVMaXRlcmFsPE9iamVjdD4pIGUuZ2V0S2V5KCk7CisKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgRHluYW1pY0l0ZW08T2JqZWN0PiBpdGVtID0gKER5bmFtaWNJdGVtPE9iamVjdD4pIGUuZ2V0VmFsdWUoKTsKKworICAgICAgSXRlcmF0b3I8UmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTw/Pj4gb2kgPQorICAgICAgICAgIG9sZEhhbmRsZXMuZ2V0KHR5cGUpLml0ZXJhdG9yKCk7CisKKyAgICAgIGZvciAoQmluZGluZzw/PiBiaW5kaW5nIDogYmluZGluZ3Moc3JjLCB0eXBlKSkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQmluZGluZzxPYmplY3Q+IGIgPSAoQmluZGluZzxPYmplY3Q+KSBiaW5kaW5nOworICAgICAgICBpZiAob2kuaGFzTmV4dCgpKSB7CisgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTxPYmplY3Q+IGggPQorICAgICAgICAgICAgKFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8T2JqZWN0Pikgb2kubmV4dCgpOworICAgICAgICAgIG9pLnJlbW92ZSgpOworICAgICAgICAgIHJlcGxhY2UobmV3UGx1Z2luLCBoLCBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXdQbHVnaW4uYWRkKGl0ZW0uc2V0KGIuZ2V0S2V5KCksIGIuZ2V0UHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgbmV3UGx1Z2luLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgcmVwbGFjZShQbHVnaW4gbmV3UGx1Z2luLAogICAgICAgUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTxUPiBoLCBCaW5kaW5nPFQ+IGIpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Mb2FkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Mb2FkZXIuamF2YQppbmRleCBkMWMyYWE0Li4wMzU1OTJjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luTG9hZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbkxvYWRlci5qYXZhCkBAIC0xOCwxMCArMTgsMTMgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5RdWV1ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUGx1Z2luTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnN5c3RlbXN0YXR1cy5TZXJ2ZXJJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLndlYnVpLkphdmFTY3JpcHRQbHVnaW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBsdWdpblVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwpAQCAtMzAsOCArMzMsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLkZpbGVTbmFwc2hvdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZVNuYXBzaG90OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTQxLDcgKzQ0LDYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwpAQCAtNDksOCArNTEsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtNjAsNiArNjQsNyBAQAogCiBAU2luZ2xldG9uCiBwdWJsaWMgY2xhc3MgUGx1Z2luTG9hZGVyIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworICBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9UTVBfUFJFRklYID0gInBsdWdpbl8iOwogICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBsdWdpbkxvYWRlci5jbGFzcyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHBsdWdpbnNEaXI7CkBAIC02NywxMSArNzIsMTIgQEAKICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHRtcERpcjsKICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5HdWljZUVudmlyb25tZW50IGVudjsKICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJJbmZvcm1hdGlvbkltcGwgc3J2SW5mb0ltcGw7CisgIHByaXZhdGUgZmluYWwgUGx1Z2luVXNlci5GYWN0b3J5IHBsdWdpblVzZXJGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQbHVnaW4+IHJ1bm5pbmc7CiAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFBsdWdpbj4gZGlzYWJsZWQ7CiAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRmlsZVNuYXBzaG90PiBicm9rZW47Ci0gIHByaXZhdGUgZmluYWwgUmVmZXJlbmNlUXVldWU8Q2xhc3NMb2FkZXI+IGNsZWFudXBRdWV1ZTsKLSAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPENsZWFudXBIYW5kbGUsIEJvb2xlYW4+IGNsZWFudXBIYW5kbGVzOworICBwcml2YXRlIGZpbmFsIE1hcDxQbHVnaW4sIENsZWFudXBIYW5kbGU+IGNsZWFudXBIYW5kbGVzOworICBwcml2YXRlIGZpbmFsIFF1ZXVlPFBsdWdpbj4gdG9DbGVhbnVwOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFBsdWdpbkNsZWFuZXJUYXNrPiBjbGVhbmVyOwogICBwcml2YXRlIGZpbmFsIFBsdWdpblNjYW5uZXJUaHJlYWQgc2Nhbm5lcjsKIApAQCAtNzksNiArODUsNyBAQAogICBwdWJsaWMgUGx1Z2luTG9hZGVyKFNpdGVQYXRocyBzaXRlUGF0aHMsCiAgICAgICBQbHVnaW5HdWljZUVudmlyb25tZW50IHBlLAogICAgICAgU2VydmVySW5mb3JtYXRpb25JbXBsIHNpaSwKKyAgICAgIFBsdWdpblVzZXIuRmFjdG9yeSBwdWYsCiAgICAgICBQcm92aWRlcjxQbHVnaW5DbGVhbmVyVGFzaz4gcGN0LAogICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnKSB7CiAgICAgcGx1Z2luc0RpciA9IHNpdGVQYXRocy5wbHVnaW5zX2RpcjsKQEAgLTg2LDEwICs5MywxMSBAQAogICAgIHRtcERpciA9IHNpdGVQYXRocy50bXBfZGlyOwogICAgIGVudiA9IHBlOwogICAgIHNydkluZm9JbXBsID0gc2lpOworICAgIHBsdWdpblVzZXJGYWN0b3J5ID0gcHVmOwogICAgIHJ1bm5pbmcgPSBNYXBzLm5ld0NvbmN1cnJlbnRNYXAoKTsKICAgICBkaXNhYmxlZCA9IE1hcHMubmV3Q29uY3VycmVudE1hcCgpOwogICAgIGJyb2tlbiA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIGNsZWFudXBRdWV1ZSA9IG5ldyBSZWZlcmVuY2VRdWV1ZTxDbGFzc0xvYWRlcj4oKTsKKyAgICB0b0NsZWFudXAgPSBRdWV1ZXMubmV3QXJyYXlEZXF1ZSgpOwogICAgIGNsZWFudXBIYW5kbGVzID0gTWFwcy5uZXdDb25jdXJyZW50TWFwKCk7CiAgICAgY2xlYW5lciA9IHBjdDsKIApAQCAtMTAzLDYgKzExMSwxNCBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyBQbHVnaW4gZ2V0KFN0cmluZyBuYW1lKSB7CisgICAgUGx1Z2luIHAgPSBydW5uaW5nLmdldChuYW1lKTsKKyAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgcmV0dXJuIGRpc2FibGVkLmdldChuYW1lKTsKKyAgfQorCiAgIHB1YmxpYyBJdGVyYWJsZTxQbHVnaW4+IGdldFBsdWdpbnMoYm9vbGVhbiBhbGwpIHsKICAgICBpZiAoIWFsbCkgewogICAgICAgcmV0dXJuIHJ1bm5pbmcudmFsdWVzKCk7CkBAIC0xNzgsNiArMTk0LDE1IEBACiAgICAgfQogICB9CiAKKyAgc3luY2hyb25pemVkIHByaXZhdGUgdm9pZCB1bmxvYWRQbHVnaW4oUGx1Z2luIHBsdWdpbikgeworICAgIFN0cmluZyBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKKyAgICBsb2cuaW5mbyhTdHJpbmcuZm9ybWF0KCJVbmxvYWRpbmcgcGx1Z2luICVzIiwgbmFtZSkpOworICAgIHBsdWdpbi5zdG9wKGVudik7CisgICAgcnVubmluZy5yZW1vdmUobmFtZSk7CisgICAgZGlzYWJsZWQucmVtb3ZlKG5hbWUpOworICAgIHRvQ2xlYW51cC5hZGQocGx1Z2luKTsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIGRpc2FibGVQbHVnaW5zKFNldDxTdHJpbmc+IG5hbWVzKSB7CiAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKQEAgLTE5MCw4ICsyMTUsNyBAQAogICAgICAgICBGaWxlIG9mZiA9IG5ldyBGaWxlKHBsdWdpbnNEaXIsIGFjdGl2ZS5nZXROYW1lKCkgKyAiLmphci5kaXNhYmxlZCIpOwogICAgICAgICBhY3RpdmUuZ2V0U3JjSmFyKCkucmVuYW1lVG8ob2ZmKTsKIAotICAgICAgICBhY3RpdmUuc3RvcCgpOwotICAgICAgICBydW5uaW5nLnJlbW92ZShuYW1lKTsKKyAgICAgICAgdW5sb2FkUGx1Z2luKGFjdGl2ZSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgRmlsZVNuYXBzaG90IHNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUob2ZmKTsKICAgICAgICAgICBQbHVnaW4gb2ZmUGx1Z2luID0gbG9hZFBsdWdpbihuYW1lLCBvZmYsIHNuYXBzaG90KTsKQEAgLTI0NCwxMiArMjY4LDEyIEBACiAgICAgc3J2SW5mb0ltcGwuc3RhdGUgPSBTZXJ2ZXJJbmZvcm1hdGlvbi5TdGF0ZS5TSFVURE9XTjsKICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgIGZvciAoUGx1Z2luIHAgOiBydW5uaW5nLnZhbHVlcygpKSB7Ci0gICAgICAgIHAuc3RvcCgpOworICAgICAgICB1bmxvYWRQbHVnaW4ocCk7CiAgICAgICB9CiAgICAgICBydW5uaW5nLmNsZWFyKCk7CiAgICAgICBkaXNhYmxlZC5jbGVhcigpOwogICAgICAgYnJva2VuLmNsZWFyKCk7Ci0gICAgICBpZiAoY2xlYW51cEhhbmRsZXMuc2l6ZSgpID4gcnVubmluZy5zaXplKCkpIHsKKyAgICAgIGlmICghdG9DbGVhbnVwLmlzRW1wdHkoKSkgewogICAgICAgICBTeXN0ZW0uZ2MoKTsKICAgICAgICAgcHJvY2Vzc1BlbmRpbmdDbGVhbnVwcygpOwogICAgICAgfQpAQCAtMjk2LDYgKzMyMCwxMCBAQAogICAgIGRyb3BSZW1vdmVkRGlzYWJsZWRQbHVnaW5zKGphcnMpOwogCiAgICAgZm9yIChGaWxlIGphciA6IGphcnMpIHsKKyAgICAgIGlmIChqYXIuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuZGlzYWJsZWQiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKwogICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lT2YoamFyKTsKICAgICAgIEZpbGVTbmFwc2hvdCBicm9rZW5UaW1lID0gYnJva2VuLmdldChuYW1lKTsKICAgICAgIGlmIChicm9rZW5UaW1lICE9IG51bGwgJiYgIWJyb2tlblRpbWUuaXNNb2RpZmllZChqYXIpKSB7CkBAIC0zMzMsMTUgKzM2MSwxNCBAQAogICAgICAgICAgICYmIG9sZFBsdWdpbi5jYW5SZWxvYWQoKQogICAgICAgICAgICYmIG5ld1BsdWdpbi5jYW5SZWxvYWQoKTsKICAgICAgIGlmICghcmVsb2FkICYmIG9sZFBsdWdpbiAhPSBudWxsKSB7Ci0gICAgICAgIG9sZFBsdWdpbi5zdG9wKCk7Ci0gICAgICAgIHJ1bm5pbmcucmVtb3ZlKG5hbWUpOworICAgICAgICB1bmxvYWRQbHVnaW4ob2xkUGx1Z2luKTsKICAgICAgIH0KICAgICAgIGlmICghbmV3UGx1Z2luLmlzRGlzYWJsZWQoKSkgewogICAgICAgICBuZXdQbHVnaW4uc3RhcnQoZW52KTsKICAgICAgIH0KICAgICAgIGlmIChyZWxvYWQpIHsKICAgICAgICAgZW52Lm9uUmVsb2FkUGx1Z2luKG9sZFBsdWdpbiwgbmV3UGx1Z2luKTsKLSAgICAgICAgb2xkUGx1Z2luLnN0b3AoKTsKKyAgICAgICAgdW5sb2FkUGx1Z2luKG9sZFBsdWdpbik7CiAgICAgICB9IGVsc2UgaWYgKCFuZXdQbHVnaW4uaXNEaXNhYmxlZCgpKSB7CiAgICAgICAgIGVudi5vblN0YXJ0UGx1Z2luKG5ld1BsdWdpbik7CiAgICAgICB9CkBAIC0zNjYsOCArMzkzLDcgQEAKICAgICAgIH0KICAgICB9CiAgICAgZm9yIChTdHJpbmcgbmFtZSA6IHVubG9hZCl7Ci0gICAgICBsb2cuaW5mbyhTdHJpbmcuZm9ybWF0KCJVbmxvYWRpbmcgcGx1Z2luICVzIiwgbmFtZSkpOwotICAgICAgcnVubmluZy5yZW1vdmUobmFtZSkuc3RvcCgpOworICAgICAgdW5sb2FkUGx1Z2luKHJ1bm5pbmcuZ2V0KG5hbWUpKTsKICAgICB9CiAgIH0KIApAQCAtMzg0LDE2ICs0MTAsMTkgQEAKICAgfQogCiAgIHN5bmNocm9uaXplZCBpbnQgcHJvY2Vzc1BlbmRpbmdDbGVhbnVwcygpIHsKLSAgICBDbGVhbnVwSGFuZGxlIGg7Ci0gICAgd2hpbGUgKChoID0gKENsZWFudXBIYW5kbGUpIGNsZWFudXBRdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKLSAgICAgIGguY2xlYW51cCgpOwotICAgICAgY2xlYW51cEhhbmRsZXMucmVtb3ZlKGgpOworICAgIEl0ZXJhdG9yPFBsdWdpbj4gaXRlcmF0b3IgPSB0b0NsZWFudXAuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICBQbHVnaW4gcGx1Z2luID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisKKyAgICAgIENsZWFudXBIYW5kbGUgY2xlYW51cEhhbmRsZSA9IGNsZWFudXBIYW5kbGVzLnJlbW92ZShwbHVnaW4pOworICAgICAgY2xlYW51cEhhbmRsZS5jbGVhbnVwKCk7CiAgICAgfQotICAgIHJldHVybiBNYXRoLm1heCgwLCBjbGVhbnVwSGFuZGxlcy5zaXplKCkgLSBydW5uaW5nLnNpemUoKSk7CisgICAgcmV0dXJuIHRvQ2xlYW51cC5zaXplKCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgY2xlYW5JbkJhY2tncm91bmQoKSB7Ci0gICAgaW50IGNudCA9IE1hdGgubWF4KDAsIGNsZWFudXBIYW5kbGVzLnNpemUoKSAtIHJ1bm5pbmcuc2l6ZSgpKTsKKyAgICBpbnQgY250ID0gdG9DbGVhbnVwLnNpemUoKTsKICAgICBpZiAoMCA8IGNudCkgewogICAgICAgY2xlYW5lci5nZXQoKS5jbGVhbihjbnQpOwogICAgIH0KQEAgLTQzNywxOSArNDY2LDE3IEBACiAgICAgICBVUkxbXSB1cmxzID0ge3RtcC50b1VSSSgpLnRvVVJMKCl9OwogICAgICAgQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyID0gcGFyZW50Rm9yKHR5cGUpOwogICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKHVybHMsIHBhcmVudExvYWRlcik7Ci0gICAgICBjbGVhbnVwSGFuZGxlcy5wdXQoCi0gICAgICAgICAgbmV3IENsZWFudXBIYW5kbGUodG1wLCBqYXJGaWxlLCBwbHVnaW5Mb2FkZXIsIGNsZWFudXBRdWV1ZSksCi0gICAgICAgICAgQm9vbGVhbi5UUlVFKTsKLQogICAgICAgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gc3lzTW9kdWxlID0gbG9hZChzeXNOYW1lLCBwbHVnaW5Mb2FkZXIpOwogICAgICAgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gc3NoTW9kdWxlID0gbG9hZChzc2hOYW1lLCBwbHVnaW5Mb2FkZXIpOwogICAgICAgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gaHR0cE1vZHVsZSA9IGxvYWQoaHR0cE5hbWUsIHBsdWdpbkxvYWRlcik7Ci0gICAgICBrZWVwID0gdHJ1ZTsKLSAgICAgIHJldHVybiBuZXcgUGx1Z2luKG5hbWUsCisgICAgICBQbHVnaW4gcGx1Z2luID0gbmV3IFBsdWdpbihuYW1lLCBwbHVnaW5Vc2VyRmFjdG9yeS5jcmVhdGUobmFtZSksCiAgICAgICAgICAgc3JjSmFyLCBzbmFwc2hvdCwKICAgICAgICAgICBqYXJGaWxlLCBtYW5pZmVzdCwKICAgICAgICAgICBuZXcgRmlsZShkYXRhRGlyLCBuYW1lKSwgdHlwZSwgcGx1Z2luTG9hZGVyLAogICAgICAgICAgIHN5c01vZHVsZSwgc3NoTW9kdWxlLCBodHRwTW9kdWxlKTsKKyAgICAgIGNsZWFudXBIYW5kbGVzLnB1dChwbHVnaW4sIG5ldyBDbGVhbnVwSGFuZGxlKHRtcCwgamFyRmlsZSkpOworICAgICAga2VlcCA9IHRydWU7CisgICAgICByZXR1cm4gcGx1Z2luOwogICAgIH0gZmluYWxseSB7CiAgICAgICBpZiAoIWtlZXApIHsKICAgICAgICAgamFyRmlsZS5jbG9zZSgpOwpAQCAtNDY0LDYgKzQ5MSw4IEBACiAgICAgICAgIHJldHVybiBQbHVnaW5OYW1lLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CiAgICAgICBjYXNlIFBMVUdJTjoKICAgICAgICAgcmV0dXJuIFBsdWdpbkxvYWRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworICAgICAgY2FzZSBKUzoKKyAgICAgICAgcmV0dXJuIEphdmFTY3JpcHRQbHVnaW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUGx1Z2luRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBBcGlUeXBlICIgKyB0eXBlKTsKICAgICB9CkBAIC00NzEsNyArNTAwLDcgQEAKIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcE5hbWVGb3IoU3RyaW5nIG5hbWUpIHsKICAgICBTaW1wbGVEYXRlRm9ybWF0IGZtdCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eU1NZGRfSEhtbSIpOwotICAgIHJldHVybiAicGx1Z2luXyIgKyBuYW1lICsgIl8iICsgZm10LmZvcm1hdChuZXcgRGF0ZSgpKSArICJfIjsKKyAgICByZXR1cm4gUExVR0lOX1RNUF9QUkVGSVggKyBuYW1lICsgIl8iICsgZm10LmZvcm1hdChuZXcgRGF0ZSgpKSArICJfIjsKICAgfQogCiAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gbG9hZChTdHJpbmcgbmFtZSwgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyKQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbk1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbk1vZHVsZS5qYXZhCmluZGV4IGFiN2RjM2MuLjRjZGFmYjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Nb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luTW9kdWxlLmphdmEKQEAgLTE0LDIwICsxNCwzNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpblJlc291cmNlLlBMVUdJTl9LSU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnN5c3RlbXN0YXR1cy5TZXJ2ZXJJbmZvcm1hdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOwogCi1wdWJsaWMgY2xhc3MgUGx1Z2luTW9kdWxlIGV4dGVuZHMgTGlmZWN5Y2xlTW9kdWxlIHsKK3B1YmxpYyBjbGFzcyBQbHVnaW5Nb2R1bGUgZXh0ZW5kcyBSZXN0QXBpTW9kdWxlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICBiaW5kKFNlcnZlckluZm9ybWF0aW9uSW1wbC5jbGFzcyk7CiAgICAgYmluZChTZXJ2ZXJJbmZvcm1hdGlvbi5jbGFzcykudG8oU2VydmVySW5mb3JtYXRpb25JbXBsLmNsYXNzKTsKIAogICAgIGJpbmQoUGx1Z2luQ2xlYW5lclRhc2suY2xhc3MpOworICAgIGJpbmQoUGx1Z2luc0NvbGxlY3Rpb24uY2xhc3MpOwogICAgIGJpbmQoUGx1Z2luR3VpY2VFbnZpcm9ubWVudC5jbGFzcyk7CiAgICAgYmluZChQbHVnaW5Mb2FkZXIuY2xhc3MpOwotCiAgICAgYmluZChDb3B5Q29uZmlnTW9kdWxlLmNsYXNzKTsKLSAgICBsaXN0ZW5lcigpLnRvKFBsdWdpbkxvYWRlci5jbGFzcyk7CisgICAgaW5zdGFsbChuZXcgTGlmZWN5Y2xlTW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGxpc3RlbmVyKCkudG8oUGx1Z2luTG9hZGVyLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIFBMVUdJTl9LSU5EKTsKKyAgICBwdXQoUExVR0lOX0tJTkQpLnRvKEluc3RhbGxQbHVnaW4uT3ZlcndyaXRlLmNsYXNzKTsKKyAgICBkZWxldGUoUExVR0lOX0tJTkQpLnRvKERpc2FibGVQbHVnaW4uY2xhc3MpOworICAgIGdldChQTFVHSU5fS0lORCwgInN0YXR1cyIpLnRvKEdldFN0YXR1cy5jbGFzcyk7CisgICAgcG9zdChQTFVHSU5fS0lORCwgImRpc2FibGUiKS50byhEaXNhYmxlUGx1Z2luLmNsYXNzKTsKKyAgICBwb3N0KFBMVUdJTl9LSU5ELCAiZW5hYmxlIikudG8oRW5hYmxlUGx1Z2luLmNsYXNzKTsKKyAgICBwb3N0KFBMVUdJTl9LSU5ELCAicmVsb2FkIikudG8oUmVsb2FkUGx1Z2luLmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpblJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcyMjcxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBQbHVnaW5SZXNvdXJjZSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UGx1Z2luUmVzb3VyY2U+PiBQTFVHSU5fS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UGx1Z2luUmVzb3VyY2U+PigpIHt9OworCisgIHByaXZhdGUgZmluYWwgUGx1Z2luIHBsdWdpbjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICBQbHVnaW5SZXNvdXJjZShQbHVnaW4gcGx1Z2luKSB7CisgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47CisgICAgdGhpcy5uYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKKyAgfQorCisgIFBsdWdpblJlc291cmNlKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5wbHVnaW4gPSBudWxsOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBwdWJsaWMgUGx1Z2luIGdldFBsdWdpbigpIHsKKyAgICByZXR1cm4gcGx1Z2luOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5zQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzBiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luc0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIFBsdWdpbnNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBSZXN0Q29sbGVjdGlvbjxUb3BMZXZlbFJlc291cmNlLCBQbHVnaW5SZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxUb3BMZXZlbFJlc291cmNlPiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PFBsdWdpblJlc291cmNlPj4gdmlld3M7CisgIHByaXZhdGUgZmluYWwgUGx1Z2luTG9hZGVyIGxvYWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0UGx1Z2lucz4gbGlzdDsKKworICBASW5qZWN0CisgIFBsdWdpbnNDb2xsZWN0aW9uKER5bmFtaWNNYXA8UmVzdFZpZXc8UGx1Z2luUmVzb3VyY2U+PiB2aWV3cywKKyAgICAgIFBsdWdpbkxvYWRlciBsb2FkZXIsIFByb3ZpZGVyPExpc3RQbHVnaW5zPiBsaXN0KSB7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFRvcExldmVsUmVzb3VyY2U+IGxpc3QoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBsdWdpblJlc291cmNlIHBhcnNlKFRvcExldmVsUmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBQbHVnaW4gcCA9IGxvYWRlci5nZXQoaWQuZ2V0KCkpOworICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBQbHVnaW5SZXNvdXJjZShwKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIEluc3RhbGxQbHVnaW4gY3JlYXRlKFRvcExldmVsUmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbmV3IEluc3RhbGxQbHVnaW4obG9hZGVyLCBpZC5nZXQoKSwgdHJ1ZSAvKiBjcmVhdGVkICovKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxQbHVnaW5SZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1JlbG9hZFBsdWdpbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1JlbG9hZFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOWVmMmRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1JlbG9hZFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5SZWxvYWRQbHVnaW4uSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitjbGFzcyBSZWxvYWRQbHVnaW4gaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQbHVnaW5SZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUGx1Z2luTG9hZGVyIGxvYWRlcjsKKworICBASW5qZWN0CisgIFJlbG9hZFBsdWdpbihQbHVnaW5Mb2FkZXIgbG9hZGVyKSB7CisgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQbHVnaW5SZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpIHRocm93cyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKKyAgICB0cnkgeworICAgICAgbG9hZGVyLnJlbG9hZChJbW11dGFibGVMaXN0Lm9mKG5hbWUpKTsKKyAgICB9IGNhdGNoIChJbnZhbGlkUGx1Z2luRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChQbHVnaW5JbnN0YWxsRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN0cmluZ1dyaXRlciBidWYgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICBidWYud3JpdGUoU3RyaW5nLmZvcm1hdCgiY2Fubm90IHJlbG9hZCAlc1xuIiwgbmFtZSkpOworICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoYnVmKTsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgIHB3LmZsdXNoKCk7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihidWYudG9TdHJpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgTGlzdFBsdWdpbnMuUGx1Z2luSW5mbyhsb2FkZXIuZ2V0KG5hbWUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NoYW5nZUNvbnRyb2wuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DaGFuZ2VDb250cm9sLmphdmEKaW5kZXggZGI0YjAyMS4uNjM5N2I5NiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NoYW5nZUNvbnRyb2wuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvQ2hhbmdlQ29udHJvbC5qYXZhCkBAIC0xNCwxNiArMTQsMTYgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRUeXBlUmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5Qcm9sb2dFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5TdG9yZWRWYWx1ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CkBAIC0zMiwyMyArMzIsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC51dGlsLlByb3ZpZGVyczsKIAotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmNvbXBpbGVyLkNvbXBpbGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5JbnRlZ2VyVGVybTsKIGltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkxpc3RUZXJtOwogaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuU3RydWN0dXJlVGVybTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlN5bWJvbFRlcm07CiBpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVmFyaWFibGVUZXJtOwogCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCkBAIC0xOTUsMTIgKzE5MSwxNCBAQAogCiAgIC8qKiBDYW4gdGhpcyB1c2VyIHB1Ymxpc2ggdGhpcyBkcmFmdCBjaGFuZ2Ugb3IgYW55IGRyYWZ0IHBhdGNoIHNldCBvZiB0aGlzIGNoYW5nZT8gKi8KICAgcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaChmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGlzT3duZXIoKSAmJiBpc1Zpc2libGUoZGIpOworICAgIHJldHVybiAoaXNPd25lcigpIHx8IGdldFJlZkNvbnRyb2woKS5jYW5QdWJsaXNoRHJhZnRzKCkpCisgICAgICAgICYmIGlzVmlzaWJsZShkYik7CiAgIH0KIAogICAvKiogQ2FuIHRoaXMgdXNlciBkZWxldGUgdGhpcyBkcmFmdCBjaGFuZ2Ugb3IgYW55IGRyYWZ0IHBhdGNoIHNldCBvZiB0aGlzIGNoYW5nZT8gKi8KICAgcHVibGljIGJvb2xlYW4gY2FuRGVsZXRlRHJhZnQoZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIHJldHVybiBpc093bmVyKCkgJiYgaXNWaXNpYmxlKGRiKTsKKyAgICByZXR1cm4gKGlzT3duZXIoKSB8fCBnZXRSZWZDb250cm9sKCkuY2FuRGVsZXRlRHJhZnRzKCkpCisgICAgICAgICYmIGlzVmlzaWJsZShkYik7CiAgIH0KIAogICAvKiogQ2FuIHRoaXMgdXNlciByZWJhc2UgdGhpcyBjaGFuZ2U/ICovCkBAIC0yMTUsNiArMjEzLDExIEBACiAgICAgICAgICYmIGdldFJlZkNvbnRyb2woKS5jYW5VcGxvYWQoKTsgLy8gYXMgbG9uZyBhcyB5b3UgY2FuIHVwbG9hZCB0b28KICAgfQogCisgIC8qKiBBbGwgYXZhaWxhYmxlIGxhYmVsIHR5cGVzIGZvciB0aGlzIHByb2plY3QuICovCisgIHB1YmxpYyBMYWJlbFR5cGVzIGdldExhYmVsVHlwZXMoKSB7CisgICAgcmV0dXJuIGdldFByb2plY3RDb250cm9sKCkuZ2V0TGFiZWxUeXBlcygpOworICB9CisKICAgLyoqIEFsbCB2YWx1ZSByYW5nZXMgb2YgYW55IGFsbG93ZWQgbGFiZWwgcGVybWlzc2lvbi4gKi8KICAgcHVibGljIExpc3Q8UGVybWlzc2lvblJhbmdlPiBnZXRMYWJlbFJhbmdlcygpIHsKICAgICByZXR1cm4gZ2V0UmVmQ29udHJvbCgpLmdldExhYmVsUmFuZ2VzKCk7CkBAIC0yNjYsMjUgKzI2OSwzMCBAQAogCiAgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byByZW1vdmUgdGhpcyByZXZpZXdlci4gKi8KICAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXIoUGF0Y2hTZXRBcHByb3ZhbCBhcHByb3ZhbCkgeworICAgIHJldHVybiBjYW5SZW1vdmVSZXZpZXdlcihhcHByb3ZhbC5nZXRBY2NvdW50SWQoKSwgYXBwcm92YWwuZ2V0VmFsdWUoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmVSZXZpZXdlcihBY2NvdW50LklkIHJldmlld2VyLCBpbnQgdmFsdWUpIHsKICAgICBpZiAoZ2V0Q2hhbmdlKCkuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKICAgICAgIC8vIEEgdXNlciBjYW4gYWx3YXlzIHJlbW92ZSB0aGVtc2VsdmVzLgogICAgICAgLy8KICAgICAgIGlmIChnZXRDdXJyZW50VXNlcigpIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKICAgICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgaSA9IChJZGVudGlmaWVkVXNlcikgZ2V0Q3VycmVudFVzZXIoKTsKLSAgICAgICAgaWYgKGkuZ2V0QWNjb3VudElkKCkuZXF1YWxzKGFwcHJvdmFsLmdldEFjY291bnRJZCgpKSkgeworICAgICAgICBpZiAoaS5nZXRBY2NvdW50SWQoKS5lcXVhbHMocmV2aWV3ZXIpKSB7CiAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIGNhbiByZW1vdmUgc2VsZgogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8vIFRoZSBjaGFuZ2Ugb3duZXIgbWF5IHJlbW92ZSBhbnkgemVybyBvciBwb3NpdGl2ZSBzY29yZS4KICAgICAgIC8vCi0gICAgICBpZiAoaXNPd25lcigpICYmIDAgPD0gYXBwcm92YWwuZ2V0VmFsdWUoKSkgeworICAgICAgaWYgKGlzT3duZXIoKSAmJiAwIDw9IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogCi0gICAgICAvLyBUaGUgYnJhbmNoIG93bmVyLCBwcm9qZWN0IG93bmVyLCBzaXRlIGFkbWluIGNhbiByZW1vdmUgYW55b25lLgotICAgICAgLy8KLSAgICAgIGlmIChnZXRSZWZDb250cm9sKCkuaXNPd25lcigpIC8vIGJyYW5jaCBvd25lcgorICAgICAgLy8gVXNlcnMgd2l0aCB0aGUgcmVtb3ZlIHJldmlld2VyIHBlcm1pc3Npb24sIHRoZSBicmFuY2ggb3duZXIsIHByb2plY3QKKyAgICAgIC8vIG93bmVyIGFuZCBzaXRlIGFkbWluIGNhbiByZW1vdmUgYW55b25lCisgICAgICBpZiAoZ2V0UmVmQ29udHJvbCgpLmNhblJlbW92ZVJldmlld2VyKCkgLy8gaGFzIHJlbW92YWwgcGVybWlzc2lvbnMKKyAgICAgICAgICB8fCBnZXRSZWZDb250cm9sKCkuaXNPd25lcigpIC8vIGJyYW5jaCBvd25lcgogICAgICAgICAgIHx8IGdldFByb2plY3RDb250cm9sKCkuaXNPd25lcigpIC8vIHByb2plY3Qgb3duZXIKICAgICAgICAgICB8fCBnZXRDdXJyZW50VXNlcigpLmdldENhcGFiaWxpdGllcygpLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjk0LDE2ICszMDIsMzUgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICAvKiogQ2FuIHRoaXMgdXNlciBlZGl0IHRoZSB0b3BpYyBuYW1lPyAqLworICBwdWJsaWMgYm9vbGVhbiBjYW5FZGl0VG9waWNOYW1lKCkgeworICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgIHJldHVybiBpc093bmVyKCkgLy8gb3duZXIgKGFrYSBjcmVhdG9yKSBvZiB0aGUgY2hhbmdlIGNhbiBlZGl0IHRvcGljCisgICAgICAgICAgfHwgZ2V0UmVmQ29udHJvbCgpLmlzT3duZXIoKSAvLyBicmFuY2ggb3duZXIgY2FuIGVkaXQgdG9waWMKKyAgICAgICAgICB8fCBnZXRQcm9qZWN0Q29udHJvbCgpLmlzT3duZXIoKSAvLyBwcm9qZWN0IG93bmVyIGNhbiBlZGl0IHRvcGljCisgICAgICAgICAgfHwgZ2V0Q3VycmVudFVzZXIoKS5nZXRDYXBhYmlsaXRpZXMoKS5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSAvLyBzaXRlIGFkbWluaXN0ZXJzIGFyZSBnb2QKKyAgICAgICAgICB8fCBnZXRSZWZDb250cm9sKCkuY2FuRWRpdFRvcGljTmFtZSgpIC8vIHVzZXIgY2FuIGVkaXQgdG9waWMgb24gYSBzcGVjaWZpYyByZWYKKyAgICAgIDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdldFJlZkNvbnRyb2woKS5jYW5Gb3JjZUVkaXRUb3BpY05hbWUoKTsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgTGlzdDxTdWJtaXRSZWNvcmQ+IGdldFN1Ym1pdFJlY29yZHMoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0KSB7Ci0gICAgcmV0dXJuIGNhblN1Ym1pdChkYiwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCB0cnVlKTsKKyAgICByZXR1cm4gY2FuU3VibWl0KGRiLCBwYXRjaFNldCwgbnVsbCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNhblN1Ym1pdCgpIHsKKyAgICByZXR1cm4gZ2V0UmVmQ29udHJvbCgpLmNhblN1Ym1pdCgpOwogICB9CiAKICAgcHVibGljIExpc3Q8U3VibWl0UmVjb3JkPiBjYW5TdWJtaXQoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0KSB7Ci0gICAgcmV0dXJuIGNhblN1Ym1pdChkYiwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCBmYWxzZSk7CisgICAgcmV0dXJuIGNhblN1Ym1pdChkYiwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICB9CiAKICAgcHVibGljIExpc3Q8U3VibWl0UmVjb3JkPiBjYW5TdWJtaXQoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0LAotICAgICAgQE51bGxhYmxlIENoYW5nZURhdGEgY2QsIGJvb2xlYW4gZmFzdEV2YWxMYWJlbHMsIGJvb2xlYW4gYWxsb3dDbG9zZWQpIHsKKyAgICAgIEBOdWxsYWJsZSBDaGFuZ2VEYXRhIGNkLCBib29sZWFuIGZhc3RFdmFsTGFiZWxzLCBib29sZWFuIGFsbG93Q2xvc2VkLAorICAgICAgYm9vbGVhbiBhbGxvd0RyYWZ0KSB7CiAgICAgaWYgKCFhbGxvd0Nsb3NlZCAmJiBjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNDbG9zZWQoKSkgewogICAgICAgU3VibWl0UmVjb3JkIHJlYyA9IG5ldyBTdWJtaXRSZWNvcmQoKTsKICAgICAgIHJlYy5zdGF0dXMgPSBTdWJtaXRSZWNvcmQuU3RhdHVzLkNMT1NFRDsKQEAgLTMxNCwxMjIgKzM0MSwyMyBAQAogICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiUGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiIGlzIG5vdCBjdXJyZW50Iik7CiAgICAgfQogCi0gICAgdHJ5IHsKLSAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5EUkFGVCkgewotICAgICAgICBpZiAoIWlzRHJhZnRWaXNpYmxlKGRiLCBjZCkpIHsKLSAgICAgICAgICByZXR1cm4gcnVsZUVycm9yKCJQYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSArICIgbm90IGZvdW5kIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiQ2Fubm90IHN1Ym1pdCBkcmFmdCBjaGFuZ2VzIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwYXRjaFNldC5pc0RyYWZ0KCkpIHsKLSAgICAgICAgaWYgKCFpc0RyYWZ0VmlzaWJsZShkYiwgY2QpKSB7Ci0gICAgICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiUGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBydWxlRXJyb3IoIkNhbm5vdCBzdWJtaXQgZHJhZnQgcGF0Y2ggc2V0cyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGVycikgewotICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiQ2Fubm90IHJlYWQgcGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRJZCgpLCBlcnIpOworICAgIGlmICgoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuRFJBRlQgfHwgcGF0Y2hTZXQuaXNEcmFmdCgpKQorICAgICAgICAmJiAhYWxsb3dEcmFmdCkgeworICAgICAgcmV0dXJuIGNhbm5vdFN1Ym1pdERyYWZ0KGRiLCBwYXRjaFNldCwgY2QpOwogICAgIH0KIAotICAgIExpc3Q8VGVybT4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8VGVybT4oKTsKLSAgICBUZXJtIHN1Ym1pdFJ1bGU7Ci0gICAgUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSA9IGdldFByb2plY3RDb250cm9sKCkuZ2V0UHJvamVjdFN0YXRlKCk7Ci0gICAgUHJvbG9nRW52aXJvbm1lbnQgZW52OwotCisgICAgTGlzdDxUZXJtPiByZXN1bHRzOworICAgIFN1Ym1pdFJ1bGVFdmFsdWF0b3IgZXZhbHVhdG9yOwogICAgIHRyeSB7Ci0gICAgICBlbnYgPSBwcm9qZWN0U3RhdGUubmV3UHJvbG9nRW52aXJvbm1lbnQoKTsKLSAgICB9IGNhdGNoIChDb21waWxlRXhjZXB0aW9uIGVycikgewotICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKLSAgICAgICAgICArIGdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLlJFVklFV19EQiwgZGIpOwotICAgICAgZW52LnNldChTdG9yZWRWYWx1ZXMuQ0hBTkdFLCBjaGFuZ2UpOwotICAgICAgZW52LnNldChTdG9yZWRWYWx1ZXMuQ0hBTkdFX0RBVEEsIGNkKTsKLSAgICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLlBBVENIX1NFVCwgcGF0Y2hTZXQpOwotICAgICAgZW52LnNldChTdG9yZWRWYWx1ZXMuQ0hBTkdFX0NPTlRST0wsIHRoaXMpOwotCi0gICAgICBzdWJtaXRSdWxlID0gZW52Lm9uY2UoCi0gICAgICAgICJnZXJyaXQiLCAibG9jYXRlX3N1Ym1pdF9ydWxlIiwKLSAgICAgICAgbmV3IFZhcmlhYmxlVGVybSgpKTsKLSAgICAgIGlmIChzdWJtaXRSdWxlID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiTm8gdXNlcjpzdWJtaXRfcnVsZSBmb3VuZCBmb3IgIgotICAgICAgICAgICAgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGZhc3RFdmFsTGFiZWxzKSB7Ci0gICAgICAgIGVudi5vbmNlKCJnZXJyaXQiLCAiYXNzdW1lX3JhbmdlX2Zyb21fbGFiZWwiKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZm9yIChUZXJtW10gdGVtcGxhdGUgOiBlbnYuYWxsKAotICAgICAgICAgICAgImdlcnJpdCIsICJjYW5fc3VibWl0IiwKLSAgICAgICAgICAgIHN1Ym1pdFJ1bGUsCi0gICAgICAgICAgICBuZXcgVmFyaWFibGVUZXJtKCkpKSB7Ci0gICAgICAgICAgcmVzdWx0cy5hZGQodGVtcGxhdGVbMV0pOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChQcm9sb2dFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkV4Y2VwdGlvbiBjYWxsaW5nICIgKyBzdWJtaXRSdWxlICsgIiBvbiBjaGFuZ2UgIgotICAgICAgICAgICAgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIGdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7Ci0gICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGVycikgewotICAgICAgICByZXR1cm4gbG9nUnVsZUVycm9yKCJFeGNlcHRpb24gY2FsbGluZyAiICsgc3VibWl0UnVsZSArICIgb24gY2hhbmdlICIKLSAgICAgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOwotICAgICAgfQotCi0gICAgICBQcm9qZWN0U3RhdGUgcGFyZW50U3RhdGUgPSBwcm9qZWN0U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICAgIFByb2xvZ0Vudmlyb25tZW50IGNoaWxkRW52ID0gZW52OwotICAgICAgU2V0PFByb2plY3QuTmFtZUtleT4gcHJvamVjdHNTZWVuID0gbmV3IEhhc2hTZXQ8UHJvamVjdC5OYW1lS2V5PigpOwotICAgICAgcHJvamVjdHNTZWVuLmFkZChnZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKLQotICAgICAgd2hpbGUgKHBhcmVudFN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgaWYgKCFwcm9qZWN0c1NlZW4uYWRkKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpKSB7Ci0gICAgICAgICAgLy9wYXJlbnQgaGFzIGJlZW4gc2VlbiBiZWZvcmUsIHN0b3Agd2FsayB1cCBpbmhlcml0YW5jZSB0cmVlCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvbG9nRW52aXJvbm1lbnQgcGFyZW50RW52OwotICAgICAgICB0cnkgewotICAgICAgICAgIHBhcmVudEVudiA9IHBhcmVudFN0YXRlLm5ld1Byb2xvZ0Vudmlyb25tZW50KCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvbXBpbGVFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKLSAgICAgICAgICAgICAgKyBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50RW52LmNvcHlTdG9yZWRWYWx1ZXMoY2hpbGRFbnYpOwotICAgICAgICBUZXJtIGZpbHRlclJ1bGUgPQotICAgICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsICJsb2NhdGVfc3VibWl0X2ZpbHRlciIsIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICAgIGlmIChmaWx0ZXJSdWxlICE9IG51bGwpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGZhc3RFdmFsTGFiZWxzKSB7Ci0gICAgICAgICAgICAgIGVudi5vbmNlKCJnZXJyaXQiLCAiYXNzdW1lX3JhbmdlX2Zyb21fbGFiZWwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVGVybSByZXN1bHRzVGVybSA9IHRvTGlzdFRlcm0ocmVzdWx0cyk7Ci0gICAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7Ci0gICAgICAgICAgICBUZXJtW10gdGVtcGxhdGUgPSBwYXJlbnRFbnYub25jZSgKLSAgICAgICAgICAgICAgICAiZ2Vycml0IiwgImZpbHRlcl9zdWJtaXRfcmVzdWx0cyIsCi0gICAgICAgICAgICAgICAgZmlsdGVyUnVsZSwKLSAgICAgICAgICAgICAgICByZXN1bHRzVGVybSwKLSAgICAgICAgICAgICAgICBuZXcgVmFyaWFibGVUZXJtKCkpOwotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBUZXJtPiB0ZXJtTGlzdCA9ICgoTGlzdFRlcm0pIHRlbXBsYXRlWzJdKS50b0phdmEoKTsKLSAgICAgICAgICAgIHJlc3VsdHMuYWRkQWxsKHRlcm1MaXN0KTsKLSAgICAgICAgICB9IGNhdGNoIChQcm9sb2dFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9nUnVsZUVycm9yKCJFeGNlcHRpb24gY2FsbGluZyAiICsgZmlsdGVyUnVsZSArICIgb24gY2hhbmdlICIKLSAgICAgICAgICAgICAgICArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKLSAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGVycikgewotICAgICAgICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIGZpbHRlclJ1bGUgKyAiIG9uIGNoYW5nZSAiCi0gICAgICAgICAgICAgICAgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGFyZW50U3RhdGUgPSBwYXJlbnRTdGF0ZS5nZXRQYXJlbnRTdGF0ZSgpOwotICAgICAgICBjaGlsZEVudiA9IHBhcmVudEVudjsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgZW52LmNsb3NlKCk7CisgICAgICBldmFsdWF0b3IgPSBuZXcgU3VibWl0UnVsZUV2YWx1YXRvcihkYiwgcGF0Y2hTZXQsCisgICAgICAgICAgZ2V0UHJvamVjdENvbnRyb2woKSwKKyAgICAgICAgICB0aGlzLCBjaGFuZ2UsIGNkLAorICAgICAgICAgIGZhc3RFdmFsTGFiZWxzLAorICAgICAgICAgICJsb2NhdGVfc3VibWl0X3J1bGUiLCAiY2FuX3N1Ym1pdCIsCisgICAgICAgICAgImxvY2F0ZV9zdWJtaXRfZmlsdGVyIiwgImZpbHRlcl9zdWJtaXRfcmVzdWx0cyIpOworICAgICAgcmVzdWx0cyA9IGV2YWx1YXRvci5ldmFsdWF0ZSgpOworICAgIH0gY2F0Y2ggKFJ1bGVFdmFsRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkgewpAQCAtNDM3LDEyICszNjUsMjggQEAKICAgICAgIC8vIGF0IGxlYXN0IG9uZSByZXN1bHQgaW5mb3JtaW5nIHRoZSBjYWxsZXIgb2YgdGhlIGxhYmVscyB0aGF0IGFyZQogICAgICAgLy8gcmVxdWlyZWQgZm9yIHRoaXMgY2hhbmdlIHRvIGJlIHN1Ym1pdHRhYmxlLiBFYWNoIGxhYmVsIHdpbGwgaW5kaWNhdGUKICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoYXQgaXMgYWN0dWFsbHkgcG9zc2libGUgZ2l2ZW4gdGhlIHBlcm1pc3Npb25zLgotICAgICAgbG9nLmVycm9yKCJTdWJtaXQgcnVsZSAiICsgc3VibWl0UnVsZSArICIgZm9yIGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCkKLSAgICAgICAgICArICIgb2YgIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiIGhhcyBubyBzb2x1dGlvbi4iKTsKKyAgICAgIGxvZy5lcnJvcigiU3VibWl0IHJ1bGUgJyIgKyBldmFsdWF0b3IuZ2V0U3VibWl0UnVsZSgpICsgIicgZm9yIGNoYW5nZSAiCisgICAgICAgICAgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkKKyAgICAgICAgICArICIgaGFzIG5vIHNvbHV0aW9uLiIpOwogICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiUHJvamVjdCBzdWJtaXQgcnVsZSBoYXMgbm8gc29sdXRpb24iKTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVzdWx0c1RvU3VibWl0UmVjb3JkKHN1Ym1pdFJ1bGUsIHJlc3VsdHMpOworICAgIHJldHVybiByZXN1bHRzVG9TdWJtaXRSZWNvcmQoZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKSwgcmVzdWx0cyk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3VibWl0UmVjb3JkPiBjYW5ub3RTdWJtaXREcmFmdChSZXZpZXdEYiBkYiwgUGF0Y2hTZXQgcGF0Y2hTZXQsCisgICAgICBDaGFuZ2VEYXRhIGNkKSB7CisgICAgdHJ5IHsKKyAgICAgIGlmICghaXNEcmFmdFZpc2libGUoZGIsIGNkKSkgeworICAgICAgICByZXR1cm4gcnVsZUVycm9yKCJQYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSArICIgbm90IGZvdW5kIik7CisgICAgICB9IGVsc2UgaWYgKHBhdGNoU2V0LmlzRHJhZnQoKSkgeworICAgICAgICByZXR1cm4gcnVsZUVycm9yKCJDYW5ub3Qgc3VibWl0IGRyYWZ0IHBhdGNoIHNldHMiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBydWxlRXJyb3IoIkNhbm5vdCBzdWJtaXQgZHJhZnQgY2hhbmdlcyIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkNhbm5vdCByZWFkIHBhdGNoIHNldCAiICsgcGF0Y2hTZXQuZ2V0SWQoKSwgZXJyKTsKKyAgICB9CiAgIH0KIAogICAvKioKQEAgLTUyNyw2ICs0NzEsNjQgQEAKICAgICByZXR1cm4gb3V0OwogICB9CiAKKyAgcHVibGljIFN1Ym1pdFR5cGVSZWNvcmQgZ2V0U3VibWl0VHlwZVJlY29yZChSZXZpZXdEYiBkYiwgUGF0Y2hTZXQgcGF0Y2hTZXQpIHsKKyAgICByZXR1cm4gZ2V0U3VibWl0VHlwZVJlY29yZChkYiwgcGF0Y2hTZXQsIG51bGwpOworICB9CisKKyAgcHVibGljIFN1Ym1pdFR5cGVSZWNvcmQgZ2V0U3VibWl0VHlwZVJlY29yZChSZXZpZXdEYiBkYiwgUGF0Y2hTZXQgcGF0Y2hTZXQsCisgICAgICBATnVsbGFibGUgQ2hhbmdlRGF0YSBjZCkgeworICAgIHRyeSB7CisgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuRFJBRlQgJiYgIWlzRHJhZnRWaXNpYmxlKGRiLCBjZCkpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVSdWxlRXJyb3IoIlBhdGNoIHNldCAiICsgcGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpCisgICAgICAgICAgICArICIgbm90IGZvdW5kIik7CisgICAgICB9CisgICAgICBpZiAocGF0Y2hTZXQuaXNEcmFmdCgpICYmICFpc0RyYWZ0VmlzaWJsZShkYiwgY2QpKSB7CisgICAgICAgIHJldHVybiB0eXBlUnVsZUVycm9yKCJQYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldFBhdGNoU2V0SWQoKQorICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHJldHVybiBsb2dUeXBlUnVsZUVycm9yKCJDYW5ub3QgcmVhZCBwYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldElkKCksCisgICAgICAgICAgZXJyKTsKKyAgICB9CisKKyAgICBMaXN0PFRlcm0+IHJlc3VsdHM7CisgICAgU3VibWl0UnVsZUV2YWx1YXRvciBldmFsdWF0b3I7CisgICAgdHJ5IHsKKyAgICAgIGV2YWx1YXRvciA9IG5ldyBTdWJtaXRSdWxlRXZhbHVhdG9yKGRiLCBwYXRjaFNldCwKKyAgICAgICAgICBnZXRQcm9qZWN0Q29udHJvbCgpLCB0aGlzLCBjaGFuZ2UsIGNkLAorICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICJsb2NhdGVfc3VibWl0X3R5cGUiLCAiZ2V0X3N1Ym1pdF90eXBlIiwKKyAgICAgICAgICAibG9jYXRlX3N1Ym1pdF90eXBlX2ZpbHRlciIsICJmaWx0ZXJfc3VibWl0X3R5cGVfcmVzdWx0cyIpOworICAgICAgcmVzdWx0cyA9IGV2YWx1YXRvci5ldmFsdWF0ZSgpOworICAgIH0gY2F0Y2ggKFJ1bGVFdmFsRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBsb2dUeXBlUnVsZUVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKyAgICAgIC8vIFNob3VsZCBuZXZlciBvY2N1ciBmb3IgYSB3ZWxsIHdyaXR0ZW4gcnVsZQorICAgICAgbG9nLmVycm9yKCJTdWJtaXQgcnVsZSAnIiArIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCkgKyAiJyBmb3IgY2hhbmdlICIKKyAgICAgICAgICArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKQorICAgICAgICAgICsgIiBoYXMgbm8gc29sdXRpb24uIik7CisgICAgICByZXR1cm4gdHlwZVJ1bGVFcnJvcigiUHJvamVjdCBzdWJtaXQgcnVsZSBoYXMgbm8gc29sdXRpb24iKTsKKyAgICB9CisKKyAgICBUZXJtIHR5cGVUZXJtID0gcmVzdWx0cy5nZXQoMCk7CisgICAgaWYgKCF0eXBlVGVybS5pc1N5bWJvbCgpKSB7CisgICAgICBsb2cuZXJyb3IoIlN1Ym1pdCBydWxlICciICsgZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKSArICInIGZvciBjaGFuZ2UgIgorICAgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpCisgICAgICAgICAgKyAiIGRpZCBub3QgcmV0dXJuIGEgc3ltYm9sLiIpOworICAgICAgcmV0dXJuIHR5cGVSdWxlRXJyb3IoIlByb2plY3Qgc3VibWl0IHJ1bGUgaGFzIGludmFsaWQgc29sdXRpb24iKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdHlwZU5hbWUgPSAoKFN5bWJvbFRlcm0pdHlwZVRlcm0pLm5hbWUoKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIFN1Ym1pdFR5cGVSZWNvcmQuT0soCisgICAgICAgICAgUHJvamVjdC5TdWJtaXRUeXBlLnZhbHVlT2YodHlwZU5hbWUudG9VcHBlckNhc2UoKSkpOworICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbG9nSW52YWxpZFR5cGUoZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKSwgdHlwZU5hbWUpOworICAgIH0KKyAgfQorCiAgIHByaXZhdGUgTGlzdDxTdWJtaXRSZWNvcmQ+IGxvZ0ludmFsaWRSZXN1bHQoVGVybSBydWxlLCBUZXJtIHJlY29yZCkgewogICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIlN1Ym1pdCBydWxlICIgKyBydWxlICsgIiBmb3IgY2hhbmdlICIgKyBjaGFuZ2UuZ2V0SWQoKQogICAgICAgICArICIgb2YgIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiIG91dHB1dCBpbnZhbGlkIHJlc3VsdDogIiArIHJlY29yZCk7CkBAIC01NDksNiArNTUxLDI5IEBACiAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVjKTsKICAgfQogCisgIHByaXZhdGUgU3VibWl0VHlwZVJlY29yZCBsb2dJbnZhbGlkVHlwZShUZXJtIHJ1bGUsIFN0cmluZyByZWNvcmQpIHsKKyAgICByZXR1cm4gbG9nVHlwZVJ1bGVFcnJvcigiU3VibWl0IHR5cGUgcnVsZSAiICsgcnVsZSArICIgZm9yIGNoYW5nZSAiCisgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpCisgICAgICAgICsgIiBvdXRwdXQgaW52YWxpZCByZXN1bHQ6ICIgKyByZWNvcmQpOworICB9CisKKyAgcHJpdmF0ZSBTdWJtaXRUeXBlUmVjb3JkIGxvZ1R5cGVSdWxlRXJyb3IoU3RyaW5nIGVyciwgRXhjZXB0aW9uIGUpIHsKKyAgICBsb2cuZXJyb3IoZXJyLCBlKTsKKyAgICByZXR1cm4gdHlwZVJ1bGVFcnJvcigiRXJyb3IgZXZhbHVhdGluZyBwcm9qZWN0IHR5cGUgcnVsZXMsIGNoZWNrIHNlcnZlciBsb2ciKTsKKyAgfQorCisgIHByaXZhdGUgU3VibWl0VHlwZVJlY29yZCBsb2dUeXBlUnVsZUVycm9yKFN0cmluZyBlcnIpIHsKKyAgICBsb2cuZXJyb3IoZXJyKTsKKyAgICByZXR1cm4gdHlwZVJ1bGVFcnJvcigiRXJyb3IgZXZhbHVhdGluZyBwcm9qZWN0IHR5cGUgcnVsZXMsIGNoZWNrIHNlcnZlciBsb2ciKTsKKyAgfQorCisgIHByaXZhdGUgU3VibWl0VHlwZVJlY29yZCB0eXBlUnVsZUVycm9yKFN0cmluZyBlcnIpIHsKKyAgICBTdWJtaXRUeXBlUmVjb3JkIHJlYyA9IG5ldyBTdWJtaXRUeXBlUmVjb3JkKCk7CisgICAgcmVjLnN0YXR1cyA9IFN1Ym1pdFR5cGVSZWNvcmQuU3RhdHVzLlJVTEVfRVJST1I7CisgICAgcmVjLmVycm9yTWVzc2FnZSA9IGVycjsKKyAgICByZXR1cm4gcmVjOworICB9CisKICAgcHJpdmF0ZSB2b2lkIGFwcGxpZWRCeShTdWJtaXRSZWNvcmQuTGFiZWwgbGFiZWwsIFRlcm0gc3RhdHVzKSB7CiAgICAgaWYgKHN0YXR1cy5pc1N0cnVjdHVyZSgpICYmIHN0YXR1cy5hcml0eSgpID09IDEpIHsKICAgICAgIFRlcm0gd2hvID0gc3RhdHVzLmFyZygwKTsKQEAgLTU2MCw3ICs1ODUsNyBAQAogCiAgIHByaXZhdGUgYm9vbGVhbiBpc0RyYWZ0VmlzaWJsZShSZXZpZXdEYiBkYiwgQ2hhbmdlRGF0YSBjZCkKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIHJldHVybiBpc093bmVyKCkgfHwgaXNSZXZpZXdlcihkYiwgY2QpOworICAgIHJldHVybiBpc093bmVyKCkgfHwgaXNSZXZpZXdlcihkYiwgY2QpIHx8IGdldFJlZkNvbnRyb2woKS5jYW5WaWV3RHJhZnRzKCk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXNlcihUZXJtIHdobykgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0LmphdmEKaW5kZXggM2RiZDdiNy4uNTQ5NDE0NiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3QuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvQ3JlYXRlUHJvamVjdC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAvLwogLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMCwyODkgKzEwLDExNSBAQAogLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIC8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Qcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Qcm9qZWN0T3duZXJHcm91cHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1ldGFEYXRhVXBkYXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlJlcG9zaXRvcnlDYXNlTWlzbWF0Y2hFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3Vwc0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdC5JbnB1dDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlLlJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLQotLyoqIENvbW1vbiBjbGFzcyB0aGF0IGhvbGRzIHRoZSBjb2RlIHRvIGNyZWF0ZSBwcm9qZWN0cyAqLwotcHVibGljIGNsYXNzIENyZWF0ZVByb2plY3QgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQotICAgICAgLmdldExvZ2dlcihDcmVhdGVQcm9qZWN0LmNsYXNzKTsKLQotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIENyZWF0ZVByb2plY3QgY3JlYXRlKENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVByb2plY3RBcmdzKTsKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfUFJPSkVDVCkKK2NsYXNzIENyZWF0ZVByb2plY3QgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxUb3BMZXZlbFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBwYXJlbnQ7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIGJvb2xlYW4gcGVybWlzc2lvbnNPbmx5OworICAgIGJvb2xlYW4gY3JlYXRlRW1wdHlDb21taXQ7CisgICAgU3VibWl0VHlwZSBzdWJtaXRUeXBlOworICAgIExpc3Q8U3RyaW5nPiBicmFuY2hlczsKKyAgICBMaXN0PFN0cmluZz4gb3duZXJzOworICAgIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VDb250cmlidXRvckFncmVlbWVudHM7CisgICAgSW5oZXJpdGFibGVCb29sZWFuIHVzZVNpZ25lZE9mZkJ5OworICAgIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VDb250ZW50TWVyZ2U7CisgICAgSW5oZXJpdGFibGVCb29sZWFuIHJlcXVpcmVDaGFuZ2VJZDsKICAgfQogCi0gIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnRHcm91cC5VVUlEPiBwcm9qZWN0T3duZXJHcm91cHM7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZWZlcmVuY2VVcGRhdGVkOwotICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8TmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lcj4gY3JlYXRlZExpc3RlbmVyOwotICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IHNlcnZlcklkZW50OwotICBwcml2YXRlIENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVByb2plY3RBcmdzOwotICBwcml2YXRlIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7Ci0gIHByaXZhdGUgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKLSAgcHJpdmF0ZSBNZXRhRGF0YVVwZGF0ZS5Vc2VyIG1ldGFEYXRhVXBkYXRlRmFjdG9yeTsKKyAgc3RhdGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBDcmVhdGVQcm9qZWN0IGNyZWF0ZShTdHJpbmcgbmFtZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBlcmZvcm1DcmVhdGVQcm9qZWN0LkZhY3RvcnkgY3JlYXRlUHJvamVjdEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UHJvamVjdHNDb2xsZWN0aW9uPiBwcm9qZWN0c0NvbGxlY3Rpb247CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0SnNvbiBqc29uOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogCiAgIEBJbmplY3QKLSAgQ3JlYXRlUHJvamVjdChAUHJvamVjdE93bmVyR3JvdXBzIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gcE93bmVyR3JvdXBzLAotICAgICAgSWRlbnRpZmllZFVzZXIgaWRlbnRpZmllZFVzZXIsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdFJlcG9NYW5hZ2VyLAotICAgICAgR2l0UmVmZXJlbmNlVXBkYXRlZCByZWZlcmVuY2VVcGRhdGVkLAotICAgICAgRHluYW1pY1NldDxOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyPiBjcmVhdGVkTGlzdGVuZXIsCi0gICAgICBSZXZpZXdEYiBkYiwKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBwZXJzb25JZGVudCwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZCwKLSAgICAgIE1ldGFEYXRhVXBkYXRlLlVzZXIgbWV0YURhdGFVcGRhdGVGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVBBcmdzLCBQcm9qZWN0Q2FjaGUgcENhY2hlKSB7Ci0gICAgdGhpcy5wcm9qZWN0T3duZXJHcm91cHMgPSBwT3duZXJHcm91cHM7Ci0gICAgdGhpcy5jdXJyZW50VXNlciA9IGlkZW50aWZpZWRVc2VyOwotICAgIHRoaXMucmVwb01hbmFnZXIgPSBnaXRSZXBvTWFuYWdlcjsKLSAgICB0aGlzLnJlZmVyZW5jZVVwZGF0ZWQgPSByZWZlcmVuY2VVcGRhdGVkOwotICAgIHRoaXMuY3JlYXRlZExpc3RlbmVyID0gY3JlYXRlZExpc3RlbmVyOwotICAgIHRoaXMuc2VydmVySWRlbnQgPSBwZXJzb25JZGVudDsKLSAgICB0aGlzLmNyZWF0ZVByb2plY3RBcmdzID0gY3JlYXRlUEFyZ3M7Ci0gICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwQ2FjaGU7Ci0gICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7Ci0gICAgdGhpcy5tZXRhRGF0YVVwZGF0ZUZhY3RvcnkgPSBtZXRhRGF0YVVwZGF0ZUZhY3Rvcnk7CisgIENyZWF0ZVByb2plY3QoUGVyZm9ybUNyZWF0ZVByb2plY3QuRmFjdG9yeSBwZXJmb3JtQ3JlYXRlUHJvamVjdEZhY3RvcnksCisgICAgICBQcm92aWRlcjxQcm9qZWN0c0NvbGxlY3Rpb24+IHByb2plY3RzQ29sbGVjdGlvbiwKKyAgICAgIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb24sIFByb2plY3RKc29uIGpzb24sCisgICAgICBAQXNzaXN0ZWQgU3RyaW5nIG5hbWUpIHsKKyAgICB0aGlzLmNyZWF0ZVByb2plY3RGYWN0b3J5ID0gcGVyZm9ybUNyZWF0ZVByb2plY3RGYWN0b3J5OworICAgIHRoaXMucHJvamVjdHNDb2xsZWN0aW9uID0gcHJvamVjdHNDb2xsZWN0aW9uOworICAgIHRoaXMuZ3JvdXBzQ29sbGVjdGlvbiA9IGdyb3Vwc0NvbGxlY3Rpb247CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOwogICB9CiAKLSAgcHVibGljIHZvaWQgY3JlYXRlUHJvamVjdCgpIHRocm93cyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24gewotICAgIHZhbGlkYXRlUGFyYW1ldGVycygpOwotICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBuYW1lS2V5ID0gY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpOwotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgaGVhZCA9Ci0gICAgICAgICAgY3JlYXRlUHJvamVjdEFyZ3MucGVybWlzc2lvbnNPbmx5ID8gR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRwotICAgICAgICAgICAgICA6IGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaC5nZXQoMCk7Ci0gICAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8gPSByZXBvTWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KG5hbWVLZXkpOwotICAgICAgdHJ5IHsKLSAgICAgICAgTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lci5FdmVudCBldmVudCA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyLkV2ZW50KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZUtleS5nZXQoKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIGhlYWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmb3IgKE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXIgbCA6IGNyZWF0ZWRMaXN0ZW5lcikgewotICAgICAgICAgIGwub25OZXdQcm9qZWN0Q3JlYXRlZChldmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBSZWZVcGRhdGUgdSA9IHJlcG8udXBkYXRlUmVmKENvbnN0YW50cy5IRUFEKTsKLSAgICAgICAgdS5kaXNhYmxlUmVmTG9nKCk7Ci0gICAgICAgIHUubGluayhoZWFkKTsKLQotICAgICAgICBjcmVhdGVQcm9qZWN0Q29uZmlnKCk7Ci0KLSAgICAgICAgaWYgKCFjcmVhdGVQcm9qZWN0QXJncy5wZXJtaXNzaW9uc09ubHkKLSAgICAgICAgICAgICYmIGNyZWF0ZVByb2plY3RBcmdzLmNyZWF0ZUVtcHR5Q29tbWl0KSB7Ci0gICAgICAgICAgY3JlYXRlRW1wdHlDb21taXRzKHJlcG8sIG5hbWVLZXksIGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIHJlcG8uY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChSZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXkuZ2V0KCkKLSAgICAgICAgICArICIgYmVjYXVzZSB0aGUgbmFtZSBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgcHJvamVjdC4iCi0gICAgICAgICAgKyAiIFRoZSBvdGhlciBwcm9qZWN0IGhhcyB0aGUgc2FtZSBuYW1lLCBvbmx5IHNwZWxsZWQgaW4gYSIKLSAgICAgICAgICArICIgZGlmZmVyZW50IGNhc2UuIiwgZSk7Ci0gICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGJhZE5hbWUpIHsKLSAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXksIGJhZE5hbWUpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KG5hbWVLZXkpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGlmIChyZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oInByb2plY3QgXCIiICsgbmFtZUtleSArICJcIiBleGlzdHMiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgcmVwby5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb0VycikgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXk7Ci0gICAgICAgIGxvZy5lcnJvcihtc2csIGVycik7Ci0gICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24obXNnLCBpb0Vycik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiQ2Fubm90IGNyZWF0ZSAiICsgbmFtZUtleTsKLSAgICAgIGxvZy5lcnJvcihtc2csIGUpOwotICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbihtc2csIGUpOworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShUb3BMZXZlbFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLAorICAgICAgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgaW5wdXQgPSBuZXcgSW5wdXQoKTsKICAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgTWV0YURhdGFVcGRhdGUgbWQgPQotICAgICAgICBtZXRhRGF0YVVwZGF0ZUZhY3RvcnkuY3JlYXRlKGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFByb2plY3RDb25maWcgY29uZmlnID0gUHJvamVjdENvbmZpZy5yZWFkKG1kKTsKLSAgICAgIGNvbmZpZy5sb2FkKG1kKTsKLQotICAgICAgUHJvamVjdCBuZXdQcm9qZWN0ID0gY29uZmlnLmdldFByb2plY3QoKTsKLSAgICAgIG5ld1Byb2plY3Quc2V0RGVzY3JpcHRpb24oY3JlYXRlUHJvamVjdEFyZ3MucHJvamVjdERlc2NyaXB0aW9uKTsKLSAgICAgIG5ld1Byb2plY3Quc2V0U3VibWl0VHlwZShjcmVhdGVQcm9qZWN0QXJncy5zdWJtaXRUeXBlKTsKLSAgICAgIG5ld1Byb2plY3QKLSAgICAgICAgICAuc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGNyZWF0ZVByb2plY3RBcmdzLmNvbnRyaWJ1dG9yQWdyZWVtZW50cyk7Ci0gICAgICBuZXdQcm9qZWN0LnNldFVzZVNpZ25lZE9mZkJ5KGNyZWF0ZVByb2plY3RBcmdzLnNpZ25lZE9mZkJ5KTsKLSAgICAgIG5ld1Byb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKGNyZWF0ZVByb2plY3RBcmdzLmNvbnRlbnRNZXJnZSk7Ci0gICAgICBuZXdQcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChjcmVhdGVQcm9qZWN0QXJncy5jaGFuZ2VJZFJlcXVpcmVkKTsKLSAgICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5uZXdQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICBuZXdQcm9qZWN0LnNldFBhcmVudE5hbWUoY3JlYXRlUHJvamVjdEFyZ3MubmV3UGFyZW50LmdldFByb2plY3QoKQotICAgICAgICAgICAgLmdldE5hbWVLZXkoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGZpbmFsIEFjY2Vzc1NlY3Rpb24gYWxsID0KLSAgICAgICAgICAgIGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKEFjY2Vzc1NlY3Rpb24uQUxMLCB0cnVlKTsKLSAgICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBvd25lcklkIDogY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMpIHsKLSAgICAgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGcgPSBncm91cEJhY2tlbmQuZ2V0KG93bmVySWQpOwotICAgICAgICAgIGlmIChnICE9IG51bGwpIHsKLSAgICAgICAgICAgIEdyb3VwUmVmZXJlbmNlIGdyb3VwID0gY29uZmlnLnJlc29sdmUoR3JvdXBSZWZlcmVuY2UuZm9yR3JvdXAoZykpOwotICAgICAgICAgICAgYWxsLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5PV05FUiwgdHJ1ZSkuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBQZXJtaXNzaW9uUnVsZShncm91cCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBtZC5zZXRNZXNzYWdlKCJDcmVhdGVkIHByb2plY3RcbiIpOwotICAgICAgY29uZmlnLmNvbW1pdChtZCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG1kLmNsb3NlKCk7Ci0gICAgfQotICAgIHByb2plY3RDYWNoZS5vbkNyZWF0ZVByb2plY3QoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpKTsKLSAgICByZXBvTWFuYWdlci5zZXRQcm9qZWN0RGVzY3JpcHRpb24oY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpLAotICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5wcm9qZWN0RGVzY3JpcHRpb24pOwotICAgIHJlZmVyZW5jZVVwZGF0ZWQuZmlyZShjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0KCksCi0gICAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFyYW1ldGVycygpIHRocm93cyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24gewotICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpID09IG51bGwKLSAgICAgICAgfHwgY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKS5pc0VtcHR5KCkpIHsKLSAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIlByb2plY3QgbmFtZSBpcyByZXF1aXJlZCIpOworICAgIGlmIChpbnB1dC5uYW1lICE9IG51bGwgJiYgIW5hbWUuZXF1YWxzKGlucHV0Lm5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibmFtZSBtdXN0IG1hdGNoIFVSTCIpOwogICAgIH0KIAotICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpLmVuZHNXaXRoKENvbnN0YW50cy5ET1RfR0lUX0VYVCkpIHsKLSAgICAgIGNyZWF0ZVByb2plY3RBcmdzLnNldFByb2plY3ROYW1lKGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3ROYW1lKCkKLSAgICAgICAgICAuc3Vic3RyaW5nKAotICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAtIENvbnN0YW50cy5ET1RfR0lUX0VYVC5sZW5ndGgoKSkpOworICAgIGZpbmFsIENyZWF0ZVByb2plY3RBcmdzIGFyZ3MgPSBuZXcgQ3JlYXRlUHJvamVjdEFyZ3MoKTsKKyAgICBhcmdzLnNldFByb2plY3ROYW1lKG5hbWUpOworICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGlucHV0LnBhcmVudCkpIHsKKyAgICAgIGFyZ3MubmV3UGFyZW50ID0gcHJvamVjdHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKGlucHV0LnBhcmVudCkuZ2V0Q29udHJvbCgpOwogICAgIH0KLQotICAgIGlmICghY3VycmVudFVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQ3JlYXRlUHJvamVjdCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgXCJDcmVhdGUgUHJvamVjdFwiIGNhcGFiaWxpdHkuIiwKLSAgICAgICAgICBjdXJyZW50VXNlci5nZXRVc2VyTmFtZSgpKSk7Ci0gICAgfQotCi0gICAgaWYgKGNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzID09IG51bGwKLSAgICAgICAgfHwgY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICBjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcyA9Ci0gICAgICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXAuVVVJRD4ocHJvamVjdE93bmVyR3JvdXBzKTsKLSAgICB9Ci0KLSAgICBMaXN0PFN0cmluZz4gdHJhbnNmb3JtZWRCcmFuY2hlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPT0gbnVsbCB8fAotICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2guaXNFbXB0eSgpKSB7Ci0gICAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENvbnN0YW50cy5NQVNURVIpOwotICAgIH0KLSAgICBmb3IgKFN0cmluZyBicmFuY2ggOiBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2gpIHsKLSAgICAgIHdoaWxlIChicmFuY2guc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgIGJyYW5jaCA9IGJyYW5jaC5zdWJzdHJpbmcoMSk7CisgICAgYXJncy5jcmVhdGVFbXB0eUNvbW1pdCA9IGlucHV0LmNyZWF0ZUVtcHR5Q29tbWl0OworICAgIGFyZ3MucGVybWlzc2lvbnNPbmx5ID0gaW5wdXQucGVybWlzc2lvbnNPbmx5OworICAgIGFyZ3MucHJvamVjdERlc2NyaXB0aW9uID0gU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5kZXNjcmlwdGlvbik7CisgICAgYXJncy5zdWJtaXRUeXBlID0KKyAgICAgICAgT2JqZWN0cy5maXJzdE5vbk51bGwoaW5wdXQuc3VibWl0VHlwZSwgU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlkpOworICAgIGFyZ3MuYnJhbmNoID0gaW5wdXQuYnJhbmNoZXM7CisgICAgaWYgKGlucHV0Lm93bmVycyAhPSBudWxsKSB7CisgICAgICBMaXN0PEFjY291bnRHcm91cC5VVUlEPiBvd25lcklkcyA9CisgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGlucHV0Lm93bmVycy5zaXplKCkpOworICAgICAgZm9yIChTdHJpbmcgb3duZXIgOiBpbnB1dC5vd25lcnMpIHsKKyAgICAgICAgb3duZXJJZHMuYWRkKGdyb3Vwc0NvbGxlY3Rpb24uZ2V0KCkucGFyc2Uob3duZXIpLmdldEdyb3VwVVVJRCgpKTsKICAgICAgIH0KLSAgICAgIGlmICghYnJhbmNoLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7Ci0gICAgICAgIGJyYW5jaCA9IENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoOwotICAgICAgfQotICAgICAgaWYgKCFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKGJyYW5jaCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgIkJyYW5jaCBcIiVzXCIgaXMgbm90IGEgdmFsaWQgbmFtZS4iLCBicmFuY2gpKTsKLSAgICAgIH0KLSAgICAgIGlmICghdHJhbnNmb3JtZWRCcmFuY2hlcy5jb250YWlucyhicmFuY2gpKSB7Ci0gICAgICAgIHRyYW5zZm9ybWVkQnJhbmNoZXMuYWRkKGJyYW5jaCk7Ci0gICAgICB9CisgICAgICBhcmdzLm93bmVySWRzID0gb3duZXJJZHM7CiAgICAgfQotICAgIGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCA9IHRyYW5zZm9ybWVkQnJhbmNoZXM7Ci0gIH0KKyAgICBhcmdzLmNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9CisgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKGlucHV0LnVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cywKKyAgICAgICAgICAgIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKKyAgICBhcmdzLnNpZ25lZE9mZkJ5ID0KKyAgICAgICAgT2JqZWN0cy5maXJzdE5vbk51bGwoaW5wdXQudXNlU2lnbmVkT2ZmQnksIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKKyAgICBhcmdzLmNvbnRlbnRNZXJnZSA9CisgICAgICAgIGlucHV0LnN1Ym1pdFR5cGUgPT0gU3VibWl0VHlwZS5GQVNUX0ZPUldBUkRfT05MWQorICAgICAgICAgICAgPyBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0UgOiBPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICAgICAgICBpbnB1dC51c2VDb250ZW50TWVyZ2UsIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKKyAgICBhcmdzLmNoYW5nZUlkUmVxdWlyZWQgPQorICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbChpbnB1dC5yZXF1aXJlQ2hhbmdlSWQsIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKIAotICBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlDb21taXRzKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywKLSAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBmaW5hbCBMaXN0PFN0cmluZz4gcmVmcykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgT2JqZWN0SW5zZXJ0ZXIgb2kgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIENvbW1pdEJ1aWxkZXIgY2IgPSBuZXcgQ29tbWl0QnVpbGRlcigpOwotICAgICAgY2Iuc2V0VHJlZUlkKG9pLmluc2VydChDb25zdGFudHMuT0JKX1RSRUUsIG5ldyBieXRlW10ge30pKTsKLSAgICAgIGNiLnNldEF1dGhvcihtZXRhRGF0YVVwZGF0ZUZhY3RvcnkuZ2V0VXNlclBlcnNvbklkZW50KCkpOwotICAgICAgY2Iuc2V0Q29tbWl0dGVyKHNlcnZlcklkZW50KTsKLSAgICAgIGNiLnNldE1lc3NhZ2UoIkluaXRpYWwgZW1wdHkgcmVwb3NpdG9yeVxuIik7Ci0KLSAgICAgIE9iamVjdElkIGlkID0gb2kuaW5zZXJ0KGNiKTsKLSAgICAgIG9pLmZsdXNoKCk7Ci0KLSAgICAgIGZvciAoU3RyaW5nIHJlZiA6IHJlZnMpIHsKLSAgICAgICAgUmVmVXBkYXRlIHJ1ID0gcmVwby51cGRhdGVSZWYocmVmKTsKLSAgICAgICAgcnUuc2V0TmV3T2JqZWN0SWQoaWQpOwotICAgICAgICBmaW5hbCBSZXN1bHQgcmVzdWx0ID0gcnUudXBkYXRlKCk7Ci0gICAgICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgICByZWZlcmVuY2VVcGRhdGVkLmZpcmUocHJvamVjdCwgcmVmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgXCIlc1wiOiAlcyIsIHJlZiwgcmVzdWx0Lm5hbWUoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGxvZy5lcnJvcigKLSAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBlbXB0eSBjb21taXQgZm9yICIKLSAgICAgICAgICAgICAgKyBjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpLCBlKTsKLSAgICAgIHRocm93IGU7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG9pLnJlbGVhc2UoKTsKLSAgICB9CisgICAgUHJvamVjdCBwID0gY3JlYXRlUHJvamVjdEZhY3RvcnkuY3JlYXRlKGFyZ3MpLmNyZWF0ZVByb2plY3QoKTsKKyAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChqc29uLmZvcm1hdChwKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0QXJncy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3RBcmdzLmphdmEKaW5kZXggMmRlZTRmNC4uN2JiZDJlNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3RBcmdzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3RBcmdzLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTI3LDE1ICsyOCwyMCBAQAogICBwdWJsaWMgUHJvamVjdENvbnRyb2wgbmV3UGFyZW50OwogICBwdWJsaWMgU3RyaW5nIHByb2plY3REZXNjcmlwdGlvbjsKICAgcHVibGljIFN1Ym1pdFR5cGUgc3VibWl0VHlwZTsKLSAgcHVibGljIGJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzOwotICBwdWJsaWMgYm9vbGVhbiBzaWduZWRPZmZCeTsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBjb250cmlidXRvckFncmVlbWVudHM7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gc2lnbmVkT2ZmQnk7CiAgIHB1YmxpYyBib29sZWFuIHBlcm1pc3Npb25zT25seTsKICAgcHVibGljIExpc3Q8U3RyaW5nPiBicmFuY2g7Ci0gIHB1YmxpYyBib29sZWFuIGNvbnRlbnRNZXJnZTsKLSAgcHVibGljIGJvb2xlYW4gY2hhbmdlSWRSZXF1aXJlZDsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBjb250ZW50TWVyZ2U7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gY2hhbmdlSWRSZXF1aXJlZDsKICAgcHVibGljIGJvb2xlYW4gY3JlYXRlRW1wdHlDb21taXQ7CiAKICAgcHVibGljIENyZWF0ZVByb2plY3RBcmdzKCkgeworICAgIGNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIHNpZ25lZE9mZkJ5ID0gSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQ7CisgICAgY29udGVudE1lcmdlID0gSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQ7CisgICAgY2hhbmdlSWRSZXF1aXJlZCA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIHN1Ym1pdFR5cGUgPSBTdWJtaXRUeXBlLk1FUkdFX0lGX05FQ0VTU0FSWTsKICAgfQogCiAgIHB1YmxpYyBQcm9qZWN0Lk5hbWVLZXkgZ2V0UHJvamVjdCgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0Rhc2hib2FyZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyZGI0OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitwdWJsaWMgY2xhc3MgRGFzaGJvYXJkUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PERhc2hib2FyZFJlc291cmNlPj4gREFTSEJPQVJEX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PERhc2hib2FyZFJlc291cmNlPj4oKSB7fTsKKworICBzdGF0aWMgRGFzaGJvYXJkUmVzb3VyY2UgcHJvamVjdERlZmF1bHQoUHJvamVjdENvbnRyb2wgY3RsKSB7CisgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRSZXNvdXJjZShjdGwsIG51bGwsIG51bGwsIG51bGwsIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBjb250cm9sOworICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWZOYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXRoTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBDb25maWcgY29uZmlnOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcHJvamVjdERlZmF1bHQ7CisKKyAgRGFzaGJvYXJkUmVzb3VyY2UoUHJvamVjdENvbnRyb2wgY29udHJvbCwKKyAgICAgIFN0cmluZyByZWZOYW1lLAorICAgICAgU3RyaW5nIHBhdGhOYW1lLAorICAgICAgQ29uZmlnIGNvbmZpZywKKyAgICAgIGJvb2xlYW4gcHJvamVjdERlZmF1bHQpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sOworICAgIHRoaXMucmVmTmFtZSA9IHJlZk5hbWU7CisgICAgdGhpcy5wYXRoTmFtZSA9IHBhdGhOYW1lOworICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIHRoaXMucHJvamVjdERlZmF1bHQgPSBwcm9qZWN0RGVmYXVsdDsKKyAgfQorCisgIHB1YmxpYyBQcm9qZWN0Q29udHJvbCBnZXRDb250cm9sKCkgeworICAgIHJldHVybiBjb250cm9sOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRSZWZOYW1lKCkgeworICAgIHJldHVybiByZWZOYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRQYXRoTmFtZSgpIHsKKyAgICByZXR1cm4gcGF0aE5hbWU7CisgIH0KKworICBwdWJsaWMgQ29uZmlnIGdldENvbmZpZygpIHsKKyAgICByZXR1cm4gY29uZmlnOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNQcm9qZWN0RGVmYXVsdCgpIHsKKyAgICByZXR1cm4gcHJvamVjdERlZmF1bHQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRzQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0Rhc2hib2FyZHNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwZTcxYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZTX0RBU0hCT0FSRFM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0QXBpRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlVybEVuY29kZWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uYW5ub3RhdGlvbnMuU2VyaWFsaXplZE5hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQmxvYkJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIERhc2hib2FyZHNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBDaGlsZENvbGxlY3Rpb248UHJvamVjdFJlc291cmNlLCBEYXNoYm9hcmRSZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxQcm9qZWN0UmVzb3VyY2U+eworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxEYXNoYm9hcmRSZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3REYXNoYm9hcmRzPiBsaXN0OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNldERlZmF1bHREYXNoYm9hcmQuQ3JlYXRlRGVmYXVsdD4gY3JlYXRlRGVmYXVsdDsKKworICBASW5qZWN0CisgIERhc2hib2FyZHNDb2xsZWN0aW9uKEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCisgICAgICBEeW5hbWljTWFwPFJlc3RWaWV3PERhc2hib2FyZFJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxMaXN0RGFzaGJvYXJkcz4gbGlzdCwKKyAgICAgIFByb3ZpZGVyPFNldERlZmF1bHREYXNoYm9hcmQuQ3JlYXRlRGVmYXVsdD4gY3JlYXRlRGVmYXVsdCkgeworICAgIHRoaXMuZ2l0TWFuYWdlciA9IGdpdE1hbmFnZXI7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgICAgdGhpcy5jcmVhdGVEZWZhdWx0ID0gY3JlYXRlRGVmYXVsdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8UHJvamVjdFJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIHJldHVybiBsaXN0LmdldCgpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdE1vZGlmeVZpZXc8UHJvamVjdFJlc291cmNlLCA/PiBjcmVhdGUoUHJvamVjdFJlc291cmNlIHBhcmVudCwKKyAgICAgIElkU3RyaW5nIGlkKSB0aHJvd3MgUmVzdEFwaUV4Y2VwdGlvbiB7CisgICAgaWYgKGlkLmVxdWFscygiZGVmYXVsdCIpKSB7CisgICAgICByZXR1cm4gY3JlYXRlRGVmYXVsdC5nZXQoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEYXNoYm9hcmRSZXNvdXJjZSBwYXJzZShQcm9qZWN0UmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdENvbnRyb2wgbXlDdGwgPSBwYXJlbnQuZ2V0Q29udHJvbCgpOworICAgIGlmIChpZC5lcXVhbHMoImRlZmF1bHQiKSkgeworICAgICAgcmV0dXJuIERhc2hib2FyZFJlc291cmNlLnByb2plY3REZWZhdWx0KG15Q3RsKTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCisgICAgICAgIFNwbGl0dGVyLm9uKCc6JykubGltaXQoMikuc3BsaXQoaWQuZ2V0KCkpKTsKKyAgICBpZiAocGFydHMuc2l6ZSgpICE9IDIpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisKKyAgICBDdXJyZW50VXNlciB1c2VyID0gbXlDdGwuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICBTdHJpbmcgcmVmID0gcGFydHMuZ2V0KDApOworICAgIFN0cmluZyBwYXRoID0gcGFydHMuZ2V0KDEpOworICAgIGZvciAoUHJvamVjdFN0YXRlIHBzIDogbXlDdGwuZ2V0UHJvamVjdFN0YXRlKCkudHJlZSgpKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gcGFyc2UocHMuY29udHJvbEZvcih1c2VyKSwgcmVmLCBwYXRoLCBteUN0bCk7CisgICAgICB9IGNhdGNoIChBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgICB9IGNhdGNoIChJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgcHJpdmF0ZSBEYXNoYm9hcmRSZXNvdXJjZSBwYXJzZShQcm9qZWN0Q29udHJvbCBjdGwsIFN0cmluZyByZWYsIFN0cmluZyBwYXRoLAorICAgICAgUHJvamVjdENvbnRyb2wgbXlDdGwpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFtYmlndW91c09iamVjdEV4Y2VwdGlvbiwKKyAgICAgICAgICBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgaWQgPSByZWYgKyAiOiIgKyBwYXRoOworICAgIGlmICghcmVmLnN0YXJ0c1dpdGgoUkVGU19EQVNIQk9BUkRTKSkgeworICAgICAgcmVmID0gUkVGU19EQVNIQk9BUkRTICsgcmVmOworICAgIH0KKyAgICBpZiAoIVJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUocmVmKQorICAgICAgICB8fCAhY3RsLmNvbnRyb2xGb3JSZWYocmVmKS5jYW5SZWFkKCkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisKKyAgICBSZXBvc2l0b3J5IGdpdDsKKyAgICB0cnkgeworICAgICAgZ2l0ID0gZ2l0TWFuYWdlci5vcGVuUmVwb3NpdG9yeShjdGwuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIE9iamVjdElkIG9iaklkID0gZ2l0LnJlc29sdmUocmVmICsgIjoiICsgcGF0aCk7CisgICAgICBpZiAob2JqSWQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgICB9CisgICAgICBCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhudWxsLCBnaXQsIG9iaklkKTsKKyAgICAgIHJldHVybiBuZXcgRGFzaGJvYXJkUmVzb3VyY2UobXlDdGwsIHJlZiwgcGF0aCwgY2ZnLCBmYWxzZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxEYXNoYm9hcmRSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIHN0YXRpYyBEYXNoYm9hcmRJbmZvIHBhcnNlKFByb2plY3QgZGVmaW5pbmdQcm9qZWN0LCBTdHJpbmcgcmVmTmFtZSwKKyAgICAgIFN0cmluZyBwYXRoLCBDb25maWcgY29uZmlnLCBTdHJpbmcgcHJvamVjdCwgYm9vbGVhbiBzZXREZWZhdWx0KQorICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIERhc2hib2FyZEluZm8gaW5mbyA9IG5ldyBEYXNoYm9hcmRJbmZvKHJlZk5hbWUsIHBhdGgpOworICAgIGluZm8ucHJvamVjdCA9IHByb2plY3Q7CisgICAgaW5mby5kZWZpbmluZ1Byb2plY3QgPSBkZWZpbmluZ1Byb2plY3QuZ2V0TmFtZSgpOworICAgIGluZm8udGl0bGUgPSByZXBsYWNlKHByb2plY3QsIGNvbmZpZy5nZXRTdHJpbmcoImRhc2hib2FyZCIsIG51bGwsICJ0aXRsZSIpKTsKKyAgICBpbmZvLmRlc2NyaXB0aW9uID0gcmVwbGFjZShwcm9qZWN0LCBjb25maWcuZ2V0U3RyaW5nKCJkYXNoYm9hcmQiLCBudWxsLCAiZGVzY3JpcHRpb24iKSk7CisgICAgaW5mby5mb3JlYWNoID0gY29uZmlnLmdldFN0cmluZygiZGFzaGJvYXJkIiwgbnVsbCwgImZvcmVhY2giKTsKKworICAgIGlmIChzZXREZWZhdWx0KSB7CisgICAgICBTdHJpbmcgaWQgPSByZWZOYW1lICsgIjoiICsgcGF0aDsKKyAgICAgIGluZm8uaXNEZWZhdWx0ID0gaWQuZXF1YWxzKGRlZmF1bHRPZihkZWZpbmluZ1Byb2plY3QpKSA/IHRydWUgOiBudWxsOworICAgIH0KKworICAgIFVybEVuY29kZWQgdSA9IG5ldyBVcmxFbmNvZGVkKCIvZGFzaGJvYXJkLyIpOworICAgIHUucHV0KCJ0aXRsZSIsIE9iamVjdHMuZmlyc3ROb25OdWxsKGluZm8udGl0bGUsIGluZm8ucGF0aCkpOworICAgIGlmIChpbmZvLmZvcmVhY2ggIT0gbnVsbCkgeworICAgICAgdS5wdXQoImZvcmVhY2giLCByZXBsYWNlKHByb2plY3QsIGluZm8uZm9yZWFjaCkpOworICAgIH0KKyAgICBmb3IgKFN0cmluZyBuYW1lIDogY29uZmlnLmdldFN1YnNlY3Rpb25zKCJzZWN0aW9uIikpIHsKKyAgICAgIFNlY3Rpb24gcyA9IG5ldyBTZWN0aW9uKCk7CisgICAgICBzLm5hbWUgPSBuYW1lOworICAgICAgcy5xdWVyeSA9IGNvbmZpZy5nZXRTdHJpbmcoInNlY3Rpb24iLCBuYW1lLCAicXVlcnkiKTsKKyAgICAgIHUucHV0KHMubmFtZSwgcmVwbGFjZShwcm9qZWN0LCBzLnF1ZXJ5KSk7CisgICAgICBpbmZvLnNlY3Rpb25zLmFkZChzKTsKKyAgICB9CisgICAgaW5mby51cmwgPSB1LnRvU3RyaW5nKCkucmVwbGFjZSgiJTNBIiwgIjoiKTsKKworICAgIHJldHVybiBpbmZvOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHByb2plY3QsIFN0cmluZyBxdWVyeSkgeworICAgIHJldHVybiBxdWVyeS5yZXBsYWNlKCIke3Byb2plY3R9IiwgcHJvamVjdCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdE9mKFByb2plY3QgcHJvaikgeworICAgIGZpbmFsIFN0cmluZyBkZWZhdWx0SWQgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgcHJvai5nZXRMb2NhbERlZmF1bHREYXNoYm9hcmQoKSwKKyAgICAgICAgU3RyaW5ncy5udWxsVG9FbXB0eShwcm9qLmdldERlZmF1bHREYXNoYm9hcmQoKSkpOworICAgIGlmIChkZWZhdWx0SWQuc3RhcnRzV2l0aChSRUZTX0RBU0hCT0FSRFMpKSB7CisgICAgICByZXR1cm4gZGVmYXVsdElkLnN1YnN0cmluZyhSRUZTX0RBU0hCT0FSRFMubGVuZ3RoKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZGVmYXVsdElkOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBEYXNoYm9hcmRJbmZvIHsKKyAgICBmaW5hbCBTdHJpbmcga2luZCA9ICJnZXJyaXRjb2RlcmV2aWV3I2Rhc2hib2FyZCI7CisgICAgU3RyaW5nIGlkOworICAgIFN0cmluZyBwcm9qZWN0OworICAgIFN0cmluZyBkZWZpbmluZ1Byb2plY3Q7CisgICAgU3RyaW5nIHJlZjsKKyAgICBTdHJpbmcgcGF0aDsKKyAgICBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgU3RyaW5nIGZvcmVhY2g7CisgICAgU3RyaW5nIHVybDsKKworICAgIEBTZXJpYWxpemVkTmFtZSgiZGVmYXVsdCIpCisgICAgQm9vbGVhbiBpc0RlZmF1bHQ7CisKKyAgICBTdHJpbmcgdGl0bGU7CisgICAgTGlzdDxTZWN0aW9uPiBzZWN0aW9ucyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgRGFzaGJvYXJkSW5mbyhTdHJpbmcgcmVmLCBTdHJpbmcgbmFtZSkKKyAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgdGhpcy5yZWYgPSByZWY7CisgICAgICB0aGlzLnBhdGggPSBuYW1lOworICAgICAgdGhpcy5pZCA9IEpvaW5lci5vbignOicpLmpvaW4oVXJsLmVuY29kZShyZWYpLCBVcmwuZW5jb2RlKHBhdGgpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgU2VjdGlvbiB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgU3RyaW5nIHF1ZXJ5OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGVsZXRlRGFzaGJvYXJkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGVsZXRlRGFzaGJvYXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EZWxldGVEYXNoYm9hcmQuamF2YQpAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuRGVsZXRlRGFzaGJvYXJkLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworY2xhc3MgRGVsZXRlRGFzaGJvYXJkIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8RGFzaGJvYXJkUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2U7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNldERlZmF1bHREYXNoYm9hcmQ+IGRlZmF1bHRTZXR0ZXI7CisKKyAgQEluamVjdAorICBEZWxldGVEYXNoYm9hcmQoUHJvdmlkZXI8U2V0RGVmYXVsdERhc2hib2FyZD4gZGVmYXVsdFNldHRlcikgeworICAgIHRoaXMuZGVmYXVsdFNldHRlciA9IGRlZmF1bHRTZXR0ZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShEYXNoYm9hcmRSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwKKyAgICAgIEV4Y2VwdGlvbiB7CisgICAgaWYgKHJlc291cmNlLmlzUHJvamVjdERlZmF1bHQoKSkgeworICAgICAgU2V0RGFzaGJvYXJkLklucHV0IGluID0gbmV3IFNldERhc2hib2FyZC5JbnB1dCgpOworICAgICAgaW4uY29tbWl0TWVzc2FnZSA9IGlucHV0ICE9IG51bGwgPyBpbnB1dC5jb21taXRNZXNzYWdlIDogbnVsbDsKKyAgICAgIHJldHVybiBkZWZhdWx0U2V0dGVyLmdldCgpLmFwcGx5KHJlc291cmNlLCBpbik7CisgICAgfQorCisgICAgLy8gVE9ETzogSW1wbGVtZW50IGRlbGV0ZSBvZiBkYXNoYm9hcmRzIGJ5IEFQSS4KKyAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2FyYmFnZUNvbGxlY3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HYXJiYWdlQ29sbGVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZDkyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2FyYmFnZUNvbGxlY3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5TdHJlYW1pbmdSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkdhcmJhZ2VDb2xsZWN0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5SVU5fR0MpCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3QgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQcm9qZWN0UmVzb3VyY2UsIElucHV0PiB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICB9CisKKyAgcHJpdmF0ZSBHYXJiYWdlQ29sbGVjdGlvbi5GYWN0b3J5IGdhcmJhZ2VDb2xsZWN0aW9uRmFjdG9yeTsKKworICBASW5qZWN0CisgIEdhcmJhZ2VDb2xsZWN0KEdhcmJhZ2VDb2xsZWN0aW9uLkZhY3RvcnkgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5KSB7CisgICAgdGhpcy5nYXJiYWdlQ29sbGVjdGlvbkZhY3RvcnkgPSBnYXJiYWdlQ29sbGVjdGlvbkZhY3Rvcnk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmVhbWluZ1Jlc3BvbnNlIGFwcGx5KGZpbmFsIFByb2plY3RSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgeworICAgIHJldHVybiBuZXcgU3RyZWFtaW5nUmVzcG9uc2UoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiAidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04IjsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIENoYXJzZXRzLlVURl84KSkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50bG4oKSB7CisgICAgICAgICAgICB3cml0ZSgnXG4nKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQgcmVzdWx0ID0gZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5LmNyZWF0ZSgpLnJ1bigKKyAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyc3JjLmdldE5hbWVLZXkoKSksIHdyaXRlcik7CisgICAgICAgICAgaWYgKHJlc3VsdC5oYXNFcnJvcnMoKSkgeworICAgICAgICAgICAgZm9yIChHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvciBlIDogcmVzdWx0LmdldEVycm9ycygpKSB7CisgICAgICAgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgICAgICAgIHN3aXRjaCAoZS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUE9TSVRPUllfTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgICAgbXNnID0gImVycm9yOiBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKSArICJcIiBub3QgZm91bmQiOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHQ19BTFJFQURZX1NDSEVEVUxFRDoKKyAgICAgICAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIgorICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRQcm9qZWN0TmFtZSgpICsgIlwiIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdDX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGZhaWxlZCI7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgbXNnID0gImVycm9yOiBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHByb2plY3QgXCIiICsgZS5nZXRQcm9qZWN0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZmFpbGVkOiAiICsgZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4obXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGFzaGJvYXJkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGFzaGJvYXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkNjE5MQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXREYXNoYm9hcmQuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGU19EQVNIQk9BUkRTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkRhc2hib2FyZHNDb2xsZWN0aW9uLkRhc2hib2FyZEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgR2V0RGFzaGJvYXJkIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PERhc2hib2FyZFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRGFzaGJvYXJkc0NvbGxlY3Rpb24gZGFzaGJvYXJkczsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1pbmhlcml0ZWQiLCB1c2FnZSA9ICJpbmNsdWRlIGluaGVyaXRlZCBkYXNoYm9hcmRzIikKKyAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRlZDsKKworICBASW5qZWN0CisgIEdldERhc2hib2FyZChEYXNoYm9hcmRzQ29sbGVjdGlvbiBkYXNoYm9hcmRzKSB7CisgICAgdGhpcy5kYXNoYm9hcmRzID0gZGFzaGJvYXJkczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGFzaGJvYXJkSW5mbyBhcHBseShEYXNoYm9hcmRSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgaWYgKGluaGVyaXRlZCAmJiAhcmVzb3VyY2UuaXNQcm9qZWN0RGVmYXVsdCgpKSB7CisgICAgICAvLyBpbmhlcml0ZWQgZmxhZyBjYW4gb25seSBiZSB1c2VkIHdpdGggZGVmYXVsdC4KKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCJpbmhlcml0ZWQiKTsKKyAgICB9CisKKyAgICBTdHJpbmcgcHJvamVjdCA9IHJlc291cmNlLmdldENvbnRyb2woKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworICAgIGlmIChyZXNvdXJjZS5pc1Byb2plY3REZWZhdWx0KCkpIHsKKyAgICAgIC8vIFRoZSBkZWZhdWx0IGlzIG5vdCByZXNvbHZlZCB0byBhIGRlZmluaXRpb24geWV0LgorICAgICAgcmVzb3VyY2UgPSBkZWZhdWx0T2YocmVzb3VyY2UuZ2V0Q29udHJvbCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gRGFzaGJvYXJkc0NvbGxlY3Rpb24ucGFyc2UoCisgICAgICAgIHJlc291cmNlLmdldENvbnRyb2woKS5nZXRQcm9qZWN0KCksCisgICAgICAgIHJlc291cmNlLmdldFJlZk5hbWUoKS5zdWJzdHJpbmcoUkVGU19EQVNIQk9BUkRTLmxlbmd0aCgpKSwKKyAgICAgICAgcmVzb3VyY2UuZ2V0UGF0aE5hbWUoKSwKKyAgICAgICAgcmVzb3VyY2UuZ2V0Q29uZmlnKCksCisgICAgICAgIHByb2plY3QsCisgICAgICAgIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBEYXNoYm9hcmRSZXNvdXJjZSBkZWZhdWx0T2YoUHJvamVjdENvbnRyb2wgY3RsKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgaWQgPSBjdGwuZ2V0UHJvamVjdCgpLmdldExvY2FsRGVmYXVsdERhc2hib2FyZCgpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaWQpKSB7CisgICAgICBpZCA9IGN0bC5nZXRQcm9qZWN0KCkuZ2V0RGVmYXVsdERhc2hib2FyZCgpOworICAgIH0KKyAgICBpZiAoImRlZmF1bHQiLmVxdWFscyhpZCkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGlkKSkgeworICAgICAgcmV0dXJuIHBhcnNlKGN0bCwgaWQpOworICAgIH0gZWxzZSBpZiAoIWluaGVyaXRlZCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBwcyA6IGN0bC5nZXRQcm9qZWN0U3RhdGUoKS50cmVlKCkpIHsKKyAgICAgIGlkID0gcHMuZ2V0UHJvamVjdCgpLmdldERlZmF1bHREYXNoYm9hcmQoKTsKKyAgICAgIGlmICgiZGVmYXVsdCIuZXF1YWxzKGlkKSkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGlkKSkgeworICAgICAgICBjdGwgPSBwcy5jb250cm9sRm9yKGN0bC5nZXRDdXJyZW50VXNlcigpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlKGN0bCwgaWQpOworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICB9CisKKyAgcHJpdmF0ZSBEYXNoYm9hcmRSZXNvdXJjZSBwYXJzZShQcm9qZWN0Q29udHJvbCBjdGwsIFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgTGlzdDxTdHJpbmc+IHAgPSBMaXN0cy5uZXdBcnJheUxpc3QoU3BsaXR0ZXIub24oJzonKS5saW1pdCgyKS5zcGxpdChpZCkpOworICAgIFN0cmluZyByZWYgPSBVcmwuZW5jb2RlKHAuZ2V0KDApKTsKKyAgICBTdHJpbmcgcGF0aCA9IFVybC5lbmNvZGUocC5nZXQoMSkpOworICAgIHJldHVybiBkYXNoYm9hcmRzLnBhcnNlKAorICAgICAgICBuZXcgUHJvamVjdFJlc291cmNlKGN0bCksCisgICAgICAgIElkU3RyaW5nLmZyb21VcmwocmVmICsgJzonICsgcGF0aCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGVzY3JpcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXREZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZmFiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGVzY3JpcHRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKKworY2xhc3MgR2V0RGVzY3JpcHRpb24gaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UHJvamVjdFJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIFByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldENvbnRyb2woKS5nZXRQcm9qZWN0KCk7CisgICAgcmV0dXJuIFN0cmluZ3MubnVsbFRvRW1wdHkocHJvamVjdC5nZXREZXNjcmlwdGlvbigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldEhlYWQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRIZWFkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzOWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRIZWFkLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHZXRIZWFkIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFByb2plY3RSZXNvdXJjZT4geworCisgIHByaXZhdGUgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisKKyAgQEluamVjdAorICBHZXRIZWFkKEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyKSB7CisgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgYXBwbHkoUHJvamVjdFJlc291cmNlIHJzcmMpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgcmVwbyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHJlcG8gPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShyc3JjLmdldE5hbWVLZXkoKSk7CisgICAgICBSZWYgaGVhZCA9IHJlcG8uZ2V0UmVmKENvbnN0YW50cy5IRUFEKTsKKyAgICAgIGlmIChoZWFkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oQ29uc3RhbnRzLkhFQUQpOworICAgICAgfSBlbHNlIGlmIChoZWFkLmlzU3ltYm9saWMoKSkgeworICAgICAgICBTdHJpbmcgbiA9IGhlYWQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpOworICAgICAgICBpZiAocnNyYy5nZXRDb250cm9sKCkuY29udHJvbEZvclJlZihuKS5pc1Zpc2libGUoKSkgeworICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCk7CisgICAgICB9IGVsc2UgaWYgKGhlYWQuZ2V0T2JqZWN0SWQoKSAhPSBudWxsKSB7CisgICAgICAgIGlmIChyc3JjLmdldENvbnRyb2woKS5pc093bmVyKCkpIHsKKyAgICAgICAgICByZXR1cm4gaGVhZC5nZXRPYmplY3RJZCgpLm5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oQ29uc3RhbnRzLkhFQUQpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihyc3JjLmdldE5hbWUoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChyZXBvICE9IG51bGwpIHsKKyAgICAgICAgcmVwby5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFBhcmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFBhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZWJkODcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0UGFyZW50LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2NsYXNzIEdldFBhcmVudCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxQcm9qZWN0UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lOworCisgIEBJbmplY3QKKyAgR2V0UGFyZW50KEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWUpIHsKKyAgICB0aGlzLmFsbFByb2plY3RzTmFtZSA9IGFsbFByb2plY3RzTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIFByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldENvbnRyb2woKS5nZXRQcm9qZWN0KCk7CisgICAgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUgPSBwcm9qZWN0LmdldFBhcmVudChhbGxQcm9qZWN0c05hbWUpOworICAgIHJldHVybiBwYXJlbnROYW1lICE9IG51bGwgPyBwYXJlbnROYW1lLmdldCgpIDogIiI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRQcm9qZWN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0UHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ODIyNzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0UHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitjbGFzcyBHZXRQcm9qZWN0IGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFByb2plY3RSZXNvdXJjZT4geworCisgIHByaXZhdGUgZmluYWwgUHJvamVjdEpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldFByb2plY3QoUHJvamVjdEpzb24ganNvbikgeworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcnNyYykgeworICAgIHJldHVybiBqc29uLmZvcm1hdChyc3JjKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFN0YXRpc3RpY3MuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRTdGF0aXN0aWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4Yjg1YQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRTdGF0aXN0aWNzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2FyYmFnZUNvbGxlY3RDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5SVU5fR0MpCitwdWJsaWMgY2xhc3MgR2V0U3RhdGlzdGljcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxQcm9qZWN0UmVzb3VyY2U+IHsKKworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworCisgIEBJbmplY3QKKyAgR2V0U3RhdGlzdGljcyhHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcikgeworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVwb3NpdG9yeVN0YXRpc3RpY3MgYXBwbHkoUHJvamVjdFJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHJzcmMuZ2V0TmFtZUtleSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIEdhcmJhZ2VDb2xsZWN0Q29tbWFuZCBnYyA9IEdpdC53cmFwKHJlcG8pLmdjKCk7CisgICAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeVN0YXRpc3RpY3MoZ2MuZ2V0U3RhdGlzdGljcygpKTsKKyAgICAgIH0gY2F0Y2ggKEdpdEFQSUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gY2F0Y2ggKEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihyc3JjLmdldE5hbWUoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdERhc2hib2FyZHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9MaXN0RGFzaGJvYXJkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNjM2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdERhc2hib2FyZHMuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGU19EQVNIQk9BUkRTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuRGFzaGJvYXJkc0NvbGxlY3Rpb24uRGFzaGJvYXJkSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5CbG9iQmFzZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5UcmVlV2FsazsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBMaXN0RGFzaGJvYXJkcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxQcm9qZWN0UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERhc2hib2FyZHNDb2xsZWN0aW9uLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7CisKKyAgQE9wdGlvbihuYW1lID0gIi0taW5oZXJpdGVkIiwgdXNhZ2UgPSAiaW5jbHVkZSBpbmhlcml0ZWQgZGFzaGJvYXJkcyIpCisgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0ZWQ7CisKKyAgQEluamVjdAorICBMaXN0RGFzaGJvYXJkcyhHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyKSB7CisgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUHJvamVjdENvbnRyb2wgY3RsID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIFN0cmluZyBwcm9qZWN0ID0gY3RsLmdldFByb2plY3QoKS5nZXROYW1lKCk7CisgICAgaWYgKCFpbmhlcml0ZWQpIHsKKyAgICAgIHJldHVybiBzY2FuKHJlc291cmNlLmdldENvbnRyb2woKSwgcHJvamVjdCwgdHJ1ZSk7CisgICAgfQorCisgICAgTGlzdDxMaXN0PERhc2hib2FyZEluZm8+PiBhbGwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBib29sZWFuIHNldERlZmF1bHQgPSB0cnVlOworICAgIGZvciAoUHJvamVjdFN0YXRlIHBzIDogY3RsLmdldFByb2plY3RTdGF0ZSgpLnRyZWUoKSkgeworICAgICAgY3RsID0gcHMuY29udHJvbEZvcihjdGwuZ2V0Q3VycmVudFVzZXIoKSk7CisgICAgICBpZiAoY3RsLmlzVmlzaWJsZSgpKSB7CisgICAgICAgIExpc3Q8RGFzaGJvYXJkSW5mbz4gbGlzdCA9IHNjYW4oY3RsLCBwcm9qZWN0LCBzZXREZWZhdWx0KTsKKyAgICAgICAgZm9yIChEYXNoYm9hcmRJbmZvIGQgOiBsaXN0KSB7CisgICAgICAgICAgaWYgKGQuaXNEZWZhdWx0ICE9IG51bGwgJiYgQm9vbGVhbi5UUlVFLmVxdWFscyhkLmlzRGVmYXVsdCkpIHsKKyAgICAgICAgICAgIHNldERlZmF1bHQgPSBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgIGFsbC5hZGQobGlzdCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFsbDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxEYXNoYm9hcmRJbmZvPiBzY2FuKFByb2plY3RDb250cm9sIGN0bCwgU3RyaW5nIHByb2plY3QsCisgICAgICBib29sZWFuIHNldERlZmF1bHQpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeSBnaXQ7CisgICAgdHJ5IHsKKyAgICAgIGdpdCA9IGdpdE1hbmFnZXIub3BlblJlcG9zaXRvcnkoY3RsLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICB0cnkgeworICAgICAgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGdpdCk7CisgICAgICB0cnkgeworICAgICAgICBMaXN0PERhc2hib2FyZEluZm8+IGFsbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBmb3IgKFJlZiByZWYgOiBnaXQuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJFRlNfREFTSEJPQVJEUykudmFsdWVzKCkpIHsKKyAgICAgICAgICBpZiAoY3RsLmNvbnRyb2xGb3JSZWYocmVmLmdldE5hbWUoKSkuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICBhbGwuYWRkQWxsKHNjYW5EYXNoYm9hcmRzKGN0bC5nZXRQcm9qZWN0KCksIGdpdCwgcncsIHJlZiwKKyAgICAgICAgICAgICAgICBwcm9qZWN0LCBzZXREZWZhdWx0KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGw7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBydy5yZWxlYXNlKCk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTGlzdDxEYXNoYm9hcmRJbmZvPiBzY2FuRGFzaGJvYXJkcyhQcm9qZWN0IGRlZmluaW5nUHJvamVjdCwKKyAgICAgIFJlcG9zaXRvcnkgZ2l0LCBSZXZXYWxrIHJ3LCBSZWYgcmVmLCBTdHJpbmcgcHJvamVjdCwgYm9vbGVhbiBzZXREZWZhdWx0KQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBMaXN0PERhc2hib2FyZEluZm8+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2Fsayhydy5nZXRPYmplY3RSZWFkZXIoKSk7CisgICAgdHJ5IHsKKyAgICAgIHR3LmFkZFRyZWUocncucGFyc2VUcmVlKHJlZi5nZXRPYmplY3RJZCgpKSk7CisgICAgICB0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CisgICAgICB3aGlsZSAodHcubmV4dCgpKSB7CisgICAgICAgIGlmICh0dy5nZXRGaWxlTW9kZSgwKSA9PSBGaWxlTW9kZS5SRUdVTEFSX0ZJTEUpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlzdC5hZGQoRGFzaGJvYXJkc0NvbGxlY3Rpb24ucGFyc2UoCisgICAgICAgICAgICAgICAgZGVmaW5pbmdQcm9qZWN0LAorICAgICAgICAgICAgICAgIHJlZi5nZXROYW1lKCkuc3Vic3RyaW5nKFJFRlNfREFTSEJPQVJEUy5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgdHcuZ2V0UGF0aFN0cmluZygpLAorICAgICAgICAgICAgICAgIG5ldyBCbG9iQmFzZWRDb25maWcobnVsbCwgZ2l0LCB0dy5nZXRPYmplY3RJZCgwKSksCisgICAgICAgICAgICAgICAgcHJvamVjdCwKKyAgICAgICAgICAgICAgICBzZXREZWZhdWx0KSk7CisgICAgICAgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJDYW5ub3QgcGFyc2UgZGFzaGJvYXJkICVzOiVzOiVzOiAlcyIsCisgICAgICAgICAgICAgICAgZGVmaW5pbmdQcm9qZWN0LmdldE5hbWUoKSwgcmVmLmdldE5hbWUoKSwgdHcuZ2V0UGF0aFN0cmluZygpLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHR3LnJlbGVhc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9MaXN0UHJvamVjdHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9MaXN0UHJvamVjdHMuamF2YQppbmRleCBlNWExMWNhLi41OWI1NDRhIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdFByb2plY3RzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0xpc3RQcm9qZWN0cy5qYXZhCkBAIC0xNCwxMyArMTQsMjUgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CaW5hcnlSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0Lk5hbWVLZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlN0cmluZ1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0SnNvbi5Qcm9qZWN0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UcmVlRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CkBAIC0zNCw2ICs0Niw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CkBAIC00Miw2ICs1NSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwpAQCAtNDksNyArNjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiAvKiogTGlzdCBwcm9qZWN0cyB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIuICovCi1wdWJsaWMgY2xhc3MgTGlzdFByb2plY3RzIHsKK3B1YmxpYyBjbGFzcyBMaXN0UHJvamVjdHMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8VG9wTGV2ZWxSZXNvdXJjZT4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGlzdFByb2plY3RzLmNsYXNzKTsKIAogICBwdWJsaWMgc3RhdGljIGVudW0gRmlsdGVyVHlwZSB7CkBAIC04Niw0MSArMTAwLDgyIEBACiAKICAgcHJpdmF0ZSBmaW5hbCBDdXJyZW50VXNlciBjdXJyZW50VXNlcjsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOworICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwogICBwcml2YXRlIGZpbmFsIFByb2plY3ROb2RlLkZhY3RvcnkgcHJvamVjdE5vZGVGYWN0b3J5OwogCi0gIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIG1ldGFWYXIgPSAiRk1UIiwgdXNhZ2UgPSAiT3V0cHV0IGRpc3BsYXkgZm9ybWF0IikKKyAgQERlcHJlY2F0ZWQKKyAgQE9wdGlvbihuYW1lID0gIi0tZm9ybWF0IiwgdXNhZ2UgPSAiKGRlcHJlY2F0ZWQpIG91dHB1dCBmb3JtYXQiKQogICBwcml2YXRlIE91dHB1dEZvcm1hdCBmb3JtYXQgPSBPdXRwdXRGb3JtYXQuVEVYVDsKIAogICBAT3B0aW9uKG5hbWUgPSAiLS1zaG93LWJyYW5jaCIsIGFsaWFzZXMgPSB7Ii1iIn0sIG11bHRpVmFsdWVkID0gdHJ1ZSwKICAgICAgIHVzYWdlID0gImRpc3BsYXlzIHRoZSBzaGEgb2YgZWFjaCBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgYnJhbmNoIikKLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc2hvd0JyYW5jaDsKKyAgcHVibGljIHZvaWQgYWRkU2hvd0JyYW5jaChTdHJpbmcgYnJhbmNoKSB7CisgICAgc2hvd0JyYW5jaC5hZGQoYnJhbmNoKTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLXRyZWUiLCBhbGlhc2VzID0geyItdCJ9LCB1c2FnZSA9CiAgICAgICAiZGlzcGxheXMgcHJvamVjdCBpbmhlcml0YW5jZSBpbiBhIHRyZWUtbGlrZSBmb3JtYXRcbiIKICAgICAgICsgInRoaXMgb3B0aW9uIGRvZXMgbm90IHdvcmsgdG9nZXRoZXIgd2l0aCB0aGUgc2hvdy1icmFuY2ggb3B0aW9uIikKLSAgcHJpdmF0ZSBib29sZWFuIHNob3dUcmVlOworICBwdWJsaWMgdm9pZCBzZXRTaG93VHJlZShib29sZWFuIHNob3dUcmVlKSB7CisgICAgdGhpcy5zaG93VHJlZSA9IHNob3dUcmVlOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tdHlwZSIsIHVzYWdlID0gInR5cGUgb2YgcHJvamVjdCIpCi0gIHByaXZhdGUgRmlsdGVyVHlwZSB0eXBlID0gRmlsdGVyVHlwZS5DT0RFOworICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJUeXBlKEZpbHRlclR5cGUgdHlwZSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1kZXNjcmlwdGlvbiIsIGFsaWFzZXMgPSB7Ii1kIn0sIHVzYWdlID0gImluY2x1ZGUgZGVzY3JpcHRpb24gb2YgcHJvamVjdCBpbiBsaXN0IikKLSAgcHJpdmF0ZSBib29sZWFuIHNob3dEZXNjcmlwdGlvbjsKKyAgcHVibGljIHZvaWQgc2V0U2hvd0Rlc2NyaXB0aW9uKGJvb2xlYW4gc2hvd0Rlc2NyaXB0aW9uKSB7CisgICAgdGhpcy5zaG93RGVzY3JpcHRpb24gPSBzaG93RGVzY3JpcHRpb247CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1hbGwiLCB1c2FnZSA9ICJkaXNwbGF5IGFsbCBwcm9qZWN0cyB0aGF0IGFyZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjYWxsaW5nIHVzZXIiKQotICBwcml2YXRlIGJvb2xlYW4gYWxsOworICBwdWJsaWMgdm9pZCBzZXRBbGwoYm9vbGVhbiBhbGwpIHsKKyAgICB0aGlzLmFsbCA9IGFsbDsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLWxpbWl0IiwgYWxpYXNlcyA9IHsiLW4ifSwgbWV0YVZhciA9ICJDTlQiLCB1c2FnZSA9ICJtYXhpbXVtIG51bWJlciBvZiBwcm9qZWN0cyB0byBsaXN0IikKLSAgcHJpdmF0ZSBpbnQgbGltaXQ7CisgIHB1YmxpYyB2b2lkIHNldExpbWl0KGludCBsaW1pdCkgeworICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgfQogCisgIEBPcHRpb24obmFtZSA9ICItcCIsIG1ldGFWYXIgPSAiUFJFRklYIiwgdXNhZ2UgPSAibWF0Y2ggcHJvamVjdCBwcmVmaXgiKQorICBwdWJsaWMgdm9pZCBzZXRNYXRjaFByZWZpeChTdHJpbmcgbWF0Y2hQcmVmaXgpIHsKKyAgICB0aGlzLm1hdGNoUHJlZml4ID0gbWF0Y2hQcmVmaXg7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLW0iLCBtZXRhVmFyID0gIk1BVENIIiwgdXNhZ2UgPSAibWF0Y2ggcHJvamVjdCBzdWJzdHJpbmciKQorICBwdWJsaWMgdm9pZCBzZXRNYXRjaFN1YnN0cmluZyhTdHJpbmcgbWF0Y2hTdWJzdHJpbmcpIHsKKyAgICB0aGlzLm1hdGNoU3Vic3RyaW5nID0gbWF0Y2hTdWJzdHJpbmc7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLS1oYXMtYWNsLWZvciIsIG1ldGFWYXIgPSAiR1JPVVAiLCB1c2FnZSA9CisgICAgICAiZGlzcGxheXMgb25seSBwcm9qZWN0cyBvbiB3aGljaCBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGdyb3VwIGFyZSBkaXJlY3RseSBhc3NpZ25lZCIpCisgIHB1YmxpYyB2b2lkIHNldEdyb3VwVXVpZChBY2NvdW50R3JvdXAuVVVJRCBncm91cFV1aWQpIHsKKyAgICB0aGlzLmdyb3VwVXVpZCA9IGdyb3VwVXVpZDsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHNob3dCcmFuY2ggPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBib29sZWFuIHNob3dUcmVlOworICBwcml2YXRlIEZpbHRlclR5cGUgdHlwZSA9IEZpbHRlclR5cGUuQ09ERTsKKyAgcHJpdmF0ZSBib29sZWFuIHNob3dEZXNjcmlwdGlvbjsKKyAgcHJpdmF0ZSBib29sZWFuIGFsbDsKKyAgcHJpdmF0ZSBpbnQgbGltaXQ7CiAgIHByaXZhdGUgU3RyaW5nIG1hdGNoUHJlZml4OworICBwcml2YXRlIFN0cmluZyBtYXRjaFN1YnN0cmluZzsKKyAgcHJpdmF0ZSBBY2NvdW50R3JvdXAuVVVJRCBncm91cFV1aWQ7CiAKICAgQEluamVjdAogICBwcm90ZWN0ZWQgTGlzdFByb2plY3RzKEN1cnJlbnRVc2VyIGN1cnJlbnRVc2VyLCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlLAotICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsCi0gICAgICBQcm9qZWN0Tm9kZS5GYWN0b3J5IHByb2plY3ROb2RlRmFjdG9yeSkgeworICAgICAgR3JvdXBDYWNoZSBncm91cENhY2hlLCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5LAorICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIFByb2plY3ROb2RlLkZhY3RvcnkgcHJvamVjdE5vZGVGYWN0b3J5KSB7CiAgICAgdGhpcy5jdXJyZW50VXNlciA9IGN1cnJlbnRVc2VyOwogICAgIHRoaXMucHJvamVjdENhY2hlID0gcHJvamVjdENhY2hlOworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CiAgICAgdGhpcy5wcm9qZWN0Tm9kZUZhY3RvcnkgPSBwcm9qZWN0Tm9kZUZhY3Rvcnk7CiAgIH0KQEAgLTE0MiwyMiArMTk3LDM2IEBACiAgIH0KIAogICBwdWJsaWMgTGlzdFByb2plY3RzIHNldEZvcm1hdChPdXRwdXRGb3JtYXQgZm10KSB7Ci0gICAgdGhpcy5mb3JtYXQgPSBmbXQ7CisgICAgZm9ybWF0ID0gZm10OwogICAgIHJldHVybiB0aGlzOwogICB9CiAKLSAgcHVibGljIExpc3RQcm9qZWN0cyBzZXRNYXRjaFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgdGhpcy5tYXRjaFByZWZpeCA9IHByZWZpeDsKLSAgICByZXR1cm4gdGhpczsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoVG9wTGV2ZWxSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIGlmIChmb3JtYXQgPT0gT3V0cHV0Rm9ybWF0LlRFWFQpIHsKKyAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICBkaXNwbGF5KGJ1Zik7CisgICAgICByZXR1cm4gQmluYXJ5UmVzdWx0LmNyZWF0ZShidWYudG9CeXRlQXJyYXkoKSkKKyAgICAgICAgICAuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKQorICAgICAgICAgIC5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICB9CisgICAgcmV0dXJuIGFwcGx5KCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBkaXNwbGF5KE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQ7Ci0gICAgdHJ5IHsKLSAgICAgIHN0ZG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJVVEYtOCIpKSk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBPdXIgZW5jb2RpbmcgaXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgcnVudGltZS4KLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKVk0gbGFja3MgVVRGLTggZW5jb2RpbmciLCBlKTsKKyAgcHVibGljIE1hcDxTdHJpbmcsIFByb2plY3RJbmZvPiBhcHBseSgpIHsKKyAgICBmb3JtYXQgPSBPdXRwdXRGb3JtYXQuSlNPTjsKKyAgICByZXR1cm4gZGlzcGxheShudWxsKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBQcm9qZWN0SW5mbz4gZGlzcGxheShPdXRwdXRTdHJlYW0gZGlzcGxheU91dHB1dFN0cmVhbSkgeworICAgIFByaW50V3JpdGVyIHN0ZG91dCA9IG51bGw7CisgICAgaWYgKGRpc3BsYXlPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc3Rkb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZGlzcGxheU91dHB1dFN0cmVhbSwgIlVURi04IikpKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIGxhY2tzIFVURi04IGVuY29kaW5nIiwgZSk7CisgICAgICB9CiAgICAgfQogCiAgICAgaW50IGZvdW5kID0gMDsKQEAgLTE3NSwxNiArMjQ0LDMzIEBACiAgICAgICAgICAgLy8KICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFByb2plY3RDb250cm9sIHBjdGwgPSBlLmNvbnRyb2xGb3IoY3VycmVudFVzZXIpOworICAgICAgICBpZiAoZ3JvdXBVdWlkICE9IG51bGwpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoZ3JvdXBVdWlkKS5pc1Zpc2libGUoKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghcGN0bC5nZXRMb2NhbEdyb3VwcygpLmNvbnRhaW5zKAorICAgICAgICAgICAgICBHcm91cFJlZmVyZW5jZS5mb3JHcm91cChncm91cENhY2hlLmdldChncm91cFV1aWQpKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIFByb2plY3RJbmZvIGluZm8gPSBuZXcgUHJvamVjdEluZm8oKTsKICAgICAgICAgaWYgKHR5cGUgPT0gRmlsdGVyVHlwZS5QQVJFTlRfQ0FORElEQVRFUykgewotICAgICAgICAgIFByb2plY3RTdGF0ZSBwYXJlbnRTdGF0ZSA9IGUuZ2V0UGFyZW50U3RhdGUoKTsKKyAgICAgICAgICBQcm9qZWN0U3RhdGUgcGFyZW50U3RhdGUgPSBJdGVyYWJsZXMuZ2V0Rmlyc3QoZS5wYXJlbnRzKCksIG51bGwpOwogICAgICAgICAgIGlmIChwYXJlbnRTdGF0ZSAhPSBudWxsCiAgICAgICAgICAgICAgICYmICFvdXRwdXQua2V5U2V0KCkuY29udGFpbnMocGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkKICAgICAgICAgICAgICAgJiYgIXJlamVjdGVkLmNvbnRhaW5zKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICBQcm9qZWN0Q29udHJvbCBwYXJlbnRDdHJsID0gcGFyZW50U3RhdGUuY29udHJvbEZvcihjdXJyZW50VXNlcik7CiAgICAgICAgICAgICBpZiAocGFyZW50Q3RybC5pc1Zpc2libGUoKSB8fCBwYXJlbnRDdHJsLmlzT3duZXIoKSkgewogICAgICAgICAgICAgICBpbmZvLm5hbWUgPSBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICBpbmZvLmRlc2NyaXB0aW9uID0gcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgIGluZm8uZGVzY3JpcHRpb24gPSBTdHJpbmdzLmVtcHR5VG9OdWxsKAorICAgICAgICAgICAgICAgICAgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgcmVqZWN0ZWQuYWRkKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE5NCw3ICsyODAsNiBAQAogICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZpbmFsIFByb2plY3RDb250cm9sIHBjdGwgPSBlLmNvbnRyb2xGb3IoY3VycmVudFVzZXIpOwogICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlID0gcGN0bC5pc1Zpc2libGUoKSB8fCAoYWxsICYmIHBjdGwuaXNPd25lcigpKTsKICAgICAgICAgICBpZiAoc2hvd1RyZWUgJiYgIWZvcm1hdC5pc0pzb24oKSkgewogICAgICAgICAgICAgdHJlZU1hcC5wdXQocHJvamVjdE5hbWUsCkBAIC0yMTAsNyArMjk1LDcgQEAKIAogICAgICAgICAgIGluZm8ubmFtZSA9IHByb2plY3ROYW1lLmdldCgpOwogICAgICAgICAgIGlmIChzaG93VHJlZSAmJiBmb3JtYXQuaXNKc29uKCkpIHsKLSAgICAgICAgICAgIFByb2plY3RTdGF0ZSBwYXJlbnQgPSBlLmdldFBhcmVudFN0YXRlKCk7CisgICAgICAgICAgICBQcm9qZWN0U3RhdGUgcGFyZW50ID0gSXRlcmFibGVzLmdldEZpcnN0KGUucGFyZW50cygpLCBudWxsKTsKICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICBQcm9qZWN0Q29udHJvbCBwYXJlbnRDdHJsID0gcGFyZW50LmNvbnRyb2xGb3IoY3VycmVudFVzZXIpOwogICAgICAgICAgICAgICBpZiAocGFyZW50Q3RybC5pc1Zpc2libGUoKSB8fCBwYXJlbnRDdHJsLmlzT3duZXIoKSkgewpAQCAtMjI0LDEyICszMDksMTIgQEAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc2hvd0Rlc2NyaXB0aW9uICYmICFlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IGUuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgaWYgKHNob3dEZXNjcmlwdGlvbikgeworICAgICAgICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IFN0cmluZ3MuZW1wdHlUb051bGwoZS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKSk7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzaG93QnJhbmNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghc2hvd0JyYW5jaC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgUmVwb3NpdG9yeSBnaXQgPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShwcm9qZWN0TmFtZSk7CiAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaWYgKCF0eXBlLm1hdGNoZXMoZ2l0KSkgewpAQCAtMjc3LDEyICszNjIsMTIgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKKyAgICAgICAgaWYgKHN0ZG91dCA9PSBudWxsIHx8IGZvcm1hdC5pc0pzb24oKSkgewogICAgICAgICAgIG91dHB1dC5wdXQoaW5mby5uYW1lLCBpbmZvKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzaG93QnJhbmNoICE9IG51bGwpIHsKKyAgICAgICAgaWYgKCFzaG93QnJhbmNoLmlzRW1wdHkoKSkgewogICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBzaG93QnJhbmNoKSB7CiAgICAgICAgICAgICBTdHJpbmcgcmVmID0gaW5mby5icmFuY2hlcyAhPSBudWxsID8gaW5mby5icmFuY2hlcy5nZXQobmFtZSkgOiBudWxsOwogICAgICAgICAgICAgaWYgKHJlZiA9PSBudWxsKSB7CkBAIC0zMDIsMjEgKzM4NywzOCBAQAogICAgICAgICBzdGRvdXQucHJpbnQoJ1xuJyk7CiAgICAgICB9CiAKLSAgICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKKyAgICAgIGZvciAoUHJvamVjdEluZm8gaW5mbyA6IG91dHB1dC52YWx1ZXMoKSkgeworICAgICAgICBpbmZvLmZpbmlzaCgpOworICAgICAgICBpbmZvLm5hbWUgPSBudWxsOworICAgICAgfQorICAgICAgaWYgKHN0ZG91dCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICB9IGVsc2UgaWYgKGZvcm1hdC5pc0pzb24oKSkgewogICAgICAgICBmb3JtYXQubmV3R3NvbigpLnRvSnNvbigKICAgICAgICAgICAgIG91dHB1dCwgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBQcm9qZWN0SW5mbz4+KCkge30uZ2V0VHlwZSgpLCBzdGRvdXQpOwogICAgICAgICBzdGRvdXQucHJpbnQoJ1xuJyk7CiAgICAgICB9IGVsc2UgaWYgKHNob3dUcmVlICYmIHRyZWVNYXAuc2l6ZSgpID4gMCkgewogICAgICAgICBwcmludFByb2plY3RUcmVlKHN0ZG91dCwgdHJlZU1hcCk7CiAgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKICAgICB9IGZpbmFsbHkgewotICAgICAgc3Rkb3V0LmZsdXNoKCk7CisgICAgICBpZiAoc3Rkb3V0ICE9IG51bGwpIHsKKyAgICAgICAgc3Rkb3V0LmZsdXNoKCk7CisgICAgICB9CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBJdGVyYWJsZTxOYW1lS2V5PiBzY2FuKCkgeworICBwcml2YXRlIEl0ZXJhYmxlPFByb2plY3QuTmFtZUtleT4gc2NhbigpIHsKICAgICBpZiAobWF0Y2hQcmVmaXggIT0gbnVsbCkgewogICAgICAgcmV0dXJuIHByb2plY3RDYWNoZS5ieU5hbWUobWF0Y2hQcmVmaXgpOworICAgIH0gZWxzZSBpZiAobWF0Y2hTdWJzdHJpbmcgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5maWx0ZXIocHJvamVjdENhY2hlLmFsbCgpLAorICAgICAgICAgIG5ldyBQcmVkaWNhdGU8UHJvamVjdC5OYW1lS2V5PigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFwcGx5KFByb2plY3QuTmFtZUtleSBpbikgeworICAgICAgICAgICAgICByZXR1cm4gaW4uZ2V0KCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKQorICAgICAgICAgICAgICAgICAgLmNvbnRhaW5zKG1hdGNoU3Vic3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOwogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gcHJvamVjdENhY2hlLmFsbCgpOwogICAgIH0KQEAgLTM3OSwxMSArNDgxLDQgQEAKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdEluZm8gewotICAgIHRyYW5zaWVudCBTdHJpbmcgbmFtZTsKLSAgICBTdHJpbmcgcGFyZW50OwotICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJyYW5jaGVzOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlMzE2MgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuRGFzaGJvYXJkUmVzb3VyY2UuREFTSEJPQVJEX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RSZXNvdXJjZS5QUk9KRUNUX0tJTkQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0QXBpTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNyZWF0ZVByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuRmFjdG9yeU1vZHVsZUJ1aWxkZXI7CisKK3B1YmxpYyBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBSZXN0QXBpTW9kdWxlIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kKFByb2plY3RzQ29sbGVjdGlvbi5jbGFzcyk7CisgICAgYmluZChEYXNoYm9hcmRzQ29sbGVjdGlvbi5jbGFzcyk7CisKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBQUk9KRUNUX0tJTkQpOworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIERBU0hCT0FSRF9LSU5EKTsKKworICAgIHB1dChQUk9KRUNUX0tJTkQpLnRvKFB1dFByb2plY3QuY2xhc3MpOworICAgIGdldChQUk9KRUNUX0tJTkQpLnRvKEdldFByb2plY3QuY2xhc3MpOworICAgIGdldChQUk9KRUNUX0tJTkQsICJkZXNjcmlwdGlvbiIpLnRvKEdldERlc2NyaXB0aW9uLmNsYXNzKTsKKyAgICBwdXQoUFJPSkVDVF9LSU5ELCAiZGVzY3JpcHRpb24iKS50byhQdXREZXNjcmlwdGlvbi5jbGFzcyk7CisgICAgZGVsZXRlKFBST0pFQ1RfS0lORCwgImRlc2NyaXB0aW9uIikudG8oUHV0RGVzY3JpcHRpb24uY2xhc3MpOworCisgICAgZ2V0KFBST0pFQ1RfS0lORCwgInBhcmVudCIpLnRvKEdldFBhcmVudC5jbGFzcyk7CisgICAgcHV0KFBST0pFQ1RfS0lORCwgInBhcmVudCIpLnRvKFNldFBhcmVudC5jbGFzcyk7CisKKyAgICBnZXQoUFJPSkVDVF9LSU5ELCAiSEVBRCIpLnRvKEdldEhlYWQuY2xhc3MpOworICAgIHB1dChQUk9KRUNUX0tJTkQsICJIRUFEIikudG8oU2V0SGVhZC5jbGFzcyk7CisKKyAgICBnZXQoUFJPSkVDVF9LSU5ELCAic3RhdGlzdGljcy5naXQiKS50byhHZXRTdGF0aXN0aWNzLmNsYXNzKTsKKyAgICBwb3N0KFBST0pFQ1RfS0lORCwgImdjIikudG8oR2FyYmFnZUNvbGxlY3QuY2xhc3MpOworCisgICAgY2hpbGQoUFJPSkVDVF9LSU5ELCAiZGFzaGJvYXJkcyIpLnRvKERhc2hib2FyZHNDb2xsZWN0aW9uLmNsYXNzKTsKKyAgICBnZXQoREFTSEJPQVJEX0tJTkQpLnRvKEdldERhc2hib2FyZC5jbGFzcyk7CisgICAgcHV0KERBU0hCT0FSRF9LSU5EKS50byhTZXREYXNoYm9hcmQuY2xhc3MpOworICAgIGRlbGV0ZShEQVNIQk9BUkRfS0lORCkudG8oRGVsZXRlRGFzaGJvYXJkLmNsYXNzKTsKKyAgICBpbnN0YWxsKG5ldyBGYWN0b3J5TW9kdWxlQnVpbGRlcigpLmJ1aWxkKENyZWF0ZVByb2plY3QuRmFjdG9yeS5jbGFzcykpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTm9TdWNoUHJvamVjdEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L05vU3VjaFByb2plY3RFeGNlcHRpb24uamF2YQppbmRleCAyYWM0OTRkLi5hYTZmYjE2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTm9TdWNoUHJvamVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uLmphdmEKQEAgLTIwLDExICsyMCwxMyBAQAogcHVibGljIGNsYXNzIE5vU3VjaFByb2plY3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJQcm9qZWN0IG5vdCBmb3VuZDogIjsKKwogICBwdWJsaWMgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbihmaW5hbCBQcm9qZWN0Lk5hbWVLZXkga2V5KSB7CiAgICAgdGhpcyhrZXksIG51bGwpOwogICB9CiAKICAgcHVibGljIE5vU3VjaFByb2plY3RFeGNlcHRpb24oZmluYWwgUHJvamVjdC5OYW1lS2V5IGtleSwgZmluYWwgVGhyb3dhYmxlIHdoeSkgewotICAgIHN1cGVyKGtleS50b1N0cmluZygpLCB3aHkpOworICAgIHN1cGVyKE1FU1NBR0UgKyBrZXkudG9TdHJpbmcoKSwgd2h5KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1BlcmZvcm1DcmVhdGVQcm9qZWN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUGVyZm9ybUNyZWF0ZVByb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjg3MjVmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1BlcmZvcm1DcmVhdGVQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlByb2plY3RVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLk5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUHJvamVjdE93bmVyR3JvdXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGUuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworCisvKiogQ29tbW9uIGNsYXNzIHRoYXQgaG9sZHMgdGhlIGNvZGUgdG8gY3JlYXRlIHByb2plY3RzICovCitwdWJsaWMgY2xhc3MgUGVyZm9ybUNyZWF0ZVByb2plY3QgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihQZXJmb3JtQ3JlYXRlUHJvamVjdC5jbGFzcyk7CisKKyAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBQZXJmb3JtQ3JlYXRlUHJvamVjdCBjcmVhdGUoQ3JlYXRlUHJvamVjdEFyZ3MgY3JlYXRlUHJvamVjdEFyZ3MpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHByb2plY3RPd25lckdyb3VwczsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlZmVyZW5jZVVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY1NldDxOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyPiBjcmVhdGVkTGlzdGVuZXI7CisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgc2VydmVySWRlbnQ7CisgIHByaXZhdGUgZmluYWwgQ3JlYXRlUHJvamVjdEFyZ3MgY3JlYXRlUHJvamVjdEFyZ3M7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kOworICBwcml2YXRlIGZpbmFsIE1ldGFEYXRhVXBkYXRlLlVzZXIgbWV0YURhdGFVcGRhdGVGYWN0b3J5OworCisgIEBJbmplY3QKKyAgUGVyZm9ybUNyZWF0ZVByb2plY3QoQFByb2plY3RPd25lckdyb3VwcyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHBPd25lckdyb3VwcywKKyAgICAgIElkZW50aWZpZWRVc2VyIGlkZW50aWZpZWRVc2VyLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRSZXBvTWFuYWdlciwKKyAgICAgIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVmZXJlbmNlVXBkYXRlZCwKKyAgICAgIER5bmFtaWNTZXQ8TmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lcj4gY3JlYXRlZExpc3RlbmVyLAorICAgICAgQEdlcnJpdFBlcnNvbklkZW50IFBlcnNvbklkZW50IHBlcnNvbklkZW50LCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAorICAgICAgTWV0YURhdGFVcGRhdGUuVXNlciBtZXRhRGF0YVVwZGF0ZUZhY3RvcnksCisgICAgICBAQXNzaXN0ZWQgQ3JlYXRlUHJvamVjdEFyZ3MgY3JlYXRlUEFyZ3MsIFByb2plY3RDYWNoZSBwQ2FjaGUpIHsKKyAgICB0aGlzLnByb2plY3RPd25lckdyb3VwcyA9IHBPd25lckdyb3VwczsKKyAgICB0aGlzLmN1cnJlbnRVc2VyID0gaWRlbnRpZmllZFVzZXI7CisgICAgdGhpcy5yZXBvTWFuYWdlciA9IGdpdFJlcG9NYW5hZ2VyOworICAgIHRoaXMucmVmZXJlbmNlVXBkYXRlZCA9IHJlZmVyZW5jZVVwZGF0ZWQ7CisgICAgdGhpcy5jcmVhdGVkTGlzdGVuZXIgPSBjcmVhdGVkTGlzdGVuZXI7CisgICAgdGhpcy5zZXJ2ZXJJZGVudCA9IHBlcnNvbklkZW50OworICAgIHRoaXMuY3JlYXRlUHJvamVjdEFyZ3MgPSBjcmVhdGVQQXJnczsKKyAgICB0aGlzLnByb2plY3RDYWNoZSA9IHBDYWNoZTsKKyAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKKyAgICB0aGlzLm1ldGFEYXRhVXBkYXRlRmFjdG9yeSA9IG1ldGFEYXRhVXBkYXRlRmFjdG9yeTsKKyAgfQorCisgIHB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB0aHJvd3MgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKKyAgICB2YWxpZGF0ZVBhcmFtZXRlcnMoKTsKKyAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgbmFtZUtleSA9IGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgU3RyaW5nIGhlYWQgPQorICAgICAgICAgIGNyZWF0ZVByb2plY3RBcmdzLnBlcm1pc3Npb25zT25seSA/IEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcKKyAgICAgICAgICAgICAgOiBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2guZ2V0KDApOworICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0gcmVwb01hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShuYW1lS2V5KTsKKyAgICAgIHRyeSB7CisgICAgICAgIE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXIuRXZlbnQgZXZlbnQgPSBuZXcgTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lci5FdmVudCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWVLZXkuZ2V0KCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyIGwgOiBjcmVhdGVkTGlzdGVuZXIpIHsKKyAgICAgICAgICBsLm9uTmV3UHJvamVjdENyZWF0ZWQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVmVXBkYXRlIHUgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuSEVBRCk7CisgICAgICAgIHUuZGlzYWJsZVJlZkxvZygpOworICAgICAgICB1LmxpbmsoaGVhZCk7CisKKyAgICAgICAgY3JlYXRlUHJvamVjdENvbmZpZygpOworCisgICAgICAgIGlmICghY3JlYXRlUHJvamVjdEFyZ3MucGVybWlzc2lvbnNPbmx5CisgICAgICAgICAgICAmJiBjcmVhdGVQcm9qZWN0QXJncy5jcmVhdGVFbXB0eUNvbW1pdCkgeworICAgICAgICAgIGNyZWF0ZUVtcHR5Q29tbWl0cyhyZXBvLCBuYW1lS2V5LCBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2gpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb2plY3RDYWNoZS5nZXQobmFtZUtleSkuZ2V0UHJvamVjdCgpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgcmVwby5jbG9zZSgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlDYXNlTWlzbWF0Y2hFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSAiICsgbmFtZUtleS5nZXQoKQorICAgICAgICAgICsgIiBiZWNhdXNlIHRoZSBuYW1lIGlzIGFscmVhZHkgb2NjdXBpZWQgYnkgYW5vdGhlciBwcm9qZWN0LiIKKyAgICAgICAgICArICIgVGhlIG90aGVyIHByb2plY3QgaGFzIHRoZSBzYW1lIG5hbWUsIG9ubHkgc3BlbGxlZCBpbiBhIgorICAgICAgICAgICsgIiBkaWZmZXJlbnQgY2FzZS4iLCBlKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gYmFkTmFtZSkgeworICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSAiICsgbmFtZUtleSwgYmFkTmFtZSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGVycikgeworICAgICAgdHJ5IHsKKyAgICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkobmFtZUtleSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKHJlcG8uZ2V0T2JqZWN0RGF0YWJhc2UoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbigicHJvamVjdCBcIiIgKyBuYW1lS2V5ICsgIlwiIGV4aXN0cyIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBlcnI7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgcmVwby5jbG9zZSgpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb0VycikgeworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXk7CisgICAgICAgIGxvZy5lcnJvcihtc2csIGVycik7CisgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24obXNnLCBpb0Vycik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiQ2Fubm90IGNyZWF0ZSAiICsgbmFtZUtleTsKKyAgICAgIGxvZy5lcnJvcihtc2csIGUpOworICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbihtc2csIGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjcmVhdGVQcm9qZWN0Q29uZmlnKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNZXRhRGF0YVVwZGF0ZSBtZCA9CisgICAgICAgIG1ldGFEYXRhVXBkYXRlRmFjdG9yeS5jcmVhdGUoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpKTsKKyAgICB0cnkgeworICAgICAgZmluYWwgUHJvamVjdENvbmZpZyBjb25maWcgPSBQcm9qZWN0Q29uZmlnLnJlYWQobWQpOworICAgICAgY29uZmlnLmxvYWQobWQpOworCisgICAgICBQcm9qZWN0IG5ld1Byb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOworICAgICAgbmV3UHJvamVjdC5zZXREZXNjcmlwdGlvbihjcmVhdGVQcm9qZWN0QXJncy5wcm9qZWN0RGVzY3JpcHRpb24pOworICAgICAgbmV3UHJvamVjdC5zZXRTdWJtaXRUeXBlKGNyZWF0ZVByb2plY3RBcmdzLnN1Ym1pdFR5cGUpOworICAgICAgbmV3UHJvamVjdAorICAgICAgICAgIC5zZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoY3JlYXRlUHJvamVjdEFyZ3MuY29udHJpYnV0b3JBZ3JlZW1lbnRzKTsKKyAgICAgIG5ld1Byb2plY3Quc2V0VXNlU2lnbmVkT2ZmQnkoY3JlYXRlUHJvamVjdEFyZ3Muc2lnbmVkT2ZmQnkpOworICAgICAgbmV3UHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoY3JlYXRlUHJvamVjdEFyZ3MuY29udGVudE1lcmdlKTsKKyAgICAgIG5ld1Byb2plY3Quc2V0UmVxdWlyZUNoYW5nZUlEKGNyZWF0ZVByb2plY3RBcmdzLmNoYW5nZUlkUmVxdWlyZWQpOworICAgICAgaWYgKGNyZWF0ZVByb2plY3RBcmdzLm5ld1BhcmVudCAhPSBudWxsKSB7CisgICAgICAgIG5ld1Byb2plY3Quc2V0UGFyZW50TmFtZShjcmVhdGVQcm9qZWN0QXJncy5uZXdQYXJlbnQuZ2V0UHJvamVjdCgpCisgICAgICAgICAgICAuZ2V0TmFtZUtleSgpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgZmluYWwgQWNjZXNzU2VjdGlvbiBhbGwgPQorICAgICAgICAgICAgY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oQWNjZXNzU2VjdGlvbi5BTEwsIHRydWUpOworICAgICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIG93bmVySWQgOiBjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcykgeworICAgICAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZyA9IGdyb3VwQmFja2VuZC5nZXQob3duZXJJZCk7CisgICAgICAgICAgaWYgKGcgIT0gbnVsbCkgeworICAgICAgICAgICAgR3JvdXBSZWZlcmVuY2UgZ3JvdXAgPSBjb25maWcucmVzb2x2ZShHcm91cFJlZmVyZW5jZS5mb3JHcm91cChnKSk7CisgICAgICAgICAgICBhbGwuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLk9XTkVSLCB0cnVlKS5hZGQoCisgICAgICAgICAgICAgICAgbmV3IFBlcm1pc3Npb25SdWxlKGdyb3VwKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1kLnNldE1lc3NhZ2UoIkNyZWF0ZWQgcHJvamVjdFxuIik7CisgICAgICBjb25maWcuY29tbWl0KG1kKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgbWQuY2xvc2UoKTsKKyAgICB9CisgICAgcHJvamVjdENhY2hlLm9uQ3JlYXRlUHJvamVjdChjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0KCkpOworICAgIHJlcG9NYW5hZ2VyLnNldFByb2plY3REZXNjcmlwdGlvbihjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0KCksCisgICAgICAgIGNyZWF0ZVByb2plY3RBcmdzLnByb2plY3REZXNjcmlwdGlvbik7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQYXJhbWV0ZXJzKCkgdGhyb3dzIFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgaWYgKGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3ROYW1lKCkgPT0gbnVsbAorICAgICAgICB8fCBjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbigiUHJvamVjdCBuYW1lIGlzIHJlcXVpcmVkIik7CisgICAgfQorCisgICAgU3RyaW5nIG5hbWVXaXRob3V0U3VmZml4ID0gUHJvamVjdFV0aWwuc3RyaXBHaXRTdWZmaXgoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKSk7CisgICAgY3JlYXRlUHJvamVjdEFyZ3Muc2V0UHJvamVjdE5hbWUobmFtZVdpdGhvdXRTdWZmaXgpOworCisgICAgaWYgKCFjdXJyZW50VXNlci5nZXRDYXBhYmlsaXRpZXMoKS5jYW5DcmVhdGVQcm9qZWN0KCkpIHsKKyAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiJXMgZG9lcyBub3QgaGF2ZSBcIkNyZWF0ZSBQcm9qZWN0XCIgY2FwYWJpbGl0eS4iLAorICAgICAgICAgIGN1cnJlbnRVc2VyLmdldFVzZXJOYW1lKCkpKTsKKyAgICB9CisKKyAgICBpZiAoY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMgPT0gbnVsbAorICAgICAgICB8fCBjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcy5pc0VtcHR5KCkpIHsKKyAgICAgIGNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzID0KKyAgICAgICAgICBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cC5VVUlEPihwcm9qZWN0T3duZXJHcm91cHMpOworICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiB0cmFuc2Zvcm1lZEJyYW5jaGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgaWYgKGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCA9PSBudWxsIHx8CisgICAgICAgIGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaC5pc0VtcHR5KCkpIHsKKyAgICAgIGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQ29uc3RhbnRzLk1BU1RFUik7CisgICAgfQorICAgIGZvciAoU3RyaW5nIGJyYW5jaCA6IGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCkgeworICAgICAgd2hpbGUgKGJyYW5jaC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgYnJhbmNoID0gYnJhbmNoLnN1YnN0cmluZygxKTsKKyAgICAgIH0KKyAgICAgIGlmICghYnJhbmNoLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKSB7CisgICAgICAgIGJyYW5jaCA9IENvbnN0YW50cy5SX0hFQURTICsgYnJhbmNoOworICAgICAgfQorICAgICAgaWYgKCFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKGJyYW5jaCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkJyYW5jaCBcIiVzXCIgaXMgbm90IGEgdmFsaWQgbmFtZS4iLCBicmFuY2gpKTsKKyAgICAgIH0KKyAgICAgIGlmICghdHJhbnNmb3JtZWRCcmFuY2hlcy5jb250YWlucyhicmFuY2gpKSB7CisgICAgICAgIHRyYW5zZm9ybWVkQnJhbmNoZXMuYWRkKGJyYW5jaCk7CisgICAgICB9CisgICAgfQorICAgIGNyZWF0ZVByb2plY3RBcmdzLmJyYW5jaCA9IHRyYW5zZm9ybWVkQnJhbmNoZXM7CisgIH0KKworICBwcml2YXRlIHZvaWQgY3JlYXRlRW1wdHlDb21taXRzKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywKKyAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBmaW5hbCBMaXN0PFN0cmluZz4gcmVmcykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgT2JqZWN0SW5zZXJ0ZXIgb2kgPSByZXBvLm5ld09iamVjdEluc2VydGVyKCk7CisgICAgdHJ5IHsKKyAgICAgIENvbW1pdEJ1aWxkZXIgY2IgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworICAgICAgY2Iuc2V0VHJlZUlkKG9pLmluc2VydChDb25zdGFudHMuT0JKX1RSRUUsIG5ldyBieXRlW10ge30pKTsKKyAgICAgIGNiLnNldEF1dGhvcihtZXRhRGF0YVVwZGF0ZUZhY3RvcnkuZ2V0VXNlclBlcnNvbklkZW50KCkpOworICAgICAgY2Iuc2V0Q29tbWl0dGVyKHNlcnZlcklkZW50KTsKKyAgICAgIGNiLnNldE1lc3NhZ2UoIkluaXRpYWwgZW1wdHkgcmVwb3NpdG9yeVxuIik7CisKKyAgICAgIE9iamVjdElkIGlkID0gb2kuaW5zZXJ0KGNiKTsKKyAgICAgIG9pLmZsdXNoKCk7CisKKyAgICAgIGZvciAoU3RyaW5nIHJlZiA6IHJlZnMpIHsKKyAgICAgICAgUmVmVXBkYXRlIHJ1ID0gcmVwby51cGRhdGVSZWYocmVmKTsKKyAgICAgICAgcnUuc2V0TmV3T2JqZWN0SWQoaWQpOworICAgICAgICBmaW5hbCBSZXN1bHQgcmVzdWx0ID0gcnUudXBkYXRlKCk7CisgICAgICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgICByZWZlcmVuY2VVcGRhdGVkLmZpcmUocHJvamVjdCwgcnUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlZiBcIiVzXCI6ICVzIiwgcmVmLCByZXN1bHQubmFtZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKAorICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGVtcHR5IGNvbW1pdCBmb3IgIgorICAgICAgICAgICAgICArIGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3ROYW1lKCksIGUpOworICAgICAgdGhyb3cgZTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgb2kucmVsZWFzZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YQppbmRleCBlNDE2ZWQ3Li40ODNlY2FmIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUGVybWlzc2lvbkNvbGxlY3Rpb24uamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUmVmQ29udHJvbC5pc1JFOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtNzMsNyArNzYsNyBAQAogICAgICAgfQogCiAgICAgICBib29sZWFuIHBlclVzZXIgPSBmYWxzZTsKLSAgICAgIExpc3Q8QWNjZXNzU2VjdGlvbj4gc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFjY2Vzc1NlY3Rpb24+KCk7CisgICAgICBNYXA8QWNjZXNzU2VjdGlvbiwgUHJvamVjdC5OYW1lS2V5PiBzZWN0aW9uVG9Qcm9qZWN0ID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7CiAgICAgICBmb3IgKFNlY3Rpb25NYXRjaGVyIG1hdGNoZXIgOiBtYXRjaGVyTGlzdCkgewogICAgICAgICAvLyBJZiB0aGUgbWF0Y2hlciBoYXMgdG8gZXhwYW5kIHBhcmFtZXRlcnMgYW5kIGl0cyBwcmVmaXggbWF0Y2hlcyB0aGUKICAgICAgICAgLy8gcmVmZXJlbmNlIHRoZXJlIGlzIGEgdmVyeSBnb29kIGNoYW5jZSB0aGUgcmVmZXJlbmNlIGlzIGFjdHVhbGx5IHVzZXIKQEAgLTkzLDkgKzk2LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobWF0Y2hlci5tYXRjaChyZWYsIHVzZXJuYW1lKSkgewotICAgICAgICAgIHNlY3Rpb25zLmFkZChtYXRjaGVyLnNlY3Rpb24pOworICAgICAgICAgIHNlY3Rpb25Ub1Byb2plY3QucHV0KG1hdGNoZXIuc2VjdGlvbiwgbWF0Y2hlci5wcm9qZWN0KTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgTGlzdDxBY2Nlc3NTZWN0aW9uPiBzZWN0aW9ucyA9IExpc3RzLm5ld0FycmF5TGlzdChzZWN0aW9uVG9Qcm9qZWN0LmtleVNldCgpKTsKICAgICAgIHNvcnRlci5zb3J0KHJlZiwgc2VjdGlvbnMpOwogCiAgICAgICBTZXQ8U2VlblJ1bGU+IHNlZW4gPSBuZXcgSGFzaFNldDxTZWVuUnVsZT4oKTsKQEAgLTEwNCw3ICsxMDgsOSBAQAogCiAgICAgICBIYXNoTWFwPFN0cmluZywgTGlzdDxQZXJtaXNzaW9uUnVsZT4+IHBlcm1pc3Npb25zID0KICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UGVybWlzc2lvblJ1bGU+PigpOworICAgICAgTWFwPFBlcm1pc3Npb25SdWxlLCBQcm9qZWN0UmVmPiBydWxlUHJvcHMgPSBNYXBzLm5ld0lkZW50aXR5SGFzaE1hcCgpOwogICAgICAgZm9yIChBY2Nlc3NTZWN0aW9uIHNlY3Rpb24gOiBzZWN0aW9ucykgeworICAgICAgICBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCA9IHNlY3Rpb25Ub1Byb2plY3QuZ2V0KHNlY3Rpb24pOwogICAgICAgICBmb3IgKFBlcm1pc3Npb24gcGVybWlzc2lvbiA6IHNlY3Rpb24uZ2V0UGVybWlzc2lvbnMoKSkgewogICAgICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlUGVybWlzc2lvbkV4aXN0cyA9CiAgICAgICAgICAgICAgIGV4Y2x1c2l2ZUdyb3VwUGVybWlzc2lvbnMuY29udGFpbnMocGVybWlzc2lvbi5nZXROYW1lKCkpOwpAQCAtMTI0LDYgKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMucHV0KHBlcm1pc3Npb24uZ2V0TmFtZSgpLCByKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICByLmFkZChydWxlKTsKKyAgICAgICAgICAgICAgcnVsZVByb3BzLnB1dChydWxlLCBuZXcgUHJvamVjdFJlZihwcm9qZWN0LCBzZWN0aW9uLmdldE5hbWUoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIApAQCAtMTMzLDE2ICsxNDAsMjAgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uKHBlcm1pc3Npb25zLCBwZXJVc2VyID8gdXNlcm5hbWUgOiBudWxsKTsKKyAgICAgIHJldHVybiBuZXcgUGVybWlzc2lvbkNvbGxlY3Rpb24ocGVybWlzc2lvbnMsIHJ1bGVQcm9wcywKKyAgICAgICAgICBwZXJVc2VyID8gdXNlcm5hbWUgOiBudWxsKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8UGVybWlzc2lvblJ1bGU+PiBydWxlczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8UGVybWlzc2lvblJ1bGUsIFByb2plY3RSZWY+IHJ1bGVQcm9wczsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlcm5hbWU7CiAKICAgcHJpdmF0ZSBQZXJtaXNzaW9uQ29sbGVjdGlvbihNYXA8U3RyaW5nLCBMaXN0PFBlcm1pc3Npb25SdWxlPj4gcnVsZXMsCisgICAgICBNYXA8UGVybWlzc2lvblJ1bGUsIFByb2plY3RSZWY+IHJ1bGVQcm9wcywKICAgICAgIFN0cmluZyB1c2VybmFtZSkgewogICAgIHRoaXMucnVsZXMgPSBydWxlczsKKyAgICB0aGlzLnJ1bGVQcm9wcyA9IHJ1bGVQcm9wczsKICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CiAgIH0KIApAQCAtMTY3LDYgKzE3OCwxMCBAQAogICAgIHJldHVybiByICE9IG51bGwgPyByIDogQ29sbGVjdGlvbnMuPFBlcm1pc3Npb25SdWxlPiBlbXB0eUxpc3QoKTsKICAgfQogCisgIFByb2plY3RSZWYgZ2V0UnVsZVByb3BzKFBlcm1pc3Npb25SdWxlIHJ1bGUpIHsKKyAgICByZXR1cm4gcnVsZVByb3BzLmdldChydWxlKTsKKyAgfQorCiAgIC8qKgogICAgKiBPYnRhaW4gYWxsIGRlY2xhcmVkIHBlcm1pc3Npb24gcnVsZXMgdGhhdCBtYXRjaCB0aGUgcmVmZXJlbmNlLgogICAgKgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZS5qYXZhCmluZGV4IDdhMTExMzExLi42OTdiODM4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENhY2hlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZS5qYXZhCkBAIC0xNCw4ICsxNCwxMSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIAoraW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIC8qKiBDYWNoZSBvZiBwcm9qZWN0IGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYWNjZXNzIHJpZ2h0cy4gKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdENhY2hlIHsKICAgLyoqIEByZXR1cm4gdGhlIHBhcmVudCBzdGF0ZSBmb3IgYWxsIHByb2plY3RzIG9uIHRoaXMgc2VydmVyLiAqLwpAQCAtNDIsNiArNDUsMTMgQEAKICAgcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFByb2plY3QuTmFtZUtleT4gYWxsKCk7CiAKICAgLyoqCisgICAqIEByZXR1cm4gZXN0aW1hdGVkIHNldCBvZiByZWxldmFudCBncm91cHMgZXh0cmFjdGVkIGZyb20gaG90IHByb2plY3QgYWNjZXNzCisgICAqICAgICAgICAgcnVsZXMuIElmIHRoZSBjYWNoZSBpcyBjb2xkIG9yIHRvbyBzbWFsbCBmb3IgdGhlIGVudGlyZSBwcm9qZWN0IHNldAorICAgKiAgICAgICAgIG9mIHRoZSBzZXJ2ZXIsIHRoaXMgc2V0IG1heSBiZSBpbmNvbXBsZXRlLgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3Vlc3NSZWxldmFudEdyb3VwVVVJRHMoKTsKKworICAvKioKICAgICogRmlsdGVyIHRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBwcm9qZWN0IG5hbWVzIGJ5IGNvbW1vbiBwcmVmaXguCiAgICAqCiAgICAqIEBwYXJhbSBwcmVmaXggY29tbW9uIHByZWZpeC4KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVDbG9jay5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUNsb2NrLmphdmEKaW5kZXggZjg2NTYyYy4uYzk2ZWJkZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUNsb2NrLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUNsb2NrLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMjMsOSArMjQsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKiogVGlja3MgcGVyaW9kaWNhbGx5IHRvIGZvcmNlIHJlZnJlc2ggZXZlbnRzIGZvciB7QGxpbmsgUHJvamVjdENhY2hlSW1wbH0uICovCiBAU2luZ2xldG9uCkBAIC0zNCwyOSArMzMsMjQgQEAKIAogICBASW5qZWN0CiAgIHB1YmxpYyBQcm9qZWN0Q2FjaGVDbG9jayhAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBzZXJ2ZXJDb25maWcpIHsKLSAgICB0aGlzKFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KAotICAgICAgICBDb25maWdVdGlsLmdldFRpbWVVbml0KHNlcnZlckNvbmZpZywKLSAgICAgICAgICAgICJjYWNoZSIsICJwcm9qZWN0cyIsICJjaGVja0ZyZXF1ZW5jeSIsCi0gICAgICAgICAgICA1LCBUaW1lVW5pdC5NSU5VVEVTKSwgVGltZVVuaXQuTUlOVVRFUykpOworICAgIHRoaXMoY2hlY2tGcmVxdWVuY3koc2VydmVyQ29uZmlnKSk7CiAgIH0KIAogICBwdWJsaWMgUHJvamVjdENhY2hlQ2xvY2sobG9uZyBjaGVja0ZyZXF1ZW5jeU1pbGxpcykgewotICAgIGlmICgxMCA8IGNoZWNrRnJlcXVlbmN5TWlsbGlzKSB7CisgICAgaWYgKGNoZWNrRnJlcXVlbmN5TWlsbGlzID09IExvbmcuTUFYX1ZBTFVFKSB7CisgICAgICAvLyBTdGFydCB3aXRoIGdlbmVyYXRpb24gMSAodG8gYXZvaWQgbWFnaWMgMCBiZWxvdykuCisgICAgICAvLyBEbyBub3QgYmVnaW4gYmFja2dyb3VuZCB0aHJlYWQsIGRpc2FibGluZyB0aGUgY2xvY2suCisgICAgICBnZW5lcmF0aW9uID0gMTsKKyAgICB9IGVsc2UgaWYgKDEwIDwgY2hlY2tGcmVxdWVuY3lNaWxsaXMpIHsKICAgICAgIC8vIFN0YXJ0IHdpdGggZ2VuZXJhdGlvbiAxICh0byBhdm9pZCBtYWdpYyAwIGJlbG93KS4KICAgICAgIGdlbmVyYXRpb24gPSAxOwotICAgICAgVGhyZWFkRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFRocmVhZEZhY3RvcnkoKSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBpZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgICAgVGhyZWFkIHRocmVhZCA9IEV4ZWN1dG9ycy5kZWZhdWx0VGhyZWFkRmFjdG9yeSgpLm5ld1RocmVhZChydW5uYWJsZSk7Ci0gICAgICAgICAgdGhyZWFkLnNldE5hbWUoU3RyaW5nLmZvcm1hdCgiUHJvamVjdENhY2hlQ2xvY2stJWQiLCBpZC5pbmNyZW1lbnRBbmRHZXQoKSkpOwotICAgICAgICAgIHRocmVhZC5zZXREYWVtb24odHJ1ZSk7Ci0gICAgICAgICAgdGhyZWFkLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpOwotICAgICAgICAgIHJldHVybiB0aHJlYWQ7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgxLCBmYWN0b3J5KTsKKyAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKAorICAgICAgICAgIDEsCisgICAgICAgICAgbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJQcm9qZWN0Q2FjaGVDbG9jay0lZCIpCisgICAgICAgICAgICAuc2V0RGFlbW9uKHRydWUpCisgICAgICAgICAgICAuc2V0UHJpb3JpdHkoVGhyZWFkLk1JTl9QUklPUklUWSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICAgIGV4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtNzUsNCArNjksMTYgQEAKICAgbG9uZyByZWFkKCkgewogICAgIHJldHVybiBnZW5lcmF0aW9uOwogICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjaGVja0ZyZXF1ZW5jeShDb25maWcgc2VydmVyQ29uZmlnKSB7CisgICAgU3RyaW5nIGZyZXEgPSBzZXJ2ZXJDb25maWcuZ2V0U3RyaW5nKCJjYWNoZSIsICJwcm9qZWN0cyIsICJjaGVja0ZyZXF1ZW5jeSIpOworICAgIGlmIChmcmVxICE9IG51bGwKKyAgICAgICAgJiYgKCJkaXNhYmxlZCIuZXF1YWxzSWdub3JlQ2FzZShmcmVxKSB8fCAib2ZmIi5lcXVhbHNJZ25vcmVDYXNlKGZyZXEpKSkgeworICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoCisgICAgICAgIENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoc2VydmVyQ29uZmlnLAorICAgICAgICAgICAgImNhY2hlIiwgInByb2plY3RzIiwgImNoZWNrRnJlcXVlbmN5IiwKKyAgICAgICAgICAgIDUsIFRpbWVVbml0Lk1JTlVURVMpLCBUaW1lVW5pdC5NSU5VVEVTKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUltcGwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVJbXBsLmphdmEKaW5kZXggYTdmZGI0ZS4uMjcyYzEyOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUltcGwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENhY2hlSW1wbC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGVMb2FkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuTG9hZGluZ0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jYWNoZS5DYWNoZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKQEAgLTM2LDYgKzM3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKQEAgLTE3MSw2ICsxNzMsMTggQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBndWVzc1JlbGV2YW50R3JvdXBVVUlEcygpIHsKKyAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IG4gOiBhbGwoKSkgeworICAgICAgUHJvamVjdFN0YXRlIHAgPSBieU5hbWUuZ2V0SWZQcmVzZW50KG4uZ2V0KCkpOworICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICBncm91cHMuYWRkQWxsKHAuZ2V0Q29uZmlnKCkuZ2V0QWxsR3JvdXBVVUlEcygpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgSXRlcmFibGU8UHJvamVjdC5OYW1lS2V5PiBieU5hbWUoZmluYWwgU3RyaW5nIHBmeCkgewogICAgIGZpbmFsIEl0ZXJhYmxlPFByb2plY3QuTmFtZUtleT4gc3JjOwogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENvbnRyb2wuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q29udHJvbC5qYXZhCmluZGV4IDUxM2YxYjEuLjU2ZDRiZTMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q29udHJvbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q29udHJvbC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2FwYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db250cmlidXRvckFncmVlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGUuQWN0aW9uOwpAQCAtMTIwLDEwICsxMjEsMTEgQEAKICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPENvbnRyaWJ1dG9yQWdyZWVtZW50PiBjb250cmlidXRvckFncmVlbWVudHM7CiAKICAgcHJpdmF0ZSBMaXN0PFNlY3Rpb25NYXRjaGVyPiBhbGxTZWN0aW9uczsKKyAgcHJpdmF0ZSBMaXN0PFNlY3Rpb25NYXRjaGVyPiBsb2NhbFNlY3Rpb25zOworICBwcml2YXRlIExhYmVsVHlwZXMgbGFiZWxUeXBlczsKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZWZDb250cm9sPiByZWZDb250cm9sczsKICAgcHJpdmF0ZSBCb29sZWFuIGRlY2xhcmVkT3duZXI7CiAKLQogICBASW5qZWN0CiAgIFByb2plY3RDb250cm9sKEBHaXRVcGxvYWRQYWNrR3JvdXBzIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gdXBsb2FkR3JvdXBzLAogICAgICAgQEdpdFJlY2VpdmVQYWNrR3JvdXBzIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gcmVjZWl2ZUdyb3VwcywKQEAgLTE4MCw2ICsxODIsMTMgQEAKICAgICByZXR1cm4gc3RhdGUuZ2V0UHJvamVjdCgpOwogICB9CiAKKyAgcHVibGljIExhYmVsVHlwZXMgZ2V0TGFiZWxUeXBlcygpIHsKKyAgICBpZiAobGFiZWxUeXBlcyA9PSBudWxsKSB7CisgICAgICBsYWJlbFR5cGVzID0gc3RhdGUuZ2V0TGFiZWxUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gbGFiZWxUeXBlczsKKyAgfQorCiAgIHByaXZhdGUgYm9vbGVhbiBpc0hpZGRlbigpIHsKICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFN0YXRlKCkuZXF1YWxzKFByb2plY3QuU3RhdGUuSElEREVOKTsKICAgfQpAQCAtMjMxLDE2ICsyNDAsMjQgQEAKICAgICAgIFN0cmluZyBwTmFtZSA9IHN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCk7CiAgICAgICByZXR1cm4gbmV3IENhcGFibGUoIlVwbG9hZCBkZW5pZWQgZm9yIHByb2plY3QgJyIgKyBwTmFtZSArICInIik7CiAgICAgfQotICAgIFByb2plY3QgcHJvamVjdCA9IHN0YXRlLmdldFByb2plY3QoKTsKLSAgICBpZiAocHJvamVjdC5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKSB7CisgICAgaWYgKHN0YXRlLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpIHsKICAgICAgIHJldHVybiB2ZXJpZnlBY3RpdmVDb250cmlidXRvckFncmVlbWVudCgpOwogICAgIH0KICAgICByZXR1cm4gQ2FwYWJsZS5PSzsKICAgfQogCiAgIHB1YmxpYyBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdldEFsbEdyb3VwcygpIHsKKyAgICByZXR1cm4gZ2V0R3JvdXBzKGFjY2VzcygpKTsKKyAgfQorCisgIHB1YmxpYyBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdldExvY2FsR3JvdXBzKCkgeworICAgIHJldHVybiBnZXRHcm91cHMobG9jYWxBY2Nlc3MoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdldEdyb3VwcygKKyAgICAgIGZpbmFsIExpc3Q8U2VjdGlvbk1hdGNoZXI+IHNlY3Rpb25NYXRjaGVyTGlzdCkgewogICAgIGZpbmFsIFNldDxHcm91cFJlZmVyZW5jZT4gYWxsID0gbmV3IEhhc2hTZXQ8R3JvdXBSZWZlcmVuY2U+KCk7Ci0gICAgZm9yIChmaW5hbCBTZWN0aW9uTWF0Y2hlciBtYXRjaGVyIDogYWNjZXNzKCkpIHsKKyAgICBmb3IgKGZpbmFsIFNlY3Rpb25NYXRjaGVyIG1hdGNoZXIgOiBzZWN0aW9uTWF0Y2hlckxpc3QpIHsKICAgICAgIGZpbmFsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiA9IG1hdGNoZXIuc2VjdGlvbjsKICAgICAgIGZvciAoZmluYWwgUGVybWlzc2lvbiBwZXJtaXNzaW9uIDogc2VjdGlvbi5nZXRQZXJtaXNzaW9ucygpKSB7CiAgICAgICAgIGZvciAoZmluYWwgUGVybWlzc2lvblJ1bGUgcnVsZSA6IHBlcm1pc3Npb24uZ2V0UnVsZXMoKSkgewpAQCAtMzkyLDYgKzQwOSwxMyBAQAogICAgIHJldHVybiBhbGxTZWN0aW9uczsKICAgfQogCisgIHByaXZhdGUgTGlzdDxTZWN0aW9uTWF0Y2hlcj4gbG9jYWxBY2Nlc3MoKSB7CisgICAgaWYgKGxvY2FsU2VjdGlvbnMgPT0gbnVsbCkgeworICAgICAgbG9jYWxTZWN0aW9ucyA9IHN0YXRlLmdldExvY2FsQWNjZXNzU2VjdGlvbnMoKTsKKyAgICB9CisgICAgcmV0dXJuIGxvY2FsU2VjdGlvbnM7CisgIH0KKwogICBib29sZWFuIG1hdGNoKFBlcm1pc3Npb25SdWxlIHJ1bGUpIHsKICAgICByZXR1cm4gbWF0Y2gocnVsZS5nZXRHcm91cCgpLmdldFVVSUQoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0SGllcmFyY2h5SXRlcmF0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0SGllcmFyY2h5SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI0Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RIaWVyYXJjaHlJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBJdGVyYXRlcyBmcm9tIGEgcHJvamVjdCB1cCB0aHJvdWdoIGl0cyBwYXJlbnRzIHRvIEFsbC1Qcm9qZWN0cy4KKyAqIDxwPgorICogSWYgYSBjeWNsZSBpcyBkZXRlY3RlZCB0aGUgY3ljbGUgaXMgYnJva2VuIGFuZCBBbGwtUHJvamVjdHMgaXMgdmlzaXRlZC4KKyAqLworY2xhc3MgUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UHJvamVjdFN0YXRlPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9qZWN0SGllcmFyY2h5SXRlcmF0b3IuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIGNhY2hlOworICBwcml2YXRlIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWU7CisgIHByaXZhdGUgZmluYWwgU2V0PFByb2plY3QuTmFtZUtleT4gc2VlbjsKKyAgcHJpdmF0ZSBQcm9qZWN0U3RhdGUgbmV4dDsKKworICBQcm9qZWN0SGllcmFyY2h5SXRlcmF0b3IoUHJvamVjdENhY2hlIGMsCisgICAgICBBbGxQcm9qZWN0c05hbWUgYWxsLAorICAgICAgUHJvamVjdFN0YXRlIGZpcnN0UmVzdWx0KSB7CisgICAgY2FjaGUgPSBjOworICAgIGFsbFByb2plY3RzTmFtZSA9IGFsbDsKKworICAgIHNlZW4gPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgICBzZWVuLmFkZChmaXJzdFJlc3VsdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICBuZXh0ID0gZmlyc3RSZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcm9qZWN0U3RhdGUgbmV4dCgpIHsKKyAgICBQcm9qZWN0U3RhdGUgbiA9IG5leHQ7CisgICAgaWYgKG4gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgbmV4dCA9IGNvbXB1dGVOZXh0KG4pOworICAgIHJldHVybiBuOworICB9CisKKyAgcHJpdmF0ZSBQcm9qZWN0U3RhdGUgY29tcHV0ZU5leHQoUHJvamVjdFN0YXRlIG4pIHsKKyAgICBQcm9qZWN0Lk5hbWVLZXkgcGFyZW50TmFtZSA9IG4uZ2V0UHJvamVjdCgpLmdldFBhcmVudCgpOworICAgIGlmIChwYXJlbnROYW1lICE9IG51bGwgJiYgdmlzaXQocGFyZW50TmFtZSkpIHsKKyAgICAgIFByb2plY3RTdGF0ZSBwID0gY2FjaGUuZ2V0KHBhcmVudE5hbWUpOworICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gcDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYXJlbnQgZG9lcyBub3QgZXhpc3Qgb3Igd2FzIGFscmVhZHkgdmlzaXRlZC4KKyAgICAvLyBGYWxsIGJhY2sgdG8gdmlzaXQgQWxsLVByb2plY3RzIGV4YWN0bHkgb25jZS4KKyAgICBpZiAoc2Vlbi5hZGQoYWxsUHJvamVjdHNOYW1lKSkgeworICAgICAgcmV0dXJuIGNhY2hlLmdldChhbGxQcm9qZWN0c05hbWUpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiB2aXNpdChQcm9qZWN0Lk5hbWVLZXkgcGFyZW50TmFtZSkgeworICAgIGlmIChzZWVuLmFkZChwYXJlbnROYW1lKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IG9yZGVyID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHNlZW4uc2l6ZSgpICsgMSk7CisgICAgZm9yIChQcm9qZWN0Lk5hbWVLZXkgcCA6IHNlZW4pIHsKKyAgICAgIG9yZGVyLmFkZChwLmdldCgpKTsKKyAgICB9CisgICAgaW50IGlkeCA9IG9yZGVyLmxhc3RJbmRleE9mKHBhcmVudE5hbWUuZ2V0KCkpOworICAgIG9yZGVyLmFkZChwYXJlbnROYW1lLmdldCgpKTsKKyAgICBsb2cud2FybigiQ3ljbGUgZGV0ZWN0ZWQgaW4gcHJvamVjdHM6ICIKKyAgICAgICAgKyBKb2luZXIub24oIiAtPiAiKS5qb2luKG9yZGVyLnN1Ykxpc3QoaWR4LCBvcmRlci5zaXplKCkpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RKc29uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdEpzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGI1Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RKc29uLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFByb2plY3RKc29uIHsKKworICBwcml2YXRlIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0czsKKworICBASW5qZWN0CisgIFByb2plY3RKc29uKEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0cykgeworICAgIHRoaXMuYWxsUHJvamVjdHMgPSBhbGxQcm9qZWN0czsKKyAgfQorCisgIHB1YmxpYyBQcm9qZWN0SW5mbyBmb3JtYXQoUHJvamVjdFJlc291cmNlIHJzcmMpIHsKKyAgICByZXR1cm4gZm9ybWF0KHJzcmMuZ2V0Q29udHJvbCgpLmdldFByb2plY3QoKSk7CisgIH0KKworICBwdWJsaWMgUHJvamVjdEluZm8gZm9ybWF0KFByb2plY3QgcCkgeworICAgIFByb2plY3RJbmZvIGluZm8gPSBuZXcgUHJvamVjdEluZm8oKTsKKyAgICBpbmZvLm5hbWUgPSBwLmdldE5hbWUoKTsKKyAgICBQcm9qZWN0Lk5hbWVLZXkgcGFyZW50TmFtZSA9IHAuZ2V0UGFyZW50KGFsbFByb2plY3RzKTsKKyAgICBpbmZvLnBhcmVudCA9IHBhcmVudE5hbWUgIT0gbnVsbCA/IHBhcmVudE5hbWUuZ2V0KCkgOiBudWxsOworICAgIGluZm8uZGVzY3JpcHRpb24gPSBTdHJpbmdzLmVtcHR5VG9OdWxsKHAuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgaW5mby5maW5pc2goKTsKKyAgICByZXR1cm4gaW5mbzsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvamVjdEluZm8geworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga2luZCA9ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiOworICAgIHB1YmxpYyBTdHJpbmcgaWQ7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBTdHJpbmcgcGFyZW50OworICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnJhbmNoZXM7CisKKyAgICB2b2lkIGZpbmlzaCgpIHsKKyAgICAgIGlkID0gVXJsLmVuY29kZShuYW1lKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0UmVmLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFJlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTVmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFJlZi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworCitjbGFzcyBQcm9qZWN0UmVmIHsKKworICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDsKKyAgZmluYWwgU3RyaW5nIHJlZjsKKworICBQcm9qZWN0UmVmKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcmVmKSB7CisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB0aGlzLnJlZiA9IHJlZjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgUHJvamVjdFJlZgorICAgICAgICAmJiBwcm9qZWN0LmVxdWFscygoKFByb2plY3RSZWYpIG90aGVyKS5wcm9qZWN0KQorICAgICAgICAmJiByZWYuZXF1YWxzKCgoUHJvamVjdFJlZikgb3RoZXIpLnJlZik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gcHJvamVjdC5oYXNoQ29kZSgpICogMzEgKyByZWYuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBwcm9qZWN0ICsgIiwgIiArIHJlZjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlY2EwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0UmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PFByb2plY3RSZXNvdXJjZT4+IFBST0pFQ1RfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UHJvamVjdFJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIFByb2plY3RDb250cm9sIGNvbnRyb2w7CisKKyAgUHJvamVjdFJlc291cmNlKFByb2plY3RDb250cm9sIGNvbnRyb2wpIHsKKyAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBjb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lKCk7CisgIH0KKworICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldE5hbWVLZXkoKSB7CisgICAgcmV0dXJuIGNvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKTsKKyAgfQorCisgIHB1YmxpYyBQcm9qZWN0Q29udHJvbCBnZXRDb250cm9sKCkgeworICAgIHJldHVybiBjb250cm9sOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFN0YXRlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFN0YXRlLmphdmEKaW5kZXggZTA2Yzk0OC4uNjE1MGEzZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RTdGF0ZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0U3RhdGUuamF2YQpAQCAtMTQsMTMgKzE0LDIwIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUnVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5Qcm9sb2dFbnZpcm9ubWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5SdWxlc0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKQEAgLTM5LDExICs0NiwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqIENhY2hlZCBpbmZvcm1hdGlvbiBvbiBhIHByb2plY3QuICovCkBAIC03Niw3ICs4Niw3IEBACiAgIHByaXZhdGUgZmluYWwgQ2FwYWJpbGl0eUNvbGxlY3Rpb24gY2FwYWJpbGl0aWVzOwogCiAgIEBJbmplY3QKLSAgcHJvdGVjdGVkIFByb2plY3RTdGF0ZSgKKyAgcHVibGljIFByb2plY3RTdGF0ZSgKICAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCiAgICAgICBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lLAogICAgICAgZmluYWwgUHJvamVjdENvbnRyb2wuQXNzaXN0ZWRGYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeSwKQEAgLTE2NSw2ICsxNzUsMjAgQEAKICAgICByZXR1cm4gZW52RmFjdG9yeS5jcmVhdGUocG1jKTsKICAgfQogCisgIC8qKgorICAgKiBMaWtlIHtAbGluayAjbmV3UHJvbG9nRW52aXJvbm1lbnQoKX0gYnV0IGluc3RlYWQgb2YgcmVhZGluZyB0aGUgcnVsZXMucGwKKyAgICogcmVhZCB0aGUgcHJvdmlkZWQgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUgb2YgdGhlIGlucHV0IHN0cmVhbS4gQ291bGQgYmUgYW55IG5hbWUuCisgICAqIEBwYXJhbSBpbiBJbnB1dFN0cmVhbSB0byByZWFkIHByb2xvZyBydWxlcyBmcm9tCisgICAqIEB0aHJvd3MgQ29tcGlsZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFByb2xvZ0Vudmlyb25tZW50IG5ld1Byb2xvZ0Vudmlyb25tZW50KFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpbikKKyAgICAgIHRocm93cyBDb21waWxlRXhjZXB0aW9uIHsKKyAgICBQcm9sb2dNYWNoaW5lQ29weSBwbWMgPSBydWxlc0NhY2hlLmxvYWRNYWNoaW5lKG5hbWUsIGluKTsKKyAgICByZXR1cm4gZW52RmFjdG9yeS5jcmVhdGUocG1jKTsKKyAgfQorCiAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CiAgICAgcmV0dXJuIGNvbmZpZy5nZXRQcm9qZWN0KCk7CiAgIH0KQEAgLTE3NCw3ICsxOTgsNyBAQAogICB9CiAKICAgLyoqIEdldCB0aGUgc2VjdGlvbnMgdGhhdCBwZXJ0YWluIG9ubHkgdG8gdGhpcyBwcm9qZWN0LiAqLwotICBwcml2YXRlIExpc3Q8U2VjdGlvbk1hdGNoZXI+IGdldExvY2FsQWNjZXNzU2VjdGlvbnMoKSB7CisgIExpc3Q8U2VjdGlvbk1hdGNoZXI+IGdldExvY2FsQWNjZXNzU2VjdGlvbnMoKSB7CiAgICAgTGlzdDxTZWN0aW9uTWF0Y2hlcj4gc20gPSBsb2NhbEFjY2Vzc1NlY3Rpb25zOwogICAgIGlmIChzbSA9PSBudWxsKSB7CiAgICAgICBDb2xsZWN0aW9uPEFjY2Vzc1NlY3Rpb24+IGZyb21Db25maWcgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbnMoKTsKQEAgLTE5Miw3ICsyMTYsOCBAQAogICAgICAgICAgIHNlY3Rpb24uc2V0UGVybWlzc2lvbnMoY29weSk7CiAgICAgICAgIH0KIAotICAgICAgICBTZWN0aW9uTWF0Y2hlciBtYXRjaGVyID0gU2VjdGlvbk1hdGNoZXIud3JhcChzZWN0aW9uKTsKKyAgICAgICAgU2VjdGlvbk1hdGNoZXIgbWF0Y2hlciA9IFNlY3Rpb25NYXRjaGVyLndyYXAoZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSwKKyAgICAgICAgICAgIHNlY3Rpb24pOwogICAgICAgICBpZiAobWF0Y2hlciAhPSBudWxsKSB7CiAgICAgICAgICAgc20uYWRkKG1hdGNoZXIpOwogICAgICAgICB9CkBAIC0yMTIsMjMgKzIzNyw5IEBACiAgICAgICByZXR1cm4gZ2V0TG9jYWxBY2Nlc3NTZWN0aW9ucygpOwogICAgIH0KIAotICAgIExpc3Q8U2VjdGlvbk1hdGNoZXI+IGFsbCA9IG5ldyBBcnJheUxpc3Q8U2VjdGlvbk1hdGNoZXI+KCk7Ci0gICAgU2V0PFByb2plY3QuTmFtZUtleT4gc2VlbiA9IG5ldyBIYXNoU2V0PFByb2plY3QuTmFtZUtleT4oKTsKLSAgICBQcm9qZWN0U3RhdGUgYWxsUHJvamVjdHMgPSBwcm9qZWN0Q2FjaGUuZ2V0QWxsUHJvamVjdHMoKTsKLSAgICBzZWVuLmFkZChnZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKLQotICAgIFByb2plY3RTdGF0ZSBzID0gdGhpczsKLSAgICBkbyB7CisgICAgTGlzdDxTZWN0aW9uTWF0Y2hlcj4gYWxsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChQcm9qZWN0U3RhdGUgcyA6IHRyZWUoKSkgewogICAgICAgYWxsLmFkZEFsbChzLmdldExvY2FsQWNjZXNzU2VjdGlvbnMoKSk7Ci0KLSAgICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnQgPSBzLmdldFByb2plY3QoKS5nZXRQYXJlbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCAhc2Vlbi5hZGQocGFyZW50KSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHMgPSBwcm9qZWN0Q2FjaGUuZ2V0KHBhcmVudCk7Ci0gICAgfSB3aGlsZSAocyAhPSBudWxsKTsKLSAgICBpZiAoc2Vlbi5hZGQoYWxsUHJvamVjdHMuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSkpIHsKLSAgICAgIGFsbC5hZGRBbGwoYWxsUHJvamVjdHMuZ2V0TG9jYWxBY2Nlc3NTZWN0aW9ucygpKTsKICAgICB9CiAgICAgcmV0dXJuIGFsbDsKICAgfQpAQCAtMjQwLDE2ICsyNTEsMTEgQEAKICAgICogICAgICAgICB0aGF0IGhhcyBsb2NhbCBvd25lcnMgYXJlIHJldHVybmVkCiAgICAqLwogICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnZXRPd25lcnMoKSB7Ci0gICAgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUgPSBnZXRQcm9qZWN0KCkuZ2V0UGFyZW50KCk7Ci0gICAgaWYgKCFsb2NhbE93bmVycy5pc0VtcHR5KCkgfHwgcGFyZW50TmFtZSA9PSBudWxsIHx8IGlzQWxsUHJvamVjdHMpIHsKLSAgICAgIHJldHVybiBsb2NhbE93bmVyczsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBwIDogdHJlZSgpKSB7CisgICAgICBpZiAoIXAubG9jYWxPd25lcnMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwLmxvY2FsT3duZXJzOworICAgICAgfQogICAgIH0KLQotICAgIFByb2plY3RTdGF0ZSBwYXJlbnQgPSBwcm9qZWN0Q2FjaGUuZ2V0KHBhcmVudE5hbWUpOwotICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIHBhcmVudC5nZXRPd25lcnMoKTsKLSAgICB9Ci0KICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgfQogCkBAIC0yNTcsMjMgKzI2MywxMyBAQAogICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBncm91cHMgbGlzdGVkIGluIHtAY29kZSBncm91cHN9IHdhcyBkZWNsYXJlZCB0bwogICAgKiAgICAgICAgIGJlIGFuIG93bmVyIG9mIHRoaXMgcHJvamVjdCwgb3Igb25lIG9mIGl0cyBwYXJlbnQgcHJvamVjdHMuLgogICAgKi8KLSAgYm9vbGVhbiBpc093bmVyKEdyb3VwTWVtYmVyc2hpcCBncm91cHMpIHsKLSAgICBTZXQ8UHJvamVjdC5OYW1lS2V5PiBzZWVuID0gbmV3IEhhc2hTZXQ8UHJvamVjdC5OYW1lS2V5PigpOwotICAgIHNlZW4uYWRkKGdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOwotCi0gICAgUHJvamVjdFN0YXRlIHMgPSB0aGlzOwotICAgIGRvIHsKLSAgICAgIGlmIChncm91cHMuY29udGFpbnNBbnlPZihzLmxvY2FsT3duZXJzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgYm9vbGVhbiBpc093bmVyKGZpbmFsIEdyb3VwTWVtYmVyc2hpcCBncm91cHMpIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLmFueSh0cmVlKCksIG5ldyBQcmVkaWNhdGU8UHJvamVjdFN0YXRlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoUHJvamVjdFN0YXRlIGluKSB7CisgICAgICAgIHJldHVybiBncm91cHMuY29udGFpbnNBbnlPZihpbi5sb2NhbE93bmVycyk7CiAgICAgICB9Ci0KLSAgICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnQgPSBzLmdldFByb2plY3QoKS5nZXRQYXJlbnQoKTsKLSAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCB8fCAhc2Vlbi5hZGQocGFyZW50KSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHMgPSBwcm9qZWN0Q2FjaGUuZ2V0KHBhcmVudCk7Ci0gICAgfSB3aGlsZSAocyAhPSBudWxsKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgfSk7CiAgIH0KIAogICBwdWJsaWMgUHJvamVjdENvbnRyb2wgY29udHJvbEZvcihmaW5hbCBDdXJyZW50VXNlciB1c2VyKSB7CkBAIC0yODEsMTggKzI3NywxMDQgQEAKICAgfQogCiAgIC8qKgotICAgKiBAcmV0dXJuIFByb2plY3RTdGF0ZSBvZiBwcm9qZWN0J3MgcGFyZW50LiBJZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEKLSAgICogICAgICAgICBwYXJlbnQsIHJldHVybiBzdGF0ZSBvZiB0aGUgdG9wIGxldmVsIHByb2plY3QsIEFsbC1Qcm9qZWN0cy4gSWYKLSAgICogICAgICAgICB0aGlzIHByb2plY3QgaXMgQWxsLVByb2plY3RzLCByZXR1cm4gbnVsbC4KKyAgICogQHJldHVybiBhbiBpdGVyYWJsZSB0aGF0IHdhbGtzIHRocm91Z2ggdGhpcyBwcm9qZWN0IGFuZCB0aGVuIHRoZSBwYXJlbnRzIG9mCisgICAqICAgICAgICAgdGhpcyBwcm9qZWN0LiBTdGFydHMgZnJvbSB0aGlzIHByb2plY3QgYW5kIHByb2dyZXNzZXMgdXAgdGhlCisgICAqICAgICAgICAgaGllcmFyY2h5IHRvIEFsbC1Qcm9qZWN0cy4KICAgICovCi0gIHB1YmxpYyBQcm9qZWN0U3RhdGUgZ2V0UGFyZW50U3RhdGUoKSB7Ci0gICAgaWYgKGlzQWxsUHJvamVjdHMpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gcHJvamVjdENhY2hlLmdldChnZXRQcm9qZWN0KCkuZ2V0UGFyZW50KGFsbFByb2plY3RzTmFtZSkpOworICBwdWJsaWMgSXRlcmFibGU8UHJvamVjdFN0YXRlPiB0cmVlKCkgeworICAgIHJldHVybiBuZXcgSXRlcmFibGU8UHJvamVjdFN0YXRlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEl0ZXJhdG9yPFByb2plY3RTdGF0ZT4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yKAorICAgICAgICAgICAgcHJvamVjdENhY2hlLCBhbGxQcm9qZWN0c05hbWUsCisgICAgICAgICAgICBQcm9qZWN0U3RhdGUudGhpcyk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBAcmV0dXJuIGFuIGl0ZXJhYmxlIHRoYXQgd2Fsa3MgdGhyb3VnaCB0aGUgcGFyZW50cyBvZiB0aGlzIHByb2plY3QuIFN0YXJ0cworICAgKiAgICAgICAgIGZyb20gdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhpcyBwcm9qZWN0IGFuZCBwcm9ncmVzc2VzIHVwIHRoZQorICAgKiAgICAgICAgIGhpZXJhcmNoeSB0byBBbGwtUHJvamVjdHMuCisgICAqLworICBwdWJsaWMgSXRlcmFibGU8UHJvamVjdFN0YXRlPiBwYXJlbnRzKCkgeworICAgIHJldHVybiBJdGVyYWJsZXMuc2tpcCh0cmVlKCksIDEpOwogICB9CiAKICAgcHVibGljIGJvb2xlYW4gaXNBbGxQcm9qZWN0cygpIHsKICAgICByZXR1cm4gaXNBbGxQcm9qZWN0czsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworICBwdWJsaWMgYm9vbGVhbiBpc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpIHsKKyAgICByZXR1cm4gZ2V0SW5oZXJpdGFibGVCb29sZWFuKG5ldyBGdW5jdGlvbjxQcm9qZWN0LCBJbmhlcml0YWJsZUJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgSW5oZXJpdGFibGVCb29sZWFuIGFwcGx5KFByb2plY3QgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0LmdldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNVc2VDb250ZW50TWVyZ2UoKSB7CisgICAgcmV0dXJuIGdldEluaGVyaXRhYmxlQm9vbGVhbihuZXcgRnVuY3Rpb248UHJvamVjdCwgSW5oZXJpdGFibGVCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBhcHBseShQcm9qZWN0IGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5nZXRVc2VDb250ZW50TWVyZ2UoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzVXNlU2lnbmVkT2ZmQnkoKSB7CisgICAgcmV0dXJuIGdldEluaGVyaXRhYmxlQm9vbGVhbihuZXcgRnVuY3Rpb248UHJvamVjdCwgSW5oZXJpdGFibGVCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBhcHBseShQcm9qZWN0IGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5nZXRVc2VTaWduZWRPZmZCeSgpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlQ2hhbmdlSUQoKSB7CisgICAgcmV0dXJuIGdldEluaGVyaXRhYmxlQm9vbGVhbihuZXcgRnVuY3Rpb248UHJvamVjdCwgSW5oZXJpdGFibGVCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBhcHBseShQcm9qZWN0IGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5nZXRSZXF1aXJlQ2hhbmdlSUQoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFR5cGVzIGdldExhYmVsVHlwZXMoKSB7CisgICAgTWFwPFN0cmluZywgTGFiZWxUeXBlPiB0eXBlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIExpc3Q8UHJvamVjdFN0YXRlPiBwcm9qZWN0cyA9IExpc3RzLm5ld0FycmF5TGlzdCh0cmVlKCkpOworICAgIENvbGxlY3Rpb25zLnJldmVyc2UocHJvamVjdHMpOworICAgIGZvciAoUHJvamVjdFN0YXRlIHMgOiBwcm9qZWN0cykgeworICAgICAgZm9yIChMYWJlbFR5cGUgdHlwZSA6IHMuZ2V0Q29uZmlnKCkuZ2V0TGFiZWxTZWN0aW9ucygpLnZhbHVlcygpKSB7CisgICAgICAgIFN0cmluZyBsb3dlciA9IHR5cGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIExhYmVsVHlwZSBvbGQgPSB0eXBlcy5nZXQobG93ZXIpOworICAgICAgICBpZiAob2xkID09IG51bGwgfHwgb2xkLmNhbk92ZXJyaWRlKCkpIHsKKyAgICAgICAgICB0eXBlcy5wdXQobG93ZXIsIHR5cGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIExpc3Q8TGFiZWxUeXBlPiBhbGwgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkodHlwZXMuc2l6ZSgpKTsKKyAgICBmb3IgKExhYmVsVHlwZSB0eXBlIDogdHlwZXMudmFsdWVzKCkpIHsKKyAgICAgIGlmICghdHlwZS5nZXRWYWx1ZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYWxsLmFkZCh0eXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBMYWJlbFR5cGVzKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoYWxsKSk7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gZ2V0SW5oZXJpdGFibGVCb29sZWFuKEZ1bmN0aW9uPFByb2plY3QsIEluaGVyaXRhYmxlQm9vbGVhbj4gZnVuYykgeworICAgIGZvciAoUHJvamVjdFN0YXRlIHMgOiB0cmVlKCkpIHsKKyAgICAgIHN3aXRjaCAoZnVuYy5hcHBseShzLmdldFByb2plY3QoKSkpIHsKKyAgICAgICAgY2FzZSBUUlVFOgorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIEZBTFNFOgorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBJTkhFUklUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0c0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0c0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzAwNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIFByb2plY3RzQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgUmVzdENvbGxlY3Rpb248VG9wTGV2ZWxSZXNvdXJjZSwgUHJvamVjdFJlc291cmNlPiwKKyAgICBBY2NlcHRzQ3JlYXRlPFRvcExldmVsUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PFByb2plY3RSZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RQcm9qZWN0cz4gbGlzdDsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbC5HZW5lcmljRmFjdG9yeSBjb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDcmVhdGVQcm9qZWN0LkZhY3RvcnkgY3JlYXRlUHJvamVjdEZhY3Rvcnk7CisKKyAgQEluamVjdAorICBQcm9qZWN0c0NvbGxlY3Rpb24oRHluYW1pY01hcDxSZXN0VmlldzxQcm9qZWN0UmVzb3VyY2U+PiB2aWV3cywKKyAgICAgIFByb3ZpZGVyPExpc3RQcm9qZWN0cz4gbGlzdCwKKyAgICAgIFByb2plY3RDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNvbnRyb2xGYWN0b3J5LAorICAgICAgQ3JlYXRlUHJvamVjdC5GYWN0b3J5IGZhY3RvcnksIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyKSB7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgICAgdGhpcy5jb250cm9sRmFjdG9yeSA9IGNvbnRyb2xGYWN0b3J5OworICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgdGhpcy5jcmVhdGVQcm9qZWN0RmFjdG9yeSA9IGZhY3Rvcnk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFRvcExldmVsUmVzb3VyY2U+IGxpc3QoKSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KCkuc2V0Rm9ybWF0KE91dHB1dEZvcm1hdC5KU09OKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHJvamVjdFJlc291cmNlIHBhcnNlKFRvcExldmVsUmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0UmVzb3VyY2UgcnNyYyA9IF9wYXJzZShpZC5nZXQoKSk7CisgICAgaWYgKHJzcmMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgIH0KKyAgICByZXR1cm4gcnNyYzsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgYSBwcm9qZWN0IElEIGZyb20gYSByZXF1ZXN0IGJvZHkgYW5kIHJldHVybnMgdGhlIHByb2plY3QuCisgICAqCisgICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgcHJvamVjdCwgY2FuIGJlIGEgcHJvamVjdCBuYW1lCisgICAqIEByZXR1cm4gdGhlIHByb2plY3QKKyAgICogQHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHRocm93biBpZiB0aGUgcHJvamVjdCBJRCBjYW5ub3QgYmUKKyAgICogICAgICAgICByZXNvbHZlZCBvciBpZiB0aGUgcHJvamVjdCBpcyBub3QgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyCisgICAqLworICBwdWJsaWMgUHJvamVjdFJlc291cmNlIHBhcnNlKFN0cmluZyBpZCkgdGhyb3dzIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24geworICAgIFByb2plY3RSZXNvdXJjZSByc3JjID0gX3BhcnNlKGlkKTsKKyAgICBpZiAocnNyYyA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJQcm9qZWN0IE5vdCBGb3VuZDogJXMiLCBpZCkpOworICAgIH0KKyAgICByZXR1cm4gcnNyYzsKKyAgfQorCisgIHByaXZhdGUgUHJvamVjdFJlc291cmNlIF9wYXJzZShTdHJpbmcgaWQpIHsKKyAgICBQcm9qZWN0Q29udHJvbCBjdGw7CisgICAgdHJ5IHsKKyAgICAgIGN0bCA9IGNvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoCisgICAgICAgICAgbmV3IFByb2plY3QuTmFtZUtleShpZCksCisgICAgICAgICAgdXNlci5nZXQoKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKCFjdGwuaXNWaXNpYmxlKCkgJiYgIWN0bC5pc093bmVyKCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gbmV3IFByb2plY3RSZXNvdXJjZShjdGwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PFByb2plY3RSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIENyZWF0ZVByb2plY3QgY3JlYXRlKFRvcExldmVsUmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGNyZWF0ZVByb2plY3RGYWN0b3J5LmNyZWF0ZShuYW1lLmdldCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dERlc2NyaXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHV0RGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2RkM2NiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dERlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlB1dERlc2NyaXB0aW9uLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworY2xhc3MgUHV0RGVzY3JpcHRpb24gaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQcm9qZWN0UmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBTdHJpbmcgY29tbWl0TWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIGNhY2hlOworICBwcml2YXRlIGZpbmFsIE1ldGFEYXRhVXBkYXRlLlNlcnZlciB1cGRhdGVGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1ncjsKKworICBASW5qZWN0CisgIFB1dERlc2NyaXB0aW9uKFByb2plY3RDYWNoZSBjYWNoZSwKKyAgICAgIE1ldGFEYXRhVXBkYXRlLlNlcnZlciB1cGRhdGVGYWN0b3J5LAorICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWdyKSB7CisgICAgdGhpcy5jYWNoZSA9IGNhY2hlOworICAgIHRoaXMudXBkYXRlRmFjdG9yeSA9IHVwZGF0ZUZhY3Rvcnk7CisgICAgdGhpcy5naXRNZ3IgPSBnaXRNZ3I7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7IC8vIERlbGV0ZSB3b3VsZCBzZXQgZGVzY3JpcHRpb24gdG8gbnVsbC4KKyAgICB9CisKKyAgICBQcm9qZWN0Q29udHJvbCBjdGwgPSByZXNvdXJjZS5nZXRDb250cm9sKCk7CisgICAgSWRlbnRpZmllZFVzZXIgdXNlciA9IChJZGVudGlmaWVkVXNlcikgY3RsLmdldEN1cnJlbnRVc2VyKCk7CisgICAgaWYgKCFjdGwuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigibm90IHByb2plY3Qgb3duZXIiKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgTWV0YURhdGFVcGRhdGUgbWQgPSB1cGRhdGVGYWN0b3J5LmNyZWF0ZShyZXNvdXJjZS5nZXROYW1lS2V5KCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgUHJvamVjdENvbmZpZyBjb25maWcgPSBQcm9qZWN0Q29uZmlnLnJlYWQobWQpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOworICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuZGVzY3JpcHRpb24pKTsKKworICAgICAgICBTdHJpbmcgbXNnID0gT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5jb21taXRNZXNzYWdlKSwKKyAgICAgICAgICAiVXBkYXRlZCBkZXNjcmlwdGlvbi5cbiIpOworICAgICAgICBpZiAoIW1zZy5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgIG1zZyArPSAiXG4iOworICAgICAgICB9CisgICAgICAgIG1kLnNldEF1dGhvcih1c2VyKTsKKyAgICAgICAgbWQuc2V0TWVzc2FnZShtc2cpOworICAgICAgICBjb25maWcuY29tbWl0KG1kKTsKKyAgICAgICAgY2FjaGUuZXZpY3QoY3RsLmdldFByb2plY3QoKSk7CisgICAgICAgIGdpdE1nci5zZXRQcm9qZWN0RGVzY3JpcHRpb24oCisgICAgICAgICAgICByZXNvdXJjZS5nZXROYW1lS2V5KCksCisgICAgICAgICAgICBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOworCisgICAgICAgIHJldHVybiBTdHJpbmdzLmlzTnVsbE9yRW1wdHkocHJvamVjdC5nZXREZXNjcmlwdGlvbigpKQorICAgICAgICAgICAgPyBSZXNwb25zZS5ub25lKCkKKyAgICAgICAgICAgIDogcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgbWQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gbm90Rm91bmQpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKHJlc291cmNlLmdldE5hbWUoKSk7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJpbnZhbGlkIHByb2plY3QuY29uZmlnOiAlcyIsIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHV0UHJvamVjdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dFByb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTk2Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dFByb2plY3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdC5JbnB1dDsKKworcHVibGljIGNsYXNzIFB1dFByb2plY3QgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQcm9qZWN0UmVzb3VyY2UsIElucHV0PiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oIlByb2plY3QgXCIiICsgcmVzb3VyY2UuZ2V0TmFtZSgpCisgICAgICAgICsgIlwiIGFscmVhZHkgZXhpc3RzIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhCmluZGV4IGE2MTgyZDEuLjU5Yjc2NzAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2wuamF2YQpAQCAtMTQsMTIgKzE0LDE1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmVmQ29uZmlnU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkludmFsaWROYW1lRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKQEAgLTQxLDYgKzQ0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIAogLyoqIE1hbmFnZXMgYWNjZXNzIGNvbnRyb2wgZm9yIEdpdCByZWZlcmVuY2VzIChha2EgYnJhbmNoZXMsIHRhZ3MpLiAqLwpAQCAtNTcsNiArNjEsNyBAQAogICBwcml2YXRlIEJvb2xlYW4gb3duZXI7CiAgIHByaXZhdGUgQm9vbGVhbiBjYW5Gb3JnZUF1dGhvcjsKICAgcHJpdmF0ZSBCb29sZWFuIGNhbkZvcmdlQ29tbWl0dGVyOworICBwcml2YXRlIEJvb2xlYW4gaXNWaXNpYmxlOwogCiAgIFJlZkNvbnRyb2woUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wsIFN0cmluZyByZWYsCiAgICAgICBQZXJtaXNzaW9uQ29sbGVjdGlvbiByZWxldmFudCkgewpAQCAtMTAyLDggKzEwNywzMSBAQAogCiAgIC8qKiBDYW4gdGhpcyB1c2VyIHNlZSB0aGlzIHJlZmVyZW5jZSBleGlzdHM/ICovCiAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICByZXR1cm4gKGdldEN1cnJlbnRVc2VyKCkgaW5zdGFuY2VvZiBJbnRlcm5hbFVzZXIgfHwgY2FuUGVyZm9ybShQZXJtaXNzaW9uLlJFQUQpKQotICAgICAgICAmJiBjYW5SZWFkKCk7CisgICAgaWYgKGlzVmlzaWJsZSA9PSBudWxsKSB7CisgICAgICBpc1Zpc2libGUgPQorICAgICAgICAgIChnZXRDdXJyZW50VXNlcigpIGluc3RhbmNlb2YgSW50ZXJuYWxVc2VyIHx8IGNhblBlcmZvcm0oUGVybWlzc2lvbi5SRUFEKSkKKyAgICAgICAgICAgICAgJiYgY2FuUmVhZCgpOworICAgIH0KKyAgICByZXR1cm4gaXNWaXNpYmxlOworICB9CisKKyAgLyoqCisgICAqIFRydWUgaWYgdGhpcyByZWZlcmVuY2UgaXMgdmlzaWJsZSBieSBhbGwgUkVHSVNURVJFRF9VU0VSUworICAgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlQnlSZWdpc3RlcmVkVXNlcnMoKSB7CisgICAgTGlzdDxQZXJtaXNzaW9uUnVsZT4gYWNjZXNzID0gcmVsZXZhbnQuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlJFQUQpOworICAgIFNldDxQcm9qZWN0UmVmPiBhbGxvd3MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBTZXQ8UHJvamVjdFJlZj4gYmxvY2tzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChQZXJtaXNzaW9uUnVsZSBydWxlIDogYWNjZXNzKSB7CisgICAgICBpZiAocnVsZS5pc0Jsb2NrKCkpIHsKKyAgICAgICAgYmxvY2tzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOworICAgICAgfSBlbHNlIGlmIChydWxlLmdldEdyb3VwKCkuZ2V0VVVJRCgpLmVxdWFscyhBY2NvdW50R3JvdXAuQU5PTllNT1VTX1VTRVJTKQorICAgICAgICAgIHx8IHJ1bGUuZ2V0R3JvdXAoKS5nZXRVVUlEKCkuZXF1YWxzKEFjY291bnRHcm91cC5SRUdJU1RFUkVEX1VTRVJTKSkgeworICAgICAgICBhbGxvd3MuYWRkKHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKSk7CisgICAgICB9CisgICAgfQorICAgIGJsb2Nrcy5yZW1vdmVBbGwoYWxsb3dzKTsKKyAgICByZXR1cm4gYmxvY2tzLmlzRW1wdHkoKSAmJiAhYWxsb3dzLmlzRW1wdHkoKTsKICAgfQogCiAgIC8qKgpAQCAtMTkzLDE2ICsyMjEsNyBAQAogICAgICAgLy8gZ3JhbnRpbmcgb2YgcG93ZXJzIGJleW9uZCBwdXNoaW5nIHRvIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGZvciAoUGVybWlzc2lvblJ1bGUgcnVsZSA6IGFjY2VzcyhQZXJtaXNzaW9uLlBVU0gpKSB7Ci0gICAgICBpZiAocnVsZS5pc0Jsb2NrKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHJ1bGUuZ2V0Rm9yY2UoKSkgewotICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBjYW5Gb3JjZVBlcmZvcm0oUGVybWlzc2lvbi5QVVNIKTsKICAgfQogCiAgIC8qKgpAQCAtMjE4LDcgKzIzNyw4IEBACiAgICAgfQogICAgIGJvb2xlYW4gb3duZXI7CiAgICAgc3dpdGNoIChnZXRDdXJyZW50VXNlcigpLmdldEFjY2Vzc1BhdGgoKSkgewotICAgICAgY2FzZSBXRUJfVUk6CisgICAgICBjYXNlIFJFU1RfQVBJOgorICAgICAgY2FzZSBKU09OX1JQQzoKICAgICAgICAgb3duZXIgPSBpc093bmVyKCk7CiAgICAgICAgIGJyZWFrOwogCkBAIC0yNTgsMTEgKzI3OCwxMCBAQAogICAgICAgLy8gdGhhbiBpZiBpdCBkb2Vzbid0IGhhdmUgYSBQR1Agc2lnbmF0dXJlLgogICAgICAgLy8KICAgICAgIGlmICh0YWcuZ2V0RnVsbE1lc3NhZ2UoKS5jb250YWlucygiLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS1cbiIpKSB7Ci0gICAgICAgIHJldHVybiBvd25lciB8fCBjYW5QZXJmb3JtKFBlcm1pc3Npb24uUFVTSF9UQUcpOworICAgICAgICByZXR1cm4gb3duZXIgfHwgY2FuUGVyZm9ybShQZXJtaXNzaW9uLlBVU0hfU0lHTkVEX1RBRyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gb3duZXIgfHwgY2FuUGVyZm9ybShQZXJtaXNzaW9uLlBVU0hfVEFHKTsKICAgICAgIH0KLQogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMjg1LDcgKzMwNCw4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChnZXRDdXJyZW50VXNlcigpLmdldEFjY2Vzc1BhdGgoKSkgewotICAgICAgY2FzZSBXRUJfVUk6CisgICAgICBjYXNlIFJFU1RfQVBJOgorICAgICAgY2FzZSBKU09OX1JQQzoKICAgICAgICAgcmV0dXJuIGlzT3duZXIoKSB8fCBjYW5QdXNoV2l0aEZvcmNlKCk7CiAKICAgICAgIGNhc2UgR0lUOgpAQCAtMzIyLDYgKzM0MiwzNiBAQAogICAgIHJldHVybiBjYW5QZXJmb3JtKFBlcm1pc3Npb24uQUJBTkRPTik7CiAgIH0KIAorICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgdXNlciBjYW4gcmVtb3ZlIGEgcmV2aWV3ZXIgZm9yIGEgY2hhbmdlLiAqLworICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmVSZXZpZXdlcigpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLlJFTU9WRV9SRVZJRVdFUik7CisgIH0KKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgdXNlciBjYW4gdmlldyBkcmFmdCBjaGFuZ2VzLiAqLworICBwdWJsaWMgYm9vbGVhbiBjYW5WaWV3RHJhZnRzKCkgeworICAgIHJldHVybiBjYW5QZXJmb3JtKFBlcm1pc3Npb24uVklFV19EUkFGVFMpOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVzZXIgY2FuIHB1Ymxpc2ggZHJhZnQgY2hhbmdlcy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaERyYWZ0cygpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLlBVQkxJU0hfRFJBRlRTKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB1c2VyIGNhbiBkZWxldGUgZHJhZnQgY2hhbmdlcy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuRGVsZXRlRHJhZnRzKCkgeworICAgIHJldHVybiBjYW5QZXJmb3JtKFBlcm1pc3Npb24uREVMRVRFX0RSQUZUUyk7CisgIH0KKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgdXNlciBjYW4gZWRpdCB0b3BpYyBuYW1lcy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuRWRpdFRvcGljTmFtZSgpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLkVESVRfVE9QSUNfTkFNRSk7CisgIH0KKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgdXNlciBjYW4gZm9yY2UgZWRpdCB0b3BpYyBuYW1lcy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuRm9yY2VFZGl0VG9waWNOYW1lKCkgeworICAgIHJldHVybiBjYW5Gb3JjZVBlcmZvcm0oUGVybWlzc2lvbi5FRElUX1RPUElDX05BTUUpOworICB9CisKICAgLyoqIEFsbCB2YWx1ZSByYW5nZXMgb2YgYW55IGFsbG93ZWQgbGFiZWwgcGVybWlzc2lvbi4gKi8KICAgcHVibGljIExpc3Q8UGVybWlzc2lvblJhbmdlPiBnZXRMYWJlbFJhbmdlcygpIHsKICAgICBMaXN0PFBlcm1pc3Npb25SYW5nZT4gciA9IG5ldyBBcnJheUxpc3Q8UGVybWlzc2lvblJhbmdlPigpOwpAQCAtMzUxLDM5ICs0MDEsOTcgQEAKICAgICByZXR1cm4gbnVsbDsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIFBlcm1pc3Npb25SYW5nZSB0b1JhbmdlKFN0cmluZyBwZXJtaXNzaW9uTmFtZSwKLSAgICAgIExpc3Q8UGVybWlzc2lvblJ1bGU+IHJ1bGVMaXN0KSB7Ci0gICAgaW50IG1pbiA9IDA7Ci0gICAgaW50IG1heCA9IDA7Ci0gICAgaW50IGJsb2NrTWluID0gSW50ZWdlci5NSU5fVkFMVUU7Ci0gICAgaW50IGJsb2NrTWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0gICAgZm9yIChQZXJtaXNzaW9uUnVsZSBydWxlIDogcnVsZUxpc3QpIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWxsb3dlZFJhbmdlIHsKKyAgICBwcml2YXRlIGludCBhbGxvd01pbiA9IDA7CisgICAgcHJpdmF0ZSBpbnQgYWxsb3dNYXggPSAwOworICAgIHByaXZhdGUgaW50IGJsb2NrTWluID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgcHJpdmF0ZSBpbnQgYmxvY2tNYXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgIHZvaWQgdXBkYXRlKFBlcm1pc3Npb25SdWxlIHJ1bGUpIHsKICAgICAgIGlmIChydWxlLmlzQmxvY2soKSkgewogICAgICAgICBibG9ja01pbiA9IE1hdGgubWF4KGJsb2NrTWluLCBydWxlLmdldE1pbigpKTsKICAgICAgICAgYmxvY2tNYXggPSBNYXRoLm1pbihibG9ja01heCwgcnVsZS5nZXRNYXgoKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIHJ1bGUuZ2V0TWluKCkpOwotICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHJ1bGUuZ2V0TWF4KCkpOworICAgICAgICBhbGxvd01pbiA9IE1hdGgubWluKGFsbG93TWluLCBydWxlLmdldE1pbigpKTsKKyAgICAgICAgYWxsb3dNYXggPSBNYXRoLm1heChhbGxvd01heCwgcnVsZS5nZXRNYXgoKSk7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChibG9ja01pbiA+IEludGVnZXIuTUlOX1ZBTFVFKSB7Ci0gICAgICBtaW4gPSBNYXRoLm1heChtaW4sIGJsb2NrTWluICsgMSk7CisKKyAgICBpbnQgZ2V0QWxsb3dNaW4oKSB7CisgICAgICByZXR1cm4gYWxsb3dNaW47CiAgICAgfQotICAgIGlmIChibG9ja01heCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICBtYXggPSBNYXRoLm1pbihtYXgsIGJsb2NrTWF4IC0gMSk7CisgICAgaW50IGdldEFsbG93TWF4KCkgeworICAgICAgcmV0dXJuIGFsbG93TWF4OwogICAgIH0KKyAgICBpbnQgZ2V0QmxvY2tNaW4oKSB7CisgICAgICAvLyBBTExPVyB3aW5zIG92ZXIgQkxPQ0sgb24gdGhlIHNhbWUgcHJvamVjdAorICAgICAgcmV0dXJuIE1hdGgubWluKGJsb2NrTWluLCBhbGxvd01pbiAtIDEpOworICAgIH0KKyAgICBpbnQgZ2V0QmxvY2tNYXgoKSB7CisgICAgICAvLyBBTExPVyB3aW5zIG92ZXIgQkxPQ0sgb24gdGhlIHNhbWUgcHJvamVjdAorICAgICAgcmV0dXJuIE1hdGgubWF4KGJsb2NrTWF4LCBhbGxvd01heCArIDEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUGVybWlzc2lvblJhbmdlIHRvUmFuZ2UoU3RyaW5nIHBlcm1pc3Npb25OYW1lLAorICAgICAgTGlzdDxQZXJtaXNzaW9uUnVsZT4gcnVsZUxpc3QpIHsKKyAgICBNYXA8UHJvamVjdFJlZiwgQWxsb3dlZFJhbmdlPiByYW5nZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKFBlcm1pc3Npb25SdWxlIHJ1bGUgOiBydWxlTGlzdCkgeworICAgICAgUHJvamVjdFJlZiBwID0gcmVsZXZhbnQuZ2V0UnVsZVByb3BzKHJ1bGUpOworICAgICAgQWxsb3dlZFJhbmdlIHIgPSByYW5nZXMuZ2V0KHApOworICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICByID0gbmV3IEFsbG93ZWRSYW5nZSgpOworICAgICAgICByYW5nZXMucHV0KHAsIHIpOworICAgICAgfQorICAgICAgci51cGRhdGUocnVsZSk7CisgICAgfQorICAgIGludCBhbGxvd01pbiA9IDA7CisgICAgaW50IGFsbG93TWF4ID0gMDsKKyAgICBpbnQgYmxvY2tNaW4gPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICBpbnQgYmxvY2tNYXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICBmb3IgKEFsbG93ZWRSYW5nZSByIDogcmFuZ2VzLnZhbHVlcygpKSB7CisgICAgICBhbGxvd01pbiA9IE1hdGgubWluKGFsbG93TWluLCByLmdldEFsbG93TWluKCkpOworICAgICAgYWxsb3dNYXggPSBNYXRoLm1heChhbGxvd01heCwgci5nZXRBbGxvd01heCgpKTsKKyAgICAgIGJsb2NrTWluID0gTWF0aC5tYXgoYmxvY2tNaW4sIHIuZ2V0QmxvY2tNaW4oKSk7CisgICAgICBibG9ja01heCA9IE1hdGgubWluKGJsb2NrTWF4LCByLmdldEJsb2NrTWF4KCkpOworICAgIH0KKworICAgIC8vIEJMT0NLIHdpbnMgb3ZlciBBTExPVyBhY3Jvc3MgcHJvamVjdHMKKyAgICBpbnQgbWluID0gTWF0aC5tYXgoYWxsb3dNaW4sIGJsb2NrTWluICsgMSk7CisgICAgaW50IG1heCA9IE1hdGgubWluKGFsbG93TWF4LCBibG9ja01heCAtIDEpOwogICAgIHJldHVybiBuZXcgUGVybWlzc2lvblJhbmdlKHBlcm1pc3Npb25OYW1lLCBtaW4sIG1heCk7CiAgIH0KIAogICAvKiogVHJ1ZSBpZiB0aGUgdXNlciBoYXMgdGhpcyBwZXJtaXNzaW9uLiBXb3JrcyBvbmx5IGZvciBub24gbGFiZWxzLiAqLwogICBib29sZWFuIGNhblBlcmZvcm0oU3RyaW5nIHBlcm1pc3Npb25OYW1lKSB7CiAgICAgTGlzdDxQZXJtaXNzaW9uUnVsZT4gYWNjZXNzID0gYWNjZXNzKHBlcm1pc3Npb25OYW1lKTsKKyAgICBTZXQ8UHJvamVjdFJlZj4gYWxsb3dzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgU2V0PFByb2plY3RSZWY+IGJsb2NrcyA9IFNldHMubmV3SGFzaFNldCgpOwogICAgIGZvciAoUGVybWlzc2lvblJ1bGUgcnVsZSA6IGFjY2VzcykgewogICAgICAgaWYgKHJ1bGUuaXNCbG9jaygpICYmICFydWxlLmdldEZvcmNlKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBibG9ja3MuYWRkKHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbGxvd3MuYWRkKHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKSk7CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAhYWNjZXNzLmlzRW1wdHkoKTsKKyAgICBibG9ja3MucmVtb3ZlQWxsKGFsbG93cyk7CisgICAgcmV0dXJuIGJsb2Nrcy5pc0VtcHR5KCkgJiYgIWFsbG93cy5pc0VtcHR5KCk7CisgIH0KKworICAvKiogVHJ1ZSBpZiB0aGUgdXNlciBoYXMgZm9yY2UgdGhpcyBwZXJtaXNzaW9uLiBXb3JrcyBvbmx5IGZvciBub24gbGFiZWxzLiAqLworICBwcml2YXRlIGJvb2xlYW4gY2FuRm9yY2VQZXJmb3JtKFN0cmluZyBwZXJtaXNzaW9uTmFtZSkgeworICAgIExpc3Q8UGVybWlzc2lvblJ1bGU+IGFjY2VzcyA9IGFjY2VzcyhwZXJtaXNzaW9uTmFtZSk7CisgICAgU2V0PFByb2plY3RSZWY+IGFsbG93cyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIFNldDxQcm9qZWN0UmVmPiBibG9ja3MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKFBlcm1pc3Npb25SdWxlIHJ1bGUgOiBhY2Nlc3MpIHsKKyAgICAgIGlmIChydWxlLmlzQmxvY2soKSkgeworICAgICAgICBibG9ja3MuYWRkKHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKSk7CisgICAgICB9IGVsc2UgaWYgKHJ1bGUuZ2V0Rm9yY2UoKSkgeworICAgICAgICBhbGxvd3MuYWRkKHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKSk7CisgICAgICB9CisgICAgfQorICAgIGJsb2Nrcy5yZW1vdmVBbGwoYWxsb3dzKTsKKyAgICByZXR1cm4gYmxvY2tzLmlzRW1wdHkoKSAmJiAhYWxsb3dzLmlzRW1wdHkoKTsKICAgfQogCiAgIC8qKiBSdWxlcyBmb3IgdGhlIGdpdmVuIHBlcm1pc3Npb24sIG9yIHRoZSBlbXB0eSBsaXN0LiAqLwpAQCAtNDI4LDcgKzUzNiwxMiBAQAogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZXN0RXhhbXBsZShTdHJpbmcgcGF0dGVybikgewogICAgIGlmIChpc1JFKHBhdHRlcm4pKSB7Ci0gICAgICByZXR1cm4gdG9SZWdFeHAocGF0dGVybikudG9BdXRvbWF0b24oKS5nZXRTaG9ydGVzdEV4YW1wbGUodHJ1ZSk7CisgICAgICAvLyBTaW5jZSBCcmljcyB3aWxsIHN1YnN0aXR1dGUgZG90IFsuXSB3aXRoIFwwIHdoZW4gZ2VuZXJhdGluZworICAgICAgLy8gc2hvcnRlc3QgZXhhbXBsZSwgYW55IHVzYWdlIG9mIGRvdCB3aWxsIGZhaWwgaW4KKyAgICAgIC8vIFJlcG9zaXRvcnkuaXNWYWxpZFJlZk5hbWUoKSBpZiBub3QgY29tYmluZWQgd2l0aCBzdGFyIFsqXS4KKyAgICAgIC8vIFRvIGdldCBhcm91bmQgdGhpcywgd2Ugc3Vic3RpdHV0ZSB0aGUgXDAgd2l0aCBhbiBhcmJpdHJhcnkKKyAgICAgIC8vIGFjY2VwdGVkIGNoYXJhY3Rlci4KKyAgICAgIHJldHVybiB0b1JlZ0V4cChwYXR0ZXJuKS50b0F1dG9tYXRvbigpLmdldFNob3J0ZXN0RXhhbXBsZSh0cnVlKS5yZXBsYWNlKCdcMCcsICctJyk7CiAgICAgfSBlbHNlIGlmIChwYXR0ZXJuLmVuZHNXaXRoKCIvKiIpKSB7CiAgICAgICByZXR1cm4gcGF0dGVybi5zdWJzdHJpbmcoMCwgcGF0dGVybi5sZW5ndGgoKSAtIDEpICsgJzEnOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVwb3NpdG9yeVN0YXRpc3RpY3MuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZXBvc2l0b3J5U3RhdGlzdGljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Mjk0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVwb3NpdG9yeVN0YXRpc3RpY3MuamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNhc2VGb3JtYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitjbGFzcyBSZXBvc2l0b3J5U3RhdGlzdGljcyBleHRlbmRzIFRyZWVNYXA8U3RyaW5nLCBPYmplY3Q+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIFJlcG9zaXRvcnlTdGF0aXN0aWNzKFByb3BlcnRpZXMgcCkgeworICAgIGZvciAoRW50cnk8T2JqZWN0LCBPYmplY3Q+IGUgOiBwLmVudHJ5U2V0KCkpIHsKKyAgICAgIHB1dChDYXNlRm9ybWF0LkxPV0VSX0NBTUVMLnRvKENhc2VGb3JtYXQuTE9XRVJfVU5ERVJTQ09SRSwKKyAgICAgICAgICBlLmdldEtleSgpLnRvU3RyaW5nKCkpLCBlLmdldFZhbHVlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1J1bGVFdmFsRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUnVsZUV2YWxFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFlMTFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1J1bGVFdmFsRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK3B1YmxpYyBjbGFzcyBSdWxlRXZhbEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHB1YmxpYyBSdWxlRXZhbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICB9CisKKyAgUnVsZUV2YWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NlY3Rpb25NYXRjaGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2VjdGlvbk1hdGNoZXIuamF2YQppbmRleCAxYzcwYjA0Li42ZjhhZjgwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2VjdGlvbk1hdGNoZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2VjdGlvbk1hdGNoZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXJhbWV0ZXJpemVkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogCiBpbXBvcnQgZGsuYnJpY3MuYXV0b21hdG9uLkF1dG9tYXRvbjsKIApAQCAtMzEsMzMgKzMyLDM3IEBACiAgKiBmYXN0ZXIgc2VsZWN0aW9uIG9mIHdoaWNoIHNlY3Rpb25zIGFyZSByZWxldmFudCB0byBhbnkgZ2l2ZW4gaW5wdXQgcmVmZXJlbmNlLgogICovCiBhYnN0cmFjdCBjbGFzcyBTZWN0aW9uTWF0Y2hlciB7Ci0gIHN0YXRpYyBTZWN0aW9uTWF0Y2hlciB3cmFwKEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICBzdGF0aWMgU2VjdGlvbk1hdGNoZXIgd3JhcChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CiAgICAgU3RyaW5nIHJlZiA9IHNlY3Rpb24uZ2V0TmFtZSgpOwogICAgIGlmIChBY2Nlc3NTZWN0aW9uLmlzVmFsaWQocmVmKSkgewotICAgICAgcmV0dXJuIHdyYXAocmVmLCBzZWN0aW9uKTsKKyAgICAgIHJldHVybiB3cmFwKHByb2plY3QsIHJlZiwgc2VjdGlvbik7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgfQogCi0gIHN0YXRpYyBTZWN0aW9uTWF0Y2hlciB3cmFwKFN0cmluZyBwYXR0ZXJuLCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKKyAgc3RhdGljIFNlY3Rpb25NYXRjaGVyIHdyYXAoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyBwYXR0ZXJuLAorICAgICAgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CiAgICAgaWYgKHBhdHRlcm4uY29udGFpbnMoIiR7IikpIHsKLSAgICAgIHJldHVybiBuZXcgRXhwYW5kUGFyYW1ldGVycyhwYXR0ZXJuLCBzZWN0aW9uKTsKKyAgICAgIHJldHVybiBuZXcgRXhwYW5kUGFyYW1ldGVycyhwcm9qZWN0LCBwYXR0ZXJuLCBzZWN0aW9uKTsKIAogICAgIH0gZWxzZSBpZiAoaXNSRShwYXR0ZXJuKSkgewotICAgICAgcmV0dXJuIG5ldyBSZWdleHAocGF0dGVybiwgc2VjdGlvbik7CisgICAgICByZXR1cm4gbmV3IFJlZ2V4cChwcm9qZWN0LCBwYXR0ZXJuLCBzZWN0aW9uKTsKIAogICAgIH0gZWxzZSBpZiAocGF0dGVybi5lbmRzV2l0aCgiLyoiKSkgewotICAgICAgcmV0dXJuIG5ldyBQcmVmaXgocGF0dGVybi5zdWJzdHJpbmcoMCwgcGF0dGVybi5sZW5ndGgoKSAtIDEpLCBzZWN0aW9uKTsKKyAgICAgIHJldHVybiBuZXcgUHJlZml4KHByb2plY3QsIHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCkgLSAxKSwKKyAgICAgICAgICBzZWN0aW9uKTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IEV4YWN0KHBhdHRlcm4sIHNlY3Rpb24pOworICAgICAgcmV0dXJuIG5ldyBFeGFjdChwcm9qZWN0LCBwYXR0ZXJuLCBzZWN0aW9uKTsKICAgICB9CiAgIH0KIAorICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDsKICAgZmluYWwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uOwogCi0gIFNlY3Rpb25NYXRjaGVyKEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICBTZWN0aW9uTWF0Y2hlcihQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CisgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uOwogICB9CiAKQEAgLTY2LDggKzcxLDggQEAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhhY3QgZXh0ZW5kcyBTZWN0aW9uTWF0Y2hlciB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhwZWN0OwogCi0gICAgRXhhY3QoU3RyaW5nIG5hbWUsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgewotICAgICAgc3VwZXIoc2VjdGlvbik7CisgICAgRXhhY3QoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyBuYW1lLCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIHNlY3Rpb24pOwogICAgICAgZXhwZWN0ID0gbmFtZTsKICAgICB9CiAKQEAgLTgwLDggKzg1LDggQEAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlZml4IGV4dGVuZHMgU2VjdGlvbk1hdGNoZXIgewogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKIAotICAgIFByZWZpeChTdHJpbmcgcGZ4LCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKLSAgICAgIHN1cGVyKHNlY3Rpb24pOworICAgIFByZWZpeChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHBmeCwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBzZWN0aW9uKTsKICAgICAgIHByZWZpeCA9IHBmeDsKICAgICB9CiAKQEAgLTk0LDggKzk5LDggQEAKICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVnZXhwIGV4dGVuZHMgU2VjdGlvbk1hdGNoZXIgewogICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBwYXR0ZXJuOwogCi0gICAgUmVnZXhwKFN0cmluZyByZSwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7Ci0gICAgICBzdXBlcihzZWN0aW9uKTsKKyAgICBSZWdleHAoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyByZSwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBzZWN0aW9uKTsKICAgICAgIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmUpOwogICAgIH0KIApAQCAtMTA5LDggKzExNCw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJpemVkU3RyaW5nIHRlbXBsYXRlOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKIAotICAgIEV4cGFuZFBhcmFtZXRlcnMoU3RyaW5nIHBhdHRlcm4sIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgewotICAgICAgc3VwZXIoc2VjdGlvbik7CisgICAgRXhwYW5kUGFyYW1ldGVycyhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHBhdHRlcm4sCisgICAgICAgIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgICAgc3VwZXIocHJvamVjdCwgc2VjdGlvbik7CiAgICAgICB0ZW1wbGF0ZSA9IG5ldyBQYXJhbWV0ZXJpemVkU3RyaW5nKHBhdHRlcm4pOwogCiAgICAgICBpZiAoaXNSRShwYXR0ZXJuKSkgewpAQCAtMTQxLDcgKzE0Nyw3IEBACiAgICAgICAgIHUgPSB1c2VybmFtZTsKICAgICAgIH0KIAotICAgICAgU2VjdGlvbk1hdGNoZXIgbmV4dCA9IHdyYXAoCisgICAgICBTZWN0aW9uTWF0Y2hlciBuZXh0ID0gd3JhcChwcm9qZWN0LAogICAgICAgICAgIHRlbXBsYXRlLnJlcGxhY2UoQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJ1c2VybmFtZSIsIHUpKSwKICAgICAgICAgICBzZWN0aW9uKTsKICAgICAgIHJldHVybiBuZXh0ICE9IG51bGwgPyBuZXh0Lm1hdGNoKHJlZiwgdXNlcm5hbWUpIDogZmFsc2U7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0RGFzaGJvYXJkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0RGFzaGJvYXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwZGExMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZXREYXNoYm9hcmQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TZXREYXNoYm9hcmQuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitjbGFzcyBTZXREYXNoYm9hcmQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxEYXNoYm9hcmRSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIGlkOworICAgIFN0cmluZyBjb21taXRNZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkPiBkZWZhdWx0U2V0dGVyOworCisgIEBJbmplY3QKKyAgU2V0RGFzaGJvYXJkKFByb3ZpZGVyPFNldERlZmF1bHREYXNoYm9hcmQ+IGRlZmF1bHRTZXR0ZXIpIHsKKyAgICB0aGlzLmRlZmF1bHRTZXR0ZXIgPSBkZWZhdWx0U2V0dGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoRGFzaGJvYXJkUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICBFeGNlcHRpb24geworICAgIGlmIChyZXNvdXJjZS5pc1Byb2plY3REZWZhdWx0KCkpIHsKKyAgICAgIHJldHVybiBkZWZhdWx0U2V0dGVyLmdldCgpLmFwcGx5KHJlc291cmNlLCBpbnB1dCk7CisgICAgfQorCisgICAgLy8gVE9ETzogSW1wbGVtZW50IGNyZWF0aW9uL3VwZGF0ZSBvZiBkYXNoYm9hcmRzIGJ5IEFQSS4KKyAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0RGVmYXVsdERhc2hib2FyZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldERlZmF1bHREYXNoYm9hcmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjcwYmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldERlZmF1bHREYXNoYm9hcmQuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuRGFzaGJvYXJkc0NvbGxlY3Rpb24uRGFzaGJvYXJkSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TZXREYXNoYm9hcmQuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworY2xhc3MgU2V0RGVmYXVsdERhc2hib2FyZCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PERhc2hib2FyZFJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIgdXBkYXRlRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBEYXNoYm9hcmRzQ29sbGVjdGlvbiBkYXNoYm9hcmRzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdldERhc2hib2FyZD4gZ2V0OworCisgIEBPcHRpb24obmFtZSA9ICItLWluaGVyaXRlZCIsIHVzYWdlID0gInNldCBkYXNoYm9hcmQgaW5oZXJpdGVkIGJ5IGNoaWxkcmVuIikKKyAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRlZDsKKworICBASW5qZWN0CisgIFNldERlZmF1bHREYXNoYm9hcmQoUHJvamVjdENhY2hlIGNhY2hlLAorICAgICAgTWV0YURhdGFVcGRhdGUuU2VydmVyIHVwZGF0ZUZhY3RvcnksCisgICAgICBEYXNoYm9hcmRzQ29sbGVjdGlvbiBkYXNoYm9hcmRzLAorICAgICAgUHJvdmlkZXI8R2V0RGFzaGJvYXJkPiBnZXQpIHsKKyAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgdGhpcy51cGRhdGVGYWN0b3J5ID0gdXBkYXRlRmFjdG9yeTsKKyAgICB0aGlzLmRhc2hib2FyZHMgPSBkYXNoYm9hcmRzOworICAgIHRoaXMuZ2V0ID0gZ2V0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoRGFzaGJvYXJkUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICBFeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOyAvLyBEZWxldGUgd291bGQgc2V0IGlucHV0IHRvIG51bGwuCisgICAgfQorICAgIGlucHV0LmlkID0gU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5pZCk7CisKKyAgICBQcm9qZWN0Q29udHJvbCBjdGwgPSByZXNvdXJjZS5nZXRDb250cm9sKCk7CisgICAgSWRlbnRpZmllZFVzZXIgdXNlciA9IChJZGVudGlmaWVkVXNlcikgY3RsLmdldEN1cnJlbnRVc2VyKCk7CisgICAgaWYgKCFjdGwuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigibm90IHByb2plY3Qgb3duZXIiKTsKKyAgICB9CisKKyAgICBEYXNoYm9hcmRSZXNvdXJjZSB0YXJnZXQgPSBudWxsOworICAgIGlmIChpbnB1dC5pZCAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICB0YXJnZXQgPSBkYXNoYm9hcmRzLnBhcnNlKAorICAgICAgICAgICAgbmV3IFByb2plY3RSZXNvdXJjZShjdGwpLAorICAgICAgICAgICAgSWRTdHJpbmcuZnJvbVVybChpbnB1dC5pZCkpOworICAgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJkYXNoYm9hcmQgIiArIGlucHV0LmlkICsgIiBub3QgZm91bmQiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworICAgICAgTWV0YURhdGFVcGRhdGUgbWQgPSB1cGRhdGVGYWN0b3J5LmNyZWF0ZShjdGwuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgICB0cnkgeworICAgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7CisgICAgICAgIGlmIChpbmhlcml0ZWQpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldERlZmF1bHREYXNoYm9hcmQoaW5wdXQuaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByb2plY3Quc2V0TG9jYWxEZWZhdWx0RGFzaGJvYXJkKGlucHV0LmlkKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtc2cgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0LmNvbW1pdE1lc3NhZ2UpLAorICAgICAgICAgIGlucHV0LmlkID09IG51bGwKKyAgICAgICAgICAgID8gIlJlbW92ZWQgZGVmYXVsdCBkYXNoYm9hcmQuXG4iCisgICAgICAgICAgICA6IFN0cmluZy5mb3JtYXQoIkNoYW5nZWQgZGVmYXVsdCBkYXNoYm9hcmQgdG8gJXMuXG4iLCBpbnB1dC5pZCkpOworICAgICAgICBpZiAoIW1zZy5lbmRzV2l0aCgiXG4iKSkgeworICAgICAgICAgIG1zZyArPSAiXG4iOworICAgICAgICB9CisgICAgICAgIG1kLnNldEF1dGhvcih1c2VyKTsKKyAgICAgICAgbWQuc2V0TWVzc2FnZShtc2cpOworICAgICAgICBjb25maWcuY29tbWl0KG1kKTsKKyAgICAgICAgY2FjaGUuZXZpY3QoY3RsLmdldFByb2plY3QoKSk7CisKKyAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7CisgICAgICAgICAgRGFzaGJvYXJkSW5mbyBpbmZvID0gZ2V0LmdldCgpLmFwcGx5KHRhcmdldCk7CisgICAgICAgICAgaW5mby5pc0RlZmF1bHQgPSB0cnVlOworICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXNwb25zZS5ub25lKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBtZC5jbG9zZSgpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBub3RGb3VuZCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oY3RsLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiaW52YWxpZCBwcm9qZWN0LmNvbmZpZzogJXMiLCBlLmdldE1lc3NhZ2UoKSkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDcmVhdGVEZWZhdWx0IGltcGxlbWVudHMKKyAgICAgIFJlc3RNb2RpZnlWaWV3PFByb2plY3RSZXNvdXJjZSwgU2V0RGFzaGJvYXJkLklucHV0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkPiBzZXREZWZhdWx0OworCisgICAgQE9wdGlvbihuYW1lID0gIi0taW5oZXJpdGVkIiwgdXNhZ2UgPSAic2V0IGRhc2hib2FyZCBpbmhlcml0ZWQgYnkgY2hpbGRyZW4iKQorICAgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0ZWQ7CisKKyAgICBASW5qZWN0CisgICAgQ3JlYXRlRGVmYXVsdChQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkPiBzZXREZWZhdWx0KSB7CisgICAgICB0aGlzLnNldERlZmF1bHQgPSBzZXREZWZhdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoUHJvamVjdFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICAgIEV4Y2VwdGlvbiB7CisgICAgICBTZXREZWZhdWx0RGFzaGJvYXJkIHNldCA9IHNldERlZmF1bHQuZ2V0KCk7CisgICAgICBzZXQuaW5oZXJpdGVkID0gaW5oZXJpdGVkOworICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoc2V0LmFwcGx5KAorICAgICAgICAgIERhc2hib2FyZFJlc291cmNlLnByb2plY3REZWZhdWx0KHJlc291cmNlLmdldENvbnRyb2woKSksCisgICAgICAgICAgaW5wdXQpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZXRIZWFkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0SGVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlN2E0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0SGVhZC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlNldEhlYWQuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBTZXRIZWFkIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UHJvamVjdFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgcmVmOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlcjsKKworICBASW5qZWN0CisgIFNldEhlYWQoR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIElkZW50aWZpZWRVc2VyIGlkZW50aWZpZWRVc2VyKSB7CisgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOworICAgIHRoaXMuaWRlbnRpZmllZFVzZXIgPSBpZGVudGlmaWVkVXNlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KFByb2plY3RSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgdGhyb3dzIEF1dGhFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGlmICghcnNyYy5nZXRDb250cm9sKCkuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigicmVzdHJpY3RlZCB0byBwcm9qZWN0IG93bmVyIik7CisgICAgfQorICAgIGlmIChpbnB1dCA9PSBudWxsIHx8IFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbnB1dC5yZWYpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigicmVmIHJlcXVpcmVkIik7CisgICAgfQorICAgIFN0cmluZyByZWYgPSBpbnB1dC5yZWY7CisgICAgaWYgKCFyZWYuc3RhcnRzV2l0aChDb25zdGFudHMuUl9SRUZTKSkgeworICAgICAgcmVmID0gQ29uc3RhbnRzLlJfSEVBRFMgKyByZWY7CisgICAgfQorCisgICAgUmVwb3NpdG9yeSByZXBvID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHJzcmMuZ2V0TmFtZUtleSgpKTsKKyAgICAgIGlmIChyZXBvLmdldFJlZihyZWYpID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJSZWYgTm90IEZvdW5kOiAlcyIsIHJlZikpOworICAgICAgfQorCisgICAgICBpZiAoIXJlcG8uZ2V0UmVmKENvbnN0YW50cy5IRUFEKS5nZXRUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKHJlZikpIHsKKyAgICAgICAgZmluYWwgUmVmVXBkYXRlIHUgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuSEVBRCwgdHJ1ZSk7CisgICAgICAgIHUuc2V0UmVmTG9nSWRlbnQoaWRlbnRpZmllZFVzZXIubmV3UmVmTG9nSWRlbnQoKSk7CisgICAgICAgIFJlZlVwZGF0ZS5SZXN1bHQgcmVzID0gdS5saW5rKHJlZik7CisgICAgICAgIHN3aXRjaChyZXMpIHsKKyAgICAgICAgICBjYXNlIE5PX0NIQU5HRToKKyAgICAgICAgICBjYXNlIFJFTkFNRUQ6CisgICAgICAgICAgY2FzZSBGT1JDRUQ6CisgICAgICAgICAgY2FzZSBORVc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTZXR0aW5nIEhFQUQgZmFpbGVkIHdpdGggIiArIHJlcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZWY7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKHJzcmMuZ2V0TmFtZSgpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKHJlcG8gIT0gbnVsbCkgeworICAgICAgICByZXBvLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0UGFyZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0UGFyZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmYjVkZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZXRQYXJlbnQuamF2YQpAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1ldGFEYXRhVXBkYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TZXRQYXJlbnQuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CisKK2NsYXNzIFNldFBhcmVudCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFByb2plY3RSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIHBhcmVudDsKKyAgICBTdHJpbmcgY29tbWl0TWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIGNhY2hlOworICBwcml2YXRlIGZpbmFsIE1ldGFEYXRhVXBkYXRlLlNlcnZlciB1cGRhdGVGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0czsKKworICBASW5qZWN0CisgIFNldFBhcmVudChQcm9qZWN0Q2FjaGUgY2FjaGUsCisgICAgICBNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIgdXBkYXRlRmFjdG9yeSwKKyAgICAgIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0cykgeworICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKyAgICB0aGlzLnVwZGF0ZUZhY3RvcnkgPSB1cGRhdGVGYWN0b3J5OworICAgIHRoaXMuYWxsUHJvamVjdHMgPSBhbGxQcm9qZWN0czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwKKyAgICAgIEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdENvbnRyb2wgY3RsID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIGN0bC5nZXRDdXJyZW50VXNlcigpOworICAgIGlmICghdXNlci5nZXRDYXBhYmlsaXRpZXMoKS5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIm5vdCBhZG1pbmlzdHJhdG9yIik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIE1ldGFEYXRhVXBkYXRlIG1kID0gdXBkYXRlRmFjdG9yeS5jcmVhdGUocmVzb3VyY2UuZ2V0TmFtZUtleSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIFByb2plY3RDb25maWcgY29uZmlnID0gUHJvamVjdENvbmZpZy5yZWFkKG1kKTsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gY29uZmlnLmdldFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXRQYXJlbnROYW1lKFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQucGFyZW50KSk7CisKKyAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuY29tbWl0TWVzc2FnZSk7CisgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgeworICAgICAgICAgIG1zZyA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJDaGFuZ2VkIHBhcmVudCB0byAlcy5cbiIsCisgICAgICAgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKHByb2plY3QuZ2V0UGFyZW50TmFtZSgpLCBhbGxQcm9qZWN0cy5nZXQoKSkpOworICAgICAgICB9IGVsc2UgaWYgKCFtc2cuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICBtc2cgKz0gIlxuIjsKKyAgICAgICAgfQorICAgICAgICBtZC5zZXRBdXRob3IodXNlcik7CisgICAgICAgIG1kLnNldE1lc3NhZ2UobXNnKTsKKyAgICAgICAgY29uZmlnLmNvbW1pdChtZCk7CisgICAgICAgIGNhY2hlLmV2aWN0KGN0bC5nZXRQcm9qZWN0KCkpOworCisgICAgICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnROYW1lID0gcHJvamVjdC5nZXRQYXJlbnQoYWxsUHJvamVjdHMpOworICAgICAgICByZXR1cm4gcGFyZW50TmFtZSAhPSBudWxsID8gcGFyZW50TmFtZS5nZXQoKSA6ICIiOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgbWQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gbm90Rm91bmQpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKHJlc291cmNlLmdldE5hbWUoKSk7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJpbnZhbGlkIHByb2plY3QuY29uZmlnOiAlcyIsIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU3VibWl0UnVsZUV2YWx1YXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1N1Ym1pdFJ1bGVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDk1NjdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1N1Ym1pdFJ1bGVFdmFsdWF0b3IuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKKworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmNvbXBpbGVyLkNvbXBpbGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5MaXN0VGVybTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZzsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5WYXJpYWJsZVRlcm07CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworLyoqCisgKiBFdmFsdWF0ZXMgYSBzdWJtaXQtbGlrZSBQcm9sb2cgcnVsZSBmb3VuZCBpbiB0aGUgcnVsZXMucGwgZmlsZSBvZiB0aGUgY3VycmVudAorICogcHJvamVjdCBhbmQgZmlsdGVycyB0aGUgcmVzdWx0cyB0aHJvdWdoIHJ1bGVzIGZvdW5kIGluIHRoZSBwYXJlbnQgcHJvamVjdHMsCisgKiBhbGwgdGhlIHdheSB1cCB0byBBbGwtUHJvamVjdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJtaXRSdWxlRXZhbHVhdG9yIHsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldCBwYXRjaFNldDsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbDsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2w7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlIGNoYW5nZTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEYXRhIGNkOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZmFzdEV2YWxMYWJlbHM7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzZXJSdWxlTG9jYXRvck5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzZXJSdWxlV3JhcHBlck5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbHRlclJ1bGVMb2NhdG9yTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsdGVyUnVsZVdyYXBwZXJOYW1lOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2tpcEZpbHRlcnM7CisgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gcnVsZXNJbnB1dFN0cmVhbTsKKworICBwcml2YXRlIFRlcm0gc3VibWl0UnVsZTsKKyAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7CisKKyAgLyoqCisgICAqIEBwYXJhbSB1c2VyUnVsZUxvY2F0b3JOYW1lIFRoZSBuYW1lIG9mIHRoZSBydWxlIHVzZWQgdG8gbG9jYXRlIHRoZQorICAgKiAgICAgICAgdXNlci1zdXBwbGllZCBydWxlLgorICAgKiBAcGFyYW0gdXNlclJ1bGVXcmFwcGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgd3JhcHBlciBydWxlIHVzZWQgdG8gZXZhbHVhdGUKKyAgICogICAgICAgIHRoZSB1c2VyLXN1cHBsaWVkIHJ1bGUuCisgICAqIEBwYXJhbSBmaWx0ZXJSdWxlTG9jYXRvck5hbWUgVGhlIG5hbWUgb2YgdGhlIHJ1bGUgdXNlZCB0byBsb2NhdGUgdGhlIGZpbHRlcgorICAgKiAgICAgICAgcnVsZS4KKyAgICogQHBhcmFtIGZpbHRlclJ1bGVXcmFwcGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVsZSB1c2VkIHRvIGV2YWx1YXRlIHRoZQorICAgKiAgICAgICAgZmlsdGVyIHJ1bGUuCisgICAqLworICBwdWJsaWMgU3VibWl0UnVsZUV2YWx1YXRvcihSZXZpZXdEYiBkYiwgUGF0Y2hTZXQgcGF0Y2hTZXQsCisgICAgICBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCwKKyAgICAgIENoYW5nZUNvbnRyb2wgY2hhbmdlQ29udHJvbCwgQ2hhbmdlIGNoYW5nZSwgQE51bGxhYmxlIENoYW5nZURhdGEgY2QsCisgICAgICBib29sZWFuIGZhc3RFdmFsTGFiZWxzLAorICAgICAgU3RyaW5nIHVzZXJSdWxlTG9jYXRvck5hbWUsIFN0cmluZyB1c2VyUnVsZVdyYXBwZXJOYW1lLAorICAgICAgU3RyaW5nIGZpbHRlclJ1bGVMb2NhdG9yTmFtZSwgU3RyaW5nIGZpbHRlclJ1bGVXcmFwcGVyTmFtZSkgeworICAgIHRoaXMoZGIsIHBhdGNoU2V0LCBwcm9qZWN0Q29udHJvbCwgY2hhbmdlQ29udHJvbCwgY2hhbmdlLCBjZCwKKyAgICAgICAgZmFzdEV2YWxMYWJlbHMsIHVzZXJSdWxlTG9jYXRvck5hbWUsIHVzZXJSdWxlV3JhcHBlck5hbWUsCisgICAgICAgIGZpbHRlclJ1bGVMb2NhdG9yTmFtZSwgZmlsdGVyUnVsZVdyYXBwZXJOYW1lLCBmYWxzZSwgbnVsbCk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIHVzZXJSdWxlTG9jYXRvck5hbWUgVGhlIG5hbWUgb2YgdGhlIHJ1bGUgdXNlZCB0byBsb2NhdGUgdGhlCisgICAqICAgICAgICB1c2VyLXN1cHBsaWVkIHJ1bGUuCisgICAqIEBwYXJhbSB1c2VyUnVsZVdyYXBwZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIHJ1bGUgdXNlZCB0byBldmFsdWF0ZQorICAgKiAgICAgICAgdGhlIHVzZXItc3VwcGxpZWQgcnVsZS4KKyAgICogQHBhcmFtIGZpbHRlclJ1bGVMb2NhdG9yTmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVsZSB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsdGVyCisgICAqICAgICAgICBydWxlLgorICAgKiBAcGFyYW0gZmlsdGVyUnVsZVdyYXBwZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBydWxlIHVzZWQgdG8gZXZhbHVhdGUgdGhlCisgICAqICAgICAgICBmaWx0ZXIgcnVsZS4KKyAgICogQHBhcmFtIHNraXBTdWJtaXRGaWx0ZXJzIGlmIDxjb2RlPnRydWU8L2NvZGU+IHN1Ym1pdCBmaWx0ZXIgd2lsbCBub3QgYmUKKyAgICogICAgICAgIGFwcGxpZWQKKyAgICogQHBhcmFtIHJ1bGVzIHdoZW4gbm9uLW51bGwgdGhlIHJ1bGVzIHdpbGwgYmUgcmVhZCBmcm9tIHRoaXMgaW5wdXQgc3RyZWFtCisgICAqICAgICAgICBpbnN0ZWFkIG9mIHJlZnMvbWV0YS9jb25maWc6cnVsZXMucGwgZmlsZQorICAgKi8KKyAgcHVibGljIFN1Ym1pdFJ1bGVFdmFsdWF0b3IoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wsCisgICAgICBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2wsIENoYW5nZSBjaGFuZ2UsIEBOdWxsYWJsZSBDaGFuZ2VEYXRhIGNkLAorICAgICAgYm9vbGVhbiBmYXN0RXZhbExhYmVscywKKyAgICAgIFN0cmluZyB1c2VyUnVsZUxvY2F0b3JOYW1lLCBTdHJpbmcgdXNlclJ1bGVXcmFwcGVyTmFtZSwKKyAgICAgIFN0cmluZyBmaWx0ZXJSdWxlTG9jYXRvck5hbWUsIFN0cmluZyBmaWx0ZXJSdWxlV3JhcHBlck5hbWUsCisgICAgICBib29sZWFuIHNraXBTdWJtaXRGaWx0ZXJzLCBJbnB1dFN0cmVhbSBydWxlcykgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLnBhdGNoU2V0ID0gcGF0Y2hTZXQ7CisgICAgdGhpcy5wcm9qZWN0Q29udHJvbCA9IHByb2plY3RDb250cm9sOworICAgIHRoaXMuY2hhbmdlQ29udHJvbCA9IGNoYW5nZUNvbnRyb2w7CisgICAgdGhpcy5jaGFuZ2UgPSBjaGFuZ2U7CisgICAgdGhpcy5jZCA9IGNkOworICAgIHRoaXMuZmFzdEV2YWxMYWJlbHMgPSBmYXN0RXZhbExhYmVsczsKKyAgICB0aGlzLnVzZXJSdWxlTG9jYXRvck5hbWUgPSB1c2VyUnVsZUxvY2F0b3JOYW1lOworICAgIHRoaXMudXNlclJ1bGVXcmFwcGVyTmFtZSA9IHVzZXJSdWxlV3JhcHBlck5hbWU7CisgICAgdGhpcy5maWx0ZXJSdWxlTG9jYXRvck5hbWUgPSBmaWx0ZXJSdWxlTG9jYXRvck5hbWU7CisgICAgdGhpcy5maWx0ZXJSdWxlV3JhcHBlck5hbWUgPSBmaWx0ZXJSdWxlV3JhcHBlck5hbWU7CisgICAgdGhpcy5za2lwRmlsdGVycyA9IHNraXBTdWJtaXRGaWx0ZXJzOworICAgIHRoaXMucnVsZXNJbnB1dFN0cmVhbSA9IHJ1bGVzOworICB9CisKKyAgLyoqCisgICAqIEV2YWx1YXRlcyB0aGUgZ2l2ZW4gcnVsZSBhbmQgZmlsdGVycy4KKyAgICoKKyAgICogU2V0cyB0aGUge0BsaW5rICNzdWJtaXRSdWxlfSB0byB0aGUgVGVybSBmb3VuZCBieSB0aGUKKyAgICoge0BsaW5rICN1c2VyUnVsZUxvY2F0b3JOYW1lfS4gVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHJlcG9ydGluZyBlcnJvcihzKSBvbgorICAgKiB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZC4KKyAgICoKKyAgICogQHJldHVybiBMaXN0IG9mIHtAbGluayBUZXJtfSBvYmplY3RzIHJldHVybmVkIGZyb20gdGhlIGV2YWx1YXRlZCBydWxlcy4KKyAgICogQHRocm93cyBSdWxlRXZhbEV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIExpc3Q8VGVybT4gZXZhbHVhdGUoKSB0aHJvd3MgUnVsZUV2YWxFeGNlcHRpb24geworICAgIFByb2xvZ0Vudmlyb25tZW50IGVudiA9IGdldFByb2xvZ0Vudmlyb25tZW50KCk7CisgICAgdHJ5IHsKKyAgICAgIHN1Ym1pdFJ1bGUgPSBlbnYub25jZSgiZ2Vycml0IiwgdXNlclJ1bGVMb2NhdG9yTmFtZSwgbmV3IFZhcmlhYmxlVGVybSgpKTsKKyAgICAgIGlmIChmYXN0RXZhbExhYmVscykgeworICAgICAgICBlbnYub25jZSgiZ2Vycml0IiwgImFzc3VtZV9yYW5nZV9mcm9tX2xhYmVsIik7CisgICAgICB9CisKKyAgICAgIExpc3Q8VGVybT4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8VGVybT4oKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoVGVybVtdIHRlbXBsYXRlIDogZW52LmFsbCgiZ2Vycml0IiwgdXNlclJ1bGVXcmFwcGVyTmFtZSwKKyAgICAgICAgICAgIHN1Ym1pdFJ1bGUsIG5ldyBWYXJpYWJsZVRlcm0oKSkpIHsKKyAgICAgICAgICByZXN1bHRzLmFkZCh0ZW1wbGF0ZVsxXSk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKFByb2xvZ0V4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bGVFdmFsRXhjZXB0aW9uKCJFeGNlcHRpb24gY2FsbGluZyAiICsgc3VibWl0UnVsZQorICAgICAgICAgICAgKyAiIG9uIGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0TmFtZSgpLAorICAgICAgICAgICAgZXJyKTsKKyAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7CisgICAgICAgIHRocm93IG5ldyBSdWxlRXZhbEV4Y2VwdGlvbigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIHN1Ym1pdFJ1bGUKKyAgICAgICAgICAgICsgIiBvbiBjaGFuZ2UgIiArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdE5hbWUoKSwKKyAgICAgICAgICAgIGVycik7CisgICAgICB9CisKKyAgICAgIFRlcm0gcmVzdWx0c1Rlcm0gPSB0b0xpc3RUZXJtKHJlc3VsdHMpOworICAgICAgaWYgKCFza2lwRmlsdGVycykgeworICAgICAgICByZXN1bHRzVGVybSA9IHJ1blN1Ym1pdEZpbHRlcnMocmVzdWx0c1Rlcm0sIGVudik7CisgICAgICB9CisgICAgICBpZiAocmVzdWx0c1Rlcm0uaXNMaXN0KCkpIHsKKyAgICAgICAgTGlzdDxUZXJtPiByID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoVGVybSB0ID0gcmVzdWx0c1Rlcm07IHQuaXNMaXN0KCk7KSB7CisgICAgICAgICAgTGlzdFRlcm0gbCA9IChMaXN0VGVybSkgdDsKKyAgICAgICAgICByLmFkZChsLmNhcigpLmRlcmVmZXJlbmNlKCkpOworICAgICAgICAgIHQgPSBsLmNkcigpLmRlcmVmZXJlbmNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHI7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGVudi5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgUHJvbG9nRW52aXJvbm1lbnQgZ2V0UHJvbG9nRW52aXJvbm1lbnQoKSB0aHJvd3MgUnVsZUV2YWxFeGNlcHRpb24geworICAgIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGUgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0U3RhdGUoKTsKKyAgICBQcm9sb2dFbnZpcm9ubWVudCBlbnY7CisgICAgdHJ5IHsKKyAgICAgIGlmIChydWxlc0lucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgZW52ID0gcHJvamVjdFN0YXRlLm5ld1Byb2xvZ0Vudmlyb25tZW50KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlbnYgPSBwcm9qZWN0U3RhdGUubmV3UHJvbG9nRW52aXJvbm1lbnQoInN0ZGluIiwgcnVsZXNJbnB1dFN0cmVhbSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoQ29tcGlsZUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHRocm93IG5ldyBSdWxlRXZhbEV4Y2VwdGlvbigiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKKyAgICAgICAgICArIGdldFByb2plY3ROYW1lKCksIGVycik7CisgICAgfQorICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLlJFVklFV19EQiwgZGIpOworICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRSwgY2hhbmdlKTsKKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0VfREFUQSwgY2QpOworICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLlBBVENIX1NFVCwgcGF0Y2hTZXQpOworICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRV9DT05UUk9MLCBjaGFuZ2VDb250cm9sKTsKKyAgICByZXR1cm4gZW52OworICB9CisKKyAgcHJpdmF0ZSBUZXJtIHJ1blN1Ym1pdEZpbHRlcnMoVGVybSByZXN1bHRzLCBQcm9sb2dFbnZpcm9ubWVudCBlbnYpIHRocm93cyBSdWxlRXZhbEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSA9IHByb2plY3RDb250cm9sLmdldFByb2plY3RTdGF0ZSgpOworICAgIFByb2xvZ0Vudmlyb25tZW50IGNoaWxkRW52ID0gZW52OworICAgIGZvciAoUHJvamVjdFN0YXRlIHBhcmVudFN0YXRlIDogcHJvamVjdFN0YXRlLnBhcmVudHMoKSkgeworICAgICAgUHJvbG9nRW52aXJvbm1lbnQgcGFyZW50RW52OworICAgICAgdHJ5IHsKKyAgICAgICAgcGFyZW50RW52ID0gcGFyZW50U3RhdGUubmV3UHJvbG9nRW52aXJvbm1lbnQoKTsKKyAgICAgIH0gY2F0Y2ggKENvbXBpbGVFeGNlcHRpb24gZXJyKSB7CisgICAgICAgIHRocm93IG5ldyBSdWxlRXZhbEV4Y2VwdGlvbigiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKKyAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKKyAgICAgIH0KKworICAgICAgcGFyZW50RW52LmNvcHlTdG9yZWRWYWx1ZXMoY2hpbGRFbnYpOworICAgICAgVGVybSBmaWx0ZXJSdWxlID0KKyAgICAgICAgICBwYXJlbnRFbnYub25jZSgiZ2Vycml0IiwgZmlsdGVyUnVsZUxvY2F0b3JOYW1lLCBuZXcgVmFyaWFibGVUZXJtKCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgaWYgKGZhc3RFdmFsTGFiZWxzKSB7CisgICAgICAgICAgZW52Lm9uY2UoImdlcnJpdCIsICJhc3N1bWVfcmFuZ2VfZnJvbV9sYWJlbCIpOworICAgICAgICB9CisKKyAgICAgICAgVGVybVtdIHRlbXBsYXRlID0KKyAgICAgICAgICAgIHBhcmVudEVudi5vbmNlKCJnZXJyaXQiLCBmaWx0ZXJSdWxlV3JhcHBlck5hbWUsIGZpbHRlclJ1bGUsCisgICAgICAgICAgICAgICAgcmVzdWx0cywgbmV3IFZhcmlhYmxlVGVybSgpKTsKKyAgICAgICAgcmVzdWx0cyA9IHRlbXBsYXRlWzJdOworICAgICAgfSBjYXRjaCAoUHJvbG9nRXhjZXB0aW9uIGVycikgeworICAgICAgICB0aHJvdyBuZXcgUnVsZUV2YWxFeGNlcHRpb24oIkV4Y2VwdGlvbiBjYWxsaW5nICIgKyBmaWx0ZXJSdWxlCisgICAgICAgICAgICArICIgb24gY2hhbmdlICIgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIgorICAgICAgICAgICAgKyBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOworICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bGVFdmFsRXhjZXB0aW9uKCJFeGNlcHRpb24gY2FsbGluZyAiICsgZmlsdGVyUnVsZQorICAgICAgICAgICAgKyAiIG9uIGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIKKyAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKKyAgICAgIH0KKyAgICAgIGNoaWxkRW52ID0gcGFyZW50RW52OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0czsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRlcm0gdG9MaXN0VGVybShMaXN0PFRlcm0+IHRlcm1zKSB7CisgICAgVGVybSBsaXN0ID0gUHJvbG9nLk5pbDsKKyAgICBmb3IgKGludCBpID0gdGVybXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGxpc3QgPSBuZXcgTGlzdFRlcm0odGVybXMuZ2V0KGkpLCBsaXN0KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CisgIH0KKworICBwdWJsaWMgVGVybSBnZXRTdWJtaXRSdWxlKCkgeworICAgIHJldHVybiBzdWJtaXRSdWxlOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKKyAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHByb2plY3ROYW1lOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5UmV3cml0ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvUXVlcnlSZXdyaXRlci5qYXZhCmluZGV4IGIzYzEwZWYuLjJhNmJhZTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvUXVlcnlSZXdyaXRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvUXVlcnlSZXdyaXRlci5qYXZhCkBAIC00NzgsMjggKzQ3OCw2IEBACiAgICAgcmV0dXJuIHI7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCBleHBhbmQoZmluYWwgTGlzdDxQcmVkaWNhdGU8VD4+IG91dCwKLSAgICAgIGZpbmFsIExpc3Q8UHJlZGljYXRlPFQ+PiBhbGxPUiwgZmluYWwgTGlzdDxQcmVkaWNhdGU8VD4+IHRtcCwKLSAgICAgIGZpbmFsIExpc3Q8UHJlZGljYXRlPFQ+PiBub25PUikgewotICAgIGlmICh0bXAuc2l6ZSgpID09IGFsbE9SLnNpemUoKSkgewotICAgICAgZmluYWwgaW50IHN6ID0gbm9uT1Iuc2l6ZSgpICsgdG1wLnNpemUoKTsKLSAgICAgIGZpbmFsIExpc3Q8UHJlZGljYXRlPFQ+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxQcmVkaWNhdGU8VD4+KHN6KTsKLSAgICAgIG5ld0xpc3QuYWRkQWxsKG5vbk9SKTsKLSAgICAgIG5ld0xpc3QuYWRkQWxsKHRtcCk7Ci0gICAgICBvdXQuYWRkKFByZWRpY2F0ZS5hbmQobmV3TGlzdCkpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoZmluYWwgUHJlZGljYXRlPFQ+IGMgOiBhbGxPUi5nZXQodG1wLnNpemUoKSkuZ2V0Q2hpbGRyZW4oKSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHRtcC5hZGQoYyk7Ci0gICAgICAgICAgZXhwYW5kKG91dCwgYWxsT1IsIHRtcCwgbm9uT1IpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIHRtcC5yZW1vdmUodG1wLnNpemUoKSAtIDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IGJvb2xlYW4gaXNBTkQoZmluYWwgUHJlZGljYXRlPFQ+IHApIHsKICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIEFuZFByZWRpY2F0ZTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQW5kU291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9BbmRTb3VyY2UuamF2YQppbmRleCAzYTBiZmEzLi43ZjcyNmE3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9BbmRTb3VyY2UuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9BbmRTb3VyY2UuamF2YQpAQCAtMTQsMTEgKzE0LDE5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuRmx1ZW50SXRlcmFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LkFuZFByZWRpY2F0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUHJlZGljYXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5MaXN0UmVzdWx0U2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybVJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlJlc3VsdFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0zNSwxNCArNDMsNiBAQAogICAgICAgICAgIGludCBiaSA9IGIgaW5zdGFuY2VvZiBDaGFuZ2VEYXRhU291cmNlID8gMCA6IDE7CiAgICAgICAgICAgaW50IGNtcCA9IGFpIC0gYmk7CiAKLSAgICAgICAgICBpZiAoY21wID09IDAgLy8KLSAgICAgICAgICAgICAgJiYgYSBpbnN0YW5jZW9mIENoYW5nZURhdGFTb3VyY2UgLy8KLSAgICAgICAgICAgICAgJiYgYiBpbnN0YW5jZW9mIENoYW5nZURhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIGFpID0gKChDaGFuZ2VEYXRhU291cmNlKSBhKS5oYXNDaGFuZ2UoKSA/IDAgOiAxOwotICAgICAgICAgICAgYmkgPSAoKENoYW5nZURhdGFTb3VyY2UpIGIpLmhhc0NoYW5nZSgpID8gMCA6IDE7Ci0gICAgICAgICAgICBjbXAgPSBhaSAtIGJpOwotICAgICAgICAgIH0KLQogICAgICAgICAgIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICAgY21wID0gYS5nZXRDb3N0KCkgLSBiLmdldENvc3QoKTsKICAgICAgICAgICB9CkBAIC01Myw2ICs1MywxMSBAQAogICAgICAgICAgICAgQ2hhbmdlRGF0YVNvdXJjZSBhcyA9IChDaGFuZ2VEYXRhU291cmNlKSBhOwogICAgICAgICAgICAgQ2hhbmdlRGF0YVNvdXJjZSBicyA9IChDaGFuZ2VEYXRhU291cmNlKSBiOwogICAgICAgICAgICAgY21wID0gYXMuZ2V0Q2FyZGluYWxpdHkoKSAtIGJzLmdldENhcmRpbmFsaXR5KCk7CisKKyAgICAgICAgICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICAgICAgICBjbXAgPSAoYXMuaGFzQ2hhbmdlKCkgPyAwIDogMSkKKyAgICAgICAgICAgICAgICAgIC0gKGJzLmhhc0NoYW5nZSgpID8gMCA6IDEpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KIAogICAgICAgICAgIHJldHVybiBjbXA7CkBAIC02NywxMCArNzIsMTIgQEAKICAgICByZXR1cm4gcjsKICAgfQogCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOwogICBwcml2YXRlIGludCBjYXJkaW5hbGl0eSA9IC0xOwogCi0gIEFuZFNvdXJjZShmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4+IHRoYXQpIHsKKyAgQW5kU291cmNlKFByb3ZpZGVyPFJldmlld0RiPiBkYiwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJlZGljYXRlPENoYW5nZURhdGE+PiB0aGF0KSB7CiAgICAgc3VwZXIoc29ydCh0aGF0KSk7CisgICAgdGhpcy5kYiA9IGRiOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC04MSwxNyArODgsMjQgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFJlc3VsdFNldDxDaGFuZ2VEYXRhPiByZWFkKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiByZWFkSW1wbCgpOworICAgIH0gY2F0Y2ggKE9ybVJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7CisgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmSW5zdGFuY2VPZihlcnIuZ2V0Q2F1c2UoKSwgT3JtRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oZXJyKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFJlc3VsdFNldDxDaGFuZ2VEYXRhPiByZWFkSW1wbCgpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIENoYW5nZURhdGFTb3VyY2Ugc291cmNlID0gc291cmNlKCk7CiAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKCJObyBDaGFuZ2VEYXRhU291cmNlOiAiICsgdGhpcyk7CiAgICAgfQogCi0gICAgLy8gVE9ETyhzcGVhcmNlKSBUaGlzIHByb2JhYmx5IHNob3VsZCBiZSBtb3JlIGxhenkuCi0gICAgLy8KLSAgICBBcnJheUxpc3Q8Q2hhbmdlRGF0YT4gciA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlRGF0YT4oKTsKKyAgICBMaXN0PENoYW5nZURhdGE+IHIgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICBDaGFuZ2VEYXRhIGxhc3QgPSBudWxsOwogICAgIGJvb2xlYW4gc2tpcHBlZCA9IGZhbHNlOwotICAgIGZvciAoQ2hhbmdlRGF0YSBkYXRhIDogc291cmNlLnJlYWQoKSkgeworICAgIGZvciAoQ2hhbmdlRGF0YSBkYXRhIDogYnVmZmVyKHNvdXJjZSwgc291cmNlLnJlYWQoKSkpIHsKICAgICAgIGlmIChtYXRjaChkYXRhKSkgewogICAgICAgICByLmFkZChkYXRhKTsKICAgICAgIH0gZWxzZSB7CkBAIC0xMDEsNyArMTE1LDcgQEAKICAgICB9CiAKICAgICBpZiAoc2tpcHBlZCAmJiBsYXN0ICE9IG51bGwgJiYgc291cmNlIGluc3RhbmNlb2YgUGFnaW5hdGVkKSB7Ci0gICAgICAvLyBJZiB3ZSBvdXIgc291cmNlIGlzIGEgcGFnaW5hdGVkIHNvdXJjZSBhbmQgd2Ugc2tpcHBlZCBhdAorICAgICAgLy8gSWYgb3VyIHNvdXJjZSBpcyBhIHBhZ2luYXRlZCBzb3VyY2UgYW5kIHdlIHNraXBwZWQgYXQKICAgICAgIC8vIGxlYXN0IG9uZSBvZiBpdHMgcmVzdWx0cywgd2UgbWF5IG5vdCBoYXZlIGZpbGxlZCB0aGUgZnVsbAogICAgICAgLy8gbGltaXQgdGhlIGNhbGxlciB3YW50cy4gIFJlc3RhcnQgdGhlIHNvdXJjZSBhbmQgY29udGludWUuCiAgICAgICAvLwpAQCAtMTEwLDcgKzEyNCw3IEBACiAgICAgICAgIENoYW5nZURhdGEgbGFzdEJlZm9yZVJlc3RhcnQgPSBsYXN0OwogICAgICAgICBza2lwcGVkID0gZmFsc2U7CiAgICAgICAgIGxhc3QgPSBudWxsOwotICAgICAgICBmb3IgKENoYW5nZURhdGEgZGF0YSA6IHAucmVzdGFydChsYXN0QmVmb3JlUmVzdGFydCkpIHsKKyAgICAgICAgZm9yIChDaGFuZ2VEYXRhIGRhdGEgOiBidWZmZXIoc291cmNlLCBwLnJlc3RhcnQobGFzdEJlZm9yZVJlc3RhcnQpKSkgewogICAgICAgICAgIGlmIChtYXRjaChkYXRhKSkgewogICAgICAgICAgICAgci5hZGQoZGF0YSk7CiAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEyNCw2ICsxMzgsMjcgQEAKICAgICByZXR1cm4gbmV3IExpc3RSZXN1bHRTZXQ8Q2hhbmdlRGF0YT4ocik7CiAgIH0KIAorICBwcml2YXRlIEl0ZXJhYmxlPENoYW5nZURhdGE+IGJ1ZmZlcigKKyAgICAgIENoYW5nZURhdGFTb3VyY2Ugc291cmNlLAorICAgICAgUmVzdWx0U2V0PENoYW5nZURhdGE+IHNjYW5uZXIpIHsKKyAgICBmaW5hbCBib29sZWFuIGxvYWRDaGFuZ2UgPSAhc291cmNlLmhhc0NoYW5nZSgpOworICAgIHJldHVybiBGbHVlbnRJdGVyYWJsZQorICAgICAgLmZyb20oSXRlcmFibGVzLnBhcnRpdGlvbihzY2FubmVyLCA1MCkpCisgICAgICAudHJhbnNmb3JtQW5kQ29uY2F0KG5ldyBGdW5jdGlvbjxMaXN0PENoYW5nZURhdGE+LCBMaXN0PENoYW5nZURhdGE+PigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PENoYW5nZURhdGE+IGFwcGx5KExpc3Q8Q2hhbmdlRGF0YT4gYnVmZmVyKSB7CisgICAgICAgICAgaWYgKGxvYWRDaGFuZ2UpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIENoYW5nZURhdGEuZW5zdXJlQ2hhbmdlTG9hZGVkKGRiLCBidWZmZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IE9ybVJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgICAgIH0KKyAgICAgIH0pOworICB9CisKICAgcHJpdmF0ZSBDaGFuZ2VEYXRhU291cmNlIHNvdXJjZSgpIHsKICAgICBmb3IgKFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBwIDogZ2V0Q2hpbGRyZW4oKSkgewogICAgICAgaWYgKHAgaW5zdGFuY2VvZiBDaGFuZ2VEYXRhU291cmNlKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VEYXRhLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VEYXRhLmphdmEKaW5kZXggZDY3NjJkYi4uNTA2ZmFiYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlRGF0YS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZURhdGEuamF2YQpAQCAtMTQsMTQgKzE0LDIwIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQuSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlRyYWNraW5nSWQ7CkBAIC00MywxNSArNDksMjkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgQ2hhbmdlRGF0YSB7CisgIHByaXZhdGUgc3RhdGljIE9yZGVyaW5nPFBhdGNoU2V0QXBwcm92YWw+IFNPUlRfQVBQUk9WQUxTID0gT3JkZXJpbmcubmF0dXJhbCgpCisgICAgICAub25SZXN1bHRPZihuZXcgRnVuY3Rpb248UGF0Y2hTZXRBcHByb3ZhbCwgVGltZXN0YW1wPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFRpbWVzdGFtcCBhcHBseShQYXRjaFNldEFwcHJvdmFsIGEpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGEuZ2V0R3JhbnRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworCisgIHB1YmxpYyBzdGF0aWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBzb3J0QXBwcm92YWxzKAorICAgICAgSXRlcmFibGU8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB7CisgICAgcmV0dXJuIFNPUlRfQVBQUk9WQUxTLnNvcnRlZENvcHkoYXBwcm92YWxzKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVDaGFuZ2VMb2FkZWQoCiAgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGIsIExpc3Q8Q2hhbmdlRGF0YT4gY2hhbmdlcykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgTWFwPENoYW5nZS5JZCwgQ2hhbmdlRGF0YT4gbWlzc2luZyA9IE1hcHMubmV3SGFzaE1hcCgpOwpAQCAtNzksNyArOTksOSBAQAogICAgICAgZm9yIChQYXRjaFNldCBwcyA6IGRiLmdldCgpLnBhdGNoU2V0cygpLmdldChtaXNzaW5nLmtleVNldCgpKSkgewogICAgICAgICBDaGFuZ2VEYXRhIGNkID0gbWlzc2luZy5nZXQocHMuZ2V0SWQoKSk7CiAgICAgICAgIGNkLmN1cnJlbnRQYXRjaFNldCA9IHBzOwotICAgICAgICBjZC5wYXRjaGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KHBzKTsKKyAgICAgICAgaWYgKGNkLmxpbWl0ZWRJZHMgPT0gbnVsbCkgeworICAgICAgICAgIGNkLnBhdGNoZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QocHMpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CkBAIC04OCw3ICsxMTAsNyBAQAogICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLCBMaXN0PENoYW5nZURhdGE+IGNoYW5nZXMpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIExpc3Q8UmVzdWx0U2V0PFBhdGNoU2V0QXBwcm92YWw+PiBwZW5kaW5nID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAgICAgZm9yIChDaGFuZ2VEYXRhIGNkIDogY2hhbmdlcykgewotICAgICAgaWYgKGNkLmN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCAmJiBjZC5hcHByb3ZhbHMgPT0gbnVsbCkgeworICAgICAgaWYgKGNkLmN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCAmJiBjZC5saW1pdGVkQXBwcm92YWxzID09IG51bGwpIHsKICAgICAgICAgcGVuZGluZy5hZGQoZGIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKQogICAgICAgICAgICAgLmJ5UGF0Y2hTZXQoY2QuY2hhbmdlKGRiKS5jdXJyZW50UGF0Y2hTZXRJZCgpKSk7CiAgICAgICB9CkBAIC05Niw4ICsxMTgsOCBAQAogICAgIGlmICghcGVuZGluZy5pc0VtcHR5KCkpIHsKICAgICAgIGludCBpZHggPSAwOwogICAgICAgZm9yIChDaGFuZ2VEYXRhIGNkIDogY2hhbmdlcykgewotICAgICAgICBpZiAoY2QuY3VycmVudEFwcHJvdmFscyA9PSBudWxsICYmIGNkLmFwcHJvdmFscyA9PSBudWxsKSB7Ci0gICAgICAgICAgY2QuY3VycmVudEFwcHJvdmFscyA9IHBlbmRpbmcuZ2V0KGlkeCsrKS50b0xpc3QoKTsKKyAgICAgICAgaWYgKGNkLmN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCAmJiBjZC5saW1pdGVkQXBwcm92YWxzID09IG51bGwpIHsKKyAgICAgICAgICBjZC5jdXJyZW50QXBwcm92YWxzID0gc29ydEFwcHJvdmFscyhwZW5kaW5nLmdldChpZHgrKykpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTA3LDE2ICsxMjksMTggQEAKICAgcHJpdmF0ZSBDaGFuZ2UgY2hhbmdlOwogICBwcml2YXRlIFN0cmluZyBjb21taXRNZXNzYWdlOwogICBwcml2YXRlIFBhdGNoU2V0IGN1cnJlbnRQYXRjaFNldDsKKyAgcHJpdmF0ZSBTZXQ8UGF0Y2hTZXQuSWQ+IGxpbWl0ZWRJZHM7CiAgIHByaXZhdGUgQ29sbGVjdGlvbjxQYXRjaFNldD4gcGF0Y2hlczsKLSAgcHJpdmF0ZSBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFsczsKLSAgcHJpdmF0ZSBNYXA8UGF0Y2hTZXQuSWQsQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gYXBwcm92YWxzTWFwOwotICBwcml2YXRlIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudEFwcHJvdmFsczsKKyAgcHJpdmF0ZSBMaXN0TXVsdGltYXA8UGF0Y2hTZXQuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGxpbWl0ZWRBcHByb3ZhbHM7CisgIHByaXZhdGUgTGlzdE11bHRpbWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldEFwcHJvdmFsPiBhbGxBcHByb3ZhbHM7CisgIHByaXZhdGUgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBjdXJyZW50QXBwcm92YWxzOwogICBwcml2YXRlIFN0cmluZ1tdIGN1cnJlbnRGaWxlczsKICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFBhdGNoTGluZUNvbW1lbnQ+IGNvbW1lbnRzOwogICBwcml2YXRlIENvbGxlY3Rpb248VHJhY2tpbmdJZD4gdHJhY2tpbmdJZHM7CiAgIHByaXZhdGUgQ3VycmVudFVzZXIgdmlzaWJsZVRvOwogICBwcml2YXRlIENoYW5nZUNvbnRyb2wgY2hhbmdlQ29udHJvbDsKICAgcHJpdmF0ZSBMaXN0PENoYW5nZU1lc3NhZ2U+IG1lc3NhZ2VzOworICBwcml2YXRlIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzOwogCiAgIHB1YmxpYyBDaGFuZ2VEYXRhKGZpbmFsIENoYW5nZS5JZCBpZCkgewogICAgIGxlZ2FjeUlkID0gaWQ7CkBAIC0xMjcsNiArMTUxLDI3IEBACiAgICAgY2hhbmdlID0gYzsKICAgfQogCisgIHB1YmxpYyBDaGFuZ2VEYXRhKGZpbmFsIENoYW5nZUNvbnRyb2wgYykgeworICAgIGxlZ2FjeUlkID0gYy5nZXRDaGFuZ2UoKS5nZXRJZCgpOworICAgIGNoYW5nZSA9IGMuZ2V0Q2hhbmdlKCk7CisgICAgY2hhbmdlQ29udHJvbCA9IGM7CisgIH0KKworICBwdWJsaWMgdm9pZCBsaW1pdFRvUGF0Y2hTZXRzKENvbGxlY3Rpb248UGF0Y2hTZXQuSWQ+IGlkcykgeworICAgIGxpbWl0ZWRJZHMgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGlkcy5zaXplKCkpOworICAgIGZvciAoUGF0Y2hTZXQuSWQgaWQgOiBpZHMpIHsKKyAgICAgIGlmICghaWQuZ2V0UGFyZW50S2V5KCkuZXF1YWxzKGxlZ2FjeUlkKSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiaW52YWxpZCBwYXRjaCBzZXQgJXMgZm9yIGNoYW5nZSAlcyIsIGlkLCBsZWdhY3lJZCkpOworICAgICAgfQorICAgICAgbGltaXRlZElkcy5hZGQoaWQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0LklkPiBnZXRMaW1pdGVkUGF0Y2hTZXRzKCkgeworICAgIHJldHVybiBsaW1pdGVkSWRzOworICB9CisKICAgcHVibGljIHZvaWQgc2V0Q3VycmVudEZpbGVQYXRocyhTdHJpbmdbXSBmaWxlUGF0aHMpIHsKICAgICBjdXJyZW50RmlsZXMgPSBmaWxlUGF0aHM7CiAgIH0KQEAgLTE2MywxMCArMjA4LDE0IEBACiAgICAgICAgICAgY2FzZSBDT1BJRUQ6CiAgICAgICAgICAgICByLmFkZChlLmdldE5ld05hbWUoKSk7CiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgIGNhc2UgUkVOQU1FRDoKICAgICAgICAgICAgIHIuYWRkKGUuZ2V0T2xkTmFtZSgpKTsKICAgICAgICAgICAgIHIuYWRkKGUuZ2V0TmV3TmFtZSgpKTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBSRVdSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGN1cnJlbnRGaWxlcyA9IHIudG9BcnJheShuZXcgU3RyaW5nW3Iuc2l6ZSgpXSk7CkBAIC0xOTEsNyArMjQwLDcgQEAKICAgICByZXR1cm4gdmlzaWJsZVRvID09IHVzZXI7CiAgIH0KIAotICBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2woKSB7CisgIHB1YmxpYyBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2woKSB7CiAgICAgcmV0dXJuIGNoYW5nZUNvbnRyb2w7CiAgIH0KIApAQCAtMjIzLDIyICsyNzIsMjAgQEAKICAgICByZXR1cm4gY3VycmVudFBhdGNoU2V0OwogICB9CiAKLSAgcHVibGljIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudEFwcHJvdmFscyhQcm92aWRlcjxSZXZpZXdEYj4gZGIpCisgIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnRBcHByb3ZhbHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQogICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgaWYgKGN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCkgewogICAgICAgQ2hhbmdlIGMgPSBjaGFuZ2UoZGIpOwogICAgICAgaWYgKGMgPT0gbnVsbCkgewogICAgICAgICBjdXJyZW50QXBwcm92YWxzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICB9IGVsc2UgaWYgKGFwcHJvdmFscyAhPSBudWxsKSB7Ci0gICAgICAgIE1hcDxJZCwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gbWFwID0gYXBwcm92YWxzTWFwKGRiKTsKLSAgICAgICAgY3VycmVudEFwcHJvdmFscyA9IG1hcC5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgaWYgKGN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCkgewotICAgICAgICAgIGN1cnJlbnRBcHByb3ZhbHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgICBtYXAucHV0KGMuY3VycmVudFBhdGNoU2V0SWQoKSwgY3VycmVudEFwcHJvdmFscyk7Ci0gICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoYWxsQXBwcm92YWxzICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGFsbEFwcHJvdmFscy5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICAgIH0gZWxzZSBpZiAobGltaXRlZEFwcHJvdmFscyAhPSBudWxsICYmCisgICAgICAgICAgKGxpbWl0ZWRJZHMgPT0gbnVsbCB8fCBsaW1pdGVkSWRzLmNvbnRhaW5zKGMuY3VycmVudFBhdGNoU2V0SWQoKSkpKSB7CisgICAgICAgIHJldHVybiBsaW1pdGVkQXBwcm92YWxzLmdldChjLmN1cnJlbnRQYXRjaFNldElkKCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3VycmVudEFwcHJvdmFscyA9IGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkKLSAgICAgICAgICAgIC5ieVBhdGNoU2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSkudG9MaXN0KCk7CisgICAgICAgIGN1cnJlbnRBcHByb3ZhbHMgPSBzb3J0QXBwcm92YWxzKGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkKKyAgICAgICAgICAgIC5ieVBhdGNoU2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSkpOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm4gY3VycmVudEFwcHJvdmFsczsKQEAgLTI2NiwzNyArMzEzLDk4IEBACiAgICAgcmV0dXJuIGNvbW1pdE1lc3NhZ2U7CiAgIH0KIAorICAvKioKKyAgICogQHBhcmFtIGRiIHJldmlldyBkYXRhYmFzZS4KKyAgICogQHJldHVybiBwYXRjaGVzIGZvciB0aGUgY2hhbmdlLiBJZiB7QGxpbmsgI2xpbWl0VG9QYXRjaFNldHMoQ29sbGVjdGlvbil9CisgICAqICAgICB3YXMgcHJldmlvdXNseSBjYWxsZWQsIG9ubHkgY29udGFpbnMgcGF0Y2hlcyB3aXRoIHRoZSBzcGVjaWZpZWQgSURzLgorICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbiBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHRoZSBkYXRhYmFzZS4KKyAgICovCiAgIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0PiBwYXRjaGVzKFByb3ZpZGVyPFJldmlld0RiPiBkYikKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIGlmIChwYXRjaGVzID09IG51bGwpIHsKLSAgICAgIHBhdGNoZXMgPSBkYi5nZXQoKS5wYXRjaFNldHMoKS5ieUNoYW5nZShsZWdhY3lJZCkudG9MaXN0KCk7CisgICAgICBpZiAobGltaXRlZElkcyAhPSBudWxsKSB7CisgICAgICAgIHBhdGNoZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChQYXRjaFNldCBwcyA6IGRiLmdldCgpLnBhdGNoU2V0cygpLmJ5Q2hhbmdlKGxlZ2FjeUlkKSkgeworICAgICAgICAgIGlmIChsaW1pdGVkSWRzLmNvbnRhaW5zKHBzLmdldElkKCkpKSB7CisgICAgICAgICAgICBwYXRjaGVzLmFkZChwcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXRjaGVzID0gZGIuZ2V0KCkucGF0Y2hTZXRzKCkuYnlDaGFuZ2UobGVnYWN5SWQpLnRvTGlzdCgpOworICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcGF0Y2hlczsKICAgfQogCi0gIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyhQcm92aWRlcjxSZXZpZXdEYj4gZGIpCisgIC8qKgorICAgKiBAcGFyYW0gZGIgcmV2aWV3IGRhdGFiYXNlLgorICAgKiBAcmV0dXJuIHBhdGNoIHNldCBhcHByb3ZhbHMgZm9yIHRoZSBjaGFuZ2UgaW4gdGltZXN0YW1wIG9yZGVyLiBJZgorICAgKiAgICAge0BsaW5rICNsaW1pdFRvUGF0Y2hTZXRzKENvbGxlY3Rpb24pfSB3YXMgcHJldmlvdXNseSBjYWxsZWQsIG9ubHkgY29udGFpbnMKKyAgICogICAgIGFwcHJvdmFscyBmb3IgdGhlIHBhdGNoZXMgd2l0aCB0aGUgc3BlY2lmaWVkIElEcy4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGUgZGF0YWJhc2UuCisgICAqLworICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQogICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgaWYgKGFwcHJvdmFscyA9PSBudWxsKSB7Ci0gICAgICBhcHByb3ZhbHMgPSBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGxlZ2FjeUlkKS50b0xpc3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwcHJvdmFsczsKKyAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2YoYXBwcm92YWxzTWFwKGRiKS52YWx1ZXMoKSk7CiAgIH0KIAotICBwdWJsaWMgTWFwPFBhdGNoU2V0LklkLENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFsc01hcChQcm92aWRlcjxSZXZpZXdEYj4gZGIpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBpZiAoYXBwcm92YWxzTWFwID09IG51bGwpIHsKLSAgICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYWxsID0gYXBwcm92YWxzKGRiKTsKLSAgICAgIGFwcHJvdmFsc01hcCA9IG5ldyBIYXNoTWFwPFBhdGNoU2V0LklkLENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+KGFsbC5zaXplKCkpOwotICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IGFsbCkgewotICAgICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGMgPSBhcHByb3ZhbHNNYXAuZ2V0KHBzYS5nZXRQYXRjaFNldElkKCkpOwotICAgICAgICBpZiAoYyA9PSBudWxsKSB7Ci0gICAgICAgICAgYyA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICAgICAgICBhcHByb3ZhbHNNYXAucHV0KHBzYS5nZXRQYXRjaFNldElkKCksIGMpOworICAvKioKKyAgICogQHBhcmFtIGRiIHJldmlldyBkYXRhYmFzZS4KKyAgICogQHJldHVybiBwYXRjaCBzZXQgYXBwcm92YWxzIGZvciB0aGUgY2hhbmdlLCBrZXllZCBieSBJRCwgb3JkZXJlZCBieQorICAgKiAgICAgdGltZXN0YW1wIHdpdGhpbiBlYWNoIHBhdGNoIHNldC4gSWYKKyAgICogICAgIHtAbGluayAjbGltaXRUb1BhdGNoU2V0cyhDb2xsZWN0aW9uKX0gd2FzIHByZXZpb3VzbHkgY2FsbGVkLCBvbmx5CisgICAqICAgICBjb250YWlucyBhcHByb3ZhbHMgZm9yIHRoZSBwYXRjaGVzIHdpdGggdGhlIHNwZWNpZmllZCBJRHMuCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIGRhdGFiYXNlLgorICAgKi8KKyAgcHVibGljIExpc3RNdWx0aW1hcDxQYXRjaFNldC5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzTWFwKAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAobGltaXRlZEFwcHJvdmFscyA9PSBudWxsKSB7CisgICAgICBsaW1pdGVkQXBwcm92YWxzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBpZiAoYWxsQXBwcm92YWxzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChQYXRjaFNldC5JZCBpZCA6IGxpbWl0ZWRJZHMpIHsKKyAgICAgICAgICBsaW1pdGVkQXBwcm92YWxzLnB1dEFsbChpZCwgYWxsQXBwcm92YWxzLmdldChpZCkpOwogICAgICAgICB9Ci0gICAgICAgIGMuYWRkKHBzYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogc29ydEFwcHJvdmFscygKKyAgICAgICAgICAgIGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UobGVnYWN5SWQpKSkgeworICAgICAgICAgIGlmIChsaW1pdGVkSWRzID09IG51bGwgfHwgbGltaXRlZElkcy5jb250YWlucyhsZWdhY3lJZCkpIHsKKyAgICAgICAgICAgIGxpbWl0ZWRBcHByb3ZhbHMucHV0KHBzYS5nZXRQYXRjaFNldElkKCksIHBzYSk7CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBhcHByb3ZhbHNNYXA7CisgICAgcmV0dXJuIGxpbWl0ZWRBcHByb3ZhbHM7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGRiIHJldmlldyBkYXRhYmFzZS4KKyAgICogQHJldHVybiBhbGwgcGF0Y2ggc2V0IGFwcHJvdmFscyBmb3IgdGhlIGNoYW5nZSBpbiB0aW1lc3RhbXAgb3JkZXIKKyAgICogICAgIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIge0BsaW5rICNsaW1pdFRvUGF0Y2hTZXRzKENvbGxlY3Rpb24pfSB3YXMKKyAgICogICAgIHByZXZpb3VzbHkgY2FsbGVkKS4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGUgZGF0YWJhc2UuCisgICAqLworICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhbGxBcHByb3ZhbHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKGFsbEFwcHJvdmFsc01hcChkYikudmFsdWVzKCkpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBkYiByZXZpZXcgZGF0YWJhc2UuCisgICAqIEByZXR1cm4gYWxsIHBhdGNoIHNldCBhcHByb3ZhbHMgZm9yIHRoZSBjaGFuZ2UgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICAgKiAgICAge0BsaW5rICNsaW1pdFRvUGF0Y2hTZXRzKENvbGxlY3Rpb24pfSB3YXMgcHJldmlvdXNseSBjYWxsZWQpLCBrZXllZCBieQorICAgKiAgICAgSUQsIG9yZGVyZWQgYnkgdGltZXN0YW1wIHdpdGhpbiBlYWNoIHBhdGNoIHNldC4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGUgZGF0YWJhc2UuCisgICAqLworICBwdWJsaWMgTGlzdE11bHRpbWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldEFwcHJvdmFsPiBhbGxBcHByb3ZhbHNNYXAoCisgICAgICBQcm92aWRlcjxSZXZpZXdEYj4gZGIpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGlmIChhbGxBcHByb3ZhbHMgPT0gbnVsbCkgeworICAgICAgYWxsQXBwcm92YWxzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogc29ydEFwcHJvdmFscygKKyAgICAgICAgICBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGxlZ2FjeUlkKSkpIHsKKyAgICAgICAgYWxsQXBwcm92YWxzLnB1dChwc2EuZ2V0UGF0Y2hTZXRJZCgpLCBwc2EpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWxsQXBwcm92YWxzOwogICB9CiAKICAgcHVibGljIENvbGxlY3Rpb248UGF0Y2hMaW5lQ29tbWVudD4gY29tbWVudHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQpAQCAtMzIyLDQgKzQzMCwxMiBAQAogICAgIH0KICAgICByZXR1cm4gbWVzc2FnZXM7CiAgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTdWJtaXRSZWNvcmRzKExpc3Q8U3VibWl0UmVjb3JkPiByZWNvcmRzKSB7CisgICAgc3VibWl0UmVjb3JkcyA9IHJlY29yZHM7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdWJtaXRSZWNvcmQ+IGdldFN1Ym1pdFJlY29yZHMoKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlY29yZHM7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5QnVpbGRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlCdWlsZGVyLmphdmEKaW5kZXggZTgwYWQ2Ny4uN2JiYjA3MyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlCdWlsZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlCdWlsZGVyLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwpAQCAtMTA3LDExICsxMDYsOSBAQAogICAgIGZpbmFsIFByb3ZpZGVyPENoYW5nZVF1ZXJ5UmV3cml0ZXI+IHJld3JpdGVyOwogICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OwogICAgIGZpbmFsIENhcGFiaWxpdHlDb250cm9sLkZhY3RvcnkgY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5OwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeTsKICAgICBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOwogICAgIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7Ci0gICAgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwogICAgIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWU7CiAgICAgZmluYWwgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGU7CiAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CkBAIC0xMjIsMTEgKzExOSw5IEBACiAgICAgICAgIFByb3ZpZGVyPENoYW5nZVF1ZXJ5UmV3cml0ZXI+IHJld3JpdGVyLAogICAgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKICAgICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCi0gICAgICAgIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKICAgICAgICAgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3RvcnksCiAgICAgICAgIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXIsCiAgICAgICAgIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCi0gICAgICAgIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKICAgICAgICAgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZSwKICAgICAgICAgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGUsCiAgICAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLApAQCAtMTM1LDExICsxMzAsOSBAQAogICAgICAgdGhpcy5yZXdyaXRlciA9IHJld3JpdGVyOwogICAgICAgdGhpcy51c2VyRmFjdG9yeSA9IHVzZXJGYWN0b3J5OwogICAgICAgdGhpcy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkgPSBjYXBhYmlsaXR5Q29udHJvbEZhY3Rvcnk7Ci0gICAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgICAgICB0aGlzLmNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeTsKICAgICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOwogICAgICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7Ci0gICAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwogICAgICAgdGhpcy5hbGxQcm9qZWN0c05hbWUgPSBhbGxQcm9qZWN0c05hbWU7CiAgICAgICB0aGlzLnBhdGNoTGlzdENhY2hlID0gcGF0Y2hMaXN0Q2FjaGU7CiAgICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CkBAIC0zMDQsOCArMjk3LDkgQEAKIAogICBAT3BlcmF0b3IKICAgcHVibGljIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBsYWJlbChTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBuZXcgTGFiZWxQcmVkaWNhdGUoYXJncy5jaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3RvcnksCi0gICAgICAgIGFyZ3MudXNlckZhY3RvcnksIGFyZ3MuZGJQcm92aWRlciwgYXJncy5hcHByb3ZhbFR5cGVzLCBuYW1lKTsKKyAgICByZXR1cm4gbmV3IExhYmVsUHJlZGljYXRlKGFyZ3MucHJvamVjdENhY2hlLAorICAgICAgICBhcmdzLmNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeSwgYXJncy51c2VyRmFjdG9yeSwgYXJncy5kYlByb3ZpZGVyLAorICAgICAgICBuYW1lKTsKICAgfQogCiAgIEBPcGVyYXRvcgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlSZXdyaXRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlSZXdyaXRlci5qYXZhCmluZGV4IDM0ZWMyZjQuLmU2MjUxYmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5UmV3cml0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VRdWVyeVJld3JpdGVyLmphdmEKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAgICAgICAgICAgbmV3IENoYW5nZVF1ZXJ5QnVpbGRlci5Bcmd1bWVudHMoIC8vCiAgICAgICAgICAgICAgICAgICBuZXcgSW52YWxpZFByb3ZpZGVyPFJldmlld0RiPigpLCAvLwogICAgICAgICAgICAgICAgICAgbmV3IEludmFsaWRQcm92aWRlcjxDaGFuZ2VRdWVyeVJld3JpdGVyPigpLCAvLwotICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgLy8KKyAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIC8vCiAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsKSwgbnVsbCkpOwogCiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CkBAIC01Miw3ICs1Miw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4gYW5kKENvbGxlY3Rpb248PyBleHRlbmRzIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPj4gbCkgewotICAgIHJldHVybiBoYXNTb3VyY2UobCkgPyBuZXcgQW5kU291cmNlKGwpIDogc3VwZXIuYW5kKGwpOworICAgIHJldHVybiBoYXNTb3VyY2UobCkgPyBuZXcgQW5kU291cmNlKGRiUHJvdmlkZXIsIGwpIDogc3VwZXIuYW5kKGwpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MYWJlbFByZWRpY2F0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvTGFiZWxQcmVkaWNhdGUuamF2YQppbmRleCBiZjIxMjYxLi45MzZhNDdkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MYWJlbFByZWRpY2F0ZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0xhYmVsUHJlZGljYXRlLmphdmEKQEAgLTE0LDE5ICsxNCwyNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5PcGVyYXRvclByZWRpY2F0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIApAQCAtNTQsMzQgKzU5LDI0IEBACiAgICAgYWJzdHJhY3QgYm9vbGVhbiBtYXRjaChpbnQgcHNWYWx1ZSwgaW50IGV4cFZhbHVlKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkoQXBwcm92YWxUeXBlcyB0eXBlcywgU3RyaW5nIHRvRmluZCkgeworICBwcml2YXRlIHN0YXRpYyBMYWJlbFR5cGUgdHlwZShMYWJlbFR5cGVzIHR5cGVzLCBTdHJpbmcgdG9GaW5kKSB7CiAgICAgaWYgKHR5cGVzLmJ5TGFiZWwodG9GaW5kKSAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gdHlwZXMuYnlMYWJlbCh0b0ZpbmQpLmdldENhdGVnb3J5KCk7CisgICAgICByZXR1cm4gdHlwZXMuYnlMYWJlbCh0b0ZpbmQpOwogICAgIH0KIAotICAgIGlmICh0eXBlcy5ieUlkKG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKHRvRmluZCkpICE9IG51bGwpIHsKLSAgICAgIHJldHVybiB0eXBlcy5ieUlkKG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKHRvRmluZCkpLmdldENhdGVnb3J5KCk7Ci0gICAgfQotCi0gICAgZm9yIChBcHByb3ZhbFR5cGUgYXQgOiB0eXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBhdC5nZXRDYXRlZ29yeSgpOwotCi0gICAgICBpZiAodG9GaW5kLmVxdWFsc0lnbm9yZUNhc2UoY2F0ZWdvcnkuZ2V0TmFtZSgpKSkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7Ci0KLSAgICAgIH0gZWxzZSBpZiAodG9GaW5kLmVxdWFsc0lnbm9yZUNhc2UoY2F0ZWdvcnkuZ2V0TmFtZSgpLnJlcGxhY2UoIiAiLCAiIikpKSB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKKyAgICBmb3IgKExhYmVsVHlwZSBsdCA6IHR5cGVzLmdldExhYmVsVHlwZXMoKSkgeworICAgICAgaWYgKHRvRmluZC5lcXVhbHNJZ25vcmVDYXNlKGx0LmdldE5hbWUoKSkpIHsKKyAgICAgICAgcmV0dXJuIGx0OwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoQXBwcm92YWxUeXBlIGF0IDogdHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpKSB7Ci0gICAgICBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5ID0gYXQuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgIGlmICh0b0ZpbmQuZXF1YWxzSWdub3JlQ2FzZShjYXRlZ29yeS5nZXRBYmJyZXZpYXRlZE5hbWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OworICAgIGZvciAoTGFiZWxUeXBlIGx0IDogdHlwZXMuZ2V0TGFiZWxUeXBlcygpKSB7CisgICAgICBpZiAodG9GaW5kLmVxdWFsc0lnbm9yZUNhc2UobHQuZ2V0QWJicmV2aWF0ZWROYW1lKCkpKSB7CisgICAgICAgIHJldHVybiBsdDsKICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkobmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQodG9GaW5kKSwgdG9GaW5kKTsKKyAgICByZXR1cm4gTGFiZWxUeXBlLndpdGhEZWZhdWx0VmFsdWVzKHRvRmluZCk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBUZXN0IG9wKFN0cmluZyBvcCkgewpAQCAtMTA2LDcyICsxMDEsMTA4IEBACiAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwogICB9CiAKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOwogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2NGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOwogICBwcml2YXRlIGZpbmFsIFRlc3QgdGVzdDsKLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5OwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBwZXJtaXNzaW9uTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdHlwZTsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhwVmFsOwogCi0gIExhYmVsUHJlZGljYXRlKENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2NGYWN0b3J5LAotICAgICAgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdXNlckZhY3RvcnksIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLAotICAgICAgQXBwcm92YWxUeXBlcyB0eXBlcywgU3RyaW5nIHZhbHVlKSB7CisgIExhYmVsUHJlZGljYXRlKFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCisgICAgICBDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNjRmFjdG9yeSwKKyAgICAgIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBTdHJpbmcgdmFsdWUpIHsKICAgICBzdXBlcihDaGFuZ2VRdWVyeUJ1aWxkZXIuRklFTERfTEFCRUwsIHZhbHVlKTsKICAgICB0aGlzLmNjRmFjdG9yeSA9IGNjRmFjdG9yeTsKKyAgICB0aGlzLnByb2plY3RDYWNoZSA9IHByb2plY3RDYWNoZTsKICAgICB0aGlzLnVzZXJGYWN0b3J5ID0gdXNlckZhY3Rvcnk7CiAgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKIAogICAgIE1hdGNoZXIgbTEgPSBQYXR0ZXJuLmNvbXBpbGUoIig9fD49fDw9KShbKy1dP1xcZCspJCIpLm1hdGNoZXIodmFsdWUpOwogICAgIE1hdGNoZXIgbTIgPSBQYXR0ZXJuLmNvbXBpbGUoIihbKy1dXFxkKykkIikubWF0Y2hlcih2YWx1ZSk7CiAgICAgaWYgKG0xLmZpbmQoKSkgewotICAgICAgY2F0ZWdvcnkgPSBjYXRlZ29yeSh0eXBlcywgdmFsdWUuc3Vic3RyaW5nKDAsIG0xLnN0YXJ0KCkpKTsKKyAgICAgIHR5cGUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgbTEuc3RhcnQoKSk7CiAgICAgICB0ZXN0ID0gb3AobTEuZ3JvdXAoMSkpOwogICAgICAgZXhwVmFsID0gdmFsdWUobTEuZ3JvdXAoMikpOwogCiAgICAgfSBlbHNlIGlmIChtMi5maW5kKCkpIHsKLSAgICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkodHlwZXMsIHZhbHVlLnN1YnN0cmluZygwLCBtMi5zdGFydCgpKSk7CisgICAgICB0eXBlID0gdmFsdWUuc3Vic3RyaW5nKDAsIG0yLnN0YXJ0KCkpOwogICAgICAgdGVzdCA9IFRlc3QuRVE7CiAgICAgICBleHBWYWwgPSB2YWx1ZShtMi5ncm91cCgxKSk7CiAKICAgICB9IGVsc2UgewotICAgICAgY2F0ZWdvcnkgPSBjYXRlZ29yeSh0eXBlcywgdmFsdWUpOworICAgICAgdHlwZSA9IHZhbHVlOwogICAgICAgdGVzdCA9IFRlc3QuRVE7CiAgICAgICBleHBWYWwgPSAxOwogICAgIH0KLQotICAgIHRoaXMucGVybWlzc2lvbk5hbWUgPSBQZXJtaXNzaW9uLmZvckxhYmVsKGNhdGVnb3J5LmdldExhYmVsTmFtZSgpKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiBtYXRjaChmaW5hbCBDaGFuZ2VEYXRhIG9iamVjdCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ2hhbmdlIGMgPSBvYmplY3QuY2hhbmdlKGRiUHJvdmlkZXIpOworICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgIC8vIFRoZSBjaGFuZ2UgaGFzIGRpc2FwcGVhcmVkLgorICAgICAgLy8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmluYWwgUHJvamVjdFN0YXRlIHByb2plY3QgPSBwcm9qZWN0Q2FjaGUuZ2V0KGMuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpKTsKKyAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CisgICAgICAvLyBUaGUgcHJvamVjdCBoYXMgZGlzYXBwZWFyZWQuCisgICAgICAvLworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmaW5hbCBMYWJlbFR5cGUgbGFiZWxUeXBlID0gdHlwZShwcm9qZWN0LmdldExhYmVsVHlwZXMoKSwgdHlwZSk7CisgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IGFsbEFwcHJvdmVycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CisgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IGFwcHJvdmVyc1RoYXRWb3RlZEluQ2F0ZWdvcnkgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwogICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwIDogb2JqZWN0LmN1cnJlbnRBcHByb3ZhbHMoZGJQcm92aWRlcikpIHsKLSAgICAgIGlmIChwLmdldENhdGVnb3J5SWQoKS5lcXVhbHMoY2F0ZWdvcnkuZ2V0SWQoKSkpIHsKLSAgICAgICAgaW50IHBzVmFsID0gcC5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodGVzdC5tYXRjaChwc1ZhbCwgZXhwVmFsKSkgewotICAgICAgICAgIC8vIERvdWJsZSBjaGVjayB0aGUgdmFsdWUgaXMgc3RpbGwgcGVybWl0dGVkIGZvciB0aGUgdXNlci4KLSAgICAgICAgICAvLwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDaGFuZ2VDb250cm9sIGNjID0gY2NGYWN0b3J5LmNvbnRyb2xGb3Iob2JqZWN0LmNoYW5nZShkYlByb3ZpZGVyKSwgLy8KLSAgICAgICAgICAgICAgICB1c2VyRmFjdG9yeS5jcmVhdGUoZGJQcm92aWRlciwgcC5nZXRBY2NvdW50SWQoKSkpOwotICAgICAgICAgICAgaWYgKCFjYy5pc1Zpc2libGUoZGJQcm92aWRlci5nZXQoKSkpIHsKLSAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgY2FuJ3Qgc2VlIHRoZSBjaGFuZ2UgYW55bW9yZS4KLSAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwc1ZhbCA9IGNjLmdldFJhbmdlKHBlcm1pc3Npb25OYW1lKS5zcXVhc2gocHNWYWwpOwotICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBUaGUgcHJvamVjdCBoYXMgZGlzYXBwZWFyZWQuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKHRlc3QubWF0Y2gocHNWYWwsIGV4cFZhbCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KKyAgICAgIGFsbEFwcHJvdmVycy5hZGQocC5nZXRBY2NvdW50SWQoKSk7CisgICAgICBpZiAobGFiZWxUeXBlLm1hdGNoZXMocCkpIHsKKyAgICAgICAgYXBwcm92ZXJzVGhhdFZvdGVkSW5DYXRlZ29yeS5hZGQocC5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIGlmIChtYXRjaChjLCBwLmdldFZhbHVlKCksIHAuZ2V0QWNjb3VudElkKCksIGxhYmVsVHlwZSkpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKworICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBhcHByb3ZlcnNUaGF0RGlkTm90Vm90ZUluQ2F0ZWdvcnkgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPihhbGxBcHByb3ZlcnMpOworICAgIGFwcHJvdmVyc1RoYXREaWROb3RWb3RlSW5DYXRlZ29yeS5yZW1vdmVBbGwoYXBwcm92ZXJzVGhhdFZvdGVkSW5DYXRlZ29yeSk7CisgICAgZm9yIChBY2NvdW50LklkIGEgOiBhcHByb3ZlcnNUaGF0RGlkTm90Vm90ZUluQ2F0ZWdvcnkpIHsKKyAgICAgIGlmIChtYXRjaChjLCAwLCBhLCBsYWJlbFR5cGUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBtYXRjaChmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBpbnQgdmFsdWUsCisgICAgICBmaW5hbCBBY2NvdW50LklkIGFwcHJvdmVyLCBmaW5hbCBMYWJlbFR5cGUgdHlwZSkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGludCBwc1ZhbCA9IHZhbHVlOworICAgIGlmICh0ZXN0Lm1hdGNoKHBzVmFsLCBleHBWYWwpKSB7CisgICAgICAvLyBEb3VibGUgY2hlY2sgdGhlIHZhbHVlIGlzIHN0aWxsIHBlcm1pdHRlZCBmb3IgdGhlIHVzZXIuCisgICAgICAvLworICAgICAgdHJ5IHsKKyAgICAgICAgQ2hhbmdlQ29udHJvbCBjYyA9IGNjRmFjdG9yeS5jb250cm9sRm9yKGNoYW5nZSwgLy8KKyAgICAgICAgICAgIHVzZXJGYWN0b3J5LmNyZWF0ZShkYlByb3ZpZGVyLCBhcHByb3ZlcikpOworICAgICAgICBpZiAoIWNjLmlzVmlzaWJsZShkYlByb3ZpZGVyLmdldCgpKSkgeworICAgICAgICAgIC8vIFRoZSB1c2VyIGNhbid0IHNlZSB0aGUgY2hhbmdlIGFueW1vcmUuCisgICAgICAgICAgLy8KKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNWYWwgPSBjYy5nZXRSYW5nZShQZXJtaXNzaW9uLmZvckxhYmVsKHR5cGUuZ2V0TmFtZSgpKSkuc3F1YXNoKHBzVmFsKTsKKyAgICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIFRoZSBwcm9qZWN0IGhhcyBkaXNhcHBlYXJlZC4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAodGVzdC5tYXRjaChwc1ZhbCwgZXhwVmFsKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0xpc3RDaGFuZ2VzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MaXN0Q2hhbmdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVkNjZhLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0xpc3RDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQUxMX0NPTU1JVFM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkFMTF9GSUxFUzsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQUxMX1JFVklTSU9OUzsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQ1VSUkVOVF9DT01NSVQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkNVUlJFTlRfRklMRVM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkNVUlJFTlRfUkVWSVNJT047Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkxBQkVMUzsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mby5QYXJlbnRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Vc2VySWRlbnRpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Bbm9ueW1vdXNVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkFjY291bnRBdHRyaWJ1dGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Q2FjaGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdEVudHJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Ib3N0S2V5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgTGlzdENoYW5nZXMgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGlzdENoYW5nZXMuY2xhc3MpOwotCi0gIEBTaW5nbGV0b24KLSAgc3RhdGljIGNsYXNzIFVybHMgewotICAgIGZpbmFsIFN0cmluZyBnaXQ7Ci0gICAgZmluYWwgU3RyaW5nIGh0dHA7Ci0KLSAgICBASW5qZWN0Ci0gICAgVXJscyhAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcpIHsKLSAgICAgIHRoaXMuZ2l0ID0gZW5zdXJlU2xhc2goY2ZnLmdldFN0cmluZygiZ2Vycml0IiwgbnVsbCwgImNhbm9uaWNhbEdpdFVybCIpKTsKLSAgICAgIHRoaXMuaHR0cCA9IGVuc3VyZVNsYXNoKGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJnaXRIdHRwVXJsIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBlbnN1cmVTbGFzaChTdHJpbmcgaW4pIHsKLSAgICAgIGlmIChpbiAhPSBudWxsICYmICFpbi5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgIHJldHVybiBpbiArICIvIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFF1ZXJ5UHJvY2Vzc29yIGltcDsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotICBwcml2YXRlIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXI7Ci0gIHByaXZhdGUgZmluYWwgQW5vbnltb3VzVXNlciBhbm9ueW1vdXM7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBQYXRjaExpc3RDYWNoZSBwYXRjaExpc3RDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBTc2hJbmZvIHNzaEluZm87Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKLSAgcHJpdmF0ZSBmaW5hbCBVcmxzIHVybHM7Ci0gIHByaXZhdGUgYm9vbGVhbiByZXZlcnNlOwotICBwcml2YXRlIE1hcDxBY2NvdW50LklkLCBBY2NvdW50QXR0cmlidXRlPiBhY2NvdW50czsKLSAgcHJpdmF0ZSBNYXA8Q2hhbmdlLklkLCBDaGFuZ2VDb250cm9sPiBjb250cm9sczsKLSAgcHJpdmF0ZSBFbnVtU2V0PExpc3RDaGFuZ2VzT3B0aW9uPiBvcHRpb25zOwotCi0gIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIG1ldGFWYXIgPSAiRk1UIiwgdXNhZ2UgPSAiT3V0cHV0IGRpc3BsYXkgZm9ybWF0IikKLSAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tcXVlcnkiLCBhbGlhc2VzID0geyItcSJ9LCBtZXRhVmFyID0gIlFVRVJZIiwgbXVsdGlWYWx1ZWQgPSB0cnVlLCB1c2FnZSA9ICJRdWVyeSBzdHJpbmciKQotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBxdWVyaWVzOwotCi0gIEBPcHRpb24obmFtZSA9ICItLWxpbWl0IiwgYWxpYXNlcyA9IHsiLW4ifSwgbWV0YVZhciA9ICJDTlQiLCB1c2FnZSA9ICJNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiIpCi0gIHB1YmxpYyB2b2lkIHNldExpbWl0KGludCBsaW1pdCkgewotICAgIGltcC5zZXRMaW1pdChsaW1pdCk7Ci0gIH0KLQotICBAT3B0aW9uKG5hbWUgPSAiLW8iLCBtdWx0aVZhbHVlZCA9IHRydWUsIHVzYWdlID0gIk91dHB1dCBvcHRpb25zIHBlciBjaGFuZ2UiKQotICBwdWJsaWMgdm9pZCBhZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24gbykgewotICAgIG9wdGlvbnMuYWRkKG8pOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi1PIiwgdXNhZ2UgPSAiT3V0cHV0IG9wdGlvbiBmbGFncywgaW4gaGV4IikKLSAgdm9pZCBzZXRPcHRpb25GbGFnc0hleChTdHJpbmcgaGV4KSB7Ci0gICAgb3B0aW9ucy5hZGRBbGwoTGlzdENoYW5nZXNPcHRpb24uZnJvbUJpdHMoSW50ZWdlci5wYXJzZUludChoZXgsIDE2KSkpOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi1QIiwgbWV0YVZhciA9ICJTT1JUS0VZIiwgdXNhZ2UgPSAiUHJldmlvdXMgY2hhbmdlcyBiZWZvcmUgU09SVEtFWSIpCi0gIHB1YmxpYyB2b2lkIHNldFNvcnRLZXlBZnRlcihTdHJpbmcga2V5KSB7Ci0gICAgLy8gUXVlcnlpbmcgZm9yIHRoZSBwcmlvciBwYWdlIG9mIGNoYW5nZXMgcmVxdWlyZXMgc29ydGtleV9hZnRlciBwcmVkaWNhdGUuCi0gICAgLy8gQ2hhbmdlcyBhcmUgc2hvd24gbW9zdCByZWNlbnQtPmxlYXN0IHJlY2VudC4gVGhlIHByZXZpb3VzIHBhZ2Ugb2YKLSAgICAvLyByZXN1bHRzIGNvbnRhaW5zIGNoYW5nZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGdpdmVuIGtleS4KLSAgICBpbXAuc2V0U29ydGtleUFmdGVyKGtleSk7Ci0gICAgcmV2ZXJzZSA9IHRydWU7Ci0gIH0KLQotICBAT3B0aW9uKG5hbWUgPSAiLU4iLCBtZXRhVmFyID0gIlNPUlRLRVkiLCB1c2FnZSA9ICJOZXh0IGNoYW5nZXMgYWZ0ZXIgU09SVEtFWSIpCi0gIHB1YmxpYyB2b2lkIHNldFNvcnRLZXlCZWZvcmUoU3RyaW5nIGtleSkgewotICAgIC8vIFF1ZXJ5aW5nIGZvciB0aGUgbmV4dCBwYWdlIG9mIGNoYW5nZXMgcmVxdWlyZXMgc29ydGtleV9iZWZvcmUgcHJlZGljYXRlLgotICAgIC8vIENoYW5nZXMgYXJlIHNob3duIG1vc3QgcmVjZW50LT5sZWFzdCByZWNlbnQuIFRoZSBuZXh0IHBhZ2UgY29udGFpbnMKLSAgICAvLyBjaGFuZ2VzIHRoYXQgd2VyZSB1cGRhdGVkIGJlZm9yZSB0aGUgZ2l2ZW4ga2V5LgotICAgIGltcC5zZXRTb3J0a2V5QmVmb3JlKGtleSk7Ci0gIH0KLQotICBASW5qZWN0Ci0gIExpc3RDaGFuZ2VzKFF1ZXJ5UHJvY2Vzc29yIHFwLAotICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLAotICAgICAgQXBwcm92YWxUeXBlcyBhdCwKLSAgICAgIEN1cnJlbnRVc2VyIHUsCi0gICAgICBBbm9ueW1vdXNVc2VyIGF1LAotICAgICAgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNmLAotICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwc2ksCi0gICAgICBQYXRjaExpc3RDYWNoZSBwbGMsCi0gICAgICBTc2hJbmZvIHNzaEluZm8sCi0gICAgICBAQ2Fub25pY2FsV2ViVXJsIFByb3ZpZGVyPFN0cmluZz4gY3VybCwKLSAgICAgIFVybHMgdXJscykgewotICAgIHRoaXMuaW1wID0gcXA7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGF0OwotICAgIHRoaXMudXNlciA9IHU7Ci0gICAgdGhpcy5hbm9ueW1vdXMgPSBhdTsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2Y7Ci0gICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcHNpOwotICAgIHRoaXMucGF0Y2hMaXN0Q2FjaGUgPSBwbGM7Ci0gICAgdGhpcy5zc2hJbmZvID0gc3NoSW5mbzsKLSAgICB0aGlzLnVybFByb3ZpZGVyID0gY3VybDsKLSAgICB0aGlzLnVybHMgPSB1cmxzOwotCi0gICAgYWNjb3VudHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICBjb250cm9scyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIG9wdGlvbnMgPSBFbnVtU2V0Lm5vbmVPZihMaXN0Q2hhbmdlc09wdGlvbi5jbGFzcyk7Ci0gIH0KLQotICBwdWJsaWMgT3V0cHV0Rm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gZm9ybWF0OwotICB9Ci0KLSAgcHVibGljIExpc3RDaGFuZ2VzIHNldEZvcm1hdChPdXRwdXRGb3JtYXQgZm10KSB7Ci0gICAgdGhpcy5mb3JtYXQgPSBmbXQ7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdENoYW5nZXMgYWRkUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7Ci0gICAgaWYgKHF1ZXJpZXMgPT0gbnVsbCkgewotICAgICAgcXVlcmllcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgIH0KLSAgICBxdWVyaWVzLmFkZChxdWVyeSk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBxdWVyeShXcml0ZXIgb3V0KQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgUXVlcnlQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIGlmIChpbXAuaXNEaXNhYmxlZCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUV4Y2VwdGlvbigicXVlcnkgZGlzYWJsZWQiKTsKLSAgICB9Ci0gICAgaWYgKHF1ZXJpZXMgPT0gbnVsbCB8fCBxdWVyaWVzLmlzRW1wdHkoKSkgewotICAgICAgcXVlcmllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInN0YXR1czpvcGVuIik7Ci0gICAgfSBlbHNlIGlmIChxdWVyaWVzLnNpemUoKSA+IDEwKSB7Ci0gICAgICAvLyBIYXJkLWNvZGUgYSBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdG8gcHJldmVudAotICAgICAgLy8gdXNlcnMgZnJvbSBzdWJtaXR0aW5nIHRvbyBtdWNoIHRvIHRoZSBzZXJ2ZXIgaW4gYSBzaW5nbGUgY2FsbC4KLSAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXhjZXB0aW9uKCJsaW1pdCBvZiAxMCBxdWVyaWVzIik7Ci0gICAgfQotCi0gICAgTGlzdDxMaXN0PENoYW5nZUluZm8+PiByZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocXVlcmllcy5zaXplKCkpOwotICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogcXVlcmllcykgewotICAgICAgTGlzdDxDaGFuZ2VEYXRhPiBjaGFuZ2VzID0gaW1wLnF1ZXJ5Q2hhbmdlcyhxdWVyeSk7Ci0gICAgICBib29sZWFuIG1vcmVDaGFuZ2VzID0gaW1wLmdldExpbWl0KCkgPiAwICYmIGNoYW5nZXMuc2l6ZSgpID4gaW1wLmdldExpbWl0KCk7Ci0gICAgICBpZiAobW9yZUNoYW5nZXMpIHsKLSAgICAgICAgaWYgKHJldmVyc2UpIHsKLSAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zdWJMaXN0KDEsIGNoYW5nZXMuc2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zdWJMaXN0KDAsIGltcC5nZXRMaW1pdCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ2hhbmdlRGF0YS5lbnN1cmVDaGFuZ2VMb2FkZWQoZGIsIGNoYW5nZXMpOwotICAgICAgQ2hhbmdlRGF0YS5lbnN1cmVDdXJyZW50UGF0Y2hTZXRMb2FkZWQoZGIsIGNoYW5nZXMpOwotICAgICAgQ2hhbmdlRGF0YS5lbnN1cmVDdXJyZW50QXBwcm92YWxzTG9hZGVkKGRiLCBjaGFuZ2VzKTsKLQotICAgICAgTGlzdDxDaGFuZ2VJbmZvPiBpbmZvID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGNoYW5nZXMuc2l6ZSgpKTsKLSAgICAgIGZvciAoQ2hhbmdlRGF0YSBjZCA6IGNoYW5nZXMpIHsKLSAgICAgICAgaW5mby5hZGQodG9DaGFuZ2VJbmZvKGNkKSk7Ci0gICAgICB9Ci0gICAgICBpZiAobW9yZUNoYW5nZXMgJiYgIWluZm8uaXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChyZXZlcnNlKSB7Ci0gICAgICAgICAgaW5mby5nZXQoMCkuX21vcmVDaGFuZ2VzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmZvLmdldChpbmZvLnNpemUoKSAtIDEpLl9tb3JlQ2hhbmdlcyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlcy5hZGQoaW5mbyk7Ci0gICAgfQotCi0gICAgaWYgKCFhY2NvdW50cy5pc0VtcHR5KCkpIHsKLSAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogZGIuZ2V0KCkuYWNjb3VudHMoKS5nZXQoYWNjb3VudHMua2V5U2V0KCkpKSB7Ci0gICAgICAgIEFjY291bnRBdHRyaWJ1dGUgYSA9IGFjY291bnRzLmdldChhY2NvdW50LmdldElkKCkpOwotICAgICAgICBhLm5hbWUgPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGFjY291bnQuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZvcm1hdC5pc0pzb24oKSkgewotICAgICAgZm9ybWF0Lm5ld0dzb24oKS50b0pzb24oCi0gICAgICAgICAgcmVzLnNpemUoKSA9PSAxID8gcmVzLmdldCgwKSA6IHJlcywKLSAgICAgICAgICBuZXcgVHlwZVRva2VuPExpc3Q8Q2hhbmdlSW5mbz4+KCkge30uZ2V0VHlwZSgpLAotICAgICAgICAgIG91dCk7Ci0gICAgICBvdXQud3JpdGUoJ1xuJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJvb2xlYW4gZmlyc3RRdWVyeSA9IHRydWU7Ci0gICAgICBmb3IgKExpc3Q8Q2hhbmdlSW5mbz4gaW5mbyA6IHJlcykgewotICAgICAgICBpZiAoZmlyc3RRdWVyeSkgewotICAgICAgICAgIGZpcnN0UXVlcnkgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQud3JpdGUoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChDaGFuZ2VJbmZvIGMgOiBpbmZvKSB7Ci0gICAgICAgICAgU3RyaW5nIGlkID0gbmV3IENoYW5nZS5LZXkoYy5pZCkuYWJicmV2aWF0ZSgpOwotICAgICAgICAgIFN0cmluZyBzdWJqZWN0ID0gYy5zdWJqZWN0OwotICAgICAgICAgIGlmIChzdWJqZWN0Lmxlbmd0aCgpICsgaWQubGVuZ3RoKCkgPiA4MCkgewotICAgICAgICAgICAgc3ViamVjdCA9IHN1YmplY3Quc3Vic3RyaW5nKDAsIDgwIC0gaWQubGVuZ3RoKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQud3JpdGUoaWQpOwotICAgICAgICAgIG91dC53cml0ZSgnICcpOwotICAgICAgICAgIG91dC53cml0ZShzdWJqZWN0LnJlcGxhY2UoJ1xuJywgJyAnKSk7Ci0gICAgICAgICAgb3V0LndyaXRlKCdcbicpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBDaGFuZ2VJbmZvIHRvQ2hhbmdlSW5mbyhDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBDaGFuZ2VJbmZvIG91dCA9IG5ldyBDaGFuZ2VJbmZvKCk7Ci0gICAgQ2hhbmdlIGluID0gY2QuY2hhbmdlKGRiKTsKLSAgICBvdXQucHJvamVjdCA9IGluLmdldFByb2plY3QoKS5nZXQoKTsKLSAgICBvdXQuYnJhbmNoID0gaW4uZ2V0RGVzdCgpLmdldFNob3J0TmFtZSgpOwotICAgIG91dC50b3BpYyA9IGluLmdldFRvcGljKCk7Ci0gICAgb3V0LmlkID0gaW4uZ2V0S2V5KCkuZ2V0KCk7Ci0gICAgb3V0LnN1YmplY3QgPSBpbi5nZXRTdWJqZWN0KCk7Ci0gICAgb3V0LnN0YXR1cyA9IGluLmdldFN0YXR1cygpOwotICAgIG91dC5vd25lciA9IGFzQWNjb3VudEF0dHJpYnV0ZShpbi5nZXRPd25lcigpKTsKLSAgICBvdXQuY3JlYXRlZCA9IGluLmdldENyZWF0ZWRPbigpOwotICAgIG91dC51cGRhdGVkID0gaW4uZ2V0TGFzdFVwZGF0ZWRPbigpOwotICAgIG91dC5fbnVtYmVyID0gaW4uZ2V0SWQoKS5nZXQoKTsKLSAgICBvdXQuX3NvcnRrZXkgPSBpbi5nZXRTb3J0S2V5KCk7Ci0gICAgb3V0LnN0YXJyZWQgPSB1c2VyLmdldFN0YXJyZWRDaGFuZ2VzKCkuY29udGFpbnMoaW4uZ2V0SWQoKSkgPyB0cnVlIDogbnVsbDsKLSAgICBvdXQucmV2aWV3ZWQgPSBpbi5nZXRTdGF0dXMoKS5pc09wZW4oKSAmJiBpc0NoYW5nZVJldmlld2VkKGNkKSA/IHRydWUgOiBudWxsOwotICAgIG91dC5sYWJlbHMgPSBvcHRpb25zLmNvbnRhaW5zKExBQkVMUykgPyBsYWJlbHNGb3IoY2QpIDogbnVsbDsKLQotICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKEFMTF9SRVZJU0lPTlMpIHx8IG9wdGlvbnMuY29udGFpbnMoQ1VSUkVOVF9SRVZJU0lPTikpIHsKLSAgICAgIG91dC5yZXZpc2lvbnMgPSByZXZpc2lvbnMoY2QpOwotICAgICAgZm9yIChTdHJpbmcgY29tbWl0IDogb3V0LnJldmlzaW9ucy5rZXlTZXQoKSkgewotICAgICAgICBpZiAob3V0LnJldmlzaW9ucy5nZXQoY29tbWl0KS5pc0N1cnJlbnQpIHsKLSAgICAgICAgICBvdXQuY3VycmVudF9yZXZpc2lvbiA9IGNvbW1pdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBvdXQ7Ci0gIH0KLQotICBwcml2YXRlIEFjY291bnRBdHRyaWJ1dGUgYXNBY2NvdW50QXR0cmlidXRlKEFjY291bnQuSWQgdXNlcikgewotICAgIGlmICh1c2VyID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBBY2NvdW50QXR0cmlidXRlIGEgPSBhY2NvdW50cy5nZXQodXNlcik7Ci0gICAgaWYgKGEgPT0gbnVsbCkgewotICAgICAgYSA9IG5ldyBBY2NvdW50QXR0cmlidXRlKCk7Ci0gICAgICBhY2NvdW50cy5wdXQodXNlciwgYSk7Ci0gICAgfQotICAgIHJldHVybiBhOwotICB9Ci0KLSAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sIGNvbnRyb2woQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgQ2hhbmdlQ29udHJvbCBjdHJsID0gY2QuY2hhbmdlQ29udHJvbCgpOwotICAgIGlmIChjdHJsICE9IG51bGwgJiYgY3RybC5nZXRDdXJyZW50VXNlcigpID09IHVzZXIpIHsKLSAgICAgIHJldHVybiBjdHJsOwotICAgIH0KLQotICAgIGN0cmwgPSBjb250cm9scy5nZXQoY2QuZ2V0SWQoKSk7Ci0gICAgaWYgKGN0cmwgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGN0cmw7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGN0cmwgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGNkLmNoYW5nZShkYikpOwotICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgY29udHJvbHMucHV0KGNkLmdldElkKCksIGN0cmwpOwotICAgIHJldHVybiBjdHJsOwotICB9Ci0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVsc0ZvcihDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOwotICAgIGlmIChjdGwgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfQotCi0gICAgUGF0Y2hTZXQgcHMgPSBjZC5jdXJyZW50UGF0Y2hTZXQoZGIpOwotICAgIGlmIChwcyA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICB9Ci0KLSAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVscyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOwotICAgIGZvciAoU3VibWl0UmVjb3JkIHJlYyA6IGN0bC5jYW5TdWJtaXQoZGIuZ2V0KCksIHBzLCBjZCwgdHJ1ZSwgZmFsc2UpKSB7Ci0gICAgICBpZiAocmVjLmxhYmVscyA9PSBudWxsKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZm9yIChTdWJtaXRSZWNvcmQuTGFiZWwgciA6IHJlYy5sYWJlbHMpIHsKLSAgICAgICAgTGFiZWxJbmZvIHAgPSBsYWJlbHMuZ2V0KHIubGFiZWwpOwotICAgICAgICBpZiAocCA9PSBudWxsIHx8IHAuX3N0YXR1cy5jb21wYXJlVG8oci5zdGF0dXMpIDwgMCkgewotICAgICAgICAgIExhYmVsSW5mbyBuID0gbmV3IExhYmVsSW5mbygpOwotICAgICAgICAgIG4uX3N0YXR1cyA9IHIuc3RhdHVzOwotICAgICAgICAgIHN3aXRjaCAoci5zdGF0dXMpIHsKLSAgICAgICAgICAgIGNhc2UgT0s6Ci0gICAgICAgICAgICAgIG4uYXBwcm92ZWQgPSBhc0FjY291bnRBdHRyaWJ1dGUoci5hcHBsaWVkQnkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkVKRUNUOgotICAgICAgICAgICAgICBuLnJlamVjdGVkID0gYXNBY2NvdW50QXR0cmlidXRlKHIuYXBwbGllZEJ5KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIG4ub3B0aW9uYWwgPSBuLl9zdGF0dXMgPT0gU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cy5NQVkgPyB0cnVlIDogbnVsbDsKLSAgICAgICAgICBsYWJlbHMucHV0KHIubGFiZWwsIG4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPSBudWxsOwotICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGFiZWxJbmZvPiBlIDogbGFiZWxzLmVudHJ5U2V0KCkpIHsKLSAgICAgIGlmIChlLmdldFZhbHVlKCkuYXBwcm92ZWQgIT0gbnVsbCB8fCBlLmdldFZhbHVlKCkucmVqZWN0ZWQgIT0gbnVsbCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgQXBwcm92YWxUeXBlIHR5cGUgPSBhcHByb3ZhbFR5cGVzLmJ5TGFiZWwoZS5nZXRLZXkoKSk7Ci0gICAgICBpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuZ2V0TWluKCkgPT0gbnVsbCB8fCB0eXBlLmdldE1heCgpID09IG51bGwpIHsKLSAgICAgICAgLy8gVW5rbm93biBvciBtaXNjb25maWd1cmVkIHR5cGUgY2FuJ3QgaGF2ZSBpbnRlcm1lZGlhdGUgc2NvcmVzLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgc2hvcnQgbWluID0gdHlwZS5nZXRNaW4oKS5nZXRWYWx1ZSgpOwotICAgICAgc2hvcnQgbWF4ID0gdHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKC0xIDw9IG1pbiAmJiBtYXggPD0gMSkgewotICAgICAgICAvLyBUeXBlcyB3aXRoIGEgcmFuZ2Ugb2YgLTEuLisxIGNhbid0IGhhdmUgaW50ZXJtZWRpYXRlIHNjb3Jlcy4KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChhcHByb3ZhbHMgPT0gbnVsbCkgewotICAgICAgICBhcHByb3ZhbHMgPSBjZC5jdXJyZW50QXBwcm92YWxzKGRiKTsKLSAgICAgIH0KLSAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgc2hvcnQgdmFsID0gcHNhLmdldFZhbHVlKCk7Ci0gICAgICAgIGlmICh2YWwgIT0gMCAmJiBtaW4gPCB2YWwgJiYgdmFsIDwgbWF4Ci0gICAgICAgICAgICAmJiBwc2EuZ2V0Q2F0ZWdvcnlJZCgpLmVxdWFscyh0eXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICBpZiAoMCA8IHZhbCkgewotICAgICAgICAgICAgZS5nZXRWYWx1ZSgpLnJlY29tbWVuZGVkID0gYXNBY2NvdW50QXR0cmlidXRlKHBzYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgICAgICBlLmdldFZhbHVlKCkudmFsdWUgPSB2YWwgIT0gMSA/IHZhbCA6IG51bGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGUuZ2V0VmFsdWUoKS5kaXNsaWtlZCA9IGFzQWNjb3VudEF0dHJpYnV0ZShwc2EuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICAgICAgZS5nZXRWYWx1ZSgpLnZhbHVlID0gdmFsICE9IC0xID8gdmFsIDogbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxhYmVsczsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NoYW5nZVJldmlld2VkKENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGlmICh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKLSAgICAgIFBhdGNoU2V0IGN1cnJlbnRQYXRjaFNldCA9IGNkLmN1cnJlbnRQYXRjaFNldChkYik7Ci0gICAgICBpZiAoY3VycmVudFBhdGNoU2V0ID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBMaXN0PENoYW5nZU1lc3NhZ2U+IG1lc3NhZ2VzID0KLSAgICAgICAgICBkYi5nZXQoKS5jaGFuZ2VNZXNzYWdlcygpLmJ5UGF0Y2hTZXQoY3VycmVudFBhdGNoU2V0LmdldElkKCkpLnRvTGlzdCgpOwotCi0gICAgICBpZiAobWVzc2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLy8gU29ydCBtZXNzYWdlcyB0byBsZXQgdGhlIG1vc3QgcmVjZW50IG9uZXMgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgIENvbGxlY3Rpb25zLnNvcnQobWVzc2FnZXMsIG5ldyBDb21wYXJhdG9yPENoYW5nZU1lc3NhZ2U+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKENoYW5nZU1lc3NhZ2UgYSwgQ2hhbmdlTWVzc2FnZSBiKSB7Ci0gICAgICAgICAgcmV0dXJuIGIuZ2V0V3JpdHRlbk9uKCkuY29tcGFyZVRvKGEuZ2V0V3JpdHRlbk9uKCkpOwotICAgICAgICB9Ci0gICAgICB9KTsKLQotICAgICAgQWNjb3VudC5JZCBjdXJyZW50VXNlcklkID0gKChJZGVudGlmaWVkVXNlcikgdXNlcikuZ2V0QWNjb3VudElkKCk7Ci0gICAgICBBY2NvdW50LklkIGNoYW5nZU93bmVySWQgPSBjZC5jaGFuZ2UoZGIpLmdldE93bmVyKCk7Ci0gICAgICBmb3IgKENoYW5nZU1lc3NhZ2UgY20gOiBtZXNzYWdlcykgewotICAgICAgICBpZiAoY3VycmVudFVzZXJJZC5lcXVhbHMoY20uZ2V0QXV0aG9yKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlT3duZXJJZC5lcXVhbHMoY20uZ2V0QXV0aG9yKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgTWFwPFN0cmluZywgUmV2aXNpb25JbmZvPiByZXZpc2lvbnMoQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKLSAgICBpZiAoY3RsID09IG51bGwpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotICAgIH0KLQotICAgIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHNyYzsKLSAgICBpZiAob3B0aW9ucy5jb250YWlucyhBTExfUkVWSVNJT05TKSkgewotICAgICAgc3JjID0gY2QucGF0Y2hlcyhkYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyYyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY2QuY3VycmVudFBhdGNoU2V0KGRiKSk7Ci0gICAgfQotICAgIE1hcDxTdHJpbmcsIFJldmlzaW9uSW5mbz4gcmVzID0gTWFwcy5uZXdMaW5rZWRIYXNoTWFwKCk7Ci0gICAgZm9yIChQYXRjaFNldCBpbiA6IHNyYykgewotICAgICAgaWYgKGN0bC5pc1BhdGNoVmlzaWJsZShpbiwgZGIuZ2V0KCkpKSB7Ci0gICAgICAgIHJlcy5wdXQoaW4uZ2V0UmV2aXNpb24oKS5nZXQoKSwgdG9SZXZpc2lvbkluZm8oY2QsIGluKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBwcml2YXRlIFJldmlzaW9uSW5mbyB0b1JldmlzaW9uSW5mbyhDaGFuZ2VEYXRhIGNkLCBQYXRjaFNldCBpbikKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIFJldmlzaW9uSW5mbyBvdXQgPSBuZXcgUmV2aXNpb25JbmZvKCk7Ci0gICAgb3V0LmlzQ3VycmVudCA9IGluLmdldElkKCkuZXF1YWxzKGNkLmNoYW5nZShkYikuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgb3V0Ll9udW1iZXIgPSBpbi5nZXRJZCgpLmdldCgpOwotICAgIG91dC5kcmFmdCA9IGluLmlzRHJhZnQoKSA/IHRydWUgOiBudWxsOwotICAgIG91dC5mZXRjaCA9IG1ha2VGZXRjaE1hcChjZCwgaW4pOwotCi0gICAgaWYgKG9wdGlvbnMuY29udGFpbnMoQUxMX0NPTU1JVFMpCi0gICAgICAgIHx8IChvdXQuaXNDdXJyZW50ICYmIG9wdGlvbnMuY29udGFpbnMoQ1VSUkVOVF9DT01NSVQpKSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgUGF0Y2hTZXRJbmZvIGluZm8gPSBwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYi5nZXQoKSwgaW4uZ2V0SWQoKSk7Ci0gICAgICAgIG91dC5jb21taXQgPSBuZXcgQ29tbWl0SW5mbygpOwotICAgICAgICBvdXQuY29tbWl0LnBhcmVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoaW5mby5nZXRQYXJlbnRzKCkuc2l6ZSgpKTsKLSAgICAgICAgb3V0LmNvbW1pdC5hdXRob3IgPSB0b0dpdFBlcnNvbihpbmZvLmdldEF1dGhvcigpKTsKLSAgICAgICAgb3V0LmNvbW1pdC5jb21taXR0ZXIgPSB0b0dpdFBlcnNvbihpbmZvLmdldENvbW1pdHRlcigpKTsKLSAgICAgICAgb3V0LmNvbW1pdC5zdWJqZWN0ID0gaW5mby5nZXRTdWJqZWN0KCk7Ci0gICAgICAgIG91dC5jb21taXQubWVzc2FnZSA9IGluZm8uZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgIGZvciAoUGFyZW50SW5mbyBwYXJlbnQgOiBpbmZvLmdldFBhcmVudHMoKSkgewotICAgICAgICAgIENvbW1pdEluZm8gaSA9IG5ldyBDb21taXRJbmZvKCk7Ci0gICAgICAgICAgaS5jb21taXQgPSBwYXJlbnQuaWQuZ2V0KCk7Ci0gICAgICAgICAgaS5zdWJqZWN0ID0gcGFyZW50LnNob3J0TWVzc2FnZTsKLSAgICAgICAgICBvdXQuY29tbWl0LnBhcmVudHMuYWRkKGkpOwotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgICBsb2cud2FybigiQ2Fubm90IGxvYWQgUGF0Y2hTZXRJbmZvICIgKyBpbi5nZXRJZCgpLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAob3B0aW9ucy5jb250YWlucyhBTExfRklMRVMpCi0gICAgICAgIHx8IChvdXQuaXNDdXJyZW50ICYmIG9wdGlvbnMuY29udGFpbnMoQ1VSUkVOVF9GSUxFUykpKSB7Ci0gICAgICBQYXRjaExpc3QgbGlzdDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGxpc3QgPSBwYXRjaExpc3RDYWNoZS5nZXQoY2QuY2hhbmdlKGRiKSwgaW4pOwotICAgICAgfSBjYXRjaCAoUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIFBhdGNoTGlzdCAiICsgaW4uZ2V0SWQoKSwgZSk7Ci0gICAgICAgIGxpc3QgPSBudWxsOwotICAgICAgfQotICAgICAgaWYgKGxpc3QgIT0gbnVsbCkgewotICAgICAgICBvdXQuZmlsZXMgPSBNYXBzLm5ld1RyZWVNYXAoKTsKLSAgICAgICAgZm9yIChQYXRjaExpc3RFbnRyeSBlIDogbGlzdC5nZXRQYXRjaGVzKCkpIHsKLSAgICAgICAgICBpZiAoUGF0Y2guQ09NTUlUX01TRy5lcXVhbHMoZS5nZXROZXdOYW1lKCkpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBGaWxlSW5mbyBkID0gbmV3IEZpbGVJbmZvKCk7Ci0gICAgICAgICAgZC5zdGF0dXMgPSBlLmdldENoYW5nZVR5cGUoKSAhPSBQYXRjaC5DaGFuZ2VUeXBlLk1PRElGSUVECi0gICAgICAgICAgICAgID8gZS5nZXRDaGFuZ2VUeXBlKCkuZ2V0Q29kZSgpCi0gICAgICAgICAgICAgIDogbnVsbDsKLSAgICAgICAgICBkLm9sZFBhdGggPSBlLmdldE9sZE5hbWUoKTsKLSAgICAgICAgICBpZiAoZS5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuQklOQVJZKSB7Ci0gICAgICAgICAgICBkLmJpbmFyeSA9IHRydWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGQubGluZXNJbnNlcnRlZCA9IGUuZ2V0SW5zZXJ0aW9ucygpID4gMCA/IGUuZ2V0SW5zZXJ0aW9ucygpIDogbnVsbDsKLSAgICAgICAgICAgIGQubGluZXNEZWxldGVkID0gZS5nZXREZWxldGlvbnMoKSA+IDAgPyBlLmdldERlbGV0aW9ucygpIDogbnVsbDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBGaWxlSW5mbyBvID0gb3V0LmZpbGVzLnB1dChlLmdldE5ld05hbWUoKSwgZCk7Ci0gICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gb24gYSBkZWxldGUtYWRkIGJyZWFrIGNyZWF0ZWQgYnkgSkdpdAotICAgICAgICAgICAgLy8gd2hlbiB0aGUgZmlsZSB3YXMgcmV3cml0dGVuIGFuZCB0b28gbGl0dGxlIGNvbnRlbnQgc3Vydml2ZWQuIFdyaXRlCi0gICAgICAgICAgICAvLyBhIHNpbmdsZSByZWNvcmQgd2l0aCBkYXRhIGZyb20gYm90aCBzaWRlcy4KLSAgICAgICAgICAgIGQuc3RhdHVzID0gUGF0Y2guQ2hhbmdlVHlwZS5SRVdSSVRFLmdldENvZGUoKTsKLSAgICAgICAgICAgIGlmIChvLmJpbmFyeSAhPSBudWxsICYmIG8uYmluYXJ5KSB7Ci0gICAgICAgICAgICAgIGQuYmluYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvLmxpbmVzSW5zZXJ0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBkLmxpbmVzSW5zZXJ0ZWQgPSBvLmxpbmVzSW5zZXJ0ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoby5saW5lc0RlbGV0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBkLmxpbmVzRGVsZXRlZCA9IG8ubGluZXNEZWxldGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0OwotICB9Ci0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGZXRjaEluZm8+IG1ha2VGZXRjaE1hcChDaGFuZ2VEYXRhIGNkLCBQYXRjaFNldCBpbikKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIE1hcDxTdHJpbmcsIEZldGNoSW5mbz4gciA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOwotICAgIFN0cmluZyByZWZOYW1lID0gaW4uZ2V0UmVmTmFtZSgpOwotICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7Ci0gICAgaWYgKGN0bCAhPSBudWxsICYmIGN0bC5mb3JVc2VyKGFub255bW91cykuaXNQYXRjaFZpc2libGUoaW4sIGRiLmdldCgpKSkgewotICAgICAgaWYgKHVybHMuZ2l0ICE9IG51bGwpIHsKLSAgICAgICAgci5wdXQoImdpdCIsIG5ldyBGZXRjaEluZm8odXJscy5naXQKLSAgICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHVybHMuaHR0cCAhPSBudWxsKSB7Ci0gICAgICByLnB1dCgiaHR0cCIsIG5ldyBGZXRjaEluZm8odXJscy5odHRwCi0gICAgICAgICAgKyBjZC5jaGFuZ2UoZGIpLmdldFByb2plY3QoKS5nZXQoKSwgcmVmTmFtZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTdHJpbmcgaHR0cCA9IHVybFByb3ZpZGVyLmdldCgpOwotICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaHR0cCkpIHsKLSAgICAgICAgci5wdXQoImh0dHAiLCBuZXcgRmV0Y2hJbmZvKGh0dHAKLSAgICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFzc2hJbmZvLmdldEhvc3RLZXlzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICBIb3N0S2V5IGhvc3QgPSBzc2hJbmZvLmdldEhvc3RLZXlzKCkuZ2V0KDApOwotICAgICAgci5wdXQoInNzaCIsIG5ldyBGZXRjaEluZm8oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAic3NoOi8vJXMvJXMiLAotICAgICAgICAgIGhvc3QuZ2V0SG9zdCgpLCBjZC5jaGFuZ2UoZGIpLmdldFByb2plY3QoKS5nZXQoKSksCi0gICAgICAgICAgcmVmTmFtZSkpOwotICAgIH0KLQotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgR2l0UGVyc29uIHRvR2l0UGVyc29uKFVzZXJJZGVudGl0eSBjb21taXR0ZXIpIHsKLSAgICBHaXRQZXJzb24gcCA9IG5ldyBHaXRQZXJzb24oKTsKLSAgICBwLm5hbWUgPSBjb21taXR0ZXIuZ2V0TmFtZSgpOwotICAgIHAuZW1haWwgPSBjb21taXR0ZXIuZ2V0RW1haWwoKTsKLSAgICBwLmRhdGUgPSBjb21taXR0ZXIuZ2V0RGF0ZSgpOwotICAgIHAudHogPSBjb21taXR0ZXIuZ2V0VGltZVpvbmUoKTsKLSAgICByZXR1cm4gcDsKLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBDaGFuZ2VJbmZvIHsKLSAgICBTdHJpbmcgcHJvamVjdDsKLSAgICBTdHJpbmcgYnJhbmNoOwotICAgIFN0cmluZyB0b3BpYzsKLSAgICBTdHJpbmcgaWQ7Ci0gICAgU3RyaW5nIHN1YmplY3Q7Ci0gICAgQ2hhbmdlLlN0YXR1cyBzdGF0dXM7Ci0gICAgVGltZXN0YW1wIGNyZWF0ZWQ7Ci0gICAgVGltZXN0YW1wIHVwZGF0ZWQ7Ci0gICAgQm9vbGVhbiBzdGFycmVkOwotICAgIEJvb2xlYW4gcmV2aWV3ZWQ7Ci0KLSAgICBTdHJpbmcgX3NvcnRrZXk7Ci0gICAgaW50IF9udW1iZXI7Ci0KLSAgICBBY2NvdW50QXR0cmlidXRlIG93bmVyOwotICAgIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzOwotICAgIFN0cmluZyBjdXJyZW50X3JldmlzaW9uOwotICAgIE1hcDxTdHJpbmcsIFJldmlzaW9uSW5mbz4gcmV2aXNpb25zOwotCi0gICAgQm9vbGVhbiBfbW9yZUNoYW5nZXM7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgUmV2aXNpb25JbmZvIHsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzQ3VycmVudDsKLSAgICBCb29sZWFuIGRyYWZ0OwotICAgIGludCBfbnVtYmVyOwotICAgIE1hcDxTdHJpbmcsIEZldGNoSW5mbz4gZmV0Y2g7Ci0gICAgQ29tbWl0SW5mbyBjb21taXQ7Ci0gICAgTWFwPFN0cmluZywgRmlsZUluZm8+IGZpbGVzOwotICB9Ci0KLSAgc3RhdGljIGNsYXNzIEZldGNoSW5mbyB7Ci0gICAgU3RyaW5nIHVybDsKLSAgICBTdHJpbmcgcmVmOwotCi0gICAgRmV0Y2hJbmZvKFN0cmluZyB1cmwsIFN0cmluZyByZWYpIHsKLSAgICAgIHRoaXMudXJsID0gdXJsOwotICAgICAgdGhpcy5yZWYgPSByZWY7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGNsYXNzIEdpdFBlcnNvbiB7Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgU3RyaW5nIGVtYWlsOwotICAgIFRpbWVzdGFtcCBkYXRlOwotICAgIGludCB0ejsKLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBDb21taXRJbmZvIHsKLSAgICBTdHJpbmcgY29tbWl0OwotICAgIExpc3Q8Q29tbWl0SW5mbz4gcGFyZW50czsKLSAgICBHaXRQZXJzb24gYXV0aG9yOwotICAgIEdpdFBlcnNvbiBjb21taXR0ZXI7Ci0gICAgU3RyaW5nIHN1YmplY3Q7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgRmlsZUluZm8gewotICAgIENoYXJhY3RlciBzdGF0dXM7Ci0gICAgQm9vbGVhbiBiaW5hcnk7Ci0gICAgU3RyaW5nIG9sZFBhdGg7Ci0gICAgSW50ZWdlciBsaW5lc0luc2VydGVkOwotICAgIEludGVnZXIgbGluZXNEZWxldGVkOwotICB9Ci0KLSAgc3RhdGljIGNsYXNzIExhYmVsSW5mbyB7Ci0gICAgdHJhbnNpZW50IFN1Ym1pdFJlY29yZC5MYWJlbC5TdGF0dXMgX3N0YXR1czsKLSAgICBBY2NvdW50QXR0cmlidXRlIGFwcHJvdmVkOwotICAgIEFjY291bnRBdHRyaWJ1dGUgcmVqZWN0ZWQ7Ci0KLSAgICBBY2NvdW50QXR0cmlidXRlIHJlY29tbWVuZGVkOwotICAgIEFjY291bnRBdHRyaWJ1dGUgZGlzbGlrZWQ7Ci0gICAgU2hvcnQgdmFsdWU7Ci0gICAgQm9vbGVhbiBvcHRpb25hbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlDaGFuZ2VzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9RdWVyeUNoYW5nZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA1OTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlDaGFuZ2VzLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlSnNvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZUpzb24uQ2hhbmdlSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5RdWVyeVBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworcHVibGljIGNsYXNzIFF1ZXJ5Q2hhbmdlcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxUb3BMZXZlbFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworICBwcml2YXRlIGZpbmFsIFF1ZXJ5UHJvY2Vzc29yIGltcDsKKyAgcHJpdmF0ZSBib29sZWFuIHJldmVyc2U7CisgIHByaXZhdGUgRW51bVNldDxMaXN0Q2hhbmdlc09wdGlvbj4gb3B0aW9uczsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1xdWVyeSIsIGFsaWFzZXMgPSB7Ii1xIn0sIG1ldGFWYXIgPSAiUVVFUlkiLCBtdWx0aVZhbHVlZCA9IHRydWUsIHVzYWdlID0gIlF1ZXJ5IHN0cmluZyIpCisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHF1ZXJpZXM7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tbGltaXQiLCBhbGlhc2VzID0geyItbiJ9LCBtZXRhVmFyID0gIkNOVCIsIHVzYWdlID0gIk1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuIikKKyAgcHVibGljIHZvaWQgc2V0TGltaXQoaW50IGxpbWl0KSB7CisgICAgaW1wLnNldExpbWl0KGxpbWl0KTsKKyAgfQorCisgIEBPcHRpb24obmFtZSA9ICItbyIsIG11bHRpVmFsdWVkID0gdHJ1ZSwgdXNhZ2UgPSAiT3V0cHV0IG9wdGlvbnMgcGVyIGNoYW5nZSIpCisgIHB1YmxpYyB2b2lkIGFkZE9wdGlvbihMaXN0Q2hhbmdlc09wdGlvbiBvKSB7CisgICAgb3B0aW9ucy5hZGQobyk7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLU8iLCB1c2FnZSA9ICJPdXRwdXQgb3B0aW9uIGZsYWdzLCBpbiBoZXgiKQorICB2b2lkIHNldE9wdGlvbkZsYWdzSGV4KFN0cmluZyBoZXgpIHsKKyAgICBvcHRpb25zLmFkZEFsbChMaXN0Q2hhbmdlc09wdGlvbi5mcm9tQml0cyhJbnRlZ2VyLnBhcnNlSW50KGhleCwgMTYpKSk7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLVAiLCBtZXRhVmFyID0gIlNPUlRLRVkiLCB1c2FnZSA9ICJQcmV2aW91cyBjaGFuZ2VzIGJlZm9yZSBTT1JUS0VZIikKKyAgcHVibGljIHZvaWQgc2V0U29ydEtleUFmdGVyKFN0cmluZyBrZXkpIHsKKyAgICAvLyBRdWVyeWluZyBmb3IgdGhlIHByaW9yIHBhZ2Ugb2YgY2hhbmdlcyByZXF1aXJlcyBzb3J0a2V5X2FmdGVyIHByZWRpY2F0ZS4KKyAgICAvLyBDaGFuZ2VzIGFyZSBzaG93biBtb3N0IHJlY2VudC0+bGVhc3QgcmVjZW50LiBUaGUgcHJldmlvdXMgcGFnZSBvZgorICAgIC8vIHJlc3VsdHMgY29udGFpbnMgY2hhbmdlcyB0aGF0IHdlcmUgdXBkYXRlZCBhZnRlciB0aGUgZ2l2ZW4ga2V5LgorICAgIGltcC5zZXRTb3J0a2V5QWZ0ZXIoa2V5KTsKKyAgICByZXZlcnNlID0gdHJ1ZTsKKyAgfQorCisgIEBPcHRpb24obmFtZSA9ICItTiIsIG1ldGFWYXIgPSAiU09SVEtFWSIsIHVzYWdlID0gIk5leHQgY2hhbmdlcyBhZnRlciBTT1JUS0VZIikKKyAgcHVibGljIHZvaWQgc2V0U29ydEtleUJlZm9yZShTdHJpbmcga2V5KSB7CisgICAgLy8gUXVlcnlpbmcgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgY2hhbmdlcyByZXF1aXJlcyBzb3J0a2V5X2JlZm9yZSBwcmVkaWNhdGUuCisgICAgLy8gQ2hhbmdlcyBhcmUgc2hvd24gbW9zdCByZWNlbnQtPmxlYXN0IHJlY2VudC4gVGhlIG5leHQgcGFnZSBjb250YWlucworICAgIC8vIGNoYW5nZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgYmVmb3JlIHRoZSBnaXZlbiBrZXkuCisgICAgaW1wLnNldFNvcnRrZXlCZWZvcmUoa2V5KTsKKyAgfQorCisgIEBJbmplY3QKKyAgUXVlcnlDaGFuZ2VzKENoYW5nZUpzb24ganNvbiwKKyAgICAgIFF1ZXJ5UHJvY2Vzc29yIHFwLAorICAgICAgU3NoSW5mbyBzc2hJbmZvLAorICAgICAgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNmKSB7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgICB0aGlzLmltcCA9IHFwOworCisgICAgb3B0aW9ucyA9IEVudW1TZXQubm9uZU9mKExpc3RDaGFuZ2VzT3B0aW9uLmNsYXNzKTsKKyAgICBqc29uLnNldFNzaEluZm8oc3NoSW5mbyk7CisgICAganNvbi5zZXRDaGFuZ2VDb250cm9sRmFjdG9yeShjZik7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRRdWVyeShTdHJpbmcgcXVlcnkpIHsKKyAgICBpZiAocXVlcmllcyA9PSBudWxsKSB7CisgICAgICBxdWVyaWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgfQorICAgIHF1ZXJpZXMuYWRkKHF1ZXJ5KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcnNyYykKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIExpc3Q8TGlzdDxDaGFuZ2VJbmZvPj4gb3V0OworICAgIHRyeSB7CisgICAgICBvdXQgPSBxdWVyeSgpOworICAgIH0gY2F0Y2ggKFF1ZXJ5UGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gZGV0ZWN0IGFuIG9wZXJhdG9yIHRoYXQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uCisgICAgICBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIl5FcnJvciBpbiBvcGVyYXRvciAoLio6c2VsZikkIik7CisgICAgICBNYXRjaGVyIG0gPSBwLm1hdGNoZXIoZS5nZXRNZXNzYWdlKCkpOworICAgICAgaWYgKG0ubWF0Y2hlcygpKSB7CisgICAgICAgIFN0cmluZyBvcCA9IG0uZ3JvdXAoMSk7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJNdXN0IGJlIHNpZ25lZC1pbiB0byB1c2UgIiArIG9wKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG91dC5zaXplKCkgPT0gMSA/IG91dC5nZXQoMCkgOiBvdXQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8TGlzdDxDaGFuZ2VJbmZvPj4gcXVlcnkoKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgUXVlcnlQYXJzZUV4Y2VwdGlvbiB7CisgICAgaWYgKGltcC5pc0Rpc2FibGVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXhjZXB0aW9uKCJxdWVyeSBkaXNhYmxlZCIpOworICAgIH0KKyAgICBpZiAocXVlcmllcyA9PSBudWxsIHx8IHF1ZXJpZXMuaXNFbXB0eSgpKSB7CisgICAgICBxdWVyaWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgic3RhdHVzOm9wZW4iKTsKKyAgICB9IGVsc2UgaWYgKHF1ZXJpZXMuc2l6ZSgpID4gMTApIHsKKyAgICAgIC8vIEhhcmQtY29kZSBhIGRlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgcXVlcmllcyB0byBwcmV2ZW50CisgICAgICAvLyB1c2VycyBmcm9tIHN1Ym1pdHRpbmcgdG9vIG11Y2ggdG8gdGhlIHNlcnZlciBpbiBhIHNpbmdsZSBjYWxsLgorICAgICAgdGhyb3cgbmV3IFF1ZXJ5UGFyc2VFeGNlcHRpb24oImxpbWl0IG9mIDEwIHF1ZXJpZXMiKTsKKyAgICB9CisKKyAgICBpbnQgY250ID0gcXVlcmllcy5zaXplKCk7CisgICAgQml0U2V0IG1vcmUgPSBuZXcgQml0U2V0KGNudCk7CisgICAgTGlzdDxMaXN0PENoYW5nZURhdGE+PiBkYXRhID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGNudCk7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBjbnQ7IG4rKykgeworICAgICAgU3RyaW5nIHF1ZXJ5ID0gcXVlcmllcy5nZXQobik7CisgICAgICBMaXN0PENoYW5nZURhdGE+IGNoYW5nZXMgPSBpbXAucXVlcnlDaGFuZ2VzKHF1ZXJ5KTsKKyAgICAgIGlmIChpbXAuZ2V0TGltaXQoKSA+IDAgJiYgY2hhbmdlcy5zaXplKCkgPiBpbXAuZ2V0TGltaXQoKSkgeworICAgICAgICBpZiAocmV2ZXJzZSkgeworICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLnN1Ykxpc3QoMSwgY2hhbmdlcy5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzLnN1Ykxpc3QoMCwgaW1wLmdldExpbWl0KCkpOworICAgICAgICB9CisgICAgICAgIG1vcmUuc2V0KG4sIHRydWUpOworICAgICAgfQorICAgICAgZGF0YS5hZGQoY2hhbmdlcyk7CisgICAgfQorCisgICAgTGlzdDxMaXN0PENoYW5nZUluZm8+PiByZXMgPSBqc29uLmFkZE9wdGlvbnMob3B0aW9ucykuZm9ybWF0TGlzdDIoZGF0YSk7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBjbnQ7IG4rKykgeworICAgICAgTGlzdDxDaGFuZ2VJbmZvPiBpbmZvID0gcmVzLmdldChuKTsKKyAgICAgIGlmIChtb3JlLmdldChuKSAmJiAhaW5mby5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICBpbmZvLmdldCgwKS5fbW9yZUNoYW5nZXMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZm8uZ2V0KGluZm8uc2l6ZSgpIC0gMSkuX21vcmVDaGFuZ2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9RdWVyeVByb2Nlc3Nvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlQcm9jZXNzb3IuamF2YQppbmRleCBmNDQyODJhLi5mYzM1ZGYzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9RdWVyeVByb2Nlc3Nvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1F1ZXJ5UHJvY2Vzc29yLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CkBAIC0yNSw2ICsyNiw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5QYXRjaFNldEF0dHJpYnV0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLlF1ZXJ5U3RhdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUHJlZGljYXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5RdWVyeVBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwpAQCAtOTMsNiArOTYsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZVF1ZXJ5UmV3cml0ZXIgcXVlcnlSZXdyaXRlcjsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMaW1pdDsKIAogICBwcml2YXRlIE91dHB1dEZvcm1hdCBvdXRwdXRGb3JtYXQgPSBPdXRwdXRGb3JtYXQuVEVYVDsKQEAgLTExMCwyMCArMTE0LDI0IEBACiAKICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gRGlzYWJsZWRPdXRwdXRTdHJlYW0uSU5TVEFOQ0U7CiAgIHByaXZhdGUgUHJpbnRXcml0ZXIgb3V0OworICBwcml2YXRlIGJvb2xlYW4gbW9yZVJlc3VsdHM7CiAKICAgQEluamVjdAogICBRdWVyeVByb2Nlc3NvcihFdmVudEZhY3RvcnkgZXZlbnRGYWN0b3J5LAogICAgICAgQ2hhbmdlUXVlcnlCdWlsZGVyLkZhY3RvcnkgcXVlcnlCdWlsZGVyLCBDdXJyZW50VXNlciBjdXJyZW50VXNlciwKICAgICAgIENoYW5nZVF1ZXJ5UmV3cml0ZXIgcXVlcnlSZXdyaXRlciwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLAotICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIpIHsKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAorICAgICAgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5KSB7CiAgICAgdGhpcy5ldmVudEZhY3RvcnkgPSBldmVudEZhY3Rvcnk7CiAgICAgdGhpcy5xdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXIuY3JlYXRlKGN1cnJlbnRVc2VyKTsKICAgICB0aGlzLnF1ZXJ5UmV3cml0ZXIgPSBxdWVyeVJld3JpdGVyOwogICAgIHRoaXMuZGIgPSBkYjsKICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CisgICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwogICAgIHRoaXMubWF4TGltaXQgPSBjdXJyZW50VXNlci5nZXRDYXBhYmlsaXRpZXMoKQogICAgICAgLmdldFJhbmdlKEdsb2JhbENhcGFiaWxpdHkuUVVFUllfTElNSVQpCiAgICAgICAuZ2V0TWF4KCk7CisgICAgdGhpcy5tb3JlUmVzdWx0cyA9IGZhbHNlOwogICB9CiAKICAgaW50IGdldExpbWl0KCkgewpAQCAtMjM0LDYgKzI0Miw5IEBACiAKICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIHNvcnRrZXlBZnRlciAhPSBudWxsID8gY21wQWZ0ZXIgOiBjbXBCZWZvcmUpOwogICAgIGludCBsaW1pdCA9IGxpbWl0KHMpOworICAgIGlmIChyZXN1bHRzLnNpemUoKSA+IG1heExpbWl0KSB7CisgICAgICBtb3JlUmVzdWx0cyA9IHRydWU7CisgICAgfQogICAgIGlmIChsaW1pdCA8IHJlc3VsdHMuc2l6ZSgpKSB7CiAgICAgICByZXN1bHRzID0gcmVzdWx0cy5zdWJMaXN0KDAsIGxpbWl0KTsKICAgICB9CkBAIC0yNjAsMTcgKzI3MSwxOSBAQAogICAgICAgICBzdGF0cy5ydW5UaW1lTWlsbGlzZWNvbmRzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKICAgICAgICAgTGlzdDxDaGFuZ2VEYXRhPiByZXN1bHRzID0gcXVlcnlDaGFuZ2VzKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgQ2hhbmdlQXR0cmlidXRlIGMgPSBudWxsOwogICAgICAgICBmb3IgKENoYW5nZURhdGEgZCA6IHJlc3VsdHMpIHsKLSAgICAgICAgICBDaGFuZ2VBdHRyaWJ1dGUgYyA9IGV2ZW50RmFjdG9yeS5hc0NoYW5nZUF0dHJpYnV0ZShkLmdldENoYW5nZSgpKTsKKyAgICAgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGQuZ2V0Q2hhbmdlKCkpCisgICAgICAgICAgICAgIC5nZXRMYWJlbFR5cGVzKCk7CisgICAgICAgICAgYyA9IGV2ZW50RmFjdG9yeS5hc0NoYW5nZUF0dHJpYnV0ZShkLmdldENoYW5nZSgpKTsKICAgICAgICAgICBldmVudEZhY3RvcnkuZXh0ZW5kKGMsIGQuZ2V0Q2hhbmdlKCkpOwogICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRUcmFja2luZ0lkcyhjLCBkLnRyYWNraW5nSWRzKGRiKSk7CiAKICAgICAgICAgICBpZiAoaW5jbHVkZVN1Ym1pdFJlY29yZHMpIHsKICAgICAgICAgICAgIFBhdGNoU2V0LklkIHBzSWQgPSBkLmdldENoYW5nZSgpLmN1cnJlbnRQYXRjaFNldElkKCk7CiAgICAgICAgICAgICBQYXRjaFNldCBwYXRjaFNldCA9IGRiLmdldCgpLnBhdGNoU2V0cygpLmdldChwc0lkKTsKLSAgICAgICAgICAgIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHBzSWQuZ2V0UGFyZW50S2V5KCk7CiAgICAgICAgICAgICBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVzdWx0ID0gZC5jaGFuZ2VDb250cm9sKCkuY2FuU3VibWl0KCAvLwotICAgICAgICAgICAgICAgIGRiLmdldCgpLCBwYXRjaFNldCwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGRiLmdldCgpLCBwYXRjaFNldCwgbnVsbCwgZmFsc2UsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgZXZlbnRGYWN0b3J5LmFkZFN1Ym1pdFJlY29yZHMoYywgc3VibWl0UmVzdWx0KTsKICAgICAgICAgICB9CiAKQEAgLTI4MSwxMSArMjk0LDEyIEBACiAgICAgICAgICAgaWYgKGluY2x1ZGVQYXRjaFNldHMpIHsKICAgICAgICAgICAgIGlmIChpbmNsdWRlRmlsZXMpIHsKICAgICAgICAgICAgICAgZXZlbnRGYWN0b3J5LmFkZFBhdGNoU2V0cyhjLCBkLnBhdGNoZXMoZGIpLAotICAgICAgICAgICAgICAgIGluY2x1ZGVBcHByb3ZhbHMgPyBkLmFwcHJvdmFsc01hcChkYikgOiBudWxsLAotICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcywgZC5jaGFuZ2UoZGIpKTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlQXBwcm92YWxzID8gZC5hcHByb3ZhbHNNYXAoZGIpLmFzTWFwKCkgOiBudWxsLAorICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcywgZC5jaGFuZ2UoZGIpLCBsYWJlbFR5cGVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRQYXRjaFNldHMoYywgZC5wYXRjaGVzKGRiKSwKLSAgICAgICAgICAgICAgICAgIGluY2x1ZGVBcHByb3ZhbHMgPyBkLmFwcHJvdmFsc01hcChkYikgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgIGluY2x1ZGVBcHByb3ZhbHMgPyBkLmFwcHJvdmFsc01hcChkYikuYXNNYXAoKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICBsYWJlbFR5cGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKQEAgLTI5Myw4ICszMDcsOCBAQAogICAgICAgICAgICAgUGF0Y2hTZXQgY3VycmVudCA9IGQuY3VycmVudFBhdGNoU2V0KGRiKTsKICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgYy5jdXJyZW50UGF0Y2hTZXQgPSBldmVudEZhY3RvcnkuYXNQYXRjaFNldEF0dHJpYnV0ZShjdXJyZW50KTsKLSAgICAgICAgICAgICAgZXZlbnRGYWN0b3J5LmFkZEFwcHJvdmFscyhjLmN1cnJlbnRQYXRjaFNldCwgLy8KLSAgICAgICAgICAgICAgICAgIGQuY3VycmVudEFwcHJvdmFscyhkYikpOworICAgICAgICAgICAgICBldmVudEZhY3RvcnkuYWRkQXBwcm92YWxzKGMuY3VycmVudFBhdGNoU2V0LAorICAgICAgICAgICAgICAgICAgZC5jdXJyZW50QXBwcm92YWxzKGRiKSwgbGFiZWxUeXBlcyk7CiAKICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGaWxlcykgewogICAgICAgICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRQYXRjaFNldEZpbGVOYW1lcyhjLmN1cnJlbnRQYXRjaFNldCwKQEAgLTMyMCw2ICszMzQsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RhdHMucm93Q291bnQgPSByZXN1bHRzLnNpemUoKTsKKyAgICAgICAgaWYgKG1vcmVSZXN1bHRzKSB7CisgICAgICAgICAgc3RhdHMucmVzdW1lU29ydEtleSA9IGMuc29ydEtleTsKKyAgICAgICAgfQogICAgICAgICBzdGF0cy5ydW5UaW1lTWlsbGlzZWNvbmRzID0KICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhdHMucnVuVGltZU1pbGxpc2Vjb25kczsKICAgICAgICAgc2hvdyhzdGF0cyk7CkBAIC0zMzQsNiArMzUxLDExIEBACiAgICAgICAgIEVycm9yTWVzc2FnZSBtID0gbmV3IEVycm9yTWVzc2FnZSgpOwogICAgICAgICBtLm1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKICAgICAgICAgc2hvdyhtKTsKKyAgICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZy5lcnJvcigiTWlzc2luZyBjaGFuZ2U6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIEVycm9yTWVzc2FnZSBtID0gbmV3IEVycm9yTWVzc2FnZSgpOworICAgICAgICBtLm1lc3NhZ2UgPSAibWlzc2luZyBjaGFuZ2UgIiArIGUuZ2V0TWVzc2FnZSgpOworICAgICAgICBzaG93KG0pOwogICAgICAgfQogICAgIH0gZmluYWxseSB7CiAgICAgICB0cnkgewpAQCAtMzUwLDcgKzM3Miw3IEBACiAKICAgcHJpdmF0ZSBpbnQgbGltaXQoUHJlZGljYXRlPENoYW5nZURhdGE+IHMpIHsKICAgICBpbnQgbiA9IHF1ZXJ5QnVpbGRlci5oYXNMaW1pdChzKSA/IHF1ZXJ5QnVpbGRlci5nZXRMaW1pdChzKSA6IG1heExpbWl0OwotICAgIHJldHVybiBsaW1pdCA+IDAgPyBNYXRoLm1pbihuLCBsaW1pdCkgKyAxIDogbjsKKyAgICByZXR1cm4gbGltaXQgPiAwID8gTWF0aC5taW4obiwgbGltaXQpICsgMSA6IG4gKyAxOwogICB9CiAKICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9TaW5nbGVHcm91cFVzZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1NpbmdsZUdyb3VwVXNlci5qYXZhCmluZGV4IDI3MGIyZTcuLjRiNzE3MTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1NpbmdsZUdyb3VwVXNlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1NpbmdsZUdyb3VwVXNlci5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cE1lbWJlcnNoaXA7CkBAIC0zNyw3ICszNiw3IEBACiAKICAgcHVibGljIFNpbmdsZUdyb3VwVXNlcihDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKICAgICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzKSB7Ci0gICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LCBBY2Nlc3NQYXRoLlVOS05PV04pOworICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSk7CiAgICAgdGhpcy5ncm91cHMgPSBuZXcgTGlzdEdyb3VwTWVtYmVyc2hpcChncm91cHMpOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0Jhc2VEYXRhU291cmNlVHlwZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvQmFzZURhdGFTb3VyY2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYzNlOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0Jhc2VEYXRhU291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZURhdGFTb3VyY2VUeXBlIGltcGxlbWVudHMgRGF0YVNvdXJjZVR5cGUgeworCisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRyaXZlcjsKKworICBwcm90ZWN0ZWQgQmFzZURhdGFTb3VyY2VUeXBlKFN0cmluZyBkcml2ZXIpIHsKKyAgICB0aGlzLmRyaXZlciA9IGRyaXZlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldERyaXZlcigpIHsKKyAgICByZXR1cm4gZHJpdmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHVzZVBvb2woKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNjcmlwdFJ1bm5lciBnZXRJbmRleFNjcmlwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldFNjcmlwdFJ1bm5lcigiaW5kZXhfZ2VuZXJpYy5zcWwiKTsKKyAgfQorCisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2NyaXB0UnVubmVyIGdldFNjcmlwdFJ1bm5lcihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gU2NyaXB0UnVubmVyLk5PT1A7CisgICAgfQorICAgIElucHV0U3RyZWFtIGluID0gIFJldmlld0RiLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CisgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNRTCBzY3JpcHQgIiArIHBhdGggKyAiIG5vdCBmb3VuZCIpOworICAgIH0KKyAgICBTY3JpcHRSdW5uZXIgcnVubmVyOworICAgIHRyeSB7CisgICAgICBydW5uZXIgPSBuZXcgU2NyaXB0UnVubmVyKHBhdGgsIGluKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJ1bm5lcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZU1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjZhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlTW9kdWxlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOworCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZU1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQoImgyIikpLnRvKEgyLmNsYXNzKTsKKyAgICBiaW5kKERhdGFTb3VyY2VUeXBlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKCJqZGJjIikpLnRvKEpEQkMuY2xhc3MpOworICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQoIm15c3FsIikpLnRvKE15U3FsLmNsYXNzKTsKKyAgICBiaW5kKERhdGFTb3VyY2VUeXBlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKCJwb3N0Z3Jlc3FsIikpLnRvKFBvc3RncmVTUUwuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0RhdGFTb3VyY2VQcm92aWRlci5qYXZhCmluZGV4IGNjNDgwMTkuLjZjOWNhNTlkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlUHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlUHJvdmlkZXIuamF2YQpAQCAtMTQsMTEgKzE0LDEyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWwuZ2V0RW51bTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CkBAIC0zMSw4ICszMiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRiY3AuQmFzaWNEYXRhU291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIApAQCAtNDAsMTggKzM5LDMwIEBACiAKIC8qKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIERhdGFTb3VyY2UuICovCiBAU2luZ2xldG9uCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8RGF0YVNvdXJjZT4sCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8RGF0YVNvdXJjZT4sCiAgICAgTGlmZWN5Y2xlTGlzdGVuZXIgewotICBwcml2YXRlIGZpbmFsIERhdGFTb3VyY2UgZHM7CisgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CisgIHByaXZhdGUgZmluYWwgQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IGN0eDsKKyAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlVHlwZSBkc3Q7CisgIHByaXZhdGUgRGF0YVNvdXJjZSBkczsKIAogICBASW5qZWN0Ci0gIERhdGFTb3VyY2VQcm92aWRlcihmaW5hbCBTaXRlUGF0aHMgc2l0ZSwKLSAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZywgQ29udGV4dCBjdHgpIHsKLSAgICBkcyA9IG9wZW4oc2l0ZSwgY2ZnLCBjdHgpOworICBwcm90ZWN0ZWQgRGF0YVNvdXJjZVByb3ZpZGVyKFNpdGVQYXRocyBzaXRlLAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnLAorICAgICAgQ29udGV4dCBjdHgsCisgICAgICBEYXRhU291cmNlVHlwZSBkc3QpIHsKKyAgICB0aGlzLnNpdGUgPSBzaXRlOworICAgIHRoaXMuY2ZnID0gY2ZnOworICAgIHRoaXMuY3R4ID0gY3R4OworICAgIHRoaXMuZHN0ID0gZHN0OwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0YVNvdXJjZSBnZXQoKSB7CisgICAgaWYgKGRzID09IG51bGwpIHsKKyAgICAgIGRzID0gb3BlbihzaXRlLCBjZmcsIGN0eCwgZHN0KTsKKyAgICB9CiAgICAgcmV0dXJuIGRzOwogICB9CiAKQEAgLTc0LDEwMCArODUsMjcgQEAKICAgICBTSU5HTEVfVVNFUiwgTVVMVElfVVNFUjsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKLSAgICBIMiwgUE9TVEdSRVNRTCwgTVlTUUwsIEpEQkM7Ci0gIH0KLQogICBwcml2YXRlIERhdGFTb3VyY2Ugb3BlbihmaW5hbCBTaXRlUGF0aHMgc2l0ZSwgZmluYWwgQ29uZmlnIGNmZywKLSAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCkgewotICAgIFR5cGUgdHlwZSA9IGdldEVudW0oY2ZnLCAiZGF0YWJhc2UiLCBudWxsLCAidHlwZSIsIFR5cGUudmFsdWVzKCksIG51bGwpOwotICAgIFN0cmluZyBkcml2ZXIgPSBvcHRpb25hbChjZmcsICJkcml2ZXIiKTsKLSAgICBTdHJpbmcgdXJsID0gb3B0aW9uYWwoY2ZnLCAidXJsIik7Ci0gICAgU3RyaW5nIHVzZXJuYW1lID0gb3B0aW9uYWwoY2ZnLCAidXNlcm5hbWUiKTsKLSAgICBTdHJpbmcgcGFzc3dvcmQgPSBvcHRpb25hbChjZmcsICJwYXNzd29yZCIpOwotCi0gICAgaWYgKHVybCA9PSBudWxsIHx8IHVybC5pc0VtcHR5KCkpIHsKLSAgICAgIGlmICh0eXBlID09IG51bGwpIHsKLSAgICAgICAgdHlwZSA9IFR5cGUuSDI7Ci0gICAgICB9Ci0KLSAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEgyOiB7Ci0gICAgICAgICAgU3RyaW5nIGRhdGFiYXNlID0gb3B0aW9uYWwoY2ZnLCAiZGF0YWJhc2UiKTsKLSAgICAgICAgICBpZiAoZGF0YWJhc2UgPT0gbnVsbCB8fCBkYXRhYmFzZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGRhdGFiYXNlID0gImRiL1Jldmlld0RCIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRmlsZSBkYiA9IHNpdGUucmVzb2x2ZShkYXRhYmFzZSk7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRiID0gZGIuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGRiID0gZGIuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVybCA9ICJqZGJjOmgyOiIgKyBkYi50b1VSSSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFBPU1RHUkVTUUw6IHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgIGIuYXBwZW5kKCJqZGJjOnBvc3RncmVzcWw6Ly8iKTsKLSAgICAgICAgICBiLmFwcGVuZChob3N0bmFtZShvcHRpb25hbChjZmcsICJob3N0bmFtZSIpKSk7Ci0gICAgICAgICAgYi5hcHBlbmQocG9ydChvcHRpb25hbChjZmcsICJwb3J0IikpKTsKLSAgICAgICAgICBiLmFwcGVuZCgiLyIpOwotICAgICAgICAgIGIuYXBwZW5kKHJlcXVpcmVkKGNmZywgImRhdGFiYXNlIikpOwotICAgICAgICAgIHVybCA9IGIudG9TdHJpbmcoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTVlTUUw6IHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgIGIuYXBwZW5kKCJqZGJjOm15c3FsOi8vIik7Ci0gICAgICAgICAgYi5hcHBlbmQoaG9zdG5hbWUob3B0aW9uYWwoY2ZnLCAiaG9zdG5hbWUiKSkpOwotICAgICAgICAgIGIuYXBwZW5kKHBvcnQob3B0aW9uYWwoY2ZnLCAicG9ydCIpKSk7Ci0gICAgICAgICAgYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgICBiLmFwcGVuZChyZXF1aXJlZChjZmcsICJkYXRhYmFzZSIpKTsKLSAgICAgICAgICB1cmwgPSBiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEpEQkM6Ci0gICAgICAgICAgZHJpdmVyID0gcmVxdWlyZWQoY2ZnLCAiZHJpdmVyIik7Ci0gICAgICAgICAgdXJsID0gcmVxdWlyZWQoY2ZnLCAidXJsIik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGUgKyAiIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgIH0KKyAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgRGF0YVNvdXJjZVR5cGUgZHN0KSB7CisgICAgQ29uZmlnU2VjdGlvbiBkYnMgPSBuZXcgQ29uZmlnU2VjdGlvbihjZmcsICJkYXRhYmFzZSIpOworICAgIFN0cmluZyBkcml2ZXIgPSBkYnMub3B0aW9uYWwoImRyaXZlciIpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZHJpdmVyKSkgeworICAgICAgZHJpdmVyID0gZHN0LmdldERyaXZlcigpOwogICAgIH0KIAotICAgIGlmIChkcml2ZXIgPT0gbnVsbCB8fCBkcml2ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6aDI6IikpIHsKLSAgICAgICAgZHJpdmVyID0gIm9yZy5oMi5Ecml2ZXIiOwotCi0gICAgICB9IGVsc2UgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOnBvc3RncmVzcWw6IikpIHsKLSAgICAgICAgZHJpdmVyID0gIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciI7Ci0KLSAgICAgIH0gZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6bXlzcWw6IikpIHsKLSAgICAgICAgZHJpdmVyID0gImNvbS5teXNxbC5qZGJjLkRyaXZlciI7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRhdGFiYXNlLmRyaXZlciBtdXN0IGJlIHNldCIpOwotICAgICAgfQorICAgIFN0cmluZyB1cmwgPSBkYnMub3B0aW9uYWwoInVybCIpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkodXJsKSkgeworICAgICAgdXJsID0gZHN0LmdldFVybCgpOwogICAgIH0KIAorICAgIFN0cmluZyB1c2VybmFtZSA9IGRicy5vcHRpb25hbCgidXNlcm5hbWUiKTsKKyAgICBTdHJpbmcgcGFzc3dvcmQgPSBkYnMub3B0aW9uYWwoInBhc3N3b3JkIik7CisKICAgICBib29sZWFuIHVzZVBvb2w7Ci0gICAgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOm15c3FsOiIpKSB7Ci0gICAgICAvLyBNeVNRTCBoYXMgZ2l2ZW4gdXMgdHJvdWJsZSB3aXRoIHRoZSBjb25uZWN0aW9uIHBvb2wsCi0gICAgICAvLyBzb21ldGltZXMgdGhlIGJhY2tlbmQgZGlzY29ubmVjdHMgYW5kIHRoZSBwb29sIHdpbmRzCi0gICAgICAvLyB1cCB3aXRoIGEgc3RhbGUgY29ubmVjdGlvbi4gRm9ydHVuYXRlbHkgb3BlbmluZyB1cAotICAgICAgLy8gYSBuZXcgTXlTUUwgY29ubmVjdGlvbiBpcyB1c3VhbGx5IHZlcnkgZmFzdC4KLSAgICAgIC8vCi0gICAgICB1c2VQb29sID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVzZVBvb2wgPSB0cnVlOwotICAgIH0KLSAgICB1c2VQb29sID0gY2ZnLmdldEJvb2xlYW4oImRhdGFiYXNlIiwgImNvbm5lY3Rpb25wb29sIiwgdXNlUG9vbCk7CiAgICAgaWYgKGNvbnRleHQgPT0gQ29udGV4dC5TSU5HTEVfVVNFUikgewogICAgICAgdXNlUG9vbCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICB1c2VQb29sID0gY2ZnLmdldEJvb2xlYW4oImRhdGFiYXNlIiwgImNvbm5lY3Rpb25wb29sIiwgZHN0LnVzZVBvb2woKSk7CiAgICAgfQogCiAgICAgaWYgKHVzZVBvb2wpIHsKQEAgLTIwNywzMyArMTQ1LDQgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgaG9zdG5hbWUoU3RyaW5nIGhvc3RuYW1lKSB7Ci0gICAgaWYgKGhvc3RuYW1lID09IG51bGwgfHwgaG9zdG5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICBob3N0bmFtZSA9ICJsb2NhbGhvc3QiOwotCi0gICAgfSBlbHNlIGlmIChob3N0bmFtZS5jb250YWlucygiOiIpICYmICFob3N0bmFtZS5zdGFydHNXaXRoKCJbIikpIHsKLSAgICAgIGhvc3RuYW1lID0gIlsiICsgaG9zdG5hbWUgKyAiXSI7Ci0gICAgfQotICAgIHJldHVybiBob3N0bmFtZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBwb3J0KFN0cmluZyBwb3J0KSB7Ci0gICAgaWYgKHBvcnQgIT0gbnVsbCAmJiAhcG9ydC5pc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiAiOiIgKyBwb3J0OwotICAgIH0KLSAgICByZXR1cm4gIiI7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3B0aW9uYWwoZmluYWwgQ29uZmlnIGNvbmZpZywgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gY29uZmlnLmdldFN0cmluZygiZGF0YWJhc2UiLCBudWxsLCBuYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXF1aXJlZChmaW5hbCBDb25maWcgY29uZmlnLCBmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgIGZpbmFsIFN0cmluZyB2ID0gb3B0aW9uYWwoY29uZmlnLCBuYW1lKTsKLSAgICBpZiAodiA9PSBudWxsIHx8ICIiLmVxdWFscyh2KSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gZGF0YWJhc2UuIiArIG5hbWUgKyAiIGNvbmZpZ3VyZWQiKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0RhdGFTb3VyY2VUeXBlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2I3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworCisvKiogQWJzdHJhY3Rpb24gb2YgYSBzdXBwb3J0ZWQgZGF0YWJhc2UgcGxhdGZvcm0gKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YVNvdXJjZVR5cGUgeworCisgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyKCk7CisKKyAgcHVibGljIFN0cmluZyBnZXRVcmwoKTsKKworICBwdWJsaWMgYm9vbGVhbiB1c2VQb29sKCk7CisKKyAgLyoqCisgICAqIFJldHVybiBhIFNjcmlwdFJ1bm5lciB0aGF0IHJ1bnMgdGhlIGluZGV4IHNjcmlwdC4gTXVzdCBub3QgcmV0dXJuCisgICAqIDxjb2RlPm51bGw8L2NvZGU+LCBidXQgbWF5IHJldHVybiBhIFNjcmlwdFJ1bm5lciB0aGF0IGRvZXMgbm90aGluZy4KKyAgICoKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIFNjcmlwdFJ1bm5lciBnZXRJbmRleFNjcmlwdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0gyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9IMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MzUzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9IMi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIEgyIGV4dGVuZHMgQmFzZURhdGFTb3VyY2VUeXBlIHsKKworICBwcm90ZWN0ZWQgZmluYWwgQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZTsKKworICBASW5qZWN0CisgIEgyKGZpbmFsIFNpdGVQYXRocyBzaXRlLCBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcpIHsKKyAgICBzdXBlcigib3JnLmgyLkRyaXZlciIpOworICAgIHRoaXMuY2ZnID0gY2ZnOworICAgIHRoaXMuc2l0ZSA9IHNpdGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgU3RyaW5nIGRhdGFiYXNlID0gY2ZnLmdldFN0cmluZygiZGF0YWJhc2UiLCBudWxsLCAiZGF0YWJhc2UiKTsKKyAgICBpZiAoZGF0YWJhc2UgPT0gbnVsbCB8fCBkYXRhYmFzZS5pc0VtcHR5KCkpIHsKKyAgICAgIGRhdGFiYXNlID0gImRiL1Jldmlld0RCIjsKKyAgICB9CisgICAgRmlsZSBkYiA9IHNpdGUucmVzb2x2ZShkYXRhYmFzZSk7CisgICAgdHJ5IHsKKyAgICAgIGRiID0gZGIuZ2V0Q2Fub25pY2FsRmlsZSgpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGRiID0gZGIuZ2V0QWJzb2x1dGVGaWxlKCk7CisgICAgfQorICAgIHJldHVybiAiamRiYzpoMjoiICsgZGIudG9VUkkoKS50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KREJDLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KREJDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyMDUxZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0pEQkMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2NsYXNzIEpEQkMgZXh0ZW5kcyBCYXNlRGF0YVNvdXJjZVR5cGUgeworCisgIHByb3RlY3RlZCBmaW5hbCBDb25maWcgY2ZnOworCisgIEBJbmplY3QKKyAgSkRCQyhAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcpIHsKKyAgICBzdXBlcihDb25maWdVdGlsLmdldFJlcXVpcmVkKGNmZywgImRhdGFiYXNlIiwgImRyaXZlciIpKTsKKyAgICB0aGlzLmNmZyA9IGNmZzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICByZXR1cm4gQ29uZmlnVXRpbC5nZXRSZXF1aXJlZChjZmcsICJkYXRhYmFzZSIsICJ1cmwiKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0pkYmNVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KZGJjVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2E0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KZGJjVXRpbC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitwdWJsaWMgY2xhc3MgSmRiY1V0aWwgeworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgeworICAgIGlmIChob3N0bmFtZSA9PSBudWxsIHx8IGhvc3RuYW1lLmlzRW1wdHkoKSkgeworICAgICAgaG9zdG5hbWUgPSAibG9jYWxob3N0IjsKKworICAgIH0gZWxzZSBpZiAoaG9zdG5hbWUuY29udGFpbnMoIjoiKSAmJiAhaG9zdG5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7CisgICAgICBob3N0bmFtZSA9ICJbIiArIGhvc3RuYW1lICsgIl0iOworICAgIH0KKyAgICByZXR1cm4gaG9zdG5hbWU7CisgIH0KKworICBzdGF0aWMgU3RyaW5nIHBvcnQoU3RyaW5nIHBvcnQpIHsKKyAgICBpZiAocG9ydCAhPSBudWxsICYmICFwb3J0LmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuICI6IiArIHBvcnQ7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvTXlTcWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL015U3FsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4Y2VjOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL015U3FsLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5KZGJjVXRpbC5ob3N0bmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5KZGJjVXRpbC5wb3J0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdTZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworY2xhc3MgTXlTcWwgZXh0ZW5kcyBCYXNlRGF0YVNvdXJjZVR5cGUgeworCisgIHByaXZhdGUgQ29uZmlnIGNmZzsKKworICBASW5qZWN0CisgIHB1YmxpYyBNeVNxbChAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcpIHsKKyAgICBzdXBlcigiY29tLm15c3FsLmpkYmMuRHJpdmVyIik7CisgICAgdGhpcy5jZmcgPSBjZmc7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmaW5hbCBDb25maWdTZWN0aW9uIGRicyA9IG5ldyBDb25maWdTZWN0aW9uKGNmZywgImRhdGFiYXNlIik7CisgICAgYi5hcHBlbmQoImpkYmM6bXlzcWw6Ly8iKTsKKyAgICBiLmFwcGVuZChob3N0bmFtZShkYnMub3B0aW9uYWwoImhvc3RuYW1lIikpKTsKKyAgICBiLmFwcGVuZChwb3J0KGRicy5vcHRpb25hbCgicG9ydCIpKSk7CisgICAgYi5hcHBlbmQoIi8iKTsKKyAgICBiLmFwcGVuZChkYnMucmVxdWlyZWQoImRhdGFiYXNlIikpOworICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gdXNlUG9vbCgpIHsKKyAgICAvLyBNeVNRTCBoYXMgZ2l2ZW4gdXMgdHJvdWJsZSB3aXRoIHRoZSBjb25uZWN0aW9uIHBvb2wsCisgICAgLy8gc29tZXRpbWVzIHRoZSBiYWNrZW5kIGRpc2Nvbm5lY3RzIGFuZCB0aGUgcG9vbCB3aW5kcworICAgIC8vIHVwIHdpdGggYSBzdGFsZSBjb25uZWN0aW9uLiBGb3J0dW5hdGVseSBvcGVuaW5nIHVwCisgICAgLy8gYSBuZXcgTXlTUUwgY29ubmVjdGlvbiBpcyB1c3VhbGx5IHZlcnkgZmFzdC4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9Qb3N0Z3JlU1FMLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9Qb3N0Z3JlU1FMLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU4ZDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1Bvc3RncmVTUUwuamF2YQpAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkpkYmNVdGlsLmhvc3RuYW1lOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkpkYmNVdGlsLnBvcnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1NlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworY2xhc3MgUG9zdGdyZVNRTCBleHRlbmRzIEJhc2VEYXRhU291cmNlVHlwZSB7CisKKyAgcHJpdmF0ZSBDb25maWcgY2ZnOworCisgIEBJbmplY3QKKyAgcHVibGljIFBvc3RncmVTUUwoQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnKSB7CisgICAgc3VwZXIoIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciIpOworICAgIHRoaXMuY2ZnID0gY2ZnOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZmluYWwgQ29uZmlnU2VjdGlvbiBkYmMgPSBuZXcgQ29uZmlnU2VjdGlvbihjZmcsICJkYXRhYmFzZSIpOworICAgIGIuYXBwZW5kKCJqZGJjOnBvc3RncmVzcWw6Ly8iKTsKKyAgICBiLmFwcGVuZChob3N0bmFtZShkYmMub3B0aW9uYWwoImhvc3RuYW1lIikpKTsKKyAgICBiLmFwcGVuZChwb3J0KGRiYy5vcHRpb25hbCgicG9ydCIpKSk7CisgICAgYi5hcHBlbmQoIi8iKTsKKyAgICBiLmFwcGVuZChkYmMucmVxdWlyZWQoImRhdGFiYXNlIikpOworICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNjcmlwdFJ1bm5lciBnZXRJbmRleFNjcmlwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldFNjcmlwdFJ1bm5lcigiaW5kZXhfcG9zdGdyZXMuc3FsIik7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFDcmVhdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFDcmVhdG9yLmphdmEKaW5kZXggZmQzNzliMi4uNTAyNDdiOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYUNyZWF0b3IuamF2YQpAQCAtMTQsMTcgKzE0LDE5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uVmVyc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUnVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBOYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkN1cnJlbnRTY2hlbWFWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuU3lzdGVtQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CkBAIC0zOCwxMCArNDAsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkpkYmNFeGVjdXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkpkYmNTY2hlbWE7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLnNxbC5EaWFsZWN0SDI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLnNxbC5EaWFsZWN0TXlTUUw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLnNxbC5EaWFsZWN0UG9zdGdyZVNRTDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zY2hlbWEuc3FsLlNxbERpYWxlY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTU0LDcgKzUyLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiAvKiogQ3JlYXRlcyB0aGUgY3VycmVudCBkYXRhYmFzZSBzY2hlbWEgYW5kIHBvcHVsYXRlcyBpbml0aWFsIGNvZGUgcm93cy4gKi8KQEAgLTY1LDExICs2Miw5IEBACiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgbWdyOwogICBwcml2YXRlIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWU7CiAgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgc2VydmVyVXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlVHlwZSBkYXRhU291cmNlVHlwZTsKIAogICBwcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uTmJyOwotICBwcml2YXRlIGZpbmFsIFNjcmlwdFJ1bm5lciBpbmRleF9nZW5lcmljOwotICBwcml2YXRlIGZpbmFsIFNjcmlwdFJ1bm5lciBpbmRleF9wb3N0Z3JlczsKLSAgcHJpdmF0ZSBmaW5hbCBTY3JpcHRSdW5uZXIgbXlzcWxfbmV4dHZhbDsKIAogICBwcml2YXRlIEFjY291bnRHcm91cCBhZG1pbjsKICAgcHJpdmF0ZSBBY2NvdW50R3JvdXAgYW5vbnltb3VzOwpAQCAtODEsMjMgKzc2LDIzIEBACiAgICAgICBAQ3VycmVudCBTY2hlbWFWZXJzaW9uIHZlcnNpb24sCiAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBtZ3IsCiAgICAgICBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lLAotICAgICAgQEdlcnJpdFBlcnNvbklkZW50IFBlcnNvbklkZW50IGF1KSB7Ci0gICAgdGhpcyhzaXRlLnNpdGVfcGF0aCwgdmVyc2lvbiwgbWdyLCBhbGxQcm9qZWN0c05hbWUsIGF1KTsKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBhdSwKKyAgICAgIERhdGFTb3VyY2VUeXBlIGRzdCkgeworICAgIHRoaXMoc2l0ZS5zaXRlX3BhdGgsIHZlcnNpb24sIG1nciwgYWxsUHJvamVjdHNOYW1lLCBhdSwgZHN0KTsKICAgfQogCiAgIHB1YmxpYyBTY2hlbWFDcmVhdG9yKEBTaXRlUGF0aCBGaWxlIHNpdGUsCiAgICAgICBAQ3VycmVudCBTY2hlbWFWZXJzaW9uIHZlcnNpb24sCiAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNZ3IsCiAgICAgICBBbGxQcm9qZWN0c05hbWUgYXAsCi0gICAgICBAR2Vycml0UGVyc29uSWRlbnQgUGVyc29uSWRlbnQgYXUpIHsKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBhdSwKKyAgICAgIERhdGFTb3VyY2VUeXBlIGRzdCkgewogICAgIHNpdGVfcGF0aCA9IHNpdGU7CiAgICAgbWdyID0gZ2l0TWdyOwogICAgIGFsbFByb2plY3RzTmFtZSA9IGFwOwogICAgIHNlcnZlclVzZXIgPSBhdTsKKyAgICBkYXRhU291cmNlVHlwZSA9IGRzdDsKICAgICB2ZXJzaW9uTmJyID0gdmVyc2lvbi5nZXRWZXJzaW9uTmJyKCk7Ci0gICAgaW5kZXhfZ2VuZXJpYyA9IG5ldyBTY3JpcHRSdW5uZXIoImluZGV4X2dlbmVyaWMuc3FsIik7Ci0gICAgaW5kZXhfcG9zdGdyZXMgPSBuZXcgU2NyaXB0UnVubmVyKCJpbmRleF9wb3N0Z3Jlcy5zcWwiKTsKLSAgICBteXNxbF9uZXh0dmFsID0gbmV3IFNjcmlwdFJ1bm5lcigibXlzcWxfbmV4dHZhbC5zcWwiKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGNyZWF0ZShmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCkBAIC0xMTQsMjkgKzEwOSw5IEBACiAgICAgc1Zlci52ZXJzaW9uTmJyID0gdmVyc2lvbk5icjsKICAgICBkYi5zY2hlbWFWZXJzaW9uKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihzVmVyKSk7CiAKLSAgICBmaW5hbCBTeXN0ZW1Db25maWcgc0NvbmZpZyA9IGluaXRTeXN0ZW1Db25maWcoZGIpOwotICAgIGluaXRWZXJpZmllZENhdGVnb3J5KGRiKTsKLSAgICBpbml0Q29kZVJldmlld0NhdGVnb3J5KGRiLCBzQ29uZmlnKTsKLQotICAgIGlmIChtZ3IgIT0gbnVsbCkgewotICAgICAgLy8gVE9ETyBUaGlzIHNob3VsZCBuZXZlciBiZSBudWxsIHdoZW4gaW5pdGlhbGl6aW5nIGEgc2l0ZS4KLSAgICAgIGluaXRXaWxkQ2FyZFByb2plY3QoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBTcWxEaWFsZWN0IGQgPSBqZGJjLmdldERpYWxlY3QoKTsKLSAgICBpZiAoZCBpbnN0YW5jZW9mIERpYWxlY3RIMikgewotICAgICAgaW5kZXhfZ2VuZXJpYy5ydW4oZGIpOwotCi0gICAgfSBlbHNlIGlmIChkIGluc3RhbmNlb2YgRGlhbGVjdE15U1FMKSB7Ci0gICAgICBpbmRleF9nZW5lcmljLnJ1bihkYik7Ci0gICAgICBteXNxbF9uZXh0dmFsLnJ1bihkYik7Ci0KLSAgICB9IGVsc2UgaWYgKGQgaW5zdGFuY2VvZiBEaWFsZWN0UG9zdGdyZVNRTCkgewotICAgICAgaW5kZXhfcG9zdGdyZXMucnVuKGRiKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBkYXRhYmFzZSAiICsgZC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQorICAgIGluaXRTeXN0ZW1Db25maWcoZGIpOworICAgIGluaXRBbGxQcm9qZWN0cygpOworICAgIGRhdGFTb3VyY2VUeXBlLmdldEluZGV4U2NyaXB0KCkucnVuKGRiKTsKICAgfQogCiAgIHByaXZhdGUgQWNjb3VudEdyb3VwIG5ld0dyb3VwKFJldmlld0RiIGMsIFN0cmluZyBuYW1lLCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkKQpAQCAtMjAyLDIzICsxNzcsMzIgQEAKICAgICByZXR1cm4gczsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0V2lsZENhcmRQcm9qZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKLSAgICBSZXBvc2l0b3J5IGdpdDsKKyAgcHJpdmF0ZSB2b2lkIGluaXRBbGxQcm9qZWN0cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeSBnaXQgPSBudWxsOwogICAgIHRyeSB7CiAgICAgICBnaXQgPSBtZ3Iub3BlblJlcG9zaXRvcnkoYWxsUHJvamVjdHNOYW1lKTsKKyAgICAgIGluaXRBbGxQcm9qZWN0cyhnaXQpOwogICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBub3RGb3VuZCkgewogICAgICAgLy8gQSByZXBvc2l0b3J5IG1heSBiZSBtaXNzaW5nIGlmIHRoaXMgcHJvamVjdCBleGlzdGVkIG9ubHkgdG8gc3RvcmUKICAgICAgIC8vIGluaGVyaXRhYmxlIHBlcm1pc3Npb25zLiBGb3IgZXhhbXBsZSAnQWxsLVByb2plY3RzJy4KICAgICAgIHRyeSB7CiAgICAgICAgIGdpdCA9IG1nci5jcmVhdGVSZXBvc2l0b3J5KGFsbFByb2plY3RzTmFtZSk7CisgICAgICAgIGluaXRBbGxQcm9qZWN0cyhnaXQpOwogICAgICAgICBmaW5hbCBSZWZVcGRhdGUgdSA9IGdpdC51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQpOwogICAgICAgICB1LmxpbmsoR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRyk7CiAgICAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZXJyKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYWxsUHJvamVjdHNOYW1lLmdldCgpOwogICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgcmVwb3NpdG9yeSAiICsgbmFtZSwgZXJyKTsKICAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgaWYgKGdpdCAhPSBudWxsKSB7CisgICAgICAgIGdpdC5jbG9zZSgpOworICAgICAgfQogICAgIH0KLSAgICB0cnkgeworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRBbGxQcm9qZWN0cyhSZXBvc2l0b3J5IGdpdCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAgICAgICBNZXRhRGF0YVVwZGF0ZSBtZCA9CiAgICAgICAgICAgbmV3IE1ldGFEYXRhVXBkYXRlKEdpdFJlZmVyZW5jZVVwZGF0ZWQuRElTQUJMRUQsIGFsbFByb2plY3RzTmFtZSwgZ2l0KTsKICAgICAgIG1kLmdldENvbW1pdEJ1aWxkZXIoKS5zZXRBdXRob3Ioc2VydmVyVXNlcik7CkBAIC0yMjYsNDAgKzIxMCw3NyBAQAogCiAgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CiAgICAgICBQcm9qZWN0IHAgPSBjb25maWcuZ2V0UHJvamVjdCgpOwotICAgICAgcC5zZXREZXNjcmlwdGlvbigiUmlnaHRzIGluaGVyaXRlZCBieSBhbGwgb3RoZXIgcHJvamVjdHMiKTsKLSAgICAgIHAuc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGZhbHNlKTsKKyAgICAgIHAuc2V0RGVzY3JpcHRpb24oIkFjY2VzcyBpbmhlcml0ZWQgYnkgYWxsIG90aGVyIHByb2plY3RzLiIpOworICAgICAgcC5zZXRSZXF1aXJlQ2hhbmdlSUQoSW5oZXJpdGFibGVCb29sZWFuLlRSVUUpOworICAgICAgcC5zZXRVc2VDb250ZW50TWVyZ2UoSW5oZXJpdGFibGVCb29sZWFuLlRSVUUpOworICAgICAgcC5zZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoSW5oZXJpdGFibGVCb29sZWFuLkZBTFNFKTsKKyAgICAgIHAuc2V0VXNlU2lnbmVkT2ZmQnkoSW5oZXJpdGFibGVCb29sZWFuLkZBTFNFKTsKIAogICAgICAgQWNjZXNzU2VjdGlvbiBjYXAgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbihBY2Nlc3NTZWN0aW9uLkdMT0JBTF9DQVBBQklMSVRJRVMsIHRydWUpOwogICAgICAgQWNjZXNzU2VjdGlvbiBhbGwgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbihBY2Nlc3NTZWN0aW9uLkFMTCwgdHJ1ZSk7CiAgICAgICBBY2Nlc3NTZWN0aW9uIGhlYWRzID0gY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oQWNjZXNzU2VjdGlvbi5IRUFEUywgdHJ1ZSk7CisgICAgICBBY2Nlc3NTZWN0aW9uIHRhZ3MgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbigicmVmcy90YWdzLyoiLCB0cnVlKTsKICAgICAgIEFjY2Vzc1NlY3Rpb24gbWV0YSA9IGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcsIHRydWUpOworICAgICAgQWNjZXNzU2VjdGlvbiBtYWdpYyA9IGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKCJyZWZzL2Zvci8iICsgQWNjZXNzU2VjdGlvbi5BTEwsIHRydWUpOwogCi0gICAgICBjYXAuZ2V0UGVybWlzc2lvbihHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIsIHRydWUpCi0gICAgICAgIC5hZGQocnVsZShjb25maWcsIGFkbWluKSk7CisgICAgICBncmFudChjb25maWcsIGNhcCwgR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSLCBhZG1pbik7CisgICAgICBncmFudChjb25maWcsIGFsbCwgUGVybWlzc2lvbi5SRUFELCBhZG1pbiwgYW5vbnltb3VzKTsKIAotICAgICAgUGVybWlzc2lvblJ1bGUgcmV2aWV3ID0gcnVsZShjb25maWcsIHJlZ2lzdGVyZWQpOwotICAgICAgcmV2aWV3LnNldFJhbmdlKC0xLCAxKTsKLSAgICAgIGhlYWRzLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5MQUJFTCArICJDb2RlLVJldmlldyIsIHRydWUpLmFkZChyZXZpZXcpOworICAgICAgTGFiZWxUeXBlIGNyID0gaW5pdENvZGVSZXZpZXdMYWJlbChjb25maWcpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgY3IsIC0xLCAxLCByZWdpc3RlcmVkKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIGNyLCAtMiwgMiwgYWRtaW4sIG93bmVycyk7CisgICAgICBncmFudChjb25maWcsIGhlYWRzLCBQZXJtaXNzaW9uLkNSRUFURSwgYWRtaW4sIG93bmVycyk7CisgICAgICBncmFudChjb25maWcsIGhlYWRzLCBQZXJtaXNzaW9uLlBVU0gsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5TVUJNSVQsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5GT1JHRV9BVVRIT1IsIHJlZ2lzdGVyZWQpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5GT1JHRV9DT01NSVRURVIsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5FRElUX1RPUElDX05BTUUsIHRydWUsIGFkbWluLCBvd25lcnMpOwogCi0gICAgICBhbGwuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlJFQUQsIHRydWUpIC8vCi0gICAgICAgICAgLmFkZChydWxlKGNvbmZpZywgYWRtaW4pKTsKLSAgICAgIGFsbC5nZXRQZXJtaXNzaW9uKFBlcm1pc3Npb24uUkVBRCwgdHJ1ZSkgLy8KLSAgICAgICAgICAuYWRkKHJ1bGUoY29uZmlnLCBhbm9ueW1vdXMpKTsKKyAgICAgIGdyYW50KGNvbmZpZywgdGFncywgUGVybWlzc2lvbi5QVVNIX1RBRywgYWRtaW4sIG93bmVycyk7CisgICAgICBncmFudChjb25maWcsIHRhZ3MsIFBlcm1pc3Npb24uUFVTSF9TSUdORURfVEFHLCBhZG1pbiwgb3duZXJzKTsKIAotICAgICAgY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oInJlZnMvZm9yLyIgKyBBY2Nlc3NTZWN0aW9uLkFMTCwgdHJ1ZSkgLy8KLSAgICAgICAgICAuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlBVU0gsIHRydWUpIC8vCi0gICAgICAgICAgLmFkZChydWxlKGNvbmZpZywgcmVnaXN0ZXJlZCkpOwotICAgICAgYWxsLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5GT1JHRV9BVVRIT1IsIHRydWUpIC8vCi0gICAgICAgICAgLmFkZChydWxlKGNvbmZpZywgcmVnaXN0ZXJlZCkpOworICAgICAgZ3JhbnQoY29uZmlnLCBtYWdpYywgUGVybWlzc2lvbi5QVVNILCByZWdpc3RlcmVkKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWFnaWMsIFBlcm1pc3Npb24uUFVTSF9NRVJHRSwgcmVnaXN0ZXJlZCk7CiAKLSAgICAgIFBlcm1pc3Npb24gbWV0YVJlYWRQZXJtaXNzaW9uID0gbWV0YS5nZXRQZXJtaXNzaW9uKFBlcm1pc3Npb24uUkVBRCwgdHJ1ZSk7Ci0gICAgICBtZXRhUmVhZFBlcm1pc3Npb24uc2V0RXhjbHVzaXZlR3JvdXAodHJ1ZSk7Ci0gICAgICBtZXRhUmVhZFBlcm1pc3Npb24uYWRkKHJ1bGUoY29uZmlnLCBvd25lcnMpKTsKKyAgICAgIG1ldGEuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlJFQUQsIHRydWUpLnNldEV4Y2x1c2l2ZUdyb3VwKHRydWUpOworICAgICAgZ3JhbnQoY29uZmlnLCBtZXRhLCBQZXJtaXNzaW9uLlJFQUQsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBtZXRhLCBjciwgLTIsIDIsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBtZXRhLCBQZXJtaXNzaW9uLlBVU0gsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBtZXRhLCBQZXJtaXNzaW9uLlNVQk1JVCwgYWRtaW4sIG93bmVycyk7CiAKICAgICAgIG1kLnNldE1lc3NhZ2UoIkluaXRpYWxpemVkIEdlcnJpdCBDb2RlIFJldmlldyAiICsgVmVyc2lvbi5nZXRWZXJzaW9uKCkpOwogICAgICAgY29uZmlnLmNvbW1pdChtZCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGdpdC5jbG9zZSgpOworICB9CisKKyAgcHJpdmF0ZSBQZXJtaXNzaW9uUnVsZSBncmFudChQcm9qZWN0Q29uZmlnIGNvbmZpZywgQWNjZXNzU2VjdGlvbiBzZWN0aW9uLAorICAgICAgU3RyaW5nIHBlcm1pc3Npb24sIEFjY291bnRHcm91cCBncm91cDEsIEFjY291bnRHcm91cC4uLiBncm91cExpc3QpIHsKKyAgICByZXR1cm4gZ3JhbnQoY29uZmlnLCBzZWN0aW9uLCBwZXJtaXNzaW9uLCBmYWxzZSwgZ3JvdXAxLCBncm91cExpc3QpOworICB9CisKKyAgcHJpdmF0ZSBQZXJtaXNzaW9uUnVsZSBncmFudChQcm9qZWN0Q29uZmlnIGNvbmZpZywgQWNjZXNzU2VjdGlvbiBzZWN0aW9uLAorICAgICAgU3RyaW5nIHBlcm1pc3Npb24sIGJvb2xlYW4gZm9yY2UsIEFjY291bnRHcm91cCBncm91cDEsCisgICAgICBBY2NvdW50R3JvdXAuLi4gZ3JvdXBMaXN0KSB7CisgICAgUGVybWlzc2lvbiBwID0gc2VjdGlvbi5nZXRQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHRydWUpOworICAgIFBlcm1pc3Npb25SdWxlIHJ1bGUgPSBydWxlKGNvbmZpZywgZ3JvdXAxKTsKKyAgICBydWxlLnNldEZvcmNlKGZvcmNlKTsKKyAgICBwLmFkZChydWxlKTsKKyAgICBmb3IgKEFjY291bnRHcm91cCBncm91cCA6IGdyb3VwTGlzdCkgeworICAgICAgcnVsZSA9IHJ1bGUoY29uZmlnLCBncm91cCk7CisgICAgICBydWxlLnNldEZvcmNlKGZvcmNlKTsKKyAgICAgIHAuYWRkKHJ1bGUpOworICAgIH0KKyAgICByZXR1cm4gcnVsZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncmFudChQcm9qZWN0Q29uZmlnIGNvbmZpZywKKyAgICAgIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiwgTGFiZWxUeXBlIHR5cGUsCisgICAgICBpbnQgbWluLCBpbnQgbWF4LCBBY2NvdW50R3JvdXAuLi4gZ3JvdXBMaXN0KSB7CisgICAgU3RyaW5nIG5hbWUgPSBQZXJtaXNzaW9uLkxBQkVMICsgdHlwZS5nZXROYW1lKCk7CisgICAgUGVybWlzc2lvbiBwID0gc2VjdGlvbi5nZXRQZXJtaXNzaW9uKG5hbWUsIHRydWUpOworICAgIGZvciAoQWNjb3VudEdyb3VwIGdyb3VwIDogZ3JvdXBMaXN0KSB7CisgICAgICBQZXJtaXNzaW9uUnVsZSByID0gcnVsZShjb25maWcsIGdyb3VwKTsKKyAgICAgIHIuc2V0UmFuZ2UobWluLCBtYXgpOworICAgICAgcC5hZGQocik7CiAgICAgfQogICB9CiAKQEAgLTI2Nyw0MyArMjg4LDE2IEBACiAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uUnVsZShjb25maWcucmVzb2x2ZShncm91cCkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluaXRWZXJpZmllZENhdGVnb3J5KGZpbmFsIFJldmlld0RiIGMpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0OwotICAgIGZpbmFsIEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHM7Ci0KLSAgICBjYXQgPSBuZXcgQXBwcm92YWxDYXRlZ29yeShuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgiVlJJRiIpLCAiVmVyaWZpZWQiKTsKLSAgICBjYXQuc2V0UG9zaXRpb24oKHNob3J0KSAwKTsKLSAgICBjYXQuc2V0QWJicmV2aWF0ZWROYW1lKCJWIik7Ci0gICAgdmFscyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPigpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgMSwgIlZlcmlmaWVkIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgMCwgIk5vIHNjb3JlIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgLTEsICJGYWlscyIpKTsKLSAgICBjLmFwcHJvdmFsQ2F0ZWdvcmllcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oY2F0KSk7Ci0gICAgYy5hcHByb3ZhbENhdGVnb3J5VmFsdWVzKCkuaW5zZXJ0KHZhbHMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRDb2RlUmV2aWV3Q2F0ZWdvcnkoZmluYWwgUmV2aWV3RGIgYywKLSAgICAgIGZpbmFsIFN5c3RlbUNvbmZpZyBzQ29uZmlnKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPiB2YWxzOwotCi0gICAgY2F0ID0gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkobmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIkNSVlciKSwgIkNvZGUgUmV2aWV3Iik7Ci0gICAgY2F0LnNldFBvc2l0aW9uKChzaG9ydCkgMSk7Ci0gICAgY2F0LnNldEFiYnJldmlhdGVkTmFtZSgiUiIpOwotICAgIGNhdC5zZXRDb3B5TWluU2NvcmUodHJ1ZSk7Ci0gICAgdmFscyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPigpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgMiwgIkxvb2tzIGdvb2QgdG8gbWUsIGFwcHJvdmVkIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgMSwgIkxvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgMCwgIk5vIHNjb3JlIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgLTEsICJJIHdvdWxkIHByZWZlciB0aGF0IHlvdSBkaWRuJ3Qgc3VibWl0IHRoaXMiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAtMiwgIkRvIG5vdCBzdWJtaXQiKSk7Ci0gICAgYy5hcHByb3ZhbENhdGVnb3JpZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNhdCkpOwotICAgIGMuYXBwcm92YWxDYXRlZ29yeVZhbHVlcygpLmluc2VydCh2YWxzKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2YWx1ZShmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdCwKLSAgICAgIGZpbmFsIGludCB2YWx1ZSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gbmV3IEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZShuZXcgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkKGNhdC5nZXRJZCgpLAotICAgICAgICAoc2hvcnQpIHZhbHVlKSwgbmFtZSk7CisgIHB1YmxpYyBzdGF0aWMgTGFiZWxUeXBlIGluaXRDb2RlUmV2aWV3TGFiZWwoUHJvamVjdENvbmZpZyBjKSB7CisgICAgTGFiZWxUeXBlIHR5cGUgPSBuZXcgTGFiZWxUeXBlKCJDb2RlLVJldmlldyIsIEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgMiwgIkxvb2tzIGdvb2QgdG8gbWUsIGFwcHJvdmVkIiksCisgICAgICAgIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgMSwgIkxvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlIiksCisgICAgICAgIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgMCwgIk5vIHNjb3JlIiksCisgICAgICAgIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgLTEsICJJIHdvdWxkIHByZWZlciB0aGF0IHlvdSBkaWRuJ3Qgc3VibWl0IHRoaXMiKSwKKyAgICAgICAgbmV3IExhYmVsVmFsdWUoKHNob3J0KSAtMiwgIkRvIG5vdCBzdWJtaXQiKSkpOworICAgIHR5cGUuc2V0QWJicmV2aWF0ZWROYW1lKCJDUiIpOworICAgIHR5cGUuc2V0Q29weU1pblNjb3JlKHRydWUpOworICAgIGMuZ2V0TGFiZWxTZWN0aW9ucygpLnB1dCh0eXBlLmdldE5hbWUoKSwgdHlwZSk7CisgICAgcmV0dXJuIHR5cGU7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb24uamF2YQppbmRleCBmMTI3YTIxLi40ZGUzODg4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hVmVyc2lvbi5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAvKiogQSB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZSBzY2hlbWEuICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2NoZW1hVmVyc2lvbiB7CiAgIC8qKiBUaGUgY3VycmVudCBzY2hlbWEgdmVyc2lvbi4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxTY2hlbWFfNzM+IEMgPSBTY2hlbWFfNzMuY2xhc3M7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8U2NoZW1hXzc3PiBDID0gU2NoZW1hXzc3LmNsYXNzOwogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgewogICAgIEBPdmVycmlkZQpAQCAtNDksNyArNDksNyBAQAogICAgIHRoaXMudmVyc2lvbk5iciA9IGd1ZXNzVmVyc2lvbihnZXRDbGFzcygpKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGludCBndWVzc1ZlcnNpb24oQ2xhc3M8Pz4gYykgeworICBwdWJsaWMgc3RhdGljIGludCBndWVzc1ZlcnNpb24oQ2xhc3M8Pz4gYykgewogICAgIFN0cmluZyBuID0gYy5nZXROYW1lKCk7CiAgICAgbiA9IG4uc3Vic3RyaW5nKG4ubGFzdEluZGV4T2YoJ18nKSArIDEpOwogICAgIHdoaWxlIChuLnN0YXJ0c1dpdGgoIjAiKSkKQEAgLTgzLDYgKzgzLDExIEBACiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBTUUxFeGNlcHRpb24gewogICAgIGZpbmFsIEpkYmNTY2hlbWEgcyA9IChKZGJjU2NoZW1hKSBkYjsKIAorICAgIGlmIChjdXJyLnZlcnNpb25OYnIgPiB2ZXJzaW9uTmJyKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKCJDYW5ub3QgZG93bmdyYWRlIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHZlcnNpb24gIiArIGN1cnIudmVyc2lvbk5icgorICAgICAgICAgICsgIiB0byAiICsgdmVyc2lvbk5iciArICIuIik7CisgICAgfQorCiAgICAgcHJpb3IuZ2V0KCkuY2hlY2sodWksIGN1cnIsIGRiLCBmYWxzZSk7CiAKICAgICB1aS5tZXNzYWdlKCJVcGdyYWRpbmcgZGF0YWJhc2Ugc2NoZW1hIGZyb20gdmVyc2lvbiAiICsgY3Vyci52ZXJzaW9uTmJyCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uQ2hlY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb25DaGVjay5qYXZhCmluZGV4IDEzM2I4NTYuLjJlMTJmNWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb25DaGVjay5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb25DaGVjay5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ3VycmVudFNjaGVtYVZlcnNpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMzcsMTQgKzM4LDE3IEBACiAgIH0KIAogICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYTsKKyAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZTsKIAogICBAQ3VycmVudAogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNjaGVtYVZlcnNpb24+IHZlcnNpb247CiAKICAgQEluamVjdAogICBwdWJsaWMgU2NoZW1hVmVyc2lvbkNoZWNrKFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3RvcnksCisgICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZSwKICAgICAgIEBDdXJyZW50IFByb3ZpZGVyPFNjaGVtYVZlcnNpb24+IHZlcnNpb24pIHsKICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYUZhY3Rvcnk7CisgICAgdGhpcy5zaXRlID0gc2l0ZTsKICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwogICB9CiAKQEAgLTUyLDE3ICs1NiwyNSBAQAogICAgIHRyeSB7CiAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7CiAgICAgICB0cnkgewotICAgICAgICBmaW5hbCBDdXJyZW50U2NoZW1hVmVyc2lvbiBzVmVyID0gZ2V0U2NoZW1hVmVyc2lvbihkYik7Ci0gICAgICAgIGZpbmFsIGludCBlVmVyID0gdmVyc2lvbi5nZXQoKS5nZXRWZXJzaW9uTmJyKCk7CisgICAgICAgIGZpbmFsIEN1cnJlbnRTY2hlbWFWZXJzaW9uIGN1cnJlbnRWZXIgPSBnZXRTY2hlbWFWZXJzaW9uKGRiKTsKKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVmVyID0gdmVyc2lvbi5nZXQoKS5nZXRWZXJzaW9uTmJyKCk7CiAKLSAgICAgICAgaWYgKHNWZXIgPT0gbnVsbCkgeworICAgICAgICBpZiAoY3VycmVudFZlciA9PSBudWxsKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiU2NoZW1hIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuIgotICAgICAgICAgICAgICArICIgIFJ1biBpbml0IHRvIGluaXRpYWxpemUgdGhlIHNjaGVtYS4iKTsKKyAgICAgICAgICAgICAgKyAiICBSdW4gaW5pdCB0byBpbml0aWFsaXplIHRoZSBzY2hlbWE6XG4iCisgICAgICAgICAgICAgICsgIiQgamF2YSAtamFyIGdlcnJpdC53YXIgaW5pdCAtZCAiCisgICAgICAgICAgICAgICsgc2l0ZS5zaXRlX3BhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzVmVyLnZlcnNpb25OYnIgIT0gZVZlcikgeworICAgICAgICBpZiAoY3VycmVudFZlci52ZXJzaW9uTmJyIDwgZXhwZWN0ZWRWZXIpIHsKICAgICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBzY2hlbWEgdmVyc2lvbiAiCi0gICAgICAgICAgICAgICsgc1Zlci52ZXJzaW9uTmJyICsgIjsgZXhwZWN0ZWQgc2NoZW1hIHZlcnNpb24gIiArIGVWZXIKLSAgICAgICAgICAgICAgKyAiLiAgUnVuIGluaXQgdG8gdXBncmFkZS4iKTsKKyAgICAgICAgICAgICAgKyBjdXJyZW50VmVyLnZlcnNpb25OYnIgKyAiOyBleHBlY3RlZCBzY2hlbWEgdmVyc2lvbiAiICsgZXhwZWN0ZWRWZXIKKyAgICAgICAgICAgICAgKyAiLiAgUnVuIGluaXQgdG8gdXBncmFkZTpcbiIKKyAgICAgICAgICAgICAgKyAiJCBqYXZhIC1qYXIgIiArIHNpdGUuZ2Vycml0X3dhci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgaW5pdCAtZCAiCisgICAgICAgICAgICAgICsgc2l0ZS5zaXRlX3BhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWZXIudmVyc2lvbk5iciA+IGV4cGVjdGVkVmVyKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgc2NoZW1hIHZlcnNpb24gIgorICAgICAgICAgICAgICArIGN1cnJlbnRWZXIudmVyc2lvbk5iciArICI7IGV4cGVjdGVkIHNjaGVtYSB2ZXJzaW9uICIgKyBleHBlY3RlZFZlcgorICAgICAgICAgICAgICArICIuIERvd25ncmFkZSBpcyBub3Qgc3VwcG9ydGVkLiIpOwogICAgICAgICB9CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBkYi5jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzUzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTMuamF2YQppbmRleCA4MjA3YzMxLi5lNGFhZTJjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTMuamF2YQpAQCAtMjgsMTEgKzI4LDEzIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlN5c3RlbUNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwpAQCAtNDEsNiArNDMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFfNzcuTGVnYWN5TGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkpkYmNTY2hlbWE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CkBAIC02Nyw3ICs3MCw3IEBACiAKICAgcHJpdmF0ZSBTeXN0ZW1Db25maWcgc3lzdGVtQ29uZmlnOwogICBwcml2YXRlIE1hcDxBY2NvdW50R3JvdXAuSWQsIEdyb3VwUmVmZXJlbmNlPiBncm91cE1hcDsKLSAgcHJpdmF0ZSBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeT4gY2F0ZWdvcnlNYXA7CisgIHByaXZhdGUgTGVnYWN5TGFiZWxUeXBlcyBsYWJlbFR5cGVzOwogICBwcml2YXRlIEdyb3VwUmVmZXJlbmNlIHByb2plY3RPd25lcnM7CiAKICAgcHJpdmF0ZSBNYXA8UHJvamVjdC5OYW1lS2V5LCBQcm9qZWN0Lk5hbWVLZXk+IHBhcmVudHNCeVByb2plY3Q7CkBAIC05Miw3ICs5NSw3IEBACiAgIHByb3RlY3RlZCB2b2lkIG1pZ3JhdGVEYXRhKFJldmlld0RiIGRiLCBVcGRhdGVVSSB1aSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKICAgICAgIFNRTEV4Y2VwdGlvbiB7CiAgICAgc3lzdGVtQ29uZmlnID0gZGIuc3lzdGVtQ29uZmlnKCkuZ2V0KG5ldyBTeXN0ZW1Db25maWcuS2V5KCkpOwotICAgIGNhdGVnb3J5TWFwID0gZGIuYXBwcm92YWxDYXRlZ29yaWVzKCkudG9NYXAoZGIuYXBwcm92YWxDYXRlZ29yaWVzKCkuYWxsKCkpOworICAgIGxhYmVsVHlwZXMgPSBTY2hlbWFfNzcuZ2V0TGVnYWN5VHlwZXMoZGIpOwogCiAgICAgYXNzaWduR3JvdXBVVUlEcyhkYik7CiAgICAgcmVhZE9sZFJlZlJpZ2h0cyhkYik7CkBAIC0xMDMsMTMgKzEwNiwxNyBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFjdGlvbkNhdGVnb3JpZXMoUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIExpc3Q8QXBwcm92YWxDYXRlZ29yeT4gZGVsZXRlID0gbmV3IEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5PigpOwotICAgIGZvciAoQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSA6IGNhdGVnb3J5TWFwLnZhbHVlcygpKSB7Ci0gICAgICBpZiAoY2F0ZWdvcnkuZ2V0UG9zaXRpb24oKSA8IDApIHsKLSAgICAgICAgZGVsZXRlLmFkZChjYXRlZ29yeSk7CisgICAgdHJ5IHsKKyAgICAgIFN0YXRlbWVudCBzdG10ID0gKChKZGJjU2NoZW1hKSBkYikuZ2V0Q29ubmVjdGlvbigpLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgdHJ5IHsKKyAgICAgICAgc3RtdC5leGVjdXRlVXBkYXRlKAorICAgICAgICAgICAgIkRFTEVURSBGUk9NIGFwcHJvdmFsX2NhdGVnb3JpZXMgV0hFUkUgcG9zaXRpb24gPCAwIik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBzdG10LmNsb3NlKCk7CiAgICAgICB9CisgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oZSk7CiAgICAgfQotICAgIGRiLmFwcHJvdmFsQ2F0ZWdvcmllcygpLmRlbGV0ZShkZWxldGUpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGFzc2lnbkdyb3VwVVVJRHMoUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewpAQCAtMjAwLDggKzIwNyw3IEBACiAgIHByaXZhdGUgdm9pZCBsb2FkUHJvamVjdChSZXN1bHRTZXQgcnMsIFByb2plY3QgcHJvamVjdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiwKICAgICAgIE9ybUV4Y2VwdGlvbiB7CiAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihycy5nZXRTdHJpbmcoImRlc2NyaXB0aW9uIikpOwotICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCJZIi5lcXVhbHMocnMKLSAgICAgICAgLmdldFN0cmluZygidXNlX2NvbnRyaWJ1dG9yX2FncmVlbWVudHMiKSkpOworICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGFzSW5oZXJpdGFibGVCb29sZWFuKHJzLCAidXNlX2NvbnRyaWJ1dG9yX2FncmVlbWVudHMiKSk7CiAKICAgICBzd2l0Y2ggKHJzLmdldFN0cmluZygic3VibWl0X3R5cGUiKS5jaGFyQXQoMCkpIHsKICAgICAgIGNhc2UgJ0YnOgpAQCAtMjIxLDEyICsyMjcsMTkgQEAKICAgICAgICAgICAgICsgcnMuZ2V0U3RyaW5nKCJzdWJtaXRfdHlwZSIpICsgIiBvbiBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7CiAgICAgfQogCi0gICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeSgiWSIuZXF1YWxzKHJzLmdldFN0cmluZygidXNlX3NpZ25lZF9vZmZfYnkiKSkpOwotICAgIHByb2plY3Quc2V0UmVxdWlyZUNoYW5nZUlEKCJZIi5lcXVhbHMocnMuZ2V0U3RyaW5nKCJyZXF1aXJlX2NoYW5nZV9pZCIpKSk7Ci0gICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoIlkiLmVxdWFscyhycy5nZXRTdHJpbmcoInVzZV9jb250ZW50X21lcmdlIikpKTsKKyAgICBwcm9qZWN0LnNldFVzZVNpZ25lZE9mZkJ5KGFzSW5oZXJpdGFibGVCb29sZWFuKHJzLCAidXNlX3NpZ25lZF9vZmZfYnkiKSk7CisgICAgcHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQoYXNJbmhlcml0YWJsZUJvb2xlYW4ocnMsICJyZXF1aXJlX2NoYW5nZV9pZCIpKTsKKyAgICBwcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZShhc0luaGVyaXRhYmxlQm9vbGVhbihycywgInVzZV9jb250ZW50X21lcmdlIikpOwogICAgIHByb2plY3Quc2V0UGFyZW50TmFtZShycy5nZXRTdHJpbmcoInBhcmVudF9uYW1lIikpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgSW5oZXJpdGFibGVCb29sZWFuIGFzSW5oZXJpdGFibGVCb29sZWFuKFJlc3VsdFNldCBycywgU3RyaW5nIGNvbCkKKyAgICAgIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIHJldHVybiAiWSIuZXF1YWxzKHJzLmdldFN0cmluZyhjb2wpKQorICAgICAgICA/IFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLlRSVUUKKyAgICAgICAgOiBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICB9CisKICAgcHJpdmF0ZSB2b2lkIHJlYWRPbGRSZWZSaWdodHMoUmV2aWV3RGIgZGIpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgIHJpZ2h0c0J5UHJvamVjdCA9IG5ldyBIYXNoTWFwPFByb2plY3QuTmFtZUtleSwgTGlzdDxPbGRSZWZSaWdodD4+KCk7CiAKQEAgLTM1OCw4ICszNzEsNyBAQAogCiAgICAgICAgIGlmICgzIDw9IG9sZC5tYXhfdmFsdWUpIHsKICAgICAgICAgICBhZGQoc2VjdGlvbiwgRk9SR0VfU0VSVkVSLCBvbGQuZXhjbHVzaXZlLCBydWxlKGdyb3VwKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoMyA8PSBpbmhlcml0ZWRNYXgoY29uZmlnLCBvbGQpKSB7Ci0gICAgICAgICAgYWRkKHNlY3Rpb24sIEZPUkdFX1NFUlZFUiwgb2xkLmV4Y2x1c2l2ZSwgZGVueShncm91cCkpOworICAgICAgICB9IGVsc2UgaWYgKDMgPD0gaW5oZXJpdGVkTWF4KGNvbmZpZywgb2xkKSkgeyBhZGQoc2VjdGlvbiwgRk9SR0VfU0VSVkVSLCBvbGQuZXhjbHVzaXZlLCBkZW55KGdyb3VwKSk7CiAgICAgICAgIH0KIAogICAgICAgfSBlbHNlIHsKQEAgLTM2OCw3ICszODAsOSBAQAogICAgICAgICBpZiAob2xkLm1pbl92YWx1ZSA9PSAwICYmIG9sZC5tYXhfdmFsdWUgPT0gMCkgewogICAgICAgICAgIHJ1bGUuc2V0RGVueSgpOwogICAgICAgICB9Ci0gICAgICAgIGFkZChzZWN0aW9uLCBMQUJFTCArIHZhck5hbWVPZihvbGQuY2F0ZWdvcnkpLCBvbGQuZXhjbHVzaXZlLCBydWxlKTsKKyAgICAgICAgTGFiZWxUeXBlIHR5cGUgPSBsYWJlbFR5cGVzLmJ5TGFiZWwobmV3IExhYmVsSWQob2xkLmNhdGVnb3J5KSk7CisgICAgICAgIFN0cmluZyBuYW1lID0gdHlwZSAhPSBudWxsID8gdHlwZS5nZXROYW1lKCkgOiBvbGQuY2F0ZWdvcnk7CisgICAgICAgIGFkZChzZWN0aW9uLCBMQUJFTCArIG5hbWUsIG9sZC5leGNsdXNpdmUsIHJ1bGUpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDM2LDE0ICs0NTAsNiBAQAogICAgIHJldHVybiBtYXg7CiAgIH0KIAotICBwcml2YXRlIFN0cmluZyB2YXJOYW1lT2YoU3RyaW5nIGlkKSB7Ci0gICAgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3J5TWFwLmdldChuZXcgQXBwcm92YWxDYXRlZ29yeS5JZChpZCkpOwotICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICBjYXRlZ29yeSA9IG5ldyBBcHByb3ZhbENhdGVnb3J5KG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKGlkKSwgaWQpOwotICAgIH0KLSAgICByZXR1cm4gY2F0ZWdvcnkuZ2V0TGFiZWxOYW1lKCk7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZChBY2Nlc3NTZWN0aW9uIHNlY3Rpb24sIFN0cmluZyBuYW1lLAogICAgICAgYm9vbGVhbiBleGNsdXNpdmUsIFBlcm1pc3Npb25SdWxlIHJ1bGUpIHsKICAgICBQZXJtaXNzaW9uIHAgPSBzZWN0aW9uLmdldFBlcm1pc3Npb24obmFtZSwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV81Ny5qYXZhCmluZGV4IDNhMjg4ZTIuLmJmNDg4ZTMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV81Ny5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV81Ny5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1ldGFEYXRhVXBkYXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkpkYmNTY2hlbWE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC00MSw2ICs0Miw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hXzU3IGV4dGVuZHMgU2NoZW1hVmVyc2lvbiB7CkBAIC05NSw2ICs5OCwxMSBAQAogCiAgICAgICAgIC8vIE1vdmUgdGhlIHJlcG9zaXRvcnkuKi5jcmVhdGVHcm91cCB0byBDcmVhdGUgUHJvamVjdC4KICAgICAgICAgU3RyaW5nW10gY3JlYXRlR3JvdXBMaXN0ID0gY2ZnLmdldFN0cmluZ0xpc3QoInJlcG9zaXRvcnkiLCAiKiIsICJjcmVhdGVHcm91cCIpOworCisgICAgICAgIC8vIFByZXBhcmUgdGhlIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMgcXVlcnkKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RtdCA9ICgoSmRiY1NjaGVtYSkgZGIpLmdldENvbm5lY3Rpb24oKS4KKyAgICAgICAgICAgIHByZXBhcmVTdGF0ZW1lbnQoIlNFTEVDVCAqIEZST00gYWNjb3VudF9ncm91cF9pbmNsdWRlcyBXSEVSRSBncm91cF9pZCA9ID8iKTsKKwogICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogY3JlYXRlR3JvdXBMaXN0KSB7CiAgICAgICAgICAgQWNjb3VudEdyb3VwLk5hbWVLZXkga2V5ID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KG5hbWUpOwogICAgICAgICAgIEFjY291bnRHcm91cE5hbWUgZ3JvdXBOYW1lID0gZGIuYWNjb3VudEdyb3VwTmFtZXMoKS5nZXQoa2V5KTsKQEAgLTExNyw5ICsxMjUsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFjY291bnRHcm91cCBiYXRjaCA9IGRiLmFjY291bnRHcm91cHMoKS5nZXQoc2MuYmF0Y2hVc2Vyc0dyb3VwSWQpOworICAgICAgICBzdG10LnNldEludCgxLCBzYy5iYXRjaFVzZXJzR3JvdXBJZC5nZXQoKSk7CiAgICAgICAgIGlmIChiYXRjaCAhPSBudWxsCiAgICAgICAgICAgICAmJiBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuYnlHcm91cChzYy5iYXRjaFVzZXJzR3JvdXBJZCkudG9MaXN0KCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAmJiAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKS5ieUdyb3VwKHNjLmJhdGNoVXNlcnNHcm91cElkKS50b0xpc3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICYmICBzdG10LmV4ZWN1dGVRdWVyeSgpLmZpcnN0KCkgIT0gZmFsc2UpIHsKICAgICAgICAgICAvLyBJZiB0aGUgYmF0Y2ggdXNlciBncm91cCBpcyBub3QgdXNlZCwgZGVsZXRlIGl0LgogICAgICAgICAgIC8vCiAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwcygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oYmF0Y2gpKTsKQEAgLTEzNiw2ICsxNDUsOCBAQAogCiAgICAgICAgIG1kLnNldE1lc3NhZ2UoIlVwZ3JhZGUgdG8gR2Vycml0IENvZGUgUmV2aWV3IHNjaGVtYSA1N1xuIik7CiAgICAgICAgIGNvbmZpZy5jb21taXQobWQpOworICAgICAgfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGVycikgeworICAgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKCAiQ2Fubm90IHJlYWQgYWNjb3VudF9ncm91cF9pbmNsdWRlcyIsIGVycik7CiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBnaXQuY2xvc2UoKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzc0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMTJkMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5QcmVwYXJlZFN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKiBIYW5kbGVzIGNvcHlpbmcgYWxsIGVudHJpZXMgZnJvbSBBY2NvdW50R3JvdXBJbmNsdWRlcyhBdWRpdCkgdG8gdGhlIG5ldyB0YWJsZXMgKi8KK3B1YmxpYyBjbGFzcyBTY2hlbWFfNzQgZXh0ZW5kcyBTY2hlbWFWZXJzaW9uIHsKKyAgQEluamVjdAorICBTY2hlbWFfNzQoUHJvdmlkZXI8U2NoZW1hXzczPiBwcmlvcikgeworICAgIHN1cGVyKHByaW9yKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGF0YShmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgVXBkYXRlVUkgdWkpCisgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIC8vIEdyYWIgYWxsIHRoZSBncm91cHMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgY2FjaGUgYXZhaWxhYmxlCisgICAgSGFzaE1hcDxBY2NvdW50R3JvdXAuSWQsIEFjY291bnRHcm91cC5VVUlEPiBhbGxHcm91cHMgPQorICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50R3JvdXAuSWQsIEFjY291bnRHcm91cC5VVUlEPigpOworICAgIGZvciggQWNjb3VudEdyb3VwIGFnIDogZGIuYWNjb3VudEdyb3VwcygpLmFsbCgpICkgeworICAgICAgYWxsR3JvdXBzLnB1dChhZy5nZXRJZCgpLCBhZy5nZXRHcm91cFVVSUQoKSk7CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcworICAgIENvbm5lY3Rpb24gY29ubiA9ICgoSmRiY1NjaGVtYSkgZGIpLmdldENvbm5lY3Rpb24oKTsKKyAgICBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gbmV3SW5jbHVkZXMgPQorICAgICAgICBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+KCk7CisgICAgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4gbmV3SW5jbHVkZUF1ZGl0cyA9CisgICAgICAgIG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0PigpOworCisgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzIGluIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMKKyAgICBTdGF0ZW1lbnQgb2xkR3JvdXBJbmNsdWRlc1N0bXQgPSBjb25uLmNyZWF0ZVN0YXRlbWVudCgpOworICAgIFJlc3VsdFNldCBvbGRHcm91cEluY2x1ZGVzID0gb2xkR3JvdXBJbmNsdWRlc1N0bXQuCisgICAgICAgIGV4ZWN1dGVRdWVyeSgiU0VMRUNUICogRlJPTSBhY2NvdW50X2dyb3VwX2luY2x1ZGVzIik7CisgICAgd2hpbGUgKG9sZEdyb3VwSW5jbHVkZXMubmV4dCgpKSB7CisgICAgICBBY2NvdW50R3JvdXAuSWQgb2xkR3JvdXBJZCA9CisgICAgICAgICAgbmV3IEFjY291bnRHcm91cC5JZChvbGRHcm91cEluY2x1ZGVzLmdldEludCgiZ3JvdXBfaWQiKSk7CisgICAgICBBY2NvdW50R3JvdXAuSWQgb2xkSW5jbHVkZUlkID0KKyAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwLklkKG9sZEdyb3VwSW5jbHVkZXMuZ2V0SW50KCJpbmNsdWRlX2lkIikpOworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgdXVpZEZyb21JbmNsdWRlSWQgPSBhbGxHcm91cHMuZ2V0KG9sZEluY2x1ZGVJZCk7CisKKyAgICAgIC8vIElmIHdlJ3ZlIGdvdCBhbiBpbmNsdWRlLCBidXQgdGhlIGdyb3VwIG5vIGxvbmdlciBleGlzdHMsIGRvbid0IGJvdGhlciBjb252ZXJ0aW5nCisgICAgICBpZiAodXVpZEZyb21JbmNsdWRlSWQgPT0gbnVsbCkgeworICAgICAgICB1aS5tZXNzYWdlKCJTa2lwcGluZyBncm91cF9pZCA9IFwiIiArIG9sZEluY2x1ZGVJZC5nZXQoKSArCisgICAgICAgICAgICAiXCIsIG5vdCBhIGN1cnJlbnQgZ3JvdXAiKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGluY2x1ZGUgZW50cnkKKyAgICAgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZGVzdEluY2x1ZGVFbnRyeSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkKAorICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleShvbGRHcm91cElkLCB1dWlkRnJvbUluY2x1ZGVJZCkpOworCisgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBhdWRpdHMgKGZvciB0aGlzIGdyb3VwKQorICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgb2xkQXVkaXRzUXVlcnkgPSBjb25uLnByZXBhcmVTdGF0ZW1lbnQoCisgICAgICAgICAgIlNFTEVDVCAqIEZST00gYWNjb3VudF9ncm91cF9pbmNsdWRlc19hdWRpdCBXSEVSRSBncm91cF9pZD0/IEFORCBpbmNsdWRlX2lkPT8iKTsKKyAgICAgIG9sZEF1ZGl0c1F1ZXJ5LnNldEludCgxLCBvbGRHcm91cElkLmdldCgpKTsKKyAgICAgIG9sZEF1ZGl0c1F1ZXJ5LnNldEludCgyLCBvbGRJbmNsdWRlSWQuZ2V0KCkpOworICAgICAgUmVzdWx0U2V0IG9sZEdyb3VwSW5jbHVkZUF1ZGl0cyA9IG9sZEF1ZGl0c1F1ZXJ5LmV4ZWN1dGVRdWVyeSgpOworICAgICAgd2hpbGUgKG9sZEdyb3VwSW5jbHVkZUF1ZGl0cy5uZXh0KCkpIHsKKyAgICAgICAgQWNjb3VudC5JZCBhZGRlZEJ5ID0gbmV3IEFjY291bnQuSWQob2xkR3JvdXBJbmNsdWRlQXVkaXRzLmdldEludCgiYWRkZWRfYnkiKSk7CisgICAgICAgIGludCByZW1vdmVkQnkgPSBvbGRHcm91cEluY2x1ZGVBdWRpdHMuZ2V0SW50KCJyZW1vdmVkX2J5Iik7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBuZXcgYXVkaXQgZW50cnkKKyAgICAgICAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0IGRlc3RBdWRpdEVudHJ5ID0KKyAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQoZGVzdEluY2x1ZGVFbnRyeSwgYWRkZWRCeSwKKyAgICAgICAgICAgICAgICBvbGRHcm91cEluY2x1ZGVBdWRpdHMuZ2V0VGltZXN0YW1wKCJhZGRlZF9vbiIpKTsKKworICAgICAgICAvLyBJZiB0aGlzIHdhcyBhICJyZW1vdmVkIG9uIiBlbnRyeSwgbm90ZSB0aGF0CisgICAgICAgIGlmIChyZW1vdmVkQnkgPiAwKSB7CisgICAgICAgICAgZGVzdEF1ZGl0RW50cnkucmVtb3ZlZChuZXcgQWNjb3VudC5JZChyZW1vdmVkQnkpLAorICAgICAgICAgICAgICBvbGRHcm91cEluY2x1ZGVBdWRpdHMuZ2V0VGltZXN0YW1wKCJyZW1vdmVkX29uIikpOworICAgICAgICB9CisgICAgICAgIG5ld0luY2x1ZGVBdWRpdHMuYWRkKGRlc3RBdWRpdEVudHJ5KTsKKyAgICAgIH0KKyAgICAgIG5ld0luY2x1ZGVzLmFkZChkZXN0SW5jbHVkZUVudHJ5KTsKKyAgICAgIG9sZEF1ZGl0c1F1ZXJ5LmNsb3NlKCk7CisgICAgICBvbGRHcm91cEluY2x1ZGVBdWRpdHMuY2xvc2UoKTsKKyAgICB9CisgICAgb2xkR3JvdXBJbmNsdWRlcy5jbG9zZSgpOworICAgIG9sZEdyb3VwSW5jbHVkZXNTdG10LmNsb3NlKCk7CisKKyAgICAvLyBOb3cgaW5zZXJ0IGFsbCBvZiB0aGUgbmV3IGVudHJpZXMgdG8gdGhlIGRhdGFiYXNlCisgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5pbnNlcnQobmV3SW5jbHVkZXMpOworICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkQXVkaXQoKS5pbnNlcnQobmV3SW5jbHVkZUF1ZGl0cyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzc1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0N2YyNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgU2NoZW1hXzc1IGV4dGVuZHMgU2NoZW1hVmVyc2lvbiB7CisgIEBJbmplY3QKKyAgU2NoZW1hXzc1KFByb3ZpZGVyPFNjaGVtYV83ND4gcHJpb3IpIHsKKyAgICBzdXBlcihwcmlvcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ni5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzc2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwYjU1NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ni5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgU2NoZW1hXzc2IGV4dGVuZHMgU2NoZW1hVmVyc2lvbiB7CisgIEBJbmplY3QKKyAgU2NoZW1hXzc2KFByb3ZpZGVyPFNjaGVtYV83NT4gcHJpb3IpIHsKKyAgICBzdXBlcihwcmlvcik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ny5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzc3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2ZTVhNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ny5qYXZhCkBAIC0wLDAgKzEsMjY2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdEgyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdE15U1FMOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdFBvc3RncmVTUUw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLnNxbC5TcWxEaWFsZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFNjaGVtYV83NyBleHRlbmRzIFNjaGVtYVZlcnNpb24geworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIG1ncjsKKyAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgc2VydmVyVXNlcjsKKworICBASW5qZWN0CisgIFNjaGVtYV83NyhQcm92aWRlcjxTY2hlbWFfNzY+IHByaW9yLCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHMsCisgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBtZ3IsIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBzZXJ2ZXJVc2VyKSB7CisgICAgc3VwZXIocHJpb3IpOworICAgIHRoaXMuYWxsUHJvamVjdHMgPSBhbGxQcm9qZWN0czsKKyAgICB0aGlzLm1nciA9IG1ncjsKKyAgICB0aGlzLnNlcnZlclVzZXIgPSBzZXJ2ZXJVc2VyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIG1pZ3JhdGVEYXRhKFJldmlld0RiIGRiLCBVcGRhdGVVSSB1aSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIExlZ2FjeUxhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IGdldExlZ2FjeVR5cGVzKGRiKTsKKyAgICAgIFNxbERpYWxlY3QgZGlhbGVjdCA9ICgoSmRiY1NjaGVtYSkgZGIpLmdldERpYWxlY3QoKTsKKyAgICAgIGlmIChkaWFsZWN0IGluc3RhbmNlb2YgRGlhbGVjdEgyKSB7CisgICAgICAgIGFsdGVyVGFibGUoZGIsICJBTFRFUiBUQUJMRSAlcyBBTFRFUiBDT0xVTU4gJXMgdmFyY2hhcigyNTUpIik7CisgICAgICB9IGVsc2UgaWYgKGRpYWxlY3QgaW5zdGFuY2VvZiBEaWFsZWN0UG9zdGdyZVNRTCkgeworICAgICAgICBhbHRlclRhYmxlKGRiLCAiQUxURVIgVEFCTEUgJXMgQUxURVIgJXMgVFlQRSB2YXJjaGFyKDI1NSkiKTsKKyAgICAgIH0gZWxzZSBpZiAoZGlhbGVjdCBpbnN0YW5jZW9mIERpYWxlY3RNeVNRTCkgeworICAgICAgICBhbHRlclRhYmxlKGRiLCAiQUxURVIgVEFCTEUgJXMgTU9ESUZZICVzIHZhcmNoYXIoMjU1KSBCSU5BUlkiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFsdGVyVGFibGUoZGIsICJBTFRFUiBUQUJMRSAlcyBNT0RJRlkgJXMgdmFyY2hhcigyNTUpIik7CisgICAgICB9CisgICAgICBtaWdyYXRlUGF0Y2hTZXRBcHByb3ZhbHMoZGIsIGxhYmVsVHlwZXMpOworICAgICAgbWlncmF0ZUxhYmVsc1RvQWxsUHJvamVjdHMoZGIsIGxhYmVsVHlwZXMpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oZSk7CisgICAgfSBjYXRjaCAoQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOworICAgIH0KKyAgICB1aS5tZXNzYWdlKAorICAgICAgICAiTWlncmF0ZWQgbGFiZWwgdHlwZXMgZnJvbSBkYXRhYmFzZSB0byBBbGwtUHJvamVjdHMgcHJvamVjdC5jb25maWciKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhbHRlclRhYmxlKFJldmlld0RiIGRiLCBTdHJpbmcgc3FsRm9ybWF0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICBTdGF0ZW1lbnQgc3RtdCA9ICgoSmRiY1NjaGVtYSkgZGIpLmdldENvbm5lY3Rpb24oKS5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICB0cnkgeworICAgICAgc3RtdC5leGVjdXRlVXBkYXRlKAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoc3FsRm9ybWF0LCAicGF0Y2hfc2V0X2FwcHJvdmFscyIsICJjYXRlZ29yeV9pZCIpKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgc3RtdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBtaWdyYXRlTGFiZWxzVG9BbGxQcm9qZWN0cyhSZXZpZXdEYiBkYiwKKyAgICAgIExlZ2FjeUxhYmVsVHlwZXMgbGFiZWxUeXBlcykgdGhyb3dzIFNRTEV4Y2VwdGlvbiwKKyAgICAgIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgZ2l0ID0gbWdyLm9wZW5SZXBvc2l0b3J5KGFsbFByb2plY3RzKTsKKworICAgIHRyeSB7CisgICAgICBNZXRhRGF0YVVwZGF0ZSBtZCA9CisgICAgICAgICAgbmV3IE1ldGFEYXRhVXBkYXRlKEdpdFJlZmVyZW5jZVVwZGF0ZWQuRElTQUJMRUQsIGFsbFByb2plY3RzLCBnaXQpOworICAgICAgbWQuZ2V0Q29tbWl0QnVpbGRlcigpLnNldEF1dGhvcihzZXJ2ZXJVc2VyKTsKKyAgICAgIG1kLmdldENvbW1pdEJ1aWxkZXIoKS5zZXRDb21taXR0ZXIoc2VydmVyVXNlcik7CisKKyAgICAgIFByb2plY3RDb25maWcgY29uZmlnID0gUHJvamVjdENvbmZpZy5yZWFkKG1kKTsKKyAgICAgIE1hcDxTdHJpbmcsIExhYmVsVHlwZT4gY29uZmlnVHlwZXMgPSBjb25maWcuZ2V0TGFiZWxTZWN0aW9ucygpOworICAgICAgTGlzdDxMYWJlbFR5cGU+IG5ld1R5cGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICBmb3IgKExlZ2FjeUxhYmVsVHlwZSB0eXBlIDogbGFiZWxUeXBlcy5nZXRMZWdhY3lMYWJlbFR5cGVzKCkpIHsKKyAgICAgICAgaWYgKCFjb25maWdUeXBlcy5jb250YWluc0tleSh0eXBlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICBuZXdUeXBlcy5hZGQodHlwZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5ld1R5cGVzLmFkZEFsbChjb25maWdUeXBlcy52YWx1ZXMoKSk7CisgICAgICBjb25maWdUeXBlcy5jbGVhcigpOworICAgICAgZm9yIChMYWJlbFR5cGUgdHlwZSA6IG5ld1R5cGVzKSB7CisgICAgICAgIGNvbmZpZ1R5cGVzLnB1dCh0eXBlLmdldE5hbWUoKSwgdHlwZSk7CisgICAgICB9CisgICAgICBtZC5zZXRNZXNzYWdlKCJVcGdyYWRlIHRvIEdlcnJpdCBDb2RlIFJldmlldyBzY2hlbWEgNzdcbiIpOworICAgICAgY29uZmlnLmNvbW1pdChtZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBtaWdyYXRlUGF0Y2hTZXRBcHByb3ZhbHMoUmV2aWV3RGIgZGIsCisgICAgICBMZWdhY3lMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHRocm93cyBTUUxFeGNlcHRpb24geworICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCkucHJlcGFyZVN0YXRlbWVudCgKKyAgICAgICAgIlVQREFURSBwYXRjaF9zZXRfYXBwcm92YWxzIFNFVCBjYXRlZ29yeV9pZCA9ID8gV0hFUkUgY2F0ZWdvcnlfaWQgPSA/Iik7CisgICAgdHJ5IHsKKyAgICAgIGZvciAoTGVnYWN5TGFiZWxUeXBlIHR5cGUgOiBsYWJlbFR5cGVzLmdldExlZ2FjeUxhYmVsVHlwZXMoKSkgeworICAgICAgICBzdG10LnNldFN0cmluZygxLCB0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIHN0bXQuc2V0U3RyaW5nKDIsIHR5cGUuZ2V0SWQoKSk7CisgICAgICAgIHN0bXQuYWRkQmF0Y2goKTsKKyAgICAgIH0KKyAgICAgIHN0bXQuZXhlY3V0ZUJhdGNoKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTGVnYWN5TGFiZWxUeXBlIGV4dGVuZHMgTGFiZWxUeXBlIHsKKyAgICBwcml2YXRlIFN0cmluZyBpZDsKKworICAgIHByaXZhdGUgTGVnYWN5TGFiZWxUeXBlKFN0cmluZyBuYW1lLCBMaXN0PExhYmVsVmFsdWU+IHZhbHVlcykgeworICAgICAgc3VwZXIobmFtZSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgY2hlY2tBcmd1bWVudChpZC5sZW5ndGgoKSA8PSA0LCAiSW52YWxpZCBsZWdhY3kgbGFiZWwgSUQ6IFwiJXNcIiIsIGlkKTsKKyAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTGVnYWN5TGFiZWxUeXBlcyBleHRlbmRzIExhYmVsVHlwZXMgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxMZWdhY3lMYWJlbFR5cGU+IGxlZ2FjeVR5cGVzOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMZWdhY3lMYWJlbFR5cGU+IGJ5SWQ7CisKKyAgICBwcml2YXRlIExlZ2FjeUxhYmVsVHlwZXMoTGlzdDxMZWdhY3lMYWJlbFR5cGU+IHR5cGVzKSB7CisgICAgICBzdXBlcih0eXBlcyk7CisgICAgICBsZWdhY3lUeXBlcyA9IHR5cGVzOworICAgICAgYnlJZCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgZm9yIChMZWdhY3lMYWJlbFR5cGUgdHlwZSA6IHR5cGVzKSB7CisgICAgICAgIGJ5SWQucHV0KHR5cGUuZ2V0SWQoKSwgdHlwZSk7CisgICAgICB9CisgICAgfQorCisgICAgTGlzdDxMZWdhY3lMYWJlbFR5cGU+IGdldExlZ2FjeUxhYmVsVHlwZXMoKSB7CisgICAgICByZXR1cm4gbGVnYWN5VHlwZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExlZ2FjeUxhYmVsVHlwZSBieUxhYmVsKExhYmVsSWQgbGFiZWxJZCkgeworICAgICAgTGVnYWN5TGFiZWxUeXBlIHQgPSBieUlkLmdldChsYWJlbElkLmdldCgpKTsKKyAgICAgIHJldHVybiB0ICE9IG51bGwgPyB0IDogKExlZ2FjeUxhYmVsVHlwZSkgc3VwZXIuYnlMYWJlbChsYWJlbElkKTsKKyAgICB9CisKKyAgICBMZWdhY3lMYWJlbFR5cGUgYnlJZChMYWJlbElkIGlkKSB7CisgICAgICByZXR1cm4gYnlJZC5nZXQoaWQuZ2V0KCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBMZWdhY3lMYWJlbFR5cGVzIGdldExlZ2FjeVR5cGVzKFJldmlld0RiIGRiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICBMaXN0PExlZ2FjeUxhYmVsVHlwZT4gdHlwZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoMik7CisgICAgU3RhdGVtZW50IGNhdFN0bXQgPSBudWxsOworICAgIFByZXBhcmVkU3RhdGVtZW50IHZhbFN0bXQgPSBudWxsOworICAgIFJlc3VsdFNldCBjYXRScyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGNhdFN0bXQgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7CisgICAgICBjYXRScyA9IGNhdFN0bXQuZXhlY3V0ZVF1ZXJ5KAorICAgICAgICAgICJTRUxFQ1QgY2F0ZWdvcnlfaWQsIG5hbWUsIGFiYnJldmlhdGVkX25hbWUsIGZ1bmN0aW9uX25hbWUsICIKKyAgICAgICAgICArICIgY29weV9taW5fc2NvcmUiCisgICAgICAgICAgKyAiIEZST00gYXBwcm92YWxfY2F0ZWdvcmllcyIKKyAgICAgICAgICArICIgT1JERVIgQlkgcG9zaXRpb24sIG5hbWUiKTsKKyAgICAgIHZhbFN0bXQgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCkucHJlcGFyZVN0YXRlbWVudCgKKyAgICAgICAgICAiU0VMRUNUIHZhbHVlLCBuYW1lIgorICAgICAgICAgICsgIiBGUk9NIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcyIKKyAgICAgICAgICArICIgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/Iik7CisgICAgICB3aGlsZSAoY2F0UnMubmV4dCgpKSB7CisgICAgICAgIFN0cmluZyBpZCA9IGNhdFJzLmdldFN0cmluZygiY2F0ZWdvcnlfaWQiKTsKKyAgICAgICAgdmFsU3RtdC5zZXRTdHJpbmcoMSwgaWQpOworICAgICAgICBMaXN0PExhYmVsVmFsdWU+IHZhbHVlcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSg1KTsKKyAgICAgICAgUmVzdWx0U2V0IHZhbFJzID0gdmFsU3RtdC5leGVjdXRlUXVlcnkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICB3aGlsZSAodmFsUnMubmV4dCgpKSB7CisgICAgICAgICAgICB2YWx1ZXMuYWRkKG5ldyBMYWJlbFZhbHVlKAorICAgICAgICAgICAgICAgIHZhbFJzLmdldFNob3J0KCJ2YWx1ZSIpLCB2YWxScy5nZXRTdHJpbmcoIm5hbWUiKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICB2YWxScy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIExlZ2FjeUxhYmVsVHlwZSB0eXBlID0KKyAgICAgICAgICAgIG5ldyBMZWdhY3lMYWJlbFR5cGUoZ2V0TGFiZWxOYW1lKGNhdFJzLmdldFN0cmluZygibmFtZSIpKSwgdmFsdWVzKTsKKyAgICAgICAgdHlwZS5zZXRJZChpZCk7CisgICAgICAgIHR5cGUuc2V0QWJicmV2aWF0ZWROYW1lKGNhdFJzLmdldFN0cmluZygiYWJicmV2aWF0ZWRfbmFtZSIpKTsKKyAgICAgICAgdHlwZS5zZXRGdW5jdGlvbk5hbWUoY2F0UnMuZ2V0U3RyaW5nKCJmdW5jdGlvbl9uYW1lIikpOworICAgICAgICB0eXBlLnNldENvcHlNaW5TY29yZSgiWSIuZXF1YWxzKGNhdFJzLmdldFN0cmluZygiY29weV9taW5fc2NvcmUiKSkpOworICAgICAgICB0eXBlcy5hZGQodHlwZSk7CisgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmICh2YWxTdG10ICE9IG51bGwpIHsKKyAgICAgICAgdmFsU3RtdC5jbG9zZSgpOworICAgICAgfQorICAgICAgaWYgKGNhdFJzICE9IG51bGwpIHsKKyAgICAgICAgY2F0UnMuY2xvc2UoKTsKKyAgICAgIH0KKyAgICAgIGlmIChjYXRTdG10ICE9IG51bGwpIHsKKyAgICAgICAgY2F0U3RtdC5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IExlZ2FjeUxhYmVsVHlwZXModHlwZXMpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgeworICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIGNoYXIgYyA9IG5hbWUuY2hhckF0KGkpOworICAgICAgaWYgKCgnMCcgPD0gYyAmJiBjIDw9ICc5JykgLy8KKyAgICAgICAgICB8fCAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIC8vCisgICAgICAgICAgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSAvLworICAgICAgICAgIHx8IChjID09ICctJykpIHsKKyAgICAgICAgci5hcHBlbmQoYyk7CisgICAgICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7CisgICAgICAgIHIuYXBwZW5kKCctJyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjcmlwdFJ1bm5lci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NyaXB0UnVubmVyLmphdmEKaW5kZXggOGNmMmYyNi4uYjVhZWFkOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NyaXB0UnVubmVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NyaXB0UnVubmVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTM0LDEwICszMywxNSBAQAogICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwogICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBjb21tYW5kczsKIAotICBTY3JpcHRSdW5uZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgc3RhdGljIGZpbmFsIFNjcmlwdFJ1bm5lciBOT09QID0gbmV3IFNjcmlwdFJ1bm5lcihudWxsLCBudWxsKSB7CisgICAgdm9pZCBydW4oZmluYWwgUmV2aWV3RGIgZGIpIHsKKyAgICB9OworICB9OworCisgIFNjcmlwdFJ1bm5lcihmaW5hbCBTdHJpbmcgc2NyaXB0TmFtZSwgZmluYWwgSW5wdXRTdHJlYW0gc2NyaXB0KSB7CisgICAgdGhpcy5uYW1lID0gc2NyaXB0TmFtZTsKICAgICB0cnkgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMuY29tbWFuZHMgPSBwYXJzZShuYW1lKTsKKyAgICAgIHRoaXMuY29tbWFuZHMgPSBzY3JpcHQgIT0gbnVsbCA/IHBhcnNlKHNjcmlwdCkgOiBudWxsOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwYXJzZSAiICsgbmFtZSwgZSk7CiAgICAgfQpAQCAtNjMsMTIgKzY3LDcgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXJzZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBJbnB1dFN0cmVhbSBpbiA9IFJldmlld0RiLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0obmFtZSk7Ci0gICAgaWYgKGluID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIlNRTCBzY3JpcHQgIiArIG5hbWUgKyAiIG5vdCBmb3VuZCIpOwotICAgIH0KLQorICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXJzZShmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKICAgICB0cnkgewogICAgICAgU3RyaW5nIGRlbGltaXRlciA9ICI7IjsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoSW5mby5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hJbmZvLmphdmEKaW5kZXggNTE5YjkyMi4uNmNlZWMyZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hJbmZvLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hJbmZvLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWNsYXNzIE5vU3NoSW5mbyBpbXBsZW1lbnRzIFNzaEluZm8geworcHVibGljIGNsYXNzIE5vU3NoSW5mbyBpbXBsZW1lbnRzIFNzaEluZm8gewogICBAT3ZlcnJpZGUKICAgcHVibGljIExpc3Q8SG9zdEtleT4gZ2V0SG9zdEtleXMoKSB7CiAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hLZXlDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hLZXlDYWNoZS5qYXZhCmluZGV4IDZhMDdjYTcuLjA5NTc1OTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoS2V5Q2FjaGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaEtleUNhY2hlLmphdmEKQEAgLTE2LDggKzE2LDIxIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkludmFsaWRTc2hLZXlFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRTc2hLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOwogCi1jbGFzcyBOb1NzaEtleUNhY2hlIGltcGxlbWVudHMgU3NoS2V5Q2FjaGUgeworCitwdWJsaWMgY2xhc3MgTm9Tc2hLZXlDYWNoZSBpbXBsZW1lbnRzIFNzaEtleUNhY2hlIHsKKworICBwdWJsaWMgc3RhdGljIE1vZHVsZSBtb2R1bGUoKSB7CisgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKFNzaEtleUNhY2hlLmNsYXNzKS50byhOb1NzaEtleUNhY2hlLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGV2aWN0KFN0cmluZyB1c2VybmFtZSkgewogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaE1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hNb2R1bGUuamF2YQppbmRleCAyMWIxYTU0Li44NzgxZDQ2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoTW9kdWxlLmphdmEKQEAgLTIzLDYgKzIzLDUgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICBiaW5kKFNzaEluZm8uY2xhc3MpLnRvKE5vU3NoSW5mby5jbGFzcyk7Ci0gICAgYmluZChTc2hLZXlDYWNoZS5jbGFzcykudG8oTm9Tc2hLZXlDYWNoZS5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL1NzaEFkZHJlc3Nlc01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvU3NoQWRkcmVzc2VzTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxMjgzYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL1NzaEFkZHJlc3Nlc01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuU29ja2V0VXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFNzaEFkZHJlc3Nlc01vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CisgICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTc2hBZGRyZXNzZXNNb2R1bGUuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9SVCA9IDI5NDE4OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJQU5BX1NTSF9QT1JUID0gMjI7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgfQorCisgIEBQcm92aWRlcworICBAU2luZ2xldG9uCisgIEBTc2hMaXN0ZW5BZGRyZXNzZXMKKyAgTGlzdDxTb2NrZXRBZGRyZXNzPiBnZXRMaXN0ZW5BZGRyZXNzZXMoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnKSB7CisgICAgTGlzdDxTb2NrZXRBZGRyZXNzPiBsaXN0ZW4gPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgIFN0cmluZ1tdIHdhbnQgPSBjZmcuZ2V0U3RyaW5nTGlzdCgic3NoZCIsIG51bGwsICJsaXN0ZW5hZGRyZXNzIik7CisgICAgaWYgKHdhbnQgPT0gbnVsbCB8fCB3YW50Lmxlbmd0aCA9PSAwKSB7CisgICAgICBsaXN0ZW4uYWRkKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhERUZBVUxUX1BPUlQpKTsKKyAgICAgIHJldHVybiBsaXN0ZW47CisgICAgfQorCisgICAgaWYgKHdhbnQubGVuZ3RoID09IDEgJiYgaXNPZmYod2FudFswXSkpIHsKKyAgICAgIHJldHVybiBsaXN0ZW47CisgICAgfQorCisgICAgZm9yIChmaW5hbCBTdHJpbmcgZGVzYyA6IHdhbnQpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGxpc3Rlbi5hZGQoU29ja2V0VXRpbC5yZXNvbHZlKGRlc2MsIERFRkFVTFRfUE9SVCkpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nLmVycm9yKCJCYWQgc3NoZC5saXN0ZW5hZGRyZXNzOiAiICsgZGVzYyArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaXN0ZW47CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT2ZmKFN0cmluZyBsaXN0ZW5Ib3N0bmFtZSkgeworICAgIHJldHVybiAib2ZmIi5lcXVhbHNJZ25vcmVDYXNlKGxpc3Rlbkhvc3RuYW1lKQorICAgICAgICB8fCAibm9uZSIuZXF1YWxzSWdub3JlQ2FzZShsaXN0ZW5Ib3N0bmFtZSkKKyAgICAgICAgfHwgIm5vIi5lcXVhbHNJZ25vcmVDYXNlKGxpc3Rlbkhvc3RuYW1lKTsKKyAgfQorCisgIEBQcm92aWRlcworICBAU2luZ2xldG9uCisgIEBTc2hBZHZlcnRpc2VkQWRkcmVzc2VzCisgIExpc3Q8U3RyaW5nPiBnZXRBZHZlcnRpc2VkQWRkcmVzc2VzKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZywKKyAgICAgIEBTc2hMaXN0ZW5BZGRyZXNzZXMgTGlzdDxTb2NrZXRBZGRyZXNzPiBsaXN0ZW4pIHsKKyAgICBTdHJpbmdbXSB3YW50ID0gY2ZnLmdldFN0cmluZ0xpc3QoInNzaGQiLCBudWxsLCAiYWR2ZXJ0aXNlZGFkZHJlc3MiKTsKKyAgICBpZiAod2FudC5sZW5ndGggPiAwKSB7CisgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh3YW50KTsKKyAgICB9CisgICAgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gcHViID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gbG9jYWwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGZvciAoU29ja2V0QWRkcmVzcyBhZGRyIDogbGlzdGVuKSB7CisgICAgICBpZiAoYWRkciBpbnN0YW5jZW9mIEluZXRTb2NrZXRBZGRyZXNzKSB7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGluZXRBZGRyID0gKEluZXRTb2NrZXRBZGRyZXNzKSBhZGRyOworICAgICAgICBpZiAoaW5ldEFkZHIuZ2V0QWRkcmVzcygpLmlzTG9vcGJhY2tBZGRyZXNzKCkpIHsKKyAgICAgICAgICBsb2NhbC5hZGQoaW5ldEFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB1Yi5hZGQoaW5ldEFkZHIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChwdWIuaXNFbXB0eSgpKSB7CisgICAgICBwdWIgPSBsb2NhbDsKKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IGFkdiA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShwdWIuc2l6ZSgpKTsKKyAgICBmb3IgKEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgOiBwdWIpIHsKKyAgICAgIGFkdi5hZGQoU29ja2V0VXRpbC5mb3JtYXQoYWRkciwgSUFOQV9TU0hfUE9SVCkpOworICAgIH0KKyAgICByZXR1cm4gYWR2OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hBZHZlcnRpc2VkQWRkcmVzc2VzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hBZHZlcnRpc2VkQWRkcmVzc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxOTI5OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL1NzaEFkdmVydGlzZWRBZGRyZXNzZXMuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRpbmdBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworCisvKioKKyAqIE1hcmtlciBvbiB0aGUgbGlzdCBvZiB7QGxpbmsgU29ja2V0QWRkcmVzc31lcyBjb25maWd1cmVkIHRvIGJlIGFkdmVydGlzZWQgYnkKKyAqIHRoZSBzZXJ2ZXIuCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BCaW5kaW5nQW5ub3RhdGlvbgorcHVibGljIEBpbnRlcmZhY2UgU3NoQWR2ZXJ0aXNlZEFkZHJlc3NlcyB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hMaXN0ZW5BZGRyZXNzZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL1NzaExpc3RlbkFkZHJlc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDA1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hMaXN0ZW5BZGRyZXNzZXMuamF2YQpAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRpbmdBbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworCisvKioKKyAqIE1hcmtlciBvbiB0aGUgbGlzdCBvZiB7QGxpbmsgU29ja2V0QWRkcmVzc31lcyBvbiB3aGljaCB0aGUgU1NIIGRhZW1vbiBpcworICogY29uZmlndXJlZCB0byBsaXN0ZW4uCisgKi8KK0BSZXRlbnRpb24oUlVOVElNRSkKK0BCaW5kaW5nQW5ub3RhdGlvbgorcHVibGljIEBpbnRlcmZhY2UgU3NoTGlzdGVuQWRkcmVzc2VzIHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9GYWxsYmFja1JlcXVlc3RDb250ZXh0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvRmFsbGJhY2tSZXF1ZXN0Q29udGV4dC5qYXZhCmluZGV4IDY4NmExMDguLjU1MTRlZjUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9GYWxsYmFja1JlcXVlc3RDb250ZXh0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL0ZhbGxiYWNrUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMTQsOSArMTQsMTIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKIC8qKgpAQCAtMzcsNCArNDAsMTUgQEAKICAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgewogICAgIHJldHVybiB1c2VyOwogICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcm92aWRlcjxSZXZpZXdEYj4gZ2V0UmV2aWV3RGJQcm92aWRlcigpIHsKKyAgICByZXR1cm4gbmV3IFByb3ZpZGVyPFJldmlld0RiPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJldmlld0RiIGdldCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJBdXRvbWF0aWMgUmV2aWV3RGIgb25seSBhdmFpbGFibGUgaW4gcmVxdWVzdCBzY29wZSIpOworICAgICAgfQorICAgIH07CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9HdWljZVJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9HdWljZVJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQppbmRleCBmYTA3MTc2Li40YjVkNzM2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvR3VpY2VSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL0d1aWNlUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5SZW1vdGVQZWVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKQEAgLTQyLDggKzQzLDkgQEAKICAgR3VpY2VSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yKAogICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKICAgICAgIEBSZW1vdGVQZWVyIFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+IHJlbW90ZVBlZXJQcm92aWRlciwKLSAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKLSAgICBzdXBlcihTZXJ2bGV0U2NvcGVzLlJFUVVFU1QsIGxvY2FsKTsKKyAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwsCisgICAgICBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlclByb3ZpZGVyKSB7CisgICAgc3VwZXIoU2VydmxldFNjb3Blcy5SRVFVRVNULCBsb2NhbCwgZGJQcm92aWRlclByb3ZpZGVyKTsKICAgICB0aGlzLnVybCA9IHVybFByb3ZpZGVyICE9IG51bGwgPyB1cmxQcm92aWRlci5nZXQoKSA6IG51bGw7CiAgICAgdGhpcy5wZWVyID0gcmVtb3RlUGVlclByb3ZpZGVyLmdldCgpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvSWRHZW5lcmF0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9JZEdlbmVyYXRvci5qYXZhCmluZGV4IGIyMGJiZjYuLjc4ZWI2NTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9JZEdlbmVyYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9JZEdlbmVyYXRvci5qYXZhCkBAIC00OCw4ICs0OCwxMiBAQAogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzYWx0ID0gMHg5ZTM3NzliOTsKIAorICBzdGF0aWMgaW50IG1peChpbnQgaW4pIHsKKyAgICByZXR1cm4gbWl4KHNhbHQsIGluKTsKKyAgfQorCiAgIC8qKiBBIHZlcnkgc2ltcGxlIGJpdCBwZXJtdXRhdGlvbiB0byBtYXNrIGEgc2ltcGxlIGluY3JlbWVudGVyLiAqLwotICBzdGF0aWMgaW50IG1peChmaW5hbCBpbnQgaW4pIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgbWl4KGZpbmFsIGludCBzYWx0LCBmaW5hbCBpbnQgaW4pIHsKICAgICBzaG9ydCB2MCA9IGhpMTYoaW4pOwogICAgIHNob3J0IHYxID0gbG8xNihpbik7CiAgICAgdjAgKz0gKCh2MSA8PCAyKSArIDAgXiB2MSkgKyAoc2FsdCBeICh2MSA+Pj4gMykpICsgMTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9NYWdpY0JyYW5jaC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL01hZ2ljQnJhbmNoLmphdmEKaW5kZXggNTEwZGVhYTAyLi42MDg0NGVlIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvTWFnaWNCcmFuY2guamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvTWFnaWNCcmFuY2guamF2YQpAQCAtNDYsMTIgKzQ2LDIzIEBACiAKICAgLyoqIENoZWNrcyBpZiB0aGUgc3VwcGxpZWQgcmVmIG5hbWUgaXMgYSBtYWdpYyBicmFuY2ggKi8KICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFnaWNCcmFuY2goU3RyaW5nIHJlZk5hbWUpIHsKLSAgICBpZiAocmVmTmFtZS5zdGFydHNXaXRoKE5FV19EUkFGVF9DSEFOR0UpIHx8Ci0gICAgICAgIHJlZk5hbWUuc3RhcnRzV2l0aChORVdfUFVCTElTSF9DSEFOR0UpIHx8Ci0gICAgICAgIHJlZk5hbWUuc3RhcnRzV2l0aChORVdfQ0hBTkdFKSkgewotICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHJlZk5hbWUuc3RhcnRzV2l0aChORVdfRFJBRlRfQ0hBTkdFKQorICAgICAgICB8fCByZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX1BVQkxJU0hfQ0hBTkdFKQorICAgICAgICB8fCByZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX0NIQU5HRSk7CisgIH0KKworICAvKiogUmV0dXJucyB0aGUgcmVmIG5hbWUgcHJlZml4IGZvciBhIG1hZ2ljIGJyYW5jaCwgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGJyYW5jaCBpcyBub3QgbWFnaWMgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFnaWNSZWZOYW1lUHJlZml4KFN0cmluZyByZWZOYW1lKSB7CisgICAgaWYgKHJlZk5hbWUuc3RhcnRzV2l0aChORVdfRFJBRlRfQ0hBTkdFKSkgeworICAgICAgcmV0dXJuIE5FV19EUkFGVF9DSEFOR0U7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAocmVmTmFtZS5zdGFydHNXaXRoKE5FV19QVUJMSVNIX0NIQU5HRSkpIHsKKyAgICAgIHJldHVybiBORVdfUFVCTElTSF9DSEFOR0U7CisgICAgfQorICAgIGlmIChyZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX0NIQU5HRSkpIHsKKyAgICAgIHJldHVybiBORVdfQ0hBTkdFOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKICAgfQogCiAgIC8qKgpAQCAtODAsMTEgKzkxLDYgQEAKICAgICByZXR1cm4gQ2FwYWJsZS5PSzsKICAgfQogCi0gIC8qKiBDaGVja3MgaWYgcmVmIG5hbWUgbWF0Y2hlcyB0aGUgZHJhZnQgbWFnaWMgYnJhbmNoICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RyYWZ0KFN0cmluZyByZWZOYW1lKSB7Ci0gICAgcmV0dXJuIHJlZk5hbWUuc3RhcnRzV2l0aChNYWdpY0JyYW5jaC5ORVdfRFJBRlRfQ0hBTkdFKTsKLSAgfQotCiAgIHByaXZhdGUgc3RhdGljIENhcGFibGUgY2hlY2tNYWdpY0JyYW5jaFJlZihTdHJpbmcgYnJhbmNoTmFtZSwgUmVwb3NpdG9yeSByZXBvLAogICAgICAgUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgTWFwPFN0cmluZywgUmVmPiBibG9ja2luZ0ZvcnM7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUGx1Z2luUmVxdWVzdENvbnRleHQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9QbHVnaW5SZXF1ZXN0Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MzZmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUGx1Z2luUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QbHVnaW5Vc2VyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKKworLyoqIFJlcXVlc3RDb250ZXh0IGFjdGl2ZSB3aGlsZSBwbHVnaW5zIGxvYWQgb3IgdW5sb2FkLiAqLworcHVibGljIGNsYXNzIFBsdWdpblJlcXVlc3RDb250ZXh0IGltcGxlbWVudHMgUmVxdWVzdENvbnRleHQgeworICBwcml2YXRlIGZpbmFsIFBsdWdpblVzZXIgdXNlcjsKKworICBwdWJsaWMgUGx1Z2luUmVxdWVzdENvbnRleHQoUGx1Z2luVXNlciB1c2VyKSB7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CisgICAgcmV0dXJuIHVzZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCkgeworICAgIHJldHVybiBuZXcgUHJvdmlkZXI8UmV2aWV3RGI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgUmV2aWV3RGIgZ2V0KCkgeworICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgIkF1dG9tYXRpYyBSZXZpZXdEYiBvbmx5IGF2YWlsYWJsZSBpbiByZXF1ZXN0IHNjb3BlIik7CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RDb250ZXh0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUmVxdWVzdENvbnRleHQuamF2YQppbmRleCBjYTg1NzNmLi44NmM3NGUwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUmVxdWVzdENvbnRleHQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMTQsMTMgKzE0LDE1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCiAvKioKICAqIFRoZSBSZXF1ZXN0Q29udGV4dCBpcyBhbiBpbnRlcmZhY2UgZXhwb3NpbmcgdGhlIGZpZWxkcyB0aGF0IGFyZSBuZWVkZWQKICAqIGJ5IHRoZSBHZXJyaXRHbG9iYWxNb2R1bGUgc2NvcGUuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHQgewotCiAgIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCk7CisgIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQppbmRleCA4NGM2MWU5Li5mNjNkYTU0MzkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQpAQCAtMTQsOCArMTQsMTQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0Lk5hbWVLZXk7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVxdWVzdENsZWFudXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RSdW5uYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5LZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC00MywxOSArNDksMjYgQEAKIAogICBwcml2YXRlIGZpbmFsIFNjb3BlIHNjb3BlOwogICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWw7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI+IGRiUHJvdmlkZXJQcm92aWRlcjsKIAogICBwcm90ZWN0ZWQgUmVxdWVzdFNjb3BlUHJvcGFnYXRvcihTY29wZSBzY29wZSwKLSAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKKyAgICAgIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwsCisgICAgICBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlclByb3ZpZGVyKSB7CiAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwogICAgIHRoaXMubG9jYWwgPSBsb2NhbDsKKyAgICB0aGlzLmRiUHJvdmlkZXJQcm92aWRlciA9IGRiUHJvdmlkZXJQcm92aWRlcjsKICAgfQogCiAgIC8qKgotICAgKiBXcmFwcyBjYWxsYWJsZSBpbiBhIG5ldyB7QGxpbmsgQ2FsbGFibGV9IHRoYXQgcHJvcGFnYXRlcyB0aGUgY3VycmVudAotICAgKiByZXF1ZXN0IHN0YXRlIHdoZW4gdGhlIGNhbGxhYmxlIGlzIGludm9rZWQuIFRoZSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgaW4gYQotICAgKiByZXF1ZXN0IHNjb3BlIGFuZCB0aGUgcmV0dXJuZWQgQ2FsbGFibGUgbWF5IG9ubHkgYmUgaW52b2tlZCBpbiBhIHRocmVhZAotICAgKiB0aGF0IGlzIG5vdCBhbHJlYWR5IGluIGEgcmVxdWVzdCBzY29wZS4gVGhlIHJldHVybmVkIENhbGxhYmxlIHdpbGwgaW5oZXJpdAotICAgKiB0b1N0cmluZygpIGZyb20gdGhlIHBhc3NlZCBpbiBDYWxsYWJsZS4gQQorICAgKiBFbnN1cmVzIHRoYXQgdGhlIGN1cnJlbnQgcmVxdWVzdCBzdGF0ZSBpcyBhdmFpbGFibGUgd2hlbiB0aGUgcGFzc2VkIGluCisgICAqIENhbGxhYmxlIGlzIGludm9rZWQuCisgICAqCisgICAqIElmIG5lZWRlZCB3cmFwcyB0aGUgcGFzc2VkIGluIENhbGxhYmxlIGluIGEgbmV3IHtAbGluayBDYWxsYWJsZX0gdGhhdAorICAgKiBwcm9wYWdhdGVzIHRoZSBjdXJyZW50IHJlcXVlc3Qgc3RhdGUgd2hlbiB0aGUgcmV0dXJuZWQgQ2FsbGFibGUgaXMgaW52b2tlZC4KKyAgICogVGhlIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBpbiBhIHJlcXVlc3Qgc2NvcGUgYW5kIHRoZSByZXR1cm5lZCBDYWxsYWJsZSBtYXkKKyAgICogb25seSBiZSBpbnZva2VkIGluIGEgdGhyZWFkIHRoYXQgaXMgbm90IGFscmVhZHkgaW4gYSByZXF1ZXN0IHNjb3BlIG9yIGlzIGluCisgICAqIHRoZSBzYW1lIHJlcXVlc3Qgc2NvcGUuIFRoZSByZXR1cm5lZCBDYWxsYWJsZSB3aWxsIGluaGVyaXQgdG9TdHJpbmcoKSBmcm9tCisgICAqIHRoZSBwYXNzZWQgaW4gQ2FsbGFibGUuIEEKICAgICoge0BsaW5rIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlLkV4ZWN1dG9yfSBkb2VzIG5vdCBhY2NlcHQgYQogICAgKiBDYWxsYWJsZSwgc28gdGhlcmUgaXMgbm8gUHJvamVjdENhbGxhYmxlIGltcGxlbWVudGF0aW9uLiBJbXBsZW1lbnRhdGlvbnMgb2YKICAgICogdGhpcyBtZXRob2QgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggR3VpY2UncwpAQCAtNzMsMTIgKzg2LDE3IEBACiAgICAqIEByZXR1cm4gYSBuZXcgQ2FsbGFibGUgd2hpY2ggd2lsbCBleGVjdXRlIGluIHRoZSBjdXJyZW50IHJlcXVlc3Qgc2NvcGUuCiAgICAqLwogICBwdWJsaWMgZmluYWwgPFQ+IENhbGxhYmxlPFQ+IHdyYXAoZmluYWwgQ2FsbGFibGU8VD4gY2FsbGFibGUpIHsKKyAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dCBjYWxsZXJDb250ZXh0ID0gY2hlY2tOb3ROdWxsKGxvY2FsLmdldENvbnRleHQoKSk7CiAgICAgZmluYWwgQ2FsbGFibGU8VD4gd3JhcHBlZCA9Ci0gICAgICAgIHdyYXBJbXBsKGNvbnRleHQobG9jYWwuZ2V0Q29udGV4dCgpLCBjbGVhbnVwKGNhbGxhYmxlKSkpOworICAgICAgICB3cmFwSW1wbChjb250ZXh0KGNhbGxlckNvbnRleHQsIGNsZWFudXAoY2FsbGFibGUpKSk7CiAgICAgcmV0dXJuIG5ldyBDYWxsYWJsZTxUPigpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIFQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jYWxsKCk7CisgICAgICAgIGlmIChjYWxsZXJDb250ZXh0ID09IGxvY2FsLmdldENvbnRleHQoKSkgeworICAgICAgICAgIHJldHVybiBjYWxsYWJsZS5jYWxsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuY2FsbCgpOworICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQpAQCAtMTExLDE1ICsxMjksMTQgQEAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3cmFwcGVkLmNhbGwoKTsKLSAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZQb3NzaWJsZShlKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyAvLyBOb3QgcG9zc2libGUuCiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBOYW1lS2V5IGdldFByb2plY3ROYW1lS2V5KCkgeworICAgICAgICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldFByb2plY3ROYW1lS2V5KCkgewogICAgICAgICAgIHJldHVybiAoKFByb2plY3RSdW5uYWJsZSkgcnVubmFibGUpLmdldFByb2plY3ROYW1lS2V5KCk7CiAgICAgICAgIH0KIApAQCAtMTY5LDcgKzE4NiwxNyBAQAogICAgIHJldHVybiBuZXcgQ2FsbGFibGU8VD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyBUIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUmVxdWVzdENvbnRleHQgb2xkID0gbG9jYWwuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgICAgUmVxdWVzdENvbnRleHQgb2xkID0gbG9jYWwuc2V0Q29udGV4dChuZXcgUmVxdWVzdENvbnRleHQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgUHJvdmlkZXI8UmV2aWV3RGI+IGdldFJldmlld0RiUHJvdmlkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gZGJQcm92aWRlclByb3ZpZGVyLmdldCgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgcmV0dXJuIGNhbGxhYmxlLmNhbGwoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTE5MSw3ICsyMTgsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENsZWFudXAoKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSkuZ2V0KCk7Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICByZXR1cm4gY2FsbGFibGUuY2FsbCgpOwogICAgICAgICB9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1N1Ym1vZHVsZVNlY3Rpb25QYXJzZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyLmphdmEKaW5kZXggNzMxMDcwMy4uZmJkODIzNiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1N1Ym1vZHVsZVNlY3Rpb25QYXJzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgJiYgYnJhbmNoICE9IG51bGwgJiYgYnJhbmNoLmxlbmd0aCgpID4gMCkgewogICAgICAgICAvLyBBbGwgcmVxdWlyZWQgZmllbGRzIGZpbGxlZC4KIAotICAgICAgICBib29sZWFuIHVybElzUmVsYXRpdmUgPSB1cmwuc3RhcnRzV2l0aCgiLyIpOworICAgICAgICBib29sZWFuIHVybElzUmVsYXRpdmUgPSB1cmwuc3RhcnRzV2l0aCgiLi4vIik7CiAgICAgICAgIFN0cmluZyBzZXJ2ZXIgPSBudWxsOwogICAgICAgICBpZiAoIXVybElzUmVsYXRpdmUpIHsKICAgICAgICAgICAvLyBJdCBpcyBhY3R1YWxseSBhbiBVUkkuIEl0IGNvdWxkIGJlIHNzaDovL2xvY2FsaG9zdC9wcm9qZWN0LWEuCkBAIC0xMDMsOCArMTAzLDkgQEAKICAgICAgICAgICAgIGZyb21JbmRleCA9IHVybEV4dHJhY3RlZFBhdGgubGFzdEluZGV4T2YoJy8nLCBmcm9tSW5kZXggLSAxKTsKICAgICAgICAgICAgIHByb2plY3ROYW1lID0gdXJsRXh0cmFjdGVkUGF0aC5zdWJzdHJpbmcoZnJvbUluZGV4ICsgMSk7CiAKLSAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZS5lbmRzV2l0aCgiLmdpdCIpKSB7Ci0gICAgICAgICAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIHByb2plY3ROYW1lLmxlbmd0aCgpIC0gNCk7CisgICAgICAgICAgICBpZiAocHJvamVjdE5hbWUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkgeworICAgICAgICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygwLCAvLworICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUubGVuZ3RoKCkgLSBDb25zdGFudHMuRE9UX0dJVF9FWFQubGVuZ3RoKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocmVwb01hbmFnZXIubGlzdCgpLmNvbnRhaW5zKG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdE5hbWUpKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdENvbnRleHQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0LmphdmEKaW5kZXggYjQxMTUxMi4uYmQ0M2U5ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdENvbnRleHQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob3RTaWduZWRJbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKQEAgLTY0LDYgKzY1LDExIEBACiAgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTm90U2lnbmVkSW5FeGNlcHRpb24uTUVTU0FHRSwKICAgICAgICAgICAgIG5ldyBOb3RTaWduZWRJbkV4Y2VwdGlvbigpKTsKICAgICAgIH0KKworICAgICAgQFByb3ZpZGVzCisgICAgICBSZXZpZXdEYiBwcm92aWRlUmV2aWV3RGIoUmVxdWVzdENvbnRleHQgY3R4KSB7CisgICAgICAgIHJldHVybiBjdHguZ2V0UmV2aWV3RGJQcm92aWRlcigpLmdldCgpOworICAgICAgfQogICAgIH07CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhCmluZGV4IDc3MjhkNmYuLmEzMWM3YzcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvVGhyZWFkTG9jYWxSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKQEAgLTE0LDcgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuT3V0T2ZTY29wZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TY29wZTsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwpAQCAtMzEsOCArMzMsMTAgQEAKICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxDPiB0aHJlYWRMb2NhbDsKIAogICBwcm90ZWN0ZWQgVGhyZWFkTG9jYWxSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yKFNjb3BlIHNjb3BlLAotICAgICAgVGhyZWFkTG9jYWw8Qz4gdGhyZWFkTG9jYWwsIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKLSAgICBzdXBlcihzY29wZSwgbG9jYWwpOworICAgICAgVGhyZWFkTG9jYWw8Qz4gdGhyZWFkTG9jYWwsCisgICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgUHJvdmlkZXI8UmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI+IGRiUHJvdmlkZXJQcm92aWRlcikgeworICAgIHN1cGVyKHNjb3BlLCBsb2NhbCwgZGJQcm92aWRlclByb3ZpZGVyKTsKICAgICB0aGlzLnRocmVhZExvY2FsID0gdGhyZWFkTG9jYWw7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9DYXRlZ29yeUZ1bmN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L0NhdGVnb3J5RnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmMWJmYi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L0NhdGVnb3J5RnVuY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3c7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogRnVuY3Rpb24gdG8gY29udHJvbCB7QGxpbmsgUGF0Y2hTZXRBcHByb3ZhbH1zIGluIGFuIHtAbGluayBBcHByb3ZhbENhdGVnb3J5fS4gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDYXRlZ29yeUZ1bmN0aW9uIHsKLSAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ2F0ZWdvcnlGdW5jdGlvbj4gYWxsID0KLSAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQ2F0ZWdvcnlGdW5jdGlvbj4oKTsKLSAgc3RhdGljIHsKLSAgICBhbGwucHV0KE1heFdpdGhCbG9jay5OQU1FLCBuZXcgTWF4V2l0aEJsb2NrKCkpOwotICAgIGFsbC5wdXQoTWF4Tm9CbG9jay5OQU1FLCBuZXcgTWF4Tm9CbG9jaygpKTsKLSAgICBhbGwucHV0KE5vT3BGdW5jdGlvbi5OQU1FLCBuZXcgTm9PcEZ1bmN0aW9uKCkpOwotICAgIGFsbC5wdXQoTm9CbG9jay5OQU1FLCBuZXcgTm9CbG9jaygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBMb2NhdGUgYSBmdW5jdGlvbiBieSBjYXRlZ29yeS4KLSAgICoKLSAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSB0aGUgZnVuY3Rpb24gaXMgZm9yLgotICAgKiBAcmV0dXJuIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbjsge0BsaW5rIE5vT3BGdW5jdGlvbn0gaWYgdGhlIGZ1bmN0aW9uCi0gICAqICAgICAgICAgaXMgbm90IGtub3duIHRvIEdlcnJpdCBhbmQgdGh1cyBjYW5ub3QgYmUgZXhlY3V0ZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENhdGVnb3J5RnVuY3Rpb24gZm9yQ2F0ZWdvcnkoZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSkgewotICAgIGZpbmFsIENhdGVnb3J5RnVuY3Rpb24gciA9IGFsbC5nZXQoY2F0ZWdvcnkuZ2V0RnVuY3Rpb25OYW1lKCkpOwotICAgIHJldHVybiByICE9IG51bGwgPyByIDogbmV3IE5vT3BGdW5jdGlvbigpOwotICB9Ci0KLSAgLyoqCi0gICAqIE5vcm1hbGl6ZSBDaGFuZ2VBcHByb3ZhbHMgYW5kIHNldCB0aGUgdmFsaWQgZmxhZyBmb3IgdGhpcyBjYXRlZ29yeS4KLSAgICogPHA+Ci0gICAqIEltcGxlbWVudG9ycyBzaG91bGQgaW52b2tlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBzdGF0ZS52YWxpZChhdCwgdHJ1ZSk7Ci0gICAqIDwvcHJlPgotICAgKiA8cD4KLSAgICogSWYgdGhlIHNldCBvZiBhcHByb3ZhbHMgZnJvbSA8Y29kZT5zdGF0ZS5nZXRBcHByb3ZhbHMoYXQpPC9jb2RlPiBjb3ZlcnMgdGhlCi0gICAqIHJlcXVpcmVtZW50cyBmb3IgdGhlIGZ1bmN0aW9uLCBpbmRpY2F0aW5nIHRoZSBjYXRlZ29yeSBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAqIDxwPgotICAgKiBBbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIHdoaWNoIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBwb3NpdGl2ZSBhbmQgbm8KLSAgICogbmVnYXRpdmVzIG1pZ2h0IGJlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBib29sZWFuIG5lZyA9IGZhbHNlLCBwb3MgPSBmYWxzZTsKLSAgICogZm9yIChmaW5hbCBDaGFuZ2VBcHByb3ZhbCBjYSA6IHN0YXRlLmdldEFwcHJvdmFscyhhdCkpIHsKLSAgICogICBzdGF0ZS5ub3JtYWxpemUoY2EpOwotICAgKiAgIG5lZyB8PSBjYS5nZXRWYWx1ZSgpICZsdDsgMDsKLSAgICogICBwb3MgfD0gY2EuZ2V0VmFsdWUoKSAmZ3Q7IDA7Ci0gICAqIH0KLSAgICogc3RhdGUudmFsaWQoYXQsICFuZWcgJmFtcDsmYW1wOyBwb3MpOwotICAgKiA8L3ByZT4KLSAgICoKLSAgICogQHBhcmFtIGF0IHRoZSBjYWNoZWQgY2F0ZWdvcnkgZGVzY3JpcHRpb24gdG8gcHJvY2Vzcy4KLSAgICogQHBhcmFtIHN0YXRlIHN0YXRlIHRvIHJlYWQgYXBwcm92YWxzIGFuZCBwcm9qZWN0IHJpZ2h0cyBmcm9tLCBhbmQgdG8gdXBkYXRlCi0gICAqICAgICAgICB0aGUgdmFsaWQgc3RhdHVzIGludG8uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oQXBwcm92YWxUeXBlIGF0LCBGdW5jdGlvblN0YXRlIHN0YXRlKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvRnVuY3Rpb25TdGF0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9GdW5jdGlvblN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0Yzk3ZjMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9GdW5jdGlvblN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnkuSWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBTdGF0ZSBwYXNzZWQgdGhyb3VnaCB0byBhIHtAbGluayBDYXRlZ29yeUZ1bmN0aW9ufS4gKi8KLXB1YmxpYyBjbGFzcyBGdW5jdGlvblN0YXRlIHsKLSAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBGdW5jdGlvblN0YXRlIGNyZWF0ZShDaGFuZ2VDb250cm9sIGMsIFBhdGNoU2V0LklkIHBzSWQsCi0gICAgICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYWxsKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OwotCi0gIHByaXZhdGUgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFscyA9Ci0gICAgICBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PigpOwotICBwcml2YXRlIGZpbmFsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBCb29sZWFuPiB2YWxpZCA9Ci0gICAgICBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBCb29sZWFuPigpOwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wgY2FsbGVyQ2hhbmdlQ29udHJvbDsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2UgY2hhbmdlOwotCi0gIEBJbmplY3QKLSAgRnVuY3Rpb25TdGF0ZShmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBDaGFuZ2VDb250cm9sIGMsIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwc0lkLAotICAgICAgQEFzc2lzdGVkIGZpbmFsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYWxsKSB7Ci0gICAgdGhpcy5hcHByb3ZhbFR5cGVzID0gYXBwcm92YWxUeXBlczsKLSAgICB0aGlzLnVzZXJGYWN0b3J5ID0gdXNlckZhY3Rvcnk7Ci0KLSAgICBjYWxsZXJDaGFuZ2VDb250cm9sID0gYzsKLSAgICBjaGFuZ2UgPSBjLmdldENoYW5nZSgpOwotCi0gICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhIDogYWxsKSB7Ci0gICAgICBpZiAocHNJZC5lcXVhbHMoY2EuZ2V0UGF0Y2hTZXRJZCgpKSkgewotICAgICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGwgPSBhcHByb3ZhbHMuZ2V0KGNhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgIGlmIChsID09IG51bGwpIHsKLSAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFwcHJvdmFsPigpOwotICAgICAgICAgIGFwcHJvdmFscy5wdXQoY2EuZ2V0Q2F0ZWdvcnlJZCgpLCBsKTsKLSAgICAgICAgfQotICAgICAgICBsLmFkZChjYSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgTGlzdDxBcHByb3ZhbFR5cGU+IGdldEFwcHJvdmFsVHlwZXMoKSB7Ci0gICAgcmV0dXJuIGFwcHJvdmFsVHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpOwotICB9Ci0KLSAgQ2hhbmdlIGdldENoYW5nZSgpIHsKLSAgICByZXR1cm4gY2hhbmdlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdmFsaWQoZmluYWwgQXBwcm92YWxUeXBlIGF0LCBmaW5hbCBib29sZWFuIHYpIHsKLSAgICB2YWxpZC5wdXQoaWQoYXQpLCB2KTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoZmluYWwgQXBwcm92YWxUeXBlIGF0KSB7Ci0gICAgcmV0dXJuIGlzVmFsaWQoaWQoYXQpKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBpZCkgewotICAgIGZpbmFsIEJvb2xlYW4gYiA9IHZhbGlkLmdldChpZCk7Ci0gICAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiOwotICB9Ci0KLSAgcHVibGljIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gZ2V0QXBwcm92YWxzKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCkgewotICAgIHJldHVybiBnZXRBcHByb3ZhbHMoaWQoYXQpKTsKLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGdldEFwcHJvdmFscyhmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIGlkKSB7Ci0gICAgZmluYWwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBsID0gYXBwcm92YWxzLmdldChpZCk7Ci0gICAgcmV0dXJuIGwgIT0gbnVsbCA/IGwgOiBDb2xsZWN0aW9ucy48UGF0Y2hTZXRBcHByb3ZhbD4gZW1wdHlTZXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBOb3JtYWxpemUgdGhlIGFwcHJvdmFsIHJlY29yZCBkb3duIHRvIHRoZSByYW5nZSBwZXJtaXR0ZWQgYnkgdGhlIHR5cGUsIGluCi0gICAqIGNhc2UgdGhlIHR5cGUgd2FzIG1vZGlmaWVkIHNpbmNlIHRoZSBhcHByb3ZhbCB3YXMgb3JpZ2luYWxseSBncmFudGVkLgotICAgKiA8cD4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhcHBseVR5cGVGbG9vcihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSkgewotICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBhdE1pbiA9IGF0LmdldE1pbigpOwotCi0gICAgaWYgKGF0TWluICE9IG51bGwgJiYgYS5nZXRWYWx1ZSgpIDwgYXRNaW4uZ2V0VmFsdWUoKSkgewotICAgICAgYS5zZXRWYWx1ZShhdE1pbi5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgYXRNYXggPSBhdC5nZXRNYXgoKTsKLSAgICBpZiAoYXRNYXggIT0gbnVsbCAmJiBhLmdldFZhbHVlKCkgPiBhdE1heC5nZXRWYWx1ZSgpKSB7Ci0gICAgICBhLnNldFZhbHVlKGF0TWF4LmdldFZhbHVlKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBOb3JtYWxpemUgdGhlIGFwcHJvdmFsIHJlY29yZCB0byBiZSBpbnNpZGUgdGhlIG1heGltdW0gcmFuZ2UgcGVybWl0dGVkIGJ5Ci0gICAqIHRoZSBSZWZSaWdodHMgZ3JhbnRlZCB0byBncm91cHMgdGhlIGFjY291bnQgaXMgYSBtZW1iZXIgb2YuCi0gICAqIDxwPgotICAgKiBJZiBtdWx0aXBsZSBSZWZSaWdodHMgYXJlIG1hdGNoZWQgKGFzc2lnbmVkIHRvIGRpZmZlcmVudCBncm91cHMgdGhlIGFjY291bnQKLSAgICogaXMgYSBtZW1iZXIgb2YpIHRoZSBsb3dlc3QgbWluVmFsdWUgYW5kIHRoZSBoaWdoZXN0IG1heFZhbHVlIG9mIHRoZSB1bmlvbgotICAgKiBvZiB0aGVtIGlzIHVzZWQuCi0gICAqIDxwPgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFwcGx5UmlnaHRGbG9vcihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSkgewotICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBhdC5nZXRDYXRlZ29yeSgpOwotICAgIGZpbmFsIFN0cmluZyBwZXJtaXNzaW9uID0gUGVybWlzc2lvbi5mb3JMYWJlbChjYXRlZ29yeS5nZXRMYWJlbE5hbWUoKSk7Ci0gICAgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlciA9IHVzZXJGYWN0b3J5LmNyZWF0ZShhLmdldEFjY291bnRJZCgpKTsKLSAgICBmaW5hbCBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSBjb250cm9sRm9yKHVzZXIpLmdldFJhbmdlKHBlcm1pc3Npb24pOwotICAgIGEuc2V0VmFsdWUoKHNob3J0KSByYW5nZS5zcXVhc2goYS5nZXRWYWx1ZSgpKSk7Ci0gIH0KLQotICBwcml2YXRlIENoYW5nZUNvbnRyb2wgY29udHJvbEZvcihDdXJyZW50VXNlciB1c2VyKSB7Ci0gICAgcmV0dXJuIGNhbGxlckNoYW5nZUNvbnRyb2wuZm9yVXNlcih1c2VyKTsKLSAgfQotCi0gIC8qKiBSdW4gPGNvZGU+YXBwbHlUeXBlRmxvb3I8L2NvZGU+LCA8Y29kZT5hcHBseVJpZ2h0Rmxvb3I8L2NvZGU+LiAqLwotICBwdWJsaWMgdm9pZCBub3JtYWxpemUoZmluYWwgQXBwcm92YWxUeXBlIGF0LCBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhKSB7Ci0gICAgYXBwbHlUeXBlRmxvb3IoYXQsIGNhKTsKLSAgICBhcHBseVJpZ2h0Rmxvb3IoYXQsIGNhKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIElkIGlkKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCkgewotICAgIHJldHVybiBhdC5nZXRDYXRlZ29yeSgpLmdldElkKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4Tm9CbG9jay5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9NYXhOb0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzJmOGEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9NYXhOb0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotCi0vKioKLSAqIENvbXB1dGVzIGFuIHtAbGluayBBcHByb3ZhbENhdGVnb3J5fSBieSBsb29raW5nIGF0IG1heGltdW0gdmFsdWVzLgotICogPHA+Ci0gKiBJbiBvcmRlciB0byBiZSBjb25zaWRlcmVkICJhcHByb3ZlZCIgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0OgotICogPHVsPgotICogPGxpPlRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlIGlzIHVzZWQgYXQgbGVhc3Qgb25jZTs8L2xpPgotICogPGxpPlRoZSB1c2VyIGFwcHJvdmluZyB0aGUgbWF4aW11bSBwb3NpdGl2ZSBoYXMgYmVlbiBncmFudGVkIHRoYXQuPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgYWR2aXNvcnkgcmV2aWV3IGZpZWxkcy4KLSAqLwotcHVibGljIGNsYXNzIE1heE5vQmxvY2sgZXh0ZW5kcyBDYXRlZ29yeUZ1bmN0aW9uIHsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJNYXhOb0Jsb2NrIjsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcnVuKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCwgZmluYWwgRnVuY3Rpb25TdGF0ZSBzdGF0ZSkgewotICAgIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0gICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEgOiBzdGF0ZS5nZXRBcHByb3ZhbHMoYXQpKSB7Ci0gICAgICBzdGF0ZS5ub3JtYWxpemUoYXQsIGEpOwotCi0gICAgICBwYXNzZWQgfD0gYXQuaXNNYXhQb3NpdGl2ZShhKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgdHlwZSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1heCBwb3NpdGl2ZSAoYSBmdWxsIGFjY2VwdCkuCi0gICAgLy8KLSAgICBzdGF0ZS52YWxpZChhdCwgcGFzc2VkKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9NYXhXaXRoQmxvY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4V2l0aEJsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODQ0OTkuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9NYXhXaXRoQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3c7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci0KLS8qKgotICogQ29tcHV0ZXMgYW4ge0BsaW5rIEFwcHJvdmFsQ2F0ZWdvcnl9IGJ5IGxvb2tpbmcgYXQgbWF4aW11bSB2YWx1ZXMuCi0gKiA8cD4KLSAqIEluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQgImFwcHJvdmVkIiB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQ6Ci0gKiA8dWw+Ci0gKiA8bGk+VGhlIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgaXMgbmV2ZXIgdXNlZDs8L2xpPgotICogPGxpPlRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlIGlzIHVzZWQgYXQgbGVhc3Qgb25jZTs8L2xpPgotICogPGxpPlRoZSB1c2VyIGFwcHJvdmluZyB0aGUgbWF4aW11bSBwb3NpdGl2ZSBoYXMgYmVlbiBncmFudGVkIHRoYXQuPC9saT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgcmV2aWV3IGZpZWxkcywgd2l0aCB2YWx1ZXMgc3VjaCBhczoKLSAqIDx1bD4KLSAqIDxsaT4rMjogQXBwcm92ZWQgY2hhbmdlLjwvbGk+Ci0gKiA8bGk+KzE6IExvb2tzIG9rLCBidXQgZ2V0IGFub3RoZXIgYXBwcm92YWwgZnJvbSBzb21lb25lIHdpdGggbW9yZSBkZXB0aC48L2xpPgotICogPGxpPi0xOiBTb2Z0IHJlamVjdCwgaXQgaXNuJ3QgYSBncmVhdCBjaGFuZ2UgYnV0IGl0cyBPSyBpZiBhcHByb3ZlZC48L2xpPgotICogPGxpPi0yOiBSZWplY3RlZCwgbXVzdCBub3QgYmUgc3VibWl0dGVkLgotICogPC91bD4KLSAqIDxwPgotICogTm90ZSB0aGF0IHByb2plY3RzIHVzaW5nIHRoaXMgZnVuY3Rpb24gd291bGQgdHlwaWNhbGx5IHdhbnQgdG8gYXNzaWduIG91dCB0aGUKLSAqIG1pZGRsZSByYW5nZSAoLTEgLi4gKzEpIHRvIGFsbW9zdCBldmVyeW9uZSwgc28gcGVvcGxlIGNhbiBpbmRpY2F0ZSBob3cgdGhleQotICogZmVlbCBhYm91dCBhIGNoYW5nZSwgYnV0IHRoZSBleHRyZW1lcyBvZiAtMiBhbmQgKzIgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB0aGUKLSAqIHByb2plY3QncyBsb25nLXRlcm0gbWFpbnRhaW5lcnMsIHRob3NlIHdobyBhcmUgbW9zdCBmYW1pbGlhciB3aXRoIGl0cyBjb2RlLgotICovCi1wdWJsaWMgY2xhc3MgTWF4V2l0aEJsb2NrIGV4dGVuZHMgQ2F0ZWdvcnlGdW5jdGlvbiB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUUgPSAiTWF4V2l0aEJsb2NrIjsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcnVuKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCwgZmluYWwgRnVuY3Rpb25TdGF0ZSBzdGF0ZSkgewotICAgIGJvb2xlYW4gcmVqZWN0ZWQgPSBmYWxzZTsKLSAgICBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhIDogc3RhdGUuZ2V0QXBwcm92YWxzKGF0KSkgewotICAgICAgc3RhdGUubm9ybWFsaXplKGF0LCBhKTsKLQotICAgICAgcmVqZWN0ZWQgfD0gYXQuaXNNYXhOZWdhdGl2ZShhKTsKLSAgICAgIHBhc3NlZCB8PSBhdC5pc01heFBvc2l0aXZlKGEpOwotICAgIH0KLQotICAgIC8vIFRoZSB0eXBlIG11c3Qgbm90IGhhdmUgaGFkIGl0cyBtYXggbmVnYXRpdmUgKGEgZm9yY2VmdWwgcmVqZWN0KQotICAgIC8vIGFuZCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1heCBwb3NpdGl2ZSAoYSBmdWxsIGFjY2VwdCkuCi0gICAgLy8KLSAgICBzdGF0ZS52YWxpZChhdCwgIXJlamVjdGVkICYmIHBhc3NlZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTm9CbG9jay5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9Ob0Jsb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDA3MDUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9Ob0Jsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotCi0vKiogQSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy4gKi8KLXB1YmxpYyBjbGFzcyBOb0Jsb2NrIGV4dGVuZHMgQ2F0ZWdvcnlGdW5jdGlvbiB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUUgPSAiTm9CbG9jayI7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIEZ1bmN0aW9uU3RhdGUgc3RhdGUpIHsKLSAgICBzdGF0ZS52YWxpZChhdCwgdHJ1ZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTm9PcEZ1bmN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L05vT3BGdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc2Y2M1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTm9PcEZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotCi0vKiogQSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZy4gKi8KLXB1YmxpYyBjbGFzcyBOb09wRnVuY3Rpb24gZXh0ZW5kcyBDYXRlZ29yeUZ1bmN0aW9uIHsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJOb09wIjsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcnVuKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCwgZmluYWwgRnVuY3Rpb25TdGF0ZSBzdGF0ZSkgewotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfX2xvYWRfY29tbWl0X2xhYmVsc18xLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfX2xvYWRfY29tbWl0X2xhYmVsc18xLmphdmEKaW5kZXggYTI2YTQ5Mi4uYmVlMDQ2YyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX19sb2FkX2NvbW1pdF9sYWJlbHNfMS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9fbG9hZF9jb21taXRfbGFiZWxzXzEuamF2YQpAQCAtMiwxMiArMiwxMSBAQAogCiBwYWNrYWdlIGdlcnJpdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwpAQCAtNDIsMTEgKzQxLDExIEBACiAKICAgICBUZXJtIGxpc3RIZWFkID0gUHJvbG9nLk5pbDsKICAgICB0cnkgewotICAgICAgUHJvbG9nRW52aXJvbm1lbnQgZW52ID0gKFByb2xvZ0Vudmlyb25tZW50KSBlbmdpbmUuY29udHJvbDsKICAgICAgIFJldmlld0RiIGRiID0gU3RvcmVkVmFsdWVzLlJFVklFV19EQi5nZXQoZW5naW5lKTsKICAgICAgIFBhdGNoU2V0IHBhdGNoU2V0ID0gU3RvcmVkVmFsdWVzLlBBVENIX1NFVC5nZXQoZW5naW5lKTsKICAgICAgIENoYW5nZURhdGEgY2QgPSBTdG9yZWRWYWx1ZXMuQ0hBTkdFX0RBVEEuZ2V0T3JOdWxsKGVuZ2luZSk7Ci0gICAgICBBcHByb3ZhbFR5cGVzIHR5cGVzID0gZW52LmdldEluamVjdG9yKCkuZ2V0SW5zdGFuY2UoQXBwcm92YWxUeXBlcy5jbGFzcyk7CisgICAgICBMYWJlbFR5cGVzIHR5cGVzID0KKyAgICAgICAgICBTdG9yZWRWYWx1ZXMuQ0hBTkdFX0NPTlRST0wuZ2V0KGVuZ2luZSkuZ2V0TGFiZWxUeXBlcygpOwogCiAgICAgICBJdGVyYWJsZTxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHM7CiAgICAgICBpZiAoY2QgIT0gbnVsbCkgewpAQCAtNjAsMTQgKzU5LDE0IEBACiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBBcHByb3ZhbFR5cGUgdCA9IHR5cGVzLmJ5SWQoYS5nZXRDYXRlZ29yeUlkKCkpOworICAgICAgICBMYWJlbFR5cGUgdCA9IHR5cGVzLmJ5TGFiZWwoYS5nZXRMYWJlbElkKCkpOwogICAgICAgICBpZiAodCA9PSBudWxsKSB7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBTdHJ1Y3R1cmVUZXJtIGxhYmVsVGVybSA9IG5ldyBTdHJ1Y3R1cmVUZXJtKAogICAgICAgICAgICAgc3ltX2xhYmVsLAotICAgICAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4odC5nZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpKSwKKyAgICAgICAgICAgIFN5bWJvbFRlcm0uaW50ZXJuKHQuZ2V0TmFtZSgpKSwKICAgICAgICAgICAgIG5ldyBJbnRlZ2VyVGVybShhLmdldFZhbHVlKCkpKTsKIAogICAgICAgICBTdHJ1Y3R1cmVUZXJtIHVzZXJUZXJtID0gbmV3IFN0cnVjdHVyZVRlcm0oCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY29tbWl0X2RlbHRhXzQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jb21taXRfZGVsdGFfNC5qYXZhCmluZGV4IDljZTcwOTguLjUxYTg3MWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jb21taXRfZGVsdGFfNC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jb21taXRfZGVsdGFfNC5qYXZhCkBAIC0xNjksNiArMTY5LDggQEAKICAgICAgICAgcmV0dXJuIHJlbmFtZTsKICAgICAgIGNhc2UgQ09QSUVEOgogICAgICAgICByZXR1cm4gY29weTsKKyAgICAgIGNhc2UgUkVXUklURToKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNoYW5nZVR5cGUgbm90IHJlY29nbml6ZWQiKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2NvbW1pdF9zdGF0c18zLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY29tbWl0X3N0YXRzXzMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY5OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2NvbW1pdF9zdGF0c18zLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGdlcnJpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlN0b3JlZFZhbHVlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0OworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuSW50ZWdlclRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5PcGVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2c7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworCisvKioKKyAqIEV4cG9ydHMgYmFzaWMgY29tbWl0IHN0YXRpc3RpY3MuCisgKgorICogPHByZT4KKyAqICAgJ2NvbW1pdF9zdGF0cycoLUZpbGVzLCAtSW5zZXJ0aW9ucywgLURlbGV0aW9ucykKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgUFJFRF9jb21taXRfc3RhdHNfMyBleHRlbmRzIFByZWRpY2F0ZS5QMyB7CisgIHB1YmxpYyBQUkVEX2NvbW1pdF9zdGF0c18zKFRlcm0gYTEsIFRlcm0gYTIsIFRlcm0gYTMsIE9wZXJhdGlvbiBuKSB7CisgICAgYXJnMSA9IGExOworICAgIGFyZzIgPSBhMjsKKyAgICBhcmczID0gYTM7CisgICAgY29udCA9IG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wZXJhdGlvbiBleGVjKFByb2xvZyBlbmdpbmUpIHRocm93cyBQcm9sb2dFeGNlcHRpb24geworICAgIGVuZ2luZS5zZXRCMCgpOworCisgICAgVGVybSBhMSA9IGFyZzEuZGVyZWZlcmVuY2UoKTsKKyAgICBUZXJtIGEyID0gYXJnMi5kZXJlZmVyZW5jZSgpOworICAgIFRlcm0gYTMgPSBhcmczLmRlcmVmZXJlbmNlKCk7CisKKyAgICBQYXRjaExpc3QgcGwgPSBTdG9yZWRWYWx1ZXMuUEFUQ0hfTElTVC5nZXQoZW5naW5lKTsKKyAgICBpZighYTEudW5pZnkobmV3IEludGVnZXJUZXJtKHBsLmdldFBhdGNoZXMoKS5zaXplKCkgLTEpLGVuZ2luZS50cmFpbCkpIHsgLy9BY2NvdW50IGZvciAvQ09NTUlUX01TRy4KKyAgICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgIH0KKyAgICBpZighYTIudW5pZnkobmV3IEludGVnZXJUZXJtKHBsLmdldEluc2VydGlvbnMoKSksZW5naW5lLnRyYWlsKSkgeworICAgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgfQorICAgIGlmKCFhMy51bmlmeShuZXcgSW50ZWdlclRlcm0ocGwuZ2V0RGVsZXRpb25zKCkpLGVuZ2luZS50cmFpbCkpIHsKKyAgICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgIH0KKyAgICByZXR1cm4gY29udDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2N1cnJlbnRfdXNlcl8xLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY3VycmVudF91c2VyXzEuamF2YQppbmRleCAwOWE0NmY3Li4xMTkxMWJkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY3VycmVudF91c2VyXzEuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY3VycmVudF91c2VyXzEuamF2YQpAQCAtMzYsNyArMzYsNiBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTeW1ib2xUZXJtIHVzZXIgPSBTeW1ib2xUZXJtLmludGVybigidXNlciIsIDEpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTeW1ib2xUZXJtIGFub255bW91cyA9IFN5bWJvbFRlcm0uaW50ZXJuKCJhbm9ueW1vdXMiKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3ltYm9sVGVybSBwZWVyRGFlbW9uID0gU3ltYm9sVGVybS5pbnRlcm4oInBlZXJfZGFlbW9uIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN5bWJvbFRlcm0gcmVwbGljYXRpb24gPSBTeW1ib2xUZXJtLmludGVybigicmVwbGljYXRpb24iKTsKIAogICBwdWJsaWMgUFJFRF9jdXJyZW50X3VzZXJfMShUZXJtIGExLCBPcGVyYXRpb24gbikgewogICAgIGFyZzEgPSBhMTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9nZXRfbGVnYWN5X2FwcHJvdmFsX3R5cGVzXzEuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9nZXRfbGVnYWN5X2FwcHJvdmFsX3R5cGVzXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlMGZkOC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlc18xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgZ2Vycml0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkludGVnZXJUZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuTGlzdFRlcm07Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5PcGVyYXRpb247Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2c7Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TdHJ1Y3R1cmVUZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuU3ltYm9sVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlRlcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBPYnRhaW4gYSBsaXN0IG9mIGFwcHJvdmFsIHR5cGVzIGZyb20gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotICogPHA+Ci0gKiBVbmlmaWVzIHRvIGEgUHJvbG9nIGxpc3Qgb2Y6IHtAY29kZSBhcHByb3ZhbF90eXBlKExhYmVsLCBJZCwgRnVuLCBNaW4sIE1heCl9Ci0gKiB3aGVyZToKLSAqIDx1bD4KLSAqIDxsaT57QGNvZGUgTGFiZWx9IC0gdGhlIG5ld2VyIHN0eWxlIGxhYmVsIG5hbWU8L2xpPgotICogPGxpPntAY29kZSBJZH0gLSB0aGUgbGVnYWN5IEFwcHJvdmFsQ2F0ZWdvcnkuSWQgZnJvbSB0aGUgZGF0YWJhc2U8L2xpPgotICogPGxpPntAY29kZSBGdW59IC0gbGVnYWN5IGZ1bmN0aW9uIG5hbWU8L2xpPgotICogPGxpPntAY29kZSBNaW4sIE1heH0gLSB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgY29uZmlndXJlZCB2YWx1ZXMuPC9saT4KLSAqIDwvdWw+Ci0gKi8KLWNsYXNzIFBSRURfZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlc18xIGV4dGVuZHMgUHJlZGljYXRlLlAxIHsKLSAgUFJFRF9nZXRfbGVnYWN5X2FwcHJvdmFsX3R5cGVzXzEoVGVybSBhMSwgT3BlcmF0aW9uIG4pIHsKLSAgICBhcmcxID0gYTE7Ci0gICAgY29udCA9IG47Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE9wZXJhdGlvbiBleGVjKFByb2xvZyBlbmdpbmUpIHRocm93cyBQcm9sb2dFeGNlcHRpb24gewotICAgIGVuZ2luZS5zZXRCMCgpOwotICAgIFRlcm0gYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7Ci0KLSAgICBQcm9sb2dFbnZpcm9ubWVudCBlbnYgPSAoUHJvbG9nRW52aXJvbm1lbnQpIGVuZ2luZS5jb250cm9sOwotICAgIEFwcHJvdmFsVHlwZXMgdHlwZXMgPSBlbnYuZ2V0SW5qZWN0b3IoKS5nZXRJbnN0YW5jZShBcHByb3ZhbFR5cGVzLmNsYXNzKTsKLQotICAgIExpc3Q8QXBwcm92YWxUeXBlPiBsaXN0ID0gdHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpOwotICAgIFRlcm0gaGVhZCA9IFByb2xvZy5OaWw7Ci0gICAgZm9yIChpbnQgaWR4ID0gbGlzdC5zaXplKCkgLSAxOyAwIDw9IGlkeDsgaWR4LS0pIHsKLSAgICAgIGhlYWQgPSBuZXcgTGlzdFRlcm0oZXhwb3J0KGxpc3QuZ2V0KGlkeCkpLCBoZWFkKTsKLSAgICB9Ci0KLSAgICBpZiAoIWExLnVuaWZ5KGhlYWQsIGVuZ2luZS50cmFpbCkpIHsKLSAgICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOwotICAgIH0KLSAgICByZXR1cm4gY29udDsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBTeW1ib2xUZXJtIHN5bUFwcHJvdmFsVHlwZSA9IFN5bWJvbFRlcm0uaW50ZXJuKAotICAgICAgImFwcHJvdmFsX3R5cGUiLCA1KTsKLQotICBzdGF0aWMgVGVybSBleHBvcnQoQXBwcm92YWxUeXBlIHR5cGUpIHsKLSAgICByZXR1cm4gbmV3IFN0cnVjdHVyZVRlcm0oc3ltQXBwcm92YWxUeXBlLAotICAgICAgICBTeW1ib2xUZXJtLmludGVybih0eXBlLmdldENhdGVnb3J5KCkuZ2V0TGFiZWxOYW1lKCkpLAotICAgICAgICBTeW1ib2xUZXJtLmludGVybih0eXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKS5nZXQoKSksCi0gICAgICAgIFN5bWJvbFRlcm0uaW50ZXJuKHR5cGUuZ2V0Q2F0ZWdvcnkoKS5nZXRGdW5jdGlvbk5hbWUoKSksCi0gICAgICAgIG5ldyBJbnRlZ2VyVGVybSh0eXBlLmdldE1pbigpLmdldFZhbHVlKCkpLAotICAgICAgICBuZXcgSW50ZWdlclRlcm0odHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9nZXRfbGVnYWN5X2xhYmVsX3R5cGVzXzEuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9nZXRfbGVnYWN5X2xhYmVsX3R5cGVzXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFkYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2dldF9sZWdhY3lfbGFiZWxfdHlwZXNfMS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBnZXJyaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkludGVnZXJUZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuTGlzdFRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5PcGVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2c7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TdHJ1Y3R1cmVUZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuU3ltYm9sVGVybTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlRlcm07CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBPYnRhaW4gYSBsaXN0IG9mIGxhYmVsIHR5cGVzIGZyb20gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgorICogPHA+CisgKiBVbmlmaWVzIHRvIGEgUHJvbG9nIGxpc3Qgb2Y6IHtAY29kZSBsYWJlbF90eXBlKExhYmVsLCBGdW4sIE1pbiwgTWF4KX0KKyAqIHdoZXJlOgorICogPHVsPgorICogPGxpPntAY29kZSBMYWJlbH0gLSB0aGUgbmV3ZXIgc3R5bGUgbGFiZWwgbmFtZTwvbGk+CisgKiA8bGk+e0Bjb2RlIEZ1bn0gLSBsZWdhY3kgZnVuY3Rpb24gbmFtZTwvbGk+CisgKiA8bGk+e0Bjb2RlIE1pbiwgTWF4fSAtIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBjb25maWd1cmVkIHZhbHVlcy48L2xpPgorICogPC91bD4KKyAqLworY2xhc3MgUFJFRF9nZXRfbGVnYWN5X2xhYmVsX3R5cGVzXzEgZXh0ZW5kcyBQcmVkaWNhdGUuUDEgeworICBQUkVEX2dldF9sZWdhY3lfbGFiZWxfdHlwZXNfMShUZXJtIGExLCBPcGVyYXRpb24gbikgeworICAgIGFyZzEgPSBhMTsKKyAgICBjb250ID0gbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3BlcmF0aW9uIGV4ZWMoUHJvbG9nIGVuZ2luZSkgdGhyb3dzIFByb2xvZ0V4Y2VwdGlvbiB7CisgICAgZW5naW5lLnNldEIwKCk7CisgICAgVGVybSBhMSA9IGFyZzEuZGVyZWZlcmVuY2UoKTsKKworICAgIFByb2xvZ0Vudmlyb25tZW50IGVudiA9IChQcm9sb2dFbnZpcm9ubWVudCkgZW5naW5lLmNvbnRyb2w7CisgICAgUHJvamVjdFN0YXRlIHN0YXRlID0gZW52LmdldEluamVjdG9yKCkuZ2V0SW5zdGFuY2UoUHJvamVjdENhY2hlLmNsYXNzKQorICAgICAgICAuZ2V0KFN0b3JlZFZhbHVlcy5DSEFOR0UuZ2V0KGVuZ2luZSkuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpKTsKKyAgICBpZiAoc3RhdGUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgfQorICAgIExpc3Q8TGFiZWxUeXBlPiBsaXN0ID0gc3RhdGUuZ2V0TGFiZWxUeXBlcygpLmdldExhYmVsVHlwZXMoKTsKKyAgICBUZXJtIGhlYWQgPSBQcm9sb2cuTmlsOworICAgIGZvciAoaW50IGlkeCA9IGxpc3Quc2l6ZSgpIC0gMTsgMCA8PSBpZHg7IGlkeC0tKSB7CisgICAgICBoZWFkID0gbmV3IExpc3RUZXJtKGV4cG9ydChsaXN0LmdldChpZHgpKSwgaGVhZCk7CisgICAgfQorCisgICAgaWYgKCFhMS51bmlmeShoZWFkLCBlbmdpbmUudHJhaWwpKSB7CisgICAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnQ7CisgIH0KKworICBzdGF0aWMgZmluYWwgU3ltYm9sVGVybSBzeW1MYWJlbFR5cGUgPSBTeW1ib2xUZXJtLmludGVybigKKyAgICAgICJsYWJlbF90eXBlIiwgNCk7CisKKyAgc3RhdGljIFRlcm0gZXhwb3J0KExhYmVsVHlwZSB0eXBlKSB7CisgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVUZXJtKHN5bUxhYmVsVHlwZSwKKyAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4odHlwZS5nZXROYW1lKCkpLAorICAgICAgICBTeW1ib2xUZXJtLmludGVybih0eXBlLmdldEZ1bmN0aW9uTmFtZSgpKSwKKyAgICAgICAgbmV3IEludGVnZXJUZXJtKHR5cGUuZ2V0TWluKCkuZ2V0VmFsdWUoKSksCisgICAgICAgIG5ldyBJbnRlZ2VyVGVybSh0eXBlLmdldE1heCgpLmdldFZhbHVlKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX3Byb2plY3RfZGVmYXVsdF9zdWJtaXRfdHlwZV8xLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfcHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlXzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE3M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX3Byb2plY3RfZGVmYXVsdF9zdWJtaXRfdHlwZV8xLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGdlcnJpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CisKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLk9wZXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZzsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlN5bWJvbFRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworCitwdWJsaWMgY2xhc3MgUFJFRF9wcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGVfMSBleHRlbmRzIFByZWRpY2F0ZS5QMSB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3ltYm9sVGVybVtdIHRlcm07CisKKyAgc3RhdGljIHsKKyAgICBTdWJtaXRUeXBlW10gdmFsID0gU3VibWl0VHlwZS52YWx1ZXMoKTsKKyAgICB0ZXJtID0gbmV3IFN5bWJvbFRlcm1bdmFsLmxlbmd0aF07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHsKKyAgICAgIHRlcm1baV0gPSBTeW1ib2xUZXJtLmNyZWF0ZSh2YWxbaV0ubmFtZSgpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgUFJFRF9wcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGVfMShUZXJtIGExLCBPcGVyYXRpb24gbikgeworICAgIGFyZzEgPSBhMTsKKyAgICBjb250ID0gbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3BlcmF0aW9uIGV4ZWMoUHJvbG9nIGVuZ2luZSkgdGhyb3dzIFByb2xvZ0V4Y2VwdGlvbiB7CisgICAgZW5naW5lLnNldEIwKCk7CisgICAgVGVybSBhMSA9IGFyZzEuZGVyZWZlcmVuY2UoKTsKKworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IFN0b3JlZFZhbHVlcy5DSEFOR0VfQ09OVFJPTC5nZXQoZW5naW5lKTsKKyAgICBTdWJtaXRUeXBlIHN1Ym1pdFR5cGUgPSBjb250cm9sLmdldFByb2plY3QoKS5nZXRTdWJtaXRUeXBlKCk7CisKKyAgICBpZiAoIWExLnVuaWZ5KHRlcm1bc3VibWl0VHlwZS5vcmRpbmFsKCldLCBlbmdpbmUudHJhaWwpKSB7CisgICAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcHJvbG9nL2dlcnJpdF9jb21tb24ucGwgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Byb2xvZy9nZXJyaXRfY29tbW9uLnBsCmluZGV4IGE3NWFjYzAuLjcxZTczODMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcHJvbG9nL2dlcnJpdF9jb21tb24ucGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9wcm9sb2cvZ2Vycml0X2NvbW1vbi5wbApAQCAtMTQwLDEyICsxNDAsMTIgQEAKIDotIHB1YmxpYyBjYW5fc3VibWl0LzIuCiAlJQogY2FuX3N1Ym1pdChTdWJtaXRSdWxlLCBTKSA6LQotICBjYWxsX3N1Ym1pdF9ydWxlKFN1Ym1pdFJ1bGUsIFRtcCksCisgIGNhbGxfcnVsZShTdWJtaXRSdWxlLCBUbXApLAogICBUbXAgPS4uIFtzdWJtaXQgfCBMc10sCiAgICggaXNfYWxsX29rKExzKSAtPiBTID0gb2soVG1wKSwgISA7IFMgPSBub3RfcmVhZHkoVG1wKSApLgogCi1jYWxsX3N1Ym1pdF9ydWxlKFA6WCwgQXJnKSA6LSAhLCBGID0uLiBbWCwgQXJnXSwgUDpGLgotY2FsbF9zdWJtaXRfcnVsZShYLCBBcmcpIDotICEsIEYgPS4uIFtYLCBBcmddLCBGLgorY2FsbF9ydWxlKFA6WCwgQXJnKSA6LSAhLCBGID0uLiBbWCwgQXJnXSwgUDpGLgorY2FsbF9ydWxlKFgsIEFyZykgOi0gISwgRiA9Li4gW1gsIEFyZ10sIEYuCiAKIGlzX2FsbF9vayhbXSkuCiBpc19hbGxfb2soW2xhYmVsKF8sIG9rKF9fKSkgfCBMc10pIDotIGlzX2FsbF9vayhMcykuCkBAIC0xNTUsNiArMTU1LDIxIEBACiAKICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKICUlCislJSBsb2NhdGVfaGVscGVyCislJQorJSUgICBSZXR1cm5zIHVzZXI6RnVuYyBpZiBpdCBleGlzdHMgb3RoZXJ3aXNlIHJldHVybnMgZ2Vycml0OkRlZmF1bHQKKworbG9jYXRlX2hlbHBlcihGdW5jLCBEZWZhdWx0LCBBcml0eSwgdXNlcjpGdW5jKSA6LQorICAgICckY29tcGlsZWRfcHJlZGljYXRlJyh1c2VyLCBGdW5jLCBBcml0eSksICEuCitsb2NhdGVfaGVscGVyKEZ1bmMsIERlZmF1bHQsIEFyaXR5LCB1c2VyOkZ1bmMpIDotCisgICAgbGlzdE4oQXJpdHksIFApLCBDID0uLiBbRnVuYyB8IFBdLCBjbGF1c2UodXNlcjpDLCBfKSwgIS4KK2xvY2F0ZV9oZWxwZXIoRnVuYywgRGVmYXVsdCwgXywgZ2Vycml0OkRlZmF1bHQpLgorCitsaXN0TigwLCBbXSkuCitsaXN0TihOLCBbX3xUXSkgOi0gTiA+IDAsIE4xIGlzIE4gLSAxLCBsaXN0TihOMSwgVCkuCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUlCiAlJSBsb2NhdGVfc3VibWl0X3J1bGUvMToKICUlCiAlJSAgIEZpbmRzIGEgc3VibWl0X3J1bGUgZGVwZW5kaW5nIG9uIHdoYXQgcnVsZXMgYXJlIGF2YWlsYWJsZS4KQEAgLTE2NCwxNyArMTc5LDMyIEBACiAlJQogCiBsb2NhdGVfc3VibWl0X3J1bGUoUnVsZU5hbWUpIDotCi0gICckY29tcGlsZWRfcHJlZGljYXRlJyh1c2VyLCBzdWJtaXRfcnVsZSwgMSksCi0gICEsCi0gIFJ1bGVOYW1lID0gdXNlcjpzdWJtaXRfcnVsZQotICAuCi1sb2NhdGVfc3VibWl0X3J1bGUoUnVsZU5hbWUpIDotCi0gIGNsYXVzZSh1c2VyOnN1Ym1pdF9ydWxlKF8pLCBfKSwKLSAgISwKLSAgUnVsZU5hbWUgPSB1c2VyOnN1Ym1pdF9ydWxlCi0gIC4KLWxvY2F0ZV9zdWJtaXRfcnVsZShSdWxlTmFtZSkgOi0KLSAgUnVsZU5hbWUgPSBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXQuCisgIGxvY2F0ZV9oZWxwZXIoc3VibWl0X3J1bGUsIGRlZmF1bHRfc3VibWl0LCAxLCBSdWxlTmFtZSkuCisKKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIGdldF9zdWJtaXRfdHlwZS8yOgorJSUKKyUlICAgRXhlY3V0ZXMgdGhlIFN1Ym1pdFR5cGVSdWxlIGFuZCByZXR1cm4gdGhlIGZpcnN0IHNvbHV0aW9uCislJQorOi0gcHVibGljIGdldF9zdWJtaXRfdHlwZS8yLgorJSUKK2dldF9zdWJtaXRfdHlwZShTdWJtaXRUeXBlUnVsZSwgQSkgOi0KKyAgY2FsbF9ydWxlKFN1Ym1pdFR5cGVSdWxlLCBBKSwgIS4KKworCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislJQorJSUgbG9jYXRlX3N1Ym1pdF90eXBlLzE6CislJQorJSUgICBGaW5kcyBhIHN1Ym1pdF90eXBlX3J1bGUgZGVwZW5kaW5nIG9uIHdoYXQgcnVsZXMgYXJlIGF2YWlsYWJsZS4KKyUlICAgSWYgbm9uZSBhcmUgYXZhaWxhYmxlLCB1c2UgcHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlLzEuCislJQorOi0gcHVibGljIGxvY2F0ZV9zdWJtaXRfdHlwZS8xLgorJSUKK2xvY2F0ZV9zdWJtaXRfdHlwZShSdWxlTmFtZSkgOi0KKyAgbG9jYXRlX2hlbHBlcihzdWJtaXRfdHlwZSwgcHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlLCAxLCBSdWxlTmFtZSkuCiAKIAogJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQpAQCAtMTg0LDIyICsyMTQsMjIgQEAKIDotIHB1YmxpYyBkZWZhdWx0X3N1Ym1pdC8xLgogJSUKIGRlZmF1bHRfc3VibWl0KFApIDotCi0gIGdldF9sZWdhY3lfYXBwcm92YWxfdHlwZXMoQXBwcm92YWxUeXBlcyksCi0gIGRlZmF1bHRfc3VibWl0KEFwcHJvdmFsVHlwZXMsIFApLgorICBnZXRfbGVnYWN5X2xhYmVsX3R5cGVzKExhYmVsVHlwZXMpLAorICBkZWZhdWx0X3N1Ym1pdChMYWJlbFR5cGVzLCBQKS4KIAogJSBBcHBseSB0aGUgb2xkICJhbGwgYXBwcm92YWwgY2F0ZWdvcmllcyBtdXN0IGJlIHNhdGlzZmllZCIKLSUgbG9vcCBieSBzY2FubmluZyBvdmVyIGFsbCBvZiB0aGUgYXBwcm92YWwgdHlwZXMgdG8gYnVpbGQKLSUgdXAgdGhlIHN1Ym1pdCByZWNvcmQuCislIGxvb3AgYnkgc2Nhbm5pbmcgb3ZlciBhbGwgb2YgdGhlIGxhYmVsIHR5cGVzIHRvIGJ1aWxkIHVwIHRoZQorJSBzdWJtaXQgcmVjb3JkLgogJQotZGVmYXVsdF9zdWJtaXQoQXBwcm92YWxUeXBlcywgUCkgOi0KLSAgZGVmYXVsdF9zdWJtaXQoQXBwcm92YWxUeXBlcywgW10sIFRtcCksCitkZWZhdWx0X3N1Ym1pdChMYWJlbFR5cGVzLCBQKSA6LQorICBkZWZhdWx0X3N1Ym1pdChMYWJlbFR5cGVzLCBbXSwgVG1wKSwKICAgcmV2ZXJzZShUbXAsIExzKSwKICAgUCA9Li4gWyBzdWJtaXQgfCBMc10uCiAKIGRlZmF1bHRfc3VibWl0KFtdLCBPdXQsIE91dCkuCiBkZWZhdWx0X3N1Ym1pdChbVHlwZSB8IFR5cGVzXSwgVG1wLCBPdXQpIDotCi0gIGFwcHJvdmFsX3R5cGUoTGFiZWwsIElkLCBGdW4sIE1pbiwgTWF4KSA9IFR5cGUsCi0gIGxlZ2FjeV9zdWJtaXRfcnVsZShGdW4sIExhYmVsLCBJZCwgTWluLCBNYXgsIFN0YXR1cyksCisgIGxhYmVsX3R5cGUoTGFiZWwsIEZ1biwgTWluLCBNYXgpID0gVHlwZSwKKyAgbGVnYWN5X3N1Ym1pdF9ydWxlKEZ1biwgTGFiZWwsIE1pbiwgTWF4LCBTdGF0dXMpLAogICBSID0gbGFiZWwoTGFiZWwsIFN0YXR1cyksCiAgIGRlZmF1bHRfc3VibWl0KFR5cGVzLCBbUiB8IFRtcF0sIE91dCkuCiAKQEAgLTIwOCwxMiArMjM4LDExIEBACiAlJQogJSUgQXBwbHkgdGhlIG9sZCAtMi4uKzIgc3R5bGUgbG9naWMuCiAlJQotbGVnYWN5X3N1Ym1pdF9ydWxlKCdNYXhXaXRoQmxvY2snLCBMYWJlbCwgSWQsIE1pbiwgTWF4LCBUKSA6LSAhLCBtYXhfd2l0aF9ibG9jayhMYWJlbCwgTWluLCBNYXgsIFQpLgotbGVnYWN5X3N1Ym1pdF9ydWxlKCdNYXhOb0Jsb2NrJywgTGFiZWwsIElkLCBNaW4sIE1heCwgVCkgOi0gISwgbWF4X25vX2Jsb2NrKExhYmVsLCBNYXgsIFQpLgotbGVnYWN5X3N1Ym1pdF9ydWxlKCdOb0Jsb2NrJywgTGFiZWwsIElkLCBNaW4sIE1heCwgVCkgOi0gISwgVCA9IG1heShfKS4KLWxlZ2FjeV9zdWJtaXRfcnVsZSgnTm9PcCcsIExhYmVsLCBJZCwgTWluLCBNYXgsIFQpIDotICEsIFQgPSBtYXkoXykuCi1sZWdhY3lfc3VibWl0X3J1bGUoRnVuLCBMYWJlbCwgSWQsIE1pbiwgTWF4LCBUKSA6LSBUID0gaW1wb3NzaWJsZSh1bnN1cHBvcnRlZChGdW4pKS4KLQorbGVnYWN5X3N1Ym1pdF9ydWxlKCdNYXhXaXRoQmxvY2snLCBMYWJlbCwgTWluLCBNYXgsIFQpIDotICEsIG1heF93aXRoX2Jsb2NrKExhYmVsLCBNaW4sIE1heCwgVCkuCitsZWdhY3lfc3VibWl0X3J1bGUoJ01heE5vQmxvY2snLCBMYWJlbCwgTWluLCBNYXgsIFQpIDotICEsIG1heF9ub19ibG9jayhMYWJlbCwgTWF4LCBUKS4KK2xlZ2FjeV9zdWJtaXRfcnVsZSgnTm9CbG9jaycsIExhYmVsLCBNaW4sIE1heCwgVCkgOi0gISwgVCA9IG1heShfKS4KK2xlZ2FjeV9zdWJtaXRfcnVsZSgnTm9PcCcsIExhYmVsLCBNaW4sIE1heCwgVCkgOi0gISwgVCA9IG1heShfKS4KK2xlZ2FjeV9zdWJtaXRfcnVsZShGdW4sIExhYmVsLCBNaW4sIE1heCwgVCkgOi0gVCA9IGltcG9zc2libGUodW5zdXBwb3J0ZWQoRnVuKSkuCiAKICUlIG1heF93aXRoX2Jsb2NrOgogJSUKQEAgLTIyMiw2ICsyNTEsMTAgQEAKICUlCiA6LSBwdWJsaWMgbWF4X3dpdGhfYmxvY2svNC4KICUlCittYXhfd2l0aF9ibG9jayhNaW4sIE1heCwgTGFiZWwsIGxhYmVsKExhYmVsLCBTKSkgOi0KKyAgbnVtYmVyKE1pbiksIG51bWJlcihNYXgpLCBhdG9tKExhYmVsKSwKKyAgISwKKyAgbWF4X3dpdGhfYmxvY2soTGFiZWwsIE1pbiwgTWF4LCBTKS4KIG1heF93aXRoX2Jsb2NrKExhYmVsLCBNaW4sIE1heCwgcmVqZWN0KFdobykpIDotCiAgIGNoZWNrX2xhYmVsX3JhbmdlX3Blcm1pc3Npb24oTGFiZWwsIE1pbiwgb2soV2hvKSksCiAgICEKQEAgLTMwNiw2ICszMzksMTcgQEAKIGNhbGxfc3VibWl0X2ZpbHRlcihQOlgsIFIsIFMpIDotICEsIEYgPS4uIFtYLCBSLCBTXSwgUDpGLgogY2FsbF9zdWJtaXRfZmlsdGVyKFgsIFIsIFMpIDotIEYgPS4uIFtYLCBSLCBTXSwgRi4KIAorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIGZpbHRlcl9zdWJtaXRfdHlwZV9yZXN1bHRzLzM6CislJQorJSUgICBFeGVjdXRlcyB0aGUgc3VibWl0X3R5cGVfZmlsdGVyIGFnYWluc3QgdGhlIHJlc3VsdCwKKyUlICAgcmV0dXJucyB0aGUgZmlsdGVyZWQgcmVzdWx0LgorJSUKKzotIHB1YmxpYyBmaWx0ZXJfc3VibWl0X3R5cGVfcmVzdWx0cy8zLgorJSUKK2ZpbHRlcl9zdWJtaXRfdHlwZV9yZXN1bHRzKEZpbHRlciwgSW4sIE91dCkgOi0gY2FsbF9zdWJtaXRfZmlsdGVyKEZpbHRlciwgSW4sIE91dCkuCisKIAogJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQogJSUKQEAgLTMxNiwxNSArMzYwLDI2IEBACiA6LSBwdWJsaWMgbG9jYXRlX3N1Ym1pdF9maWx0ZXIvMS4KICUlCiBsb2NhdGVfc3VibWl0X2ZpbHRlcihGaWx0ZXJOYW1lKSA6LQotICAnJGNvbXBpbGVkX3ByZWRpY2F0ZScodXNlciwgc3VibWl0X2ZpbHRlciwgMiksCi0gICEsCi0gIEZpbHRlck5hbWUgPSB1c2VyOnN1Ym1pdF9maWx0ZXIKLSAgLgotbG9jYXRlX3N1Ym1pdF9maWx0ZXIoRmlsdGVyTmFtZSkgOi0KLSAgY2xhdXNlKHVzZXI6c3VibWl0X2ZpbHRlcihfLF8pLCBfKSwKLSAgRmlsdGVyTmFtZSA9IHVzZXI6c3VibWl0X2ZpbHRlcgotICAuCisgIGxvY2F0ZV9oZWxwZXIoc3VibWl0X2ZpbHRlciwgbm9vcF9maWx0ZXIsIDIsIEZpbHRlck5hbWUpLgogCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislJQorJSUgbm9vcF9maWx0ZXIvMjoKKyUlCis6LSBwdWJsaWMgbm9vcF9maWx0ZXIvMi4KKyUlCitub29wX2ZpbHRlcihJbiwgSW4pLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislJQorJSUgbG9jYXRlX3N1Ym1pdF90eXBlX2ZpbHRlci8xOgorJSUKKyUlICAgRmluZHMgYSBzdWJtaXRfdHlwZV9maWx0ZXIgaWYgYXZhaWxhYmxlLgorJSUKKzotIHB1YmxpYyBsb2NhdGVfc3VibWl0X3R5cGVfZmlsdGVyLzEuCislJQorbG9jYXRlX3N1Ym1pdF90eXBlX2ZpbHRlcihGaWx0ZXJOYW1lKSA6LQorICBsb2NhdGVfaGVscGVyKHN1Ym1pdF90eXBlX2ZpbHRlciwgbm9vcF9maWx0ZXIsIDIsIEZpbHRlck5hbWUpLgogCiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiAlJQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzg0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZU1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSw4IEBACisjIENoYW5nZXMgdG8gdGhpcyBmaWxlIHNob3VsZCBhbHNvIGJlIG1hZGUgaW4KKyMgZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcworcmV2ZXJ0Q2hhbmdlRGVmYXVsdE1lc3NhZ2UgPSBSZXZlcnQgXCJ7MH1cIlxuXG5UaGlzIHJldmVydHMgY29tbWl0IHsxfQorcmV2aWV3ZXJOb3RGb3VuZCA9IHswfSBkb2VzIG5vdCBpZGVudGlmeSBhIHJlZ2lzdGVyZWQgdXNlciBvciBncm91cAorCitncm91cElzTm90QWxsb3dlZCA9ICBUaGUgZ3JvdXAgezB9IGNhbm5vdCBiZSBhZGRlZCBhcyByZXZpZXdlci4KK2dyb3VwSGFzVG9vTWFueU1lbWJlcnMgPSBUaGUgZ3JvdXAgezB9IGhhcyB0b28gbWFueSBtZW1iZXJzIHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnMuCitncm91cE1hbnlNZW1iZXJzQ29uZmlybWF0aW9uID0gVGhlIGdyb3VwIHswfSBoYXMgezF9IG1lbWJlcnMuIERvIHlvdSB3YW50IHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnM/CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VTdWJqZWN0LnZtIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlU3ViamVjdC52bQppbmRleCBhNjdjMzhjLi5hY2VjMWQxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VTdWJqZWN0LnZtCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NoYW5nZVN1YmplY3Qudm0KQEAgLTMxLDcgKzMxLDcgQEAKICMjIFRoZSBDaGFuZ2VTdWJqZWN0LnZtIHRlbXBsYXRlIHdpbGwgZGV0ZXJtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgZW1haWwKICMjIHN1YmplY3QgbGluZSBmb3IgQUxMIGVtYWlscyByZWxhdGVkIHRvIGNoYW5nZXMuCiAjIwotI21hY3JvKGVsaXBzZXMgJGxlbmd0aCAkc3RyKQotI2lmKCRzdHIubGVuZ3RoKCkgPiAkbGVuZ3RoKSR7c3RyLnN1YnN0cmluZygwLCRsZW5ndGgpfS4uLiNlbHNlJHN0ciNlbmQKKyNtYWNybyhlbGxpcHNpcyAkbGVuZ3RoICRzdHIpCisjaWYoJHN0ci5sZW5ndGgoKSA+ICRsZW5ndGgpI3NldCgkbGVuZ3RoID0gJGxlbmd0aCAtIDMpJHtzdHIuc3Vic3RyaW5nKDAsJGxlbmd0aCl9Li4uI2Vsc2Ukc3RyI2VuZAogI2VuZAotQ2hhbmdlIGluICRwcm9qZWN0TmFtZS5yZXBsYWNlQWxsKCcvLiovJywgJy4uLicpWyRicmFuY2guc2hvcnROYW1lXTogI2VsaXBzZXMoNjAsICRjaGFuZ2Uuc3ViamVjdCkKK0NoYW5nZSBpbiAkcHJvamVjdE5hbWUucmVwbGFjZUFsbCgnLy4qLycsICcuLi4nKVskYnJhbmNoLnNob3J0TmFtZV06ICNlbGxpcHNpcyg2MywgJGNoYW5nZS5zdWJqZWN0KQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudC52bSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnQudm0KaW5kZXggOWFmOThhNi4uZTY0Njc3ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudC52bQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50LnZtCkBAIC0zMCw5ICszMCw5IEBACiAjIyAtLS0tLS0tLS0tLS0tLQogIyMgVGhlIENvbW1lbnQudm0gdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbCByZWxhdGVkIHRvCiAjIyBhIHVzZXIgc3VibWl0dGluZyBjb21tZW50cyBvbiBjaGFuZ2VzLiAgSXQgaXMgYSBDaGFuZ2VFbWFpbDogc2VlCi0jIyBDaGFuZ2VTdWJqZWN0LnZtIGFuZCBDaGFuZ2VGb290ZXIudm0uCisjIyBDaGFuZ2VTdWJqZWN0LnZtLCBDaGFuZ2VGb290ZXIudm0gYW5kIENvbW1lbnRGb290ZXIudm0uCiAjIwotI2lmICgkZW1haWwuY292ZXJMZXR0ZXIgfHwgJGVtYWlsLmlubGluZUNvbW1lbnRzKQorI2lmICgkZW1haWwuY292ZXJMZXR0ZXIgfHwgJGVtYWlsLmhhc0lubGluZUNvbW1lbnRzKCkpCiAkZnJvbU5hbWUgaGFzIHBvc3RlZCBjb21tZW50cyBvbiB0aGlzIGNoYW5nZS4KIAogQ2hhbmdlIHN1YmplY3Q6ICRjaGFuZ2Uuc3ViamVjdApAQCAtNDUsOSArNDUsOSBAQAogI2VuZAogIyMKICMjIEl0IGlzIHBvc3NpYmxlIHRvIGluY3JlYXNlIHRoZSBzcGFuIG9mIHRoZSBxdW90ZWQgbGluZXMgYnkgdXNpbmcgdGhlIGxpbmUKLSMjIGNvdW50IHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgJGVtYWlsLmlubGluZUNvbW1lbnRzIGFzIGEgZnVuY3Rpb24uCisjIyBjb3VudCBwYXJhbWV0ZXIgd2hlbiBjYWxsaW5nICRlbWFpbC5nZXRJbmxpbmVDb21tZW50cyBhcyBhIGZ1bmN0aW9uLgogIyMKLSMjIEV4YW1wbGU6ICNpZigkZW1haWwuaW5saW5lQ29tbWVudHMpJGVtYWlsLmdldElubGluZUNvbW1lbnRzKDUpI2VuZAorIyMgRXhhbXBsZTogI2lmKCRlbWFpbC5oYXNJbmxpbmVDb21tZW50cygpKSRlbWFpbC5nZXRJbmxpbmVDb21tZW50cyg1KSNlbmQKICMjCi0jaWYoJGVtYWlsLmlubGluZUNvbW1lbnRzKSRlbWFpbC5pbmxpbmVDb21tZW50cyNlbmQKKyNpZigkZW1haWwuaGFzSW5saW5lQ29tbWVudHMoKSkkZW1haWwuaW5saW5lQ29tbWVudHMjZW5kCiAjZW5kCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50Rm9vdGVyLnZtIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudEZvb3Rlci52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgzMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudEZvb3Rlci52bQpAQCAtMCwwICsxLDQwIEBACisjIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIworIyMKKyMjIFRlbXBsYXRlIFR5cGU6CisjIyAtLS0tLS0tLS0tLS0tCisjIyBUaGlzIGlzIGEgdmVsb2NpdHkgbWFpbCB0ZW1wbGF0ZSwgc2VlOiBodHRwOi8vdmVsb2NpdHkuYXBhY2hlLm9yZyBhbmQgdGhlCisjIyBnZXJyaXQtZG9jczpjb25maWctbWFpbC50eHQgZm9yIG1vcmUgaW5mbyBvbiBtb2RpZnlpbmcgZ2Vycml0IG1haWwgdGVtcGxhdGVzLgorIyMKKyMjIFRlbXBsYXRlIEZpbGUgTmFtZXMgYW5kIGV4dGVuc2lvbnM6CisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBHZXJyaXQgd2lsbCB1c2UgdGVtcGxhdGVzIGVuZGluZyBpbiAiLnZtIiBidXQgd2lsbCBpZ25vcmUgdGVtcGxhdGVzIGVuZGluZworIyMgaW4gIi52bS5leGFtcGxlIi4gIElmIGEgLnZtIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LCB0aGUgZGVmYXVsdCBpbnRlcm5hbAorIyMgZ2Vycml0IHRlbXBsYXRlIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSAudm0uZXhhbXBsZSB3aWxsIGJlIHVzZWQuICBJZiB5b3UKKyMjIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGVtcGxhdGUsIGNvcHkgdGhlIC52bS5leGFtcGxlIGZpbGUgdG8gYSAudm0KKyMjIGZpbGUgYW5kIGVkaXQgaXQgYXBwcm9wcmlhdGVseS4KKyMjCisjIyBUaGlzIFRlbXBsYXRlOgorIyMgLS0tLS0tLS0tLS0tLS0KKyMjIFRoZSBDb21tZW50Rm9vdGVyLnZtIHRlbXBsYXRlIHdpbGwgZGV0ZXJtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgZm9vdGVyCisjIyB0ZXh0IHRoYXQgd2lsbCBiZSBhcHBlbmRlZCB0byBlbWFpbHMgcmVsYXRlZCB0byBhIHVzZXIgc3VibWl0dGluZyBjb21tZW50cworIyMgb24gY2hhbmdlcy4KKyMjCisjIyBTZWUgQ2hhbmdlU3ViamVjdC52bSBhbmQgQ2hhbmdlRm9vdGVyLnZtLgorI2lmKCRlbWFpbC5oYXNJbmxpbmVDb21tZW50cygpKQorR2Vycml0LUhhc0NvbW1lbnRzOiBZZXMKKyNlbHNlCitHZXJyaXQtSGFzQ29tbWVudHM6IE5vCisjZW5kCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21taXRNZXNzYWdlRWRpdGVkLnZtIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWl0TWVzc2FnZUVkaXRlZC52bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTgzMTAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWl0TWVzc2FnZUVkaXRlZC52bQpAQCAtMCwwICsxLDU0IEBACisjIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIyMKKyMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIworIyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIworIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIworIyMKKyMjIFRlbXBsYXRlIFR5cGU6CisjIyAtLS0tLS0tLS0tLS0tCisjIyBUaGlzIGlzIGEgdmVsb2NpdHkgbWFpbCB0ZW1wbGF0ZSwgc2VlOiBodHRwOi8vdmVsb2NpdHkuYXBhY2hlLm9yZyBhbmQgdGhlCisjIyBnZXJyaXQtZG9jczpjb25maWctbWFpbC50eHQgZm9yIG1vcmUgaW5mbyBvbiBtb2RpZnlpbmcgZ2Vycml0IG1haWwgdGVtcGxhdGVzLgorIyMKKyMjIFRlbXBsYXRlIEZpbGUgTmFtZXMgYW5kIGV4dGVuc2lvbnM6CisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBHZXJyaXQgd2lsbCB1c2UgdGVtcGxhdGVzIGVuZGluZyBpbiAiLnZtIiBidXQgd2lsbCBpZ25vcmUgdGVtcGxhdGVzIGVuZGluZworIyMgaW4gIi52bS5leGFtcGxlIi4gIElmIGEgLnZtIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LCB0aGUgZGVmYXVsdCBpbnRlcm5hbAorIyMgZ2Vycml0IHRlbXBsYXRlIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSAudm0uZXhhbXBsZSB3aWxsIGJlIHVzZWQuICBJZiB5b3UKKyMjIHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGVtcGxhdGUsIGNvcHkgdGhlIC52bS5leGFtcGxlIGZpbGUgdG8gYSAudm0KKyMjIGZpbGUgYW5kIGVkaXQgaXQgYXBwcm9wcmlhdGVseS4KKyMjCisjIyBUaGlzIFRlbXBsYXRlOgorIyMgLS0tLS0tLS0tLS0tLS0KKyMjIFRoZSBDb21taXRNZXNzYWdlVXBkYXRlZC52bSB0ZW1wbGF0ZSB3aWxsIGRldGVybWluZSB0aGUgY29udGVudHMgb2YgdGhlIGVtYWlsCisjIyByZWxhdGVkIHRvIGEgdXNlciBlZGl0aW5nIHRoZSBjb21taXQgbWVzc2FnZSBmb3IgYSBjaGFuZ2UgdGhyb3VnaCB0aGUgR2Vycml0IFVJLgorIyMgSXQgaXMgYSBDaGFuZ2VFbWFpbDogc2VlIENoYW5nZVN1YmplY3Qudm0gYW5kIENoYW5nZUZvb3Rlci52bS4KKyMjCisjaWYoJGVtYWlsLnJldmlld2VyTmFtZXMpCitIZWxsbyAkZW1haWwuam9pblN0cmluZ3MoJGVtYWlsLnJldmlld2VyTmFtZXMsICcsICcpLAorCitJJ2QgbGlrZSB5b3UgdG8gcmVleGFtaW5lIGEgY2hhbmdlLiNpZigkZW1haWwuY2hhbmdlVXJsKSAgUGxlYXNlIHZpc2l0CisKKyAgICAkZW1haWwuY2hhbmdlVXJsCisKK3RvIGxvb2sgYXQgdGhlIG5ldyBwYXRjaCBzZXQgd2l0aCBlZGl0ZWQgY29tbWl0IG1lc3NhZ2UgKCMkcGF0Y2hTZXQucGF0Y2hTZXRJZCkuCisjZW5kCisjZWxzZQorJGZyb21OYW1lIGhhcyBjcmVhdGVkIGEgbmV3IHBhdGNoIHNldCBieSBlZGl0aW5nIHRoZSBjb21taXQgbWVzc2FnZSBpbiBHZXJyaXQgKCMkcGF0Y2hTZXQucGF0Y2hTZXRJZCkuCisjZW5kCisKK0NoYW5nZSBzdWJqZWN0OiAkY2hhbmdlLnN1YmplY3QKKy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworJGVtYWlsLmNoYW5nZURldGFpbAorI2lmKCRlbWFpbC5zc2hIb3N0KQorICBnaXQgcHVsbCBzc2g6Ly8kZW1haWwuc3NoSG9zdC8kcHJvamVjdE5hbWUgJHBhdGNoU2V0LnJlZk5hbWUKKyNlbmQKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZC52bSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZC52bQppbmRleCBiY2JjN2JkLi4yMmUyOWU4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZWQudm0KKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkLnZtCkBAIC0zMiw5ICszMiw2IEBACiAjIyBhIGNoYW5nZSBzdWNjZXNzZnVsbHkgbWVyZ2VkIHRvIHRoZSBoZWFkLiAgSXQgaXMgYSBDaGFuZ2VFbWFpbDogc2VlCiAjIyBDaGFuZ2VTdWJqZWN0LnZtIGFuZCBDaGFuZ2VGb290ZXIudm0uCiAjIwotI21hY3JvKGVsaXBzZXMgJGxlbmd0aCAkc3RyKQotI2lmKCRzdHIubGVuZ3RoKCkgPiAkbGVuZ3RoKSR7c3RyLnN1YnN0cmluZygwLCRsZW5ndGgpfS4uLiNlbHNlJHN0ciNlbmQKLSNlbmQKICRmcm9tTmFtZSBoYXMgc3VibWl0dGVkIHRoaXMgY2hhbmdlIGFuZCBpdCB3YXMgbWVyZ2VkLgogCiBDaGFuZ2Ugc3ViamVjdDogJGNoYW5nZS5zdWJqZWN0CkBAIC00MiwzICszOSw3IEBACiAKIAogJGVtYWlsLmNoYW5nZURldGFpbCRlbWFpbC5hcHByb3ZhbHMKKworI2lmKCRlbWFpbC5pbmNsdWRlRGlmZikKKyRlbWFpbC5VbmlmaWVkRGlmZgorI2VuZApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Rvb2xzL3Jvb3QvaG9va3MvY29tbWl0LW1zZyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci90b29scy9yb290L2hvb2tzL2NvbW1pdC1tc2cKaW5kZXggMDY5MjZkZi4uYjI5ZTI1YyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Rvb2xzL3Jvb3QvaG9va3MvY29tbWl0LW1zZworKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdG9vbHMvcm9vdC9ob29rcy9jb21taXQtbXNnCkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJaWYgKHVucHJpbnRlZCkgewogCQkJcHJpbnQgIkNoYW5nZS1JZDogSSciJGlkIiciCiAJCX0KLQl9JyAiJE1TRyIgPiAkVCAmJiBtdiAkVCAiJE1TRyIgfHwgcm0gLWYgJFQKKwl9JyAiJE1TRyIgPiAiJFQiICYmIG12ICIkVCIgIiRNU0ciIHx8IHJtIC1mICIkVCIKIH0KIF9nZW5fQ2hhbmdlSWRJbnB1dCgpIHsKIAllY2hvICJ0cmVlIGBnaXQgd3JpdGUtdHJlZWAiCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvR2Vycml0Q29tbW9uVGVzdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL0dlcnJpdENvbW1vblRlc3QuamF2YQppbmRleCA5ZjJjY2JmLi45OGIwYjRhIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvR2Vycml0Q29tbW9uVGVzdC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9HZXJyaXRDb21tb25UZXN0LmphdmEKQEAgLTE0LDY4ICsxNCwxMTUgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgR2Vycml0Q29tbW9uVGVzdCBleHRlbmRzIFByb2xvZ1Rlc3RDYXNlIHsKKyAgcHJpdmF0ZSBQcm9qZWN0cyBwcm9qZWN0czsKKwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgZmluYWwgQXBwcm92YWxUeXBlcyB0eXBlcyA9IG5ldyBBcHByb3ZhbFR5cGVzKEFycmF5cy5hc0xpc3QoCi0gICAgICAgIGNvZGVSZXZpZXdDYXRlZ29yeSgpLAotICAgICAgICB2ZXJpZmllZENhdGVnb3J5KCkKLSAgICApKTsKLQorICAgIHByb2plY3RzID0gbmV3IFByb2plY3RzKG5ldyBMYWJlbFR5cGVzKEFycmF5cy5hc0xpc3QoCisgICAgICAgIGNhdGVnb3J5KCJDb2RlLVJldmlldyIsCisgICAgICAgICAgICB2YWx1ZSgyLCAiTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQiKSwKKyAgICAgICAgICAgIHZhbHVlKDEsICJMb29rcyBnb29kIHRvIG1lLCBidXQgc29tZW9uZSBlbHNlIG11c3QgYXBwcm92ZSIpLAorICAgICAgICAgICAgdmFsdWUoMCwgIk5vIHNjb3JlIiksCisgICAgICAgICAgICB2YWx1ZSgtMSwgIkkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcyIpLAorICAgICAgICAgICAgdmFsdWUoLTIsICJEbyBub3Qgc3VibWl0IikpLAorICAgICAgICBjYXRlZ29yeSgiVmVyaWZpZWQiLCB2YWx1ZSgxLCAiVmVyaWZpZWQiKSwKKyAgICAgICAgICAgIHZhbHVlKDAsICJObyBzY29yZSIpLCB2YWx1ZSgtMSwgIkZhaWxzIikpKSkpOwogICAgIGxvYWQoImdlcnJpdCIsICJnZXJyaXRfY29tbW9uX3Rlc3QucGwiLCBuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgYmluZChBcHByb3ZhbFR5cGVzLmNsYXNzKS50b0luc3RhbmNlKHR5cGVzKTsKKyAgICAgICAgYmluZChQcm9qZWN0Q2FjaGUuY2xhc3MpLnRvSW5zdGFuY2UocHJvamVjdHMpOwogICAgICAgfQogICAgIH0pOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQXBwcm92YWxUeXBlIGNvZGVSZXZpZXdDYXRlZ29yeSgpIHsKLSAgICBBcHByb3ZhbENhdGVnb3J5IGNhdCA9IGNhdGVnb3J5KDAsICJDUlZXIiwgIkNvZGUgUmV2aWV3Iik7Ci0gICAgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHMgPSBuZXdMaXN0KCk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAyLCAiTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAxLCAiTG9va3MgZ29vZCB0byBtZSwgYnV0IHNvbWVvbmUgZWxzZSBtdXN0IGFwcHJvdmUiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAwLCAiTm8gc2NvcmUiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAtMSwgIkkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcyIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIC0yLCAiRG8gbm90IHN1Ym1pdCIpKTsKLSAgICByZXR1cm4gbmV3IEFwcHJvdmFsVHlwZShjYXQsIHZhbHMpOworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXBFbnZpcm9ubWVudChQcm9sb2dFbnZpcm9ubWVudCBlbnYpIHsKKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0UsIG5ldyBDaGFuZ2UoCisgICAgICAgIG5ldyBDaGFuZ2UuS2V5KCJJYmVlZiIpLCBuZXcgQ2hhbmdlLklkKDEpLCBuZXcgQWNjb3VudC5JZCgyKSwKKyAgICAgICAgbmV3IEJyYW5jaC5OYW1lS2V5KHByb2plY3RzLmFsbFByb2plY3RzTmFtZSwgIm1hc3RlciIpKSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBBcHByb3ZhbFR5cGUgdmVyaWZpZWRDYXRlZ29yeSgpIHsKLSAgICBBcHByb3ZhbENhdGVnb3J5IGNhdCA9IGNhdGVnb3J5KDEsICJWUklGIiwgIlZlcmlmaWVkIik7Ci0gICAgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IHZhbHMgPSBuZXdMaXN0KCk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAxLCAiVmVyaWZpZWQiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAwLCAiTm8gc2NvcmUiKSk7Ci0gICAgdmFscy5hZGQodmFsdWUoY2F0LCAtMSwgIkZhaWxzIikpOwotICAgIHJldHVybiBuZXcgQXBwcm92YWxUeXBlKGNhdCwgdmFscyk7CisgIHByaXZhdGUgc3RhdGljIExhYmVsVmFsdWUgdmFsdWUoaW50IHZhbHVlLCBTdHJpbmcgdGV4dCkgeworICAgIHJldHVybiBuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIHZhbHVlLCB0ZXh0KTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkoaW50IHBvcywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0OwotICAgIGNhdCA9IG5ldyBBcHByb3ZhbENhdGVnb3J5KG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKGlkKSwgbmFtZSk7Ci0gICAgY2F0LnNldFBvc2l0aW9uKChzaG9ydCkgcG9zKTsKLSAgICByZXR1cm4gY2F0OworICBwcml2YXRlIHN0YXRpYyBMYWJlbFR5cGUgY2F0ZWdvcnkoU3RyaW5nIG5hbWUsIExhYmVsVmFsdWUuLi4gdmFsdWVzKSB7CisgICAgcmV0dXJuIG5ldyBMYWJlbFR5cGUobmFtZSwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IG5ld0xpc3QoKSB7Ci0gICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPigpOwotICB9CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RzIGltcGxlbWVudHMgUHJvamVjdENhY2hlIHsKKyAgICBwcml2YXRlIGZpbmFsIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0U3RhdGUgYWxsUHJvamVjdHM7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHZhbHVlKEFwcHJvdmFsQ2F0ZWdvcnkgYywgaW50IHYsIFN0cmluZyBuKSB7Ci0gICAgcmV0dXJuIG5ldyBBcHByb3ZhbENhdGVnb3J5VmFsdWUoCi0gICAgICAgIG5ldyBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQoYy5nZXRJZCgpLCAoc2hvcnQpIHYpLAotICAgICAgICBuKTsKKyAgICBwcml2YXRlIFByb2plY3RzKExhYmVsVHlwZXMgbGFiZWxUeXBlcykgeworICAgICAgYWxsUHJvamVjdHNOYW1lID0gbmV3IEFsbFByb2plY3RzTmFtZSgiQWxsLVByb2plY3RzIik7CisgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IG5ldyBQcm9qZWN0Q29uZmlnKGFsbFByb2plY3RzTmFtZSk7CisgICAgICBjb25maWcuY3JlYXRlSW5NZW1vcnkoKTsKKyAgICAgIGZvciAoTGFiZWxUeXBlIGxhYmVsIDogbGFiZWxUeXBlcy5nZXRMYWJlbFR5cGVzKCkpIHsKKyAgICAgICAgY29uZmlnLmdldExhYmVsU2VjdGlvbnMoKS5wdXQobGFiZWwuZ2V0TmFtZSgpLCBsYWJlbCk7CisgICAgICB9CisgICAgICBhbGxQcm9qZWN0cyA9IG5ldyBQcm9qZWN0U3RhdGUodGhpcywgYWxsUHJvamVjdHNOYW1lLCBudWxsLAorICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIGNvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByb2plY3RTdGF0ZSBnZXRBbGxQcm9qZWN0cygpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcm9qZWN0U3RhdGUgZ2V0KFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGFsbFByb2plY3RzTmFtZSwgcHJvamVjdE5hbWUpOworICAgICAgcmV0dXJuIGFsbFByb2plY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV2aWN0KFByb2plY3QgcCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlKFByb2plY3QgcCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPFByb2plY3QuTmFtZUtleT4gYWxsKCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3Vlc3NSZWxldmFudEdyb3VwVVVJRHMoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8UHJvamVjdC5OYW1lS2V5PiBieU5hbWUoU3RyaW5nIHByZWZpeCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGVQcm9qZWN0KFByb2plY3QuTmFtZUtleSBuZXdQcm9qZWN0TmFtZSkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJvbG9nVGVzdENhc2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dUZXN0Q2FzZS5qYXZhCmluZGV4IGNjOWQ0MGYuLjgzODA5YTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dUZXN0Q2FzZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dUZXN0Q2FzZS5qYXZhCkBAIC03OSw2ICs3OSw5IEBACiAgICAgbWFjaGluZSA9IFByb2xvZ01hY2hpbmVDb3B5LnNhdmUoZW52KTsKICAgfQogCisgIHByb3RlY3RlZCB2b2lkIHNldFVwRW52aXJvbm1lbnQoUHJvbG9nRW52aXJvbm1lbnQgZW52KSB7CisgIH0KKwogICBwcml2YXRlIFByb2xvZ01hY2hpbmVDb3B5IG5ld01hY2hpbmUoKSB7CiAgICAgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCBjdGwgPSBuZXcgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCgpOwogICAgIGN0bC5zZXRNYXhEYXRhYmFzZVNpemUoMTYgKiAxMDI0KTsKQEAgLTExNyw2ICsxMjAsNyBAQAogCiAgICAgZm9yIChUZXJtIHRlc3QgOiB0ZXN0cykgewogICAgICAgUHJvbG9nRW52aXJvbm1lbnQgZW52ID0gZW52RmFjdG9yeS5jcmVhdGUobWFjaGluZSk7CisgICAgICBzZXRVcEVudmlyb25tZW50KGVudik7CiAgICAgICBlbnYuc2V0RW5hYmxlZChQcm9sb2cuRmVhdHVyZS5JTywgdHJ1ZSk7CiAKICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJQcm9sb2cgJS02MHMgLi4uIiwgcmVtb3ZlUGFja2FnZSh0ZXN0KSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtb2R1bGVPcFRlc3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wVGVzdC5qYXZhCmluZGV4IDhkMDYxZWIuLjMyMmZmZTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wVGVzdC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wVGVzdC5qYXZhCkBAIC0xNCwxMCArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jYXB0dXJlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY3JlYXRlU3RyaWN0TW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmVxOwogaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwogaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwogaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CkBAIC0zNCw2ICszNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlN0YW5kYXJkS2V5RW5jb2RlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAoraW1wb3J0IG9yZy5lYXN5bW9jay5DYXB0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlRW50cnk7CkBAIC00Myw2ICs0Nyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKQEAgLTcyLDcgKzc3LDcgQEAKICAgcHJpdmF0ZSBSZXZpZXdEYiBzY2hlbWE7CiAgIHByaXZhdGUgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKICAgcHJpdmF0ZSBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLSAgcHJpdmF0ZSBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKIAogICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgQE92ZXJyaWRlCkBAIC04NSwyMiArOTAsMjIgQEAKICAgICBzdWJzY3JpcHRpb25zID0gY3JlYXRlU3RyaWN0TW9jayhTdWJtb2R1bGVTdWJzY3JpcHRpb25BY2Nlc3MuY2xhc3MpOwogICAgIHVybFByb3ZpZGVyID0gY3JlYXRlU3RyaWN0TW9jayhQcm92aWRlci5jbGFzcyk7CiAgICAgcmVwb01hbmFnZXIgPSBjcmVhdGVTdHJpY3RNb2NrKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzKTsKLSAgICByZXBsaWNhdGlvbiA9IGNyZWF0ZVN0cmljdE1vY2soR2l0UmVmZXJlbmNlVXBkYXRlZC5jbGFzcyk7CisgICAgZ2l0UmVmVXBkYXRlZCA9IGNyZWF0ZVN0cmljdE1vY2soR2l0UmVmZXJlbmNlVXBkYXRlZC5jbGFzcyk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9SZXBsYXkoKSB7CiAgICAgcmVwbGF5KHNjaGVtYUZhY3RvcnksIHNjaGVtYSwgc3Vic2NyaXB0aW9ucywgdXJsUHJvdmlkZXIsIHJlcG9NYW5hZ2VyLAotICAgICAgICByZXBsaWNhdGlvbik7CisgICAgICAgIGdpdFJlZlVwZGF0ZWQpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvVmVyaWZ5KCkgewogICAgIHZlcmlmeShzY2hlbWFGYWN0b3J5LCBzY2hlbWEsIHN1YnNjcmlwdGlvbnMsIHVybFByb3ZpZGVyLCByZXBvTWFuYWdlciwKLSAgICAgICAgcmVwbGljYXRpb24pOworICAgICAgICBnaXRSZWZVcGRhdGVkKTsKICAgfQogCiAgIC8qKgogICAgKiBJdCB0ZXN0cyBTdWJtb2R1bGUudXBkYXRlIGluIHRoZSBzY2VuYXJpbyBhIG1lcmdlZCBjb21taXQgaXMgYW4gZW1wdHkgb25lCi0gICAqIChpdCBkb2VzIG5vdCBoYXZlIGEgLmdpdG1vZHVsZSBmaWxlKSBhbmQgdGhlIHByb2plY3QgdGhlIGNvbW1pdCB3YXMgbWVyZ2VkCisgICAqIChpdCBkb2VzIG5vdCBoYXZlIGEgLmdpdG1vZHVsZXMgZmlsZSkgYW5kIHRoZSBwcm9qZWN0IHRoZSBjb21taXQgd2FzIG1lcmdlZAogICAgKiBpcyBub3QgYSBzdWJtb2R1bGUgb2Ygb3RoZXIgcHJvamVjdC4KICAgICoKICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KQEAgLTYwMywxNyArNjA4LDE3IEBACiAKICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvZGVSZXZpZXdDb21taXQgPQogICAgICAgICBuZXcgQ29kZVJldmlld0NvbW1pdChzb3VyY2VNZXJnZVRpcC50b09iamVjdElkKCkpOwotICAgIGZpbmFsIENoYW5nZSBzdWJtaXRlZENoYW5nZSA9CisgICAgZmluYWwgQ2hhbmdlIHN1Ym1pdHRlZENoYW5nZSA9CiAgICAgICAgIG5ldyBDaGFuZ2UobmV3IENoYW5nZS5LZXkoc291cmNlTWVyZ2VUaXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSksCiAgICAgICAgICAgICBuZXcgQ2hhbmdlLklkKDEpLCBuZXcgQWNjb3VudC5JZCgxKSwgc291cmNlQnJhbmNoTmFtZUtleSk7Ci0gICAgY29kZVJldmlld0NvbW1pdC5jaGFuZ2UgPSBzdWJtaXRlZENoYW5nZTsKKyAgICBjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZSA9IHN1Ym1pdHRlZENoYW5nZTsKIAogICAgIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IG1lcmdlZENvbW1pdHMgPQogICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+KCk7CiAgICAgbWVyZ2VkQ29tbWl0cy5wdXQoY29kZVJldmlld0NvbW1pdC5jaGFuZ2UuZ2V0SWQoKSwgY29kZVJldmlld0NvbW1pdCk7CiAKLSAgICBmaW5hbCBMaXN0PENoYW5nZT4gc3VibWl0ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5nZT4oKTsKLSAgICBzdWJtaXRlZC5hZGQoc3VibWl0ZWRDaGFuZ2UpOworICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5nZT4oKTsKKyAgICBzdWJtaXR0ZWQuYWRkKHN1Ym1pdHRlZENoYW5nZSk7CiAKICAgICBmaW5hbCBSZXBvc2l0b3J5IHRhcmdldFJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOwogICAgIGZpbmFsIEdpdCB0YXJnZXRHaXQgPSBuZXcgR2l0KHRhcmdldFJlcG9zaXRvcnkpOwpAQCAtNjM5LDggKzY0NCw5IEBACiAgICAgZXhwZWN0KHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpKQogICAgICAgICAuYW5kUmV0dXJuKHRhcmdldFJlcG9zaXRvcnkpOwogCi0gICAgcmVwbGljYXRpb24uZmlyZSh0YXJnZXRCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpLAotICAgICAgICB0YXJnZXRCcmFuY2hOYW1lS2V5LmdldCgpKTsKKyAgICBDYXB0dXJlPFJlZlVwZGF0ZT4gcnVDYXB0dXJlID0gbmV3IENhcHR1cmU8UmVmVXBkYXRlPigpOworICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShlcSh0YXJnZXRCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpKSwKKyAgICAgICAgY2FwdHVyZShydUNhcHR1cmUpKTsKIAogICAgIGV4cGVjdChzY2hlbWEuc3VibW9kdWxlU3Vic2NyaXB0aW9ucygpKS5hbmRSZXR1cm4oc3Vic2NyaXB0aW9ucyk7CiAgICAgZmluYWwgUmVzdWx0U2V0PFN1Ym1vZHVsZVN1YnNjcmlwdGlvbj4gZW1wdHlTdWJzY3JpcHRpb25zID0KQEAgLTY1OCwxMiArNjY0LDE0IEBACiAgICAgZmluYWwgU3VibW9kdWxlT3Agc3VibW9kdWxlT3AgPQogICAgICAgICBuZXcgU3VibW9kdWxlT3Aoc291cmNlQnJhbmNoTmFtZUtleSwgc291cmNlTWVyZ2VUaXAsIG5ldyBSZXZXYWxrKAogICAgICAgICAgICAgc291cmNlUmVwb3NpdG9yeSksIHVybFByb3ZpZGVyLCBzY2hlbWFGYWN0b3J5LCBzb3VyY2VSZXBvc2l0b3J5LAotICAgICAgICAgICAgbmV3IFByb2plY3Qoc291cmNlQnJhbmNoTmFtZUtleS5nZXRQYXJlbnRLZXkoKSksIHN1Ym1pdGVkLAotICAgICAgICAgICAgbWVyZ2VkQ29tbWl0cywgbXlJZGVudCwgcmVwb01hbmFnZXIsIHJlcGxpY2F0aW9uKTsKKyAgICAgICAgICAgIG5ldyBQcm9qZWN0KHNvdXJjZUJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpLCBzdWJtaXR0ZWQsCisgICAgICAgICAgICBtZXJnZWRDb21taXRzLCBteUlkZW50LCByZXBvTWFuYWdlciwgZ2l0UmVmVXBkYXRlZCk7CiAKICAgICBzdWJtb2R1bGVPcC51cGRhdGUoKTsKIAogICAgIGRvVmVyaWZ5KCk7CisgICAgUmVmVXBkYXRlIHJ1ID0gcnVDYXB0dXJlLmdldFZhbHVlKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJ1LmdldE5hbWUoKSwgdGFyZ2V0QnJhbmNoTmFtZUtleS5nZXQoKSk7CiAgIH0KIAogICAvKioKQEAgLTcwNCwxNyArNzEyLDE3IEBACiAKICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvZGVSZXZpZXdDb21taXQgPQogICAgICAgICBuZXcgQ29kZVJldmlld0NvbW1pdChzb3VyY2VNZXJnZVRpcC50b09iamVjdElkKCkpOwotICAgIGZpbmFsIENoYW5nZSBzdWJtaXRlZENoYW5nZSA9CisgICAgZmluYWwgQ2hhbmdlIHN1Ym1pdHRlZENoYW5nZSA9CiAgICAgICAgIG5ldyBDaGFuZ2UobmV3IENoYW5nZS5LZXkoc291cmNlTWVyZ2VUaXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSksCiAgICAgICAgICAgICBuZXcgQ2hhbmdlLklkKDEpLCBuZXcgQWNjb3VudC5JZCgxKSwgc291cmNlQnJhbmNoTmFtZUtleSk7Ci0gICAgY29kZVJldmlld0NvbW1pdC5jaGFuZ2UgPSBzdWJtaXRlZENoYW5nZTsKKyAgICBjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZSA9IHN1Ym1pdHRlZENoYW5nZTsKIAogICAgIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IG1lcmdlZENvbW1pdHMgPQogICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+KCk7CiAgICAgbWVyZ2VkQ29tbWl0cy5wdXQoY29kZVJldmlld0NvbW1pdC5jaGFuZ2UuZ2V0SWQoKSwgY29kZVJldmlld0NvbW1pdCk7CiAKLSAgICBmaW5hbCBMaXN0PENoYW5nZT4gc3VibWl0ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5nZT4oKTsKLSAgICBzdWJtaXRlZC5hZGQoc3VibWl0ZWRDaGFuZ2UpOworICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5nZT4oKTsKKyAgICBzdWJtaXR0ZWQuYWRkKHN1Ym1pdHRlZENoYW5nZSk7CiAKICAgICBmaW5hbCBSZXBvc2l0b3J5IHRhcmdldFJlcG9zaXRvcnkgPSBjcmVhdGVXb3JrUmVwb3NpdG9yeSgpOwogICAgIGZpbmFsIEdpdCB0YXJnZXRHaXQgPSBuZXcgR2l0KHRhcmdldFJlcG9zaXRvcnkpOwpAQCAtNzQwLDggKzc0OCw5IEBACiAgICAgZXhwZWN0KHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpKQogICAgICAgICAuYW5kUmV0dXJuKHRhcmdldFJlcG9zaXRvcnkpOwogCi0gICAgcmVwbGljYXRpb24uZmlyZSh0YXJnZXRCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpLAotICAgICAgICB0YXJnZXRCcmFuY2hOYW1lS2V5LmdldCgpKTsKKyAgICBDYXB0dXJlPFJlZlVwZGF0ZT4gcnVDYXB0dXJlID0gbmV3IENhcHR1cmU8UmVmVXBkYXRlPigpOworICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShlcSh0YXJnZXRCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpKSwKKyAgICAgICAgY2FwdHVyZShydUNhcHR1cmUpKTsKIAogICAgIGV4cGVjdChzY2hlbWEuc3VibW9kdWxlU3Vic2NyaXB0aW9ucygpKS5hbmRSZXR1cm4oc3Vic2NyaXB0aW9ucyk7CiAgICAgZmluYWwgUmVzdWx0U2V0PFN1Ym1vZHVsZVN1YnNjcmlwdGlvbj4gaW5jb3JyZWN0U3Vic2NyaXB0aW9ucyA9CkBAIC03NjEsMTIgKzc3MCwxNCBAQAogICAgIGZpbmFsIFN1Ym1vZHVsZU9wIHN1Ym1vZHVsZU9wID0KICAgICAgICAgbmV3IFN1Ym1vZHVsZU9wKHNvdXJjZUJyYW5jaE5hbWVLZXksIHNvdXJjZU1lcmdlVGlwLCBuZXcgUmV2V2FsaygKICAgICAgICAgICAgIHNvdXJjZVJlcG9zaXRvcnkpLCB1cmxQcm92aWRlciwgc2NoZW1hRmFjdG9yeSwgc291cmNlUmVwb3NpdG9yeSwKLSAgICAgICAgICAgIG5ldyBQcm9qZWN0KHNvdXJjZUJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpLCBzdWJtaXRlZCwKLSAgICAgICAgICAgIG1lcmdlZENvbW1pdHMsIG15SWRlbnQsIHJlcG9NYW5hZ2VyLCByZXBsaWNhdGlvbik7CisgICAgICAgICAgICBuZXcgUHJvamVjdChzb3VyY2VCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpKSwgc3VibWl0dGVkLAorICAgICAgICAgICAgbWVyZ2VkQ29tbWl0cywgbXlJZGVudCwgcmVwb01hbmFnZXIsIGdpdFJlZlVwZGF0ZWQpOwogCiAgICAgc3VibW9kdWxlT3AudXBkYXRlKCk7CiAKICAgICBkb1ZlcmlmeSgpOworICAgIFJlZlVwZGF0ZSBydSA9IHJ1Q2FwdHVyZS5nZXRWYWx1ZSgpOworICAgIGFzc2VydEVxdWFscyhydS5nZXROYW1lKCksIHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0KCkpOwogICB9CiAKICAgLyoqCkBAIC03ODQsNyArNzk1LDcgQEAKICAgICogQHBhcmFtIGdpdE1vZHVsZXNGaWxlQ29udGVudCBUaGUgLmdpdG1vZHVsZXMgZmlsZSBjb250ZW50LiBEdXJpbmcgdGhlIHRlc3QKICAgICogICAgICAgIHRoaXMgZmlsZSBpcyBjcmVhdGVkLCBzbyB0aGUgY29tbWl0IGNvbnRhaW5pbmcgaXQuCiAgICAqIEBwYXJhbSBzb3VyY2VCcmFuY2hOYW1lIFRoZSBicmFuY2ggbmFtZSBvZiBzb3VyY2UgcHJvamVjdCAicG9pbnRlZCBieSIKLSAgICogICAgICAgIC5naXRtb2R1bGUgZmlsZS4KKyAgICogICAgICAgIC5naXRtb2R1bGVzIGZpbGUuCiAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCiAgICAqLwogICBwcml2YXRlIHZvaWQgZG9PbmVTdWJzY3JpcHRpb25JbnNlcnQoZmluYWwgU3RyaW5nIGdpdE1vZHVsZXNGaWxlQ29udGVudCwKQEAgLTgxNSw3ICs4MjYsNyBAQAogICAgKiBzb3VyY2Ugb2YgYW5vdGhlciBwcm9qZWN0IChubyBzdWJzY3JpYmVycyBmb3VuZCB0byB0aGlzIHByb2plY3QpLgogICAgKiA8L3A+CiAgICAqCi0gICAqIEBwYXJhbSBnaXRNb2R1bGVzRmlsZUNvbnRlbnQgVGhlIC5naXRtb2R1bGUgZmlsZSBjb250ZW50LgorICAgKiBAcGFyYW0gZ2l0TW9kdWxlc0ZpbGVDb250ZW50IFRoZSAuZ2l0bW9kdWxlcyBmaWxlIGNvbnRlbnQuCiAgICAqIEBwYXJhbSBtZXJnZWRCcmFuY2ggVGhlIHtAbGluayBCcmFuY2guTmFtZUtleX0gaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgKiAgICAgICAgcHJvamVjdC9icmFuY2ggdGhlIGNvbW1pdCB3YXMgbWVyZ2VkLgogICAgKiBAcGFyYW0gZXh0cmFjdGVkU3Vic2NyaXB0aW9ucyBUaGUgc3Vic2NyaXB0aW9uIHJvd3MgZXh0cmFjdGVkIGZyb20KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sVGVzdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2xUZXN0LmphdmEKaW5kZXggZDRiMDdhZS4uNTFlYTVhMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2xUZXN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2xUZXN0LmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLkVESVRfVE9QSUNfTkFNRTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbi5MQUJFTDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbi5PV05FUjsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbi5QVVNIOwpAQCAtMzMsNyArMzQsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlByb2xvZ0Vudmlyb25tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlJ1bGVzQ2FjaGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkNhcGFiaWxpdHlDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwTWVtYmVyc2hpcDsKQEAgLTI1NCw2ICsyNTQsMTM5IEBACiAgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAtMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CiAgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAyIiwgcmFuZ2UuY29udGFpbnMoMikpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tOb0ZvcmNlKCkgeworICAgIGdyYW50KGxvY2FsLCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBkZXZzLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiBwdXNoIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhblVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrRm9yY2UoKSB7CisgICAgUGVybWlzc2lvblJ1bGUgciA9IGdyYW50KGxvY2FsLCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKTsKKyAgICByLnNldEJsb2NrKCk7CisgICAgci5zZXRGb3JjZSh0cnVlKTsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvKiIpLnNldEZvcmNlKHRydWUpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgYXNzZXJ0VHJ1ZSgidSBjYW4gZm9yY2UgcHVzaCIsIHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5jYW5Gb3JjZVVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrRm9yY2VXaXRoQWxsb3dOb0ZvcmNlX05vdFBvc3NpYmxlKCkgeworICAgIFBlcm1pc3Npb25SdWxlIHIgPSBncmFudChsb2NhbCwgUFVTSCwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIik7CisgICAgci5zZXRCbG9jaygpOworICAgIHIuc2V0Rm9yY2UodHJ1ZSk7CisgICAgZ3JhbnQobG9jYWwsIFBVU0gsIGRldnMsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKGRldnMpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IGZvcmNlIHB1c2giLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuRm9yY2VVcGRhdGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja01vcmVTcGVjaWZpY1JlZl9GYWlscygpIHsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvbWFzdGVyIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCBwdXNoIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhblVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrTGFyZ2VyU2NvcGVfRmFpbHMoKSB7CisgICAgZ3JhbnQobG9jYWwsIFBVU0gsIGFub255bW91cywgInJlZnMvaGVhZHMvbWFzdGVyIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3QgcHVzaCIsIHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5jYW5VcGRhdGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja0luTG9jYWxfRmFpbHMoKSB7CisgICAgZ3JhbnQocGFyZW50LCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBmaXhlcnMsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIGYgPSB1c2VyKGZpeGVycyk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3QgcHVzaCIsIGYuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5jYW5VcGRhdGUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja0luUGFyZW50QmxvY2tJbkxvY2FsKCkgeworICAgIGdyYW50KHBhcmVudCwgUFVTSCwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChwYXJlbnQsIFBVU0gsIGRldnMsICJyZWZzL2hlYWRzLyoiKTsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisKKyAgICBQcm9qZWN0Q29udHJvbCBkID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCBwdXNoIiwgZC5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhblVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrVmlzaWJpbGl0eUJ5UmVnaXN0ZXJlZFVzZXJzKCkgeworICAgIGdyYW50KGxvY2FsLCBSRUFELCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBSRUFELCByZWdpc3RlcmVkLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihyZWdpc3RlcmVkKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiByZWFkIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmlzVmlzaWJsZUJ5UmVnaXN0ZXJlZFVzZXJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tJbkxvY2FsVmlzaWJpbGl0eUJ5UmVnaXN0ZXJlZFVzZXJzX0ZhaWxzKCkgeworICAgIGdyYW50KHBhcmVudCwgUkVBRCwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgUkVBRCwgcmVnaXN0ZXJlZCwgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIocmVnaXN0ZXJlZCk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3QgcmVhZCIsIHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5pc1Zpc2libGVCeVJlZ2lzdGVyZWRVc2VycygpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrRm9yY2VFZGl0VG9waWNOYW1lKCkgeworICAgIGdyYW50KGxvY2FsLCBFRElUX1RPUElDX05BTUUsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIEVESVRfVE9QSUNfTkFNRSwgZGV2cywgInJlZnMvaGVhZHMvKiIpLnNldEZvcmNlKHRydWUpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgYXNzZXJ0VHJ1ZSgidSBjYW4gZWRpdCB0b3BpYyBuYW1lIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhbkZvcmNlRWRpdFRvcGljTmFtZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrSW5Mb2NhbEZvcmNlRWRpdFRvcGljTmFtZV9GYWlscygpIHsKKyAgICBncmFudChwYXJlbnQsIEVESVRfVE9QSUNfTkFNRSwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgRURJVF9UT1BJQ19OQU1FLCBkZXZzLCAicmVmcy9oZWFkcy8qIikuc2V0Rm9yY2UodHJ1ZSk7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihyZWdpc3RlcmVkKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCBlZGl0IHRvcGljIG5hbWUiLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuRm9yY2VFZGl0VG9waWNOYW1lKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tSYW5nZSgpIHsKKyAgICBncmFudChsb2NhbCwgTEFCRUwgKyAiQ29kZS1SZXZpZXciLCAtMSwgKzEsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIExBQkVMICsgIkNvZGUtUmV2aWV3IiwgLTIsICsyLCBkZXZzLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0UmFuZ2UoTEFCRUwgKyAiQ29kZS1SZXZpZXciKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiB2b3RlIC0yIiwgcmFuZ2UuY29udGFpbnMoLTIpKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiB2b3RlICsyIiwgcmFuZ2UuY29udGFpbnMoMikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tSYW5nZU9uTW9yZVNwZWNpZmljUmVmX0ZhaWxzKCkgeworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0xLCArMSwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgTEFCRUwgKyAiQ29kZS1SZXZpZXciLCAtMiwgKzIsIGRldnMsICJyZWZzL2hlYWRzL21hc3RlciIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJhbmdlKExBQkVMICsgIkNvZGUtUmV2aWV3Iik7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAtMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSArMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja1JhbmdlT25MYXJnZXJTY29wZV9GYWlscygpIHsKKyAgICBncmFudChsb2NhbCwgTEFCRUwgKyAiQ29kZS1SZXZpZXciLCAtMSwgKzEsIGFub255bW91cywgInJlZnMvaGVhZHMvbWFzdGVyIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgTEFCRUwgKyAiQ29kZS1SZXZpZXciLCAtMiwgKzIsIGRldnMsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKGRldnMpOworICAgIFBlcm1pc3Npb25SYW5nZSByYW5nZSA9IHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5nZXRSYW5nZShMQUJFTCArICJDb2RlLVJldmlldyIpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IHZvdGUgLTIiLCByYW5nZS5jb250YWlucygtMikpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IHZvdGUgKzIiLCByYW5nZS5jb250YWlucygtMikpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tJbkxvY2FsUmFuZ2VfRmFpbHMoKSB7CisgICAgZ3JhbnQocGFyZW50LCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0xLCAxLCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0yLCArMiwgZGV2cywgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJhbmdlKExBQkVMICsgIkNvZGUtUmV2aWV3Iik7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAtMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAyIiwgcmFuZ2UuY29udGFpbnMoMikpOworICB9CiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgcHJpdmF0ZSBmaW5hbCBNYXA8UHJvamVjdC5OYW1lS2V5LCBQcm9qZWN0U3RhdGU+IGFsbDsKQEAgLTMwNyw2ICs0NDAsMTEgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVQcm9qZWN0KFByb2plY3QuTmFtZUtleSBuZXdQcm9qZWN0TmFtZSkgewogICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGd1ZXNzUmVsZXZhbnRHcm91cFVVSURzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgIH0KICAgICB9OwogCiAgICAgSW5qZWN0b3IgaW5qZWN0b3IgPSBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgRmFjdG9yeU1vZHVsZSgpIHsKQEAgLTQxNSw3ICs1NTMsNyBAQAogICAgIHByaXZhdGUgZmluYWwgR3JvdXBNZW1iZXJzaGlwIGdyb3VwczsKIAogICAgIE1vY2tVc2VyKFN0cmluZyBuYW1lLCBBY2NvdW50R3JvdXAuVVVJRFtdIGdyb3VwSWQpIHsKLSAgICAgIHN1cGVyKFJlZkNvbnRyb2xUZXN0LnRoaXMuY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LCBBY2Nlc3NQYXRoLlVOS05PV04pOworICAgICAgc3VwZXIoUmVmQ29udHJvbFRlc3QudGhpcy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICAgICAgdXNlcm5hbWUgPSBuYW1lOwogICAgICAgQXJyYXlMaXN0PEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcyA9IExpc3RzLm5ld0FycmF5TGlzdChncm91cElkKTsKICAgICAgIGdyb3VwSWRzLmFkZChyZWdpc3RlcmVkKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYUNyZWF0b3JUZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFDcmVhdG9yVGVzdC5qYXZhCmluZGV4IDg3NTBlZTQuLjE4ZWRkYzkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYUNyZWF0b3JUZXN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvclRlc3QuamF2YQpAQCAtMTQsMjMgKzE0LDMxIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnRlc3R1dGlsLkluTWVtb3J5RGF0YWJhc2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hQ3JlYXRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHByaXZhdGUgQXBwcm92YWxDYXRlZ29yeS5JZCBjb2RlUmV2aWV3ID0gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIkNSVlciKTsKICAgcHJpdmF0ZSBJbk1lbW9yeURhdGFiYXNlIGRiOwogCiAgIEBPdmVycmlkZQpAQCAtNzksNTMgKzg3LDQ2IEBACiAgICAgYXNzZXJ0RXF1YWxzKHNpdGVQYXRoLmdldENhbm9uaWNhbFBhdGgoKSwgZGIuZ2V0U3lzdGVtQ29uZmlnKCkuc2l0ZVBhdGgpOwogICB9CiAKLSAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNjaGVtYV9BcHByb3ZhbENhdGVnb3J5X0NvZGVSZXZpZXcoKQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgUmV2aWV3RGIgYyA9IGRiLmNyZWF0ZSgpLm9wZW4oKTsKKyAgcHJpdmF0ZSBMYWJlbFR5cGVzIGdldExhYmVsVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBkYi5jcmVhdGUoKTsKKyAgICBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHMgPSBkYi5nZXRJbnN0YW5jZShBbGxQcm9qZWN0c05hbWUuY2xhc3MpOworICAgIFByb2plY3RDb25maWcgYyA9IG5ldyBQcm9qZWN0Q29uZmlnKGFsbFByb2plY3RzKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBkYi5nZXRJbnN0YW5jZShHaXRSZXBvc2l0b3J5TWFuYWdlci5jbGFzcykKKyAgICAgICAgLm9wZW5SZXBvc2l0b3J5KGFsbFByb2plY3RzKTsKICAgICB0cnkgewotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXQ7Ci0KLSAgICAgIGNhdCA9IGMuYXBwcm92YWxDYXRlZ29yaWVzKCkuZ2V0KGNvZGVSZXZpZXcpOwotICAgICAgYXNzZXJ0Tm90TnVsbChjYXQpOwotICAgICAgYXNzZXJ0RXF1YWxzKGNvZGVSZXZpZXcsIGNhdC5nZXRJZCgpKTsKLSAgICAgIGFzc2VydEVxdWFscygiQ29kZSBSZXZpZXciLCBjYXQuZ2V0TmFtZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscygiUiIsIGNhdC5nZXRBYmJyZXZpYXRlZE5hbWUoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoIk1heFdpdGhCbG9jayIsIGNhdC5nZXRGdW5jdGlvbk5hbWUoKSk7Ci0gICAgICBhc3NlcnRUcnVlKGNhdC5pc0NvcHlNaW5TY29yZSgpKTsKLSAgICAgIGFzc2VydFRydWUoMCA8PSBjYXQuZ2V0UG9zaXRpb24oKSk7CisgICAgICBjLmxvYWQocmVwbyk7CisgICAgICByZXR1cm4gbmV3IExhYmVsVHlwZXMoCisgICAgICAgICAgSW1tdXRhYmxlTGlzdC5jb3B5T2YoYy5nZXRMYWJlbFNlY3Rpb25zKCkudmFsdWVzKCkpKTsKICAgICB9IGZpbmFsbHkgewotICAgICAgYy5jbG9zZSgpOworICAgICAgcmVwby5jbG9zZSgpOwogICAgIH0KLSAgICBhc3NlcnRWYWx1ZVJhbmdlKGNvZGVSZXZpZXcsIC0yLCAtMSwgMCwgMSwgMik7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsdWVSYW5nZShBcHByb3ZhbENhdGVnb3J5LklkIGNhdCwgaW50Li4uIHJhbmdlKQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgSGFzaFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFjdCA9Ci0gICAgICAgIG5ldyBIYXNoU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4oKTsKLSAgICBmaW5hbCBSZXZpZXdEYiBjID0gZGIub3BlbigpOwotICAgIHRyeSB7Ci0gICAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2IDogYy5hcHByb3ZhbENhdGVnb3J5VmFsdWVzKCkuYnlDYXRlZ29yeShjYXQpKSB7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodi5nZXRJZCgpKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2LmdldE5hbWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYXQsIHYuZ2V0Q2F0ZWdvcnlJZCgpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uodi5nZXROYW1lKCkuaXNFbXB0eSgpKTsKLQotICAgICAgICBhY3QuYWRkKHYuZ2V0SWQoKSk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGMuY2xvc2UoKTsKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVNjaGVtYV9MYWJlbFR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlzdDxTdHJpbmc+IGxhYmVscyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoTGFiZWxUeXBlIGxhYmVsIDogZ2V0TGFiZWxUeXBlcygpLmdldExhYmVsVHlwZXMoKSkgeworICAgICAgbGFiZWxzLmFkZChsYWJlbC5nZXROYW1lKCkpOwogICAgIH0KKyAgICBhc3NlcnRFcXVhbHMoSW1tdXRhYmxlTGlzdC5vZigiQ29kZS1SZXZpZXciKSwgbGFiZWxzKTsKKyAgfQogCi0gICAgZm9yIChpbnQgdmFsdWUgOiByYW5nZSkgewotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkIGV4cCA9Ci0gICAgICAgICAgbmV3IEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZChjYXQsIChzaG9ydCkgdmFsdWUpOwotICAgICAgaWYgKCFhY3QucmVtb3ZlKGV4cCkpIHsKLSAgICAgICAgZmFpbCgiQ2F0ZWdvcnkgIiArIGNhdCArICIgbGFja3MgdmFsdWUgIiArIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFhY3QuaXNFbXB0eSgpKSB7Ci0gICAgICBmYWlsKCJDYXRlZ29yeSAiICsgY2F0ICsgIiBoYXMgYWRkaXRpb25hbCB2YWx1ZXM6ICIgKyBhY3QpOworICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2NoZW1hX0xhYmVsX0NvZGVSZXZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMYWJlbFR5cGUgY29kZVJldmlldyA9IGdldExhYmVsVHlwZXMoKS5ieUxhYmVsKCJDb2RlLVJldmlldyIpOworICAgIGFzc2VydE5vdE51bGwoY29kZVJldmlldyk7CisgICAgYXNzZXJ0RXF1YWxzKCJDb2RlLVJldmlldyIsIGNvZGVSZXZpZXcuZ2V0TmFtZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkNSIiwgY29kZVJldmlldy5nZXRBYmJyZXZpYXRlZE5hbWUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJNYXhXaXRoQmxvY2siLCBjb2RlUmV2aWV3LmdldEZ1bmN0aW9uTmFtZSgpKTsKKyAgICBhc3NlcnRUcnVlKGNvZGVSZXZpZXcuaXNDb3B5TWluU2NvcmUoKSk7CisgICAgYXNzZXJ0VmFsdWVSYW5nZShjb2RlUmV2aWV3LCAyLCAxLCAwLCAtMSwgLTIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFZhbHVlUmFuZ2UoTGFiZWxUeXBlIGxhYmVsLCBJbnRlZ2VyLi4uIHJhbmdlKSB7CisgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QocmFuZ2UpLCBsYWJlbC5nZXRWYWx1ZXNBc0xpc3QoKSk7CisgICAgYXNzZXJ0RXF1YWxzKHJhbmdlWzBdLCBJbnRlZ2VyLnZhbHVlT2YobGFiZWwuZ2V0TWF4KCkuZ2V0VmFsdWUoKSkpOworICAgIGFzc2VydEVxdWFscyhyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSwKKyAgICAgIEludGVnZXIudmFsdWVPZihsYWJlbC5nZXRNaW4oKS5nZXRWYWx1ZSgpKSk7CisgICAgZm9yIChMYWJlbFZhbHVlIHYgOiBsYWJlbC5nZXRWYWx1ZXMoKSkgeworICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5ncy5pc051bGxPckVtcHR5KHYuZ2V0VGV4dCgpKSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFVcGRhdGVyVGVzdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hVXBkYXRlclRlc3QuamF2YQppbmRleCBjYzhkNDdkLi5iZGQyMjU4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFVcGRhdGVyVGVzdC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVVwZGF0ZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQudGVzdHV0aWwuSW5NZW1vcnlEYXRhYmFzZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC50ZXN0dXRpbC5Jbk1lbW9yeUgyVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TdGF0ZW1lbnRFeGVjdXRvcjsKQEAgLTk0LDYgKzk1LDggQEAKICAgICAgICAgYmluZChTdHJpbmcuY2xhc3MpIC8vCiAgICAgICAgICAgLmFubm90YXRlZFdpdGgoQW5vbnltb3VzQ293YXJkTmFtZS5jbGFzcykgLy8KICAgICAgICAgICAudG9Qcm92aWRlcihBbm9ueW1vdXNDb3dhcmROYW1lUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLnRvKEluTWVtb3J5SDJUeXBlLmNsYXNzKTsKICAgICAgIH0KICAgICB9KS5nZXRJbnN0YW5jZShTY2hlbWFVcGRhdGVyLmNsYXNzKTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1N1Ym1vZHVsZVNlY3Rpb25QYXJzZXJUZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlclRlc3QuamF2YQppbmRleCA5M2Q4NmU1Li43Mjk0ZDRjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlclRlc3QuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlclRlc3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQmxvYkJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0yMTQsOCArMjE1LDkgQEAKICAgICAgICAgd2hpbGUgKGZyb21JbmRleCA+IDApIHsKICAgICAgICAgICBmcm9tSW5kZXggPSB1cmxFeHRyYWN0ZWRQYXRoLmxhc3RJbmRleE9mKCcvJywgZnJvbUluZGV4IC0gMSk7CiAgICAgICAgICAgcHJvamVjdE5hbWVDYW5kaWRhdGUgPSB1cmxFeHRyYWN0ZWRQYXRoLnN1YnN0cmluZyhmcm9tSW5kZXggKyAxKTsKLSAgICAgICAgICBpZiAocHJvamVjdE5hbWVDYW5kaWRhdGUuZW5kc1dpdGgoIi5naXQiKSkgewotICAgICAgICAgICAgcHJvamVjdE5hbWVDYW5kaWRhdGUgPSBwcm9qZWN0TmFtZUNhbmRpZGF0ZS5zdWJzdHJpbmcoMCwgcHJvamVjdE5hbWVDYW5kaWRhdGUubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICBpZiAocHJvamVjdE5hbWVDYW5kaWRhdGUuZW5kc1dpdGgoQ29uc3RhbnRzLkRPVF9HSVRfRVhUKSkgeworICAgICAgICAgICAgcHJvamVjdE5hbWVDYW5kaWRhdGUgPSBwcm9qZWN0TmFtZUNhbmRpZGF0ZS5zdWJzdHJpbmcoMCwgLy8KKyAgICAgICAgICAgICAgICBwcm9qZWN0TmFtZUNhbmRpZGF0ZS5sZW5ndGgoKSAtIENvbnN0YW50cy5ET1RfR0lUX0VYVC5sZW5ndGgoKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmIChwcm9qZWN0TmFtZUNhbmRpZGF0ZS5lcXVhbHMocmVwb3NUb0JlRm91bmQuZ2V0KGlkKSkpIHsKICAgICAgICAgICAgIGV4cGVjdChyZXBvTWFuYWdlci5saXN0KCkpLmFuZFJldHVybigKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeURhdGFiYXNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdGVzdHV0aWwvSW5NZW1vcnlEYXRhYmFzZS5qYXZhCmluZGV4IGIxZjk1NmYuLjMwM2M0OTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeURhdGFiYXNlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5RGF0YWJhc2UuamF2YQpAQCAtMTQsMTkgKzE0LDIyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQudGVzdHV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DdXJyZW50U2NoZW1hVmVyc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuU3lzdGVtQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50UHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWVQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5DdXJyZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZVR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFDcmVhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuU2NoZW1hVmVyc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkRhdGFiYXNlOwpAQCAtMzUsNiArMzgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTgxLDYgKzg1LDcgQEAKICAgcHJpdmF0ZSBEYXRhYmFzZTxSZXZpZXdEYj4gZGF0YWJhc2U7CiAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVkOwogICBwcml2YXRlIFNjaGVtYVZlcnNpb24gc2NoZW1hVmVyc2lvbjsKKyAgcHJpdmF0ZSBJbmplY3RvciBpbmplY3RvcjsKIAogICBwdWJsaWMgSW5NZW1vcnlEYXRhYmFzZSgpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIHRyeSB7CkBAIC05Niw0NiArMTAxLDU0IEBACiAgICAgICAvLwogICAgICAgZGF0YWJhc2UgPSBuZXcgRGF0YWJhc2U8UmV2aWV3RGI+KGRhdGFTb3VyY2UsIFJldmlld0RiLmNsYXNzKTsKIAotICAgICAgc2NoZW1hVmVyc2lvbiA9Ci0gICAgICAgICAgR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IEFic3RyYWN0TW9kdWxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICAgICAgICAgIGluc3RhbGwobmV3IFNjaGVtYVZlcnNpb24uTW9kdWxlKCkpOworICAgICAgaW5qZWN0b3IgPSBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgaW5zdGFsbChuZXcgU2NoZW1hVmVyc2lvbi5Nb2R1bGUoKSk7CiAKLSAgICAgICAgICAgICAgYmluZChGaWxlLmNsYXNzKSAvLwotICAgICAgICAgICAgICAgICAgLmFubm90YXRlZFdpdGgoU2l0ZVBhdGguY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgICAudG9JbnN0YW5jZShuZXcgRmlsZSgiLiIpKTsKKyAgICAgICAgICBiaW5kKEZpbGUuY2xhc3MpIC8vCisgICAgICAgICAgICAgIC5hbm5vdGF0ZWRXaXRoKFNpdGVQYXRoLmNsYXNzKSAvLworICAgICAgICAgICAgICAudG9JbnN0YW5jZShuZXcgRmlsZSgiLiIpKTsKIAotICAgICAgICAgICAgICBDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOwotICAgICAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiYmFzZVBhdGgiLCAiZ2l0Iik7Ci0gICAgICAgICAgICAgIGNmZy5zZXRTdHJpbmcoInVzZXIiLCBudWxsLCAibmFtZSIsICJHZXJyaXQgQ29kZSBSZXZpZXciKTsKLSAgICAgICAgICAgICAgY2ZnLnNldFN0cmluZygidXNlciIsIG51bGwsICJlbWFpbCIsICJnZXJyaXRAbG9jYWxob3N0Iik7CisgICAgICAgICAgQ29uZmlnIGNmZyA9IG5ldyBDb25maWcoKTsKKyAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiYmFzZVBhdGgiLCAiZ2l0Iik7CisgICAgICAgICAgY2ZnLnNldFN0cmluZygiZ2Vycml0IiwgbnVsbCwgImFsbFByb2plY3RzIiwgIlRlc3QtUHJvamVjdHMiKTsKKyAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJ1c2VyIiwgbnVsbCwgIm5hbWUiLCAiR2Vycml0IENvZGUgUmV2aWV3Iik7CisgICAgICAgICAgY2ZnLnNldFN0cmluZygidXNlciIsIG51bGwsICJlbWFpbCIsICJnZXJyaXRAbG9jYWxob3N0Iik7CiAKLSAgICAgICAgICAgICAgYmluZChDb25maWcuY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChHZXJyaXRTZXJ2ZXJDb25maWcuY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgICAudG9JbnN0YW5jZShjZmcpOworICAgICAgICAgIGJpbmQoQ29uZmlnLmNsYXNzKSAvLworICAgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChHZXJyaXRTZXJ2ZXJDb25maWcuY2xhc3MpIC8vCisgICAgICAgICAgICAgIC50b0luc3RhbmNlKGNmZyk7CiAKLSAgICAgICAgICAgICAgYmluZChQZXJzb25JZGVudC5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAgIC5hbm5vdGF0ZWRXaXRoKEdlcnJpdFBlcnNvbklkZW50LmNsYXNzKSAvLwotICAgICAgICAgICAgICAgICAgLnRvUHJvdmlkZXIoR2Vycml0UGVyc29uSWRlbnRQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgYmluZChQZXJzb25JZGVudC5jbGFzcykgLy8KKyAgICAgICAgICAgICAgLmFubm90YXRlZFdpdGgoR2Vycml0UGVyc29uSWRlbnQuY2xhc3MpIC8vCisgICAgICAgICAgICAgIC50b1Byb3ZpZGVyKEdlcnJpdFBlcnNvbklkZW50UHJvdmlkZXIuY2xhc3MpOwogCi0gICAgICAgICAgICAgIGJpbmQoQWxsUHJvamVjdHNOYW1lLmNsYXNzKQotICAgICAgICAgICAgICAgICAgLnRvSW5zdGFuY2UobmV3IEFsbFByb2plY3RzTmFtZSgiQWxsLVByb2plY3RzIikpOworICAgICAgICAgIGJpbmQoQWxsUHJvamVjdHNOYW1lLmNsYXNzKSAvLworICAgICAgICAgICAgICAudG9Qcm92aWRlcihBbGxQcm9qZWN0c05hbWVQcm92aWRlci5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgYmluZChHaXRSZXBvc2l0b3J5TWFuYWdlci5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAgIC50byhMb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlci5jbGFzcyk7CisgICAgICAgICAgYmluZChHaXRSZXBvc2l0b3J5TWFuYWdlci5jbGFzcykgLy8KKyAgICAgICAgICAgICAgLnRvKEluTWVtb3J5UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAKLSAgICAgICAgICAgICAgYmluZChTdHJpbmcuY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgLmFubm90YXRlZFdpdGgoQW5vbnltb3VzQ293YXJkTmFtZS5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAudG9Qcm92aWRlcihBbm9ueW1vdXNDb3dhcmROYW1lUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pLmdldEJpbmRpbmcoS2V5LmdldChTY2hlbWFWZXJzaW9uLmNsYXNzLCBDdXJyZW50LmNsYXNzKSkKLSAgICAgICAgICAgICAgLmdldFByb3ZpZGVyKCkuZ2V0KCk7CisgICAgICAgICAgYmluZChTdHJpbmcuY2xhc3MpIC8vCisgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChBbm9ueW1vdXNDb3dhcmROYW1lLmNsYXNzKSAvLworICAgICAgICAgICAgLnRvUHJvdmlkZXIoQW5vbnltb3VzQ293YXJkTmFtZVByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpIC8vCisgICAgICAgICAgICAudG8oSW5NZW1vcnlIMlR5cGUuY2xhc3MpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHNjaGVtYVZlcnNpb24gPSBpbmplY3Rvci5nZXRJbnN0YW5jZSgKKyAgICAgICAgICBLZXkuZ2V0KFNjaGVtYVZlcnNpb24uY2xhc3MsIEN1cnJlbnQuY2xhc3MpKTsKICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbihlKTsKICAgICB9CiAgIH0KIAorICBwdWJsaWMgPFQ+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4gY2xhenopIHsKKyAgICByZXR1cm4gaW5qZWN0b3IuZ2V0SW5zdGFuY2UoY2xhenopOworICB9CisKICAgcHVibGljIERhdGFiYXNlPFJldmlld0RiPiBnZXREYXRhYmFzZSgpIHsKICAgICByZXR1cm4gZGF0YWJhc2U7CiAgIH0KQEAgLTE1MiwxMiArMTY1LDcgQEAKICAgICAgIGZpbmFsIFJldmlld0RiIGMgPSBvcGVuKCk7CiAgICAgICB0cnkgewogICAgICAgICB0cnkgewotICAgICAgICAgIG5ldyBTY2hlbWFDcmVhdG9yKAotICAgICAgICAgICAgICBuZXcgRmlsZSgiLiIpLAotICAgICAgICAgICAgICBzY2hlbWFWZXJzaW9uLAotICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICBuZXcgQWxsUHJvamVjdHNOYW1lKCJUZXN0LVByb2plY3RzIiksCi0gICAgICAgICAgICAgIG5ldyBQZXJzb25JZGVudCgibmFtZSIsICJlbWFpbEBzaXRlIikpLmNyZWF0ZShjKTsKKyAgICAgICAgICBnZXRJbnN0YW5jZShTY2hlbWFDcmVhdG9yLmNsYXNzKS5jcmVhdGUoYyk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGluLW1lbW9yeSBkYXRhYmFzZSIsIGUpOwogICAgICAgICB9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeUgyVHlwZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5SDJUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhNjUzNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeUgyVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC50ZXN0dXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuQmFzZURhdGFTb3VyY2VUeXBlOworCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlIMlR5cGUgZXh0ZW5kcyBCYXNlRGF0YVNvdXJjZVR5cGUgeworCisgIHByb3RlY3RlZCBJbk1lbW9yeUgyVHlwZSgpIHsKKyAgICBzdXBlcihudWxsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAvLyBub3QgdXNlZAorICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyYmNlNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC50ZXN0dXRpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU29ydGVkU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlJlcG9zaXRvcnlDYXNlTWlzbWF0Y2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKKy8qKiBSZXBvc2l0b3J5IG1hbmFnZXIgdGhhdCB1c2VzIGluLW1lbW9yeSByZXBvc2l0b3JpZXMuICovCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlSZXBvc2l0b3J5TWFuYWdlciBpbXBsZW1lbnRzIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVzY3JpcHRpb24gZXh0ZW5kcyBEZnNSZXBvc2l0b3J5RGVzY3JpcHRpb24geworICAgIHByaXZhdGUgU3RyaW5nIGRlc2M7CisKKyAgICBwcml2YXRlIERlc2NyaXB0aW9uKFByb2plY3QuTmFtZUtleSBuYW1lKSB7CisgICAgICBzdXBlcihuYW1lLmdldCgpKTsKKyAgICAgIGRlc2MgPSAiSW4tbWVtb3J5IHJlcG9zaXRvcnkgIiArIG5hbWUuZ2V0KCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwbyBleHRlbmRzIEluTWVtb3J5UmVwb3NpdG9yeSB7CisgICAgcHJpdmF0ZSBSZXBvKFByb2plY3QuTmFtZUtleSBuYW1lKSB7CisgICAgICBzdXBlcihuZXcgRGVzY3JpcHRpb24obmFtZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgIHJldHVybiAoRGVzY3JpcHRpb24pIHN1cGVyLmdldERlc2NyaXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXBvPiByZXBvcyA9IE1hcHMubmV3SGFzaE1hcCgpOworCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVwb3NpdG9yeSBvcGVuUmVwb3NpdG9yeShQcm9qZWN0Lk5hbWVLZXkgbmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24geworICAgIHJldHVybiBnZXQobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlcG9zaXRvcnkgY3JlYXRlUmVwb3NpdG9yeShQcm9qZWN0Lk5hbWVLZXkgbmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uLCBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24geworICAgIFJlcG8gcmVwbzsKKyAgICB0cnkgeworICAgICAgcmVwbyA9IGdldChuYW1lKTsKKyAgICAgIGlmICghcmVwby5nZXREZXNjcmlwdGlvbigpLmdldFJlcG9zaXRvcnlOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0KCkpKSB7CisgICAgICAgIHRocm93IG5ldyBSZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uKG5hbWUpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBvID0gbmV3IFJlcG8obmFtZSk7CisgICAgICByZXBvcy5wdXQobmFtZS5nZXQoKS50b0xvd2VyQ2FzZSgpLCByZXBvKTsKKyAgICB9CisgICAgcmV0dXJuIHJlcG87CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNvcnRlZFNldDxQcm9qZWN0Lk5hbWVLZXk+IGxpc3QoKSB7CisgICAgU29ydGVkU2V0PFByb2plY3QuTmFtZUtleT4gbmFtZXMgPSBTZXRzLm5ld1RyZWVTZXQoKTsKKyAgICBmb3IgKERmc1JlcG9zaXRvcnkgcmVwbyA6IHJlcG9zLnZhbHVlcygpKSB7CisgICAgICBuYW1lcy5hZGQobmV3IFByb2plY3QuTmFtZUtleShyZXBvLmdldERlc2NyaXB0aW9uKCkuZ2V0UmVwb3NpdG9yeU5hbWUoKSkpOworICAgIH0KKyAgICByZXR1cm4gSW1tdXRhYmxlU29ydGVkU2V0LmNvcHlPZihuYW1lcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0RGVzY3JpcHRpb24oUHJvamVjdC5OYW1lS2V5IG5hbWUpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZ2V0KG5hbWUpLmdldERlc2NyaXB0aW9uKCkuZGVzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0RGVzY3JpcHRpb24oUHJvamVjdC5OYW1lS2V5IG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgIHRyeSB7CisgICAgICBnZXQobmFtZSkuZ2V0RGVzY3JpcHRpb24oKS5kZXNjID0gZGVzY3JpcHRpb247CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIElnbm9yZS4KKyAgICB9CisgIH0KKworICBwcml2YXRlIFJlcG8gZ2V0KFByb2plY3QuTmFtZUtleSBuYW1lKSB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBSZXBvIHJlcG8gPSByZXBvcy5nZXQobmFtZS5nZXQoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICBpZiAocmVwbyAhPSBudWxsKSB7CisgICAgICByZXR1cm4gcmVwbzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihuYW1lLmdldCgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL2dlcnJpdF9jb21tb25fdGVzdC5wbCBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL2dlcnJpdF9jb21tb25fdGVzdC5wbAppbmRleCBkYjg5OWE3Li5jOTkzMzk0IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9nZXJyaXRfY29tbW9uX3Rlc3QucGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvZ2Vycml0X2NvbW1vbl90ZXN0LnBsCkBAIC0yMiwxMyArMjIsMTMgQEAKICAgbm90X3NhbWUobGFiZWwoZSwgb2soYSkpLCBsYWJlbChlLCBvayhiKSkpLgogCiAKLSUlIGdldF9sZWdhY3lfYXBwcm92YWxfdHlwZXMKKyUlIGdldF9sZWdhY3lfbGFiZWxfdHlwZXMKICUlCi10ZXN0KGdldF9sZWdhY3lfYXBwcm92YWxfdHlwZXMpIDotCi0gIGdldF9sZWdhY3lfYXBwcm92YWxfdHlwZXMoVCksCit0ZXN0KGdldF9sZWdhY3lfbGFiZWxfdHlwZXMpIDotCisgIGdldF9sZWdhY3lfbGFiZWxfdHlwZXMoVCksCiAgIFQgPSBbQywgVl0sCi0gIEMgPSBhcHByb3ZhbF90eXBlKCdDb2RlLVJldmlldycsICdDUlZXJywgJ01heFdpdGhCbG9jaycsIC0yLCAyKSwKLSAgViA9IGFwcHJvdmFsX3R5cGUoJ1ZlcmlmaWVkJywgJ1ZSSUYnLCAnTWF4V2l0aEJsb2NrJywgLTEsIDEpLgorICBDID0gbGFiZWxfdHlwZSgnQ29kZS1SZXZpZXcnLCAnTWF4V2l0aEJsb2NrJywgLTIsIDIpLAorICBWID0gbGFiZWxfdHlwZSgnVmVyaWZpZWQnLCAnTWF4V2l0aEJsb2NrJywgLTEsIDEpLgogCiAKICUlIGNvbW1pdF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZ2Vycml0LXNzaGQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IDQ3MDk0MmQuLjk0MWZiMzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9nZXJyaXQtc3NoZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTcsNiArNyw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvcG9tLnhtbCBiL2dlcnJpdC1zc2hkL3BvbS54bWwKaW5kZXggYTI2YjFiMi4uZThmY2MxMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvcG9tLnhtbAorKysgYi9nZXJyaXQtc3NoZC9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtc3NoZDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9BYnN0cmFjdEdpdENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9BYnN0cmFjdEdpdENvbW1hbmQuamF2YQppbmRleCBhZjVkZjI1Li45MGZmZWJkIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQWJzdHJhY3RHaXRDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Fic3RyYWN0R2l0Q29tbWFuZC5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hTY29wZS5Db250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtMjksNyArMjgsNiBAQAogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0R2l0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kIHsKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJQUk9KRUNULmdpdCIsIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAicHJvamVjdCBuYW1lIikKQEAgLTg0LDEzICs4MiwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSBTc2hTZXNzaW9uIG5ld1Nlc3Npb24oKSB7Ci0gICAgcmV0dXJuIG5ldyBTc2hTZXNzaW9uKHNlc3Npb24sIHNlc3Npb24uZ2V0UmVtb3RlQWRkcmVzcygpLCB1c2VyRmFjdG9yeQotICAgICAgICAuY3JlYXRlKEFjY2Vzc1BhdGguR0lULCBuZXcgUHJvdmlkZXI8U29ja2V0QWRkcmVzcz4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIFNvY2tldEFkZHJlc3MgZ2V0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24uZ2V0UmVtb3RlQWRkcmVzcygpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwgdXNlci5nZXRBY2NvdW50SWQoKSkpOworICAgIFNzaFNlc3Npb24gbiA9IG5ldyBTc2hTZXNzaW9uKHNlc3Npb24sIHNlc3Npb24uZ2V0UmVtb3RlQWRkcmVzcygpLAorICAgICAgICB1c2VyRmFjdG9yeS5jcmVhdGUoc2Vzc2lvbi5nZXRSZW1vdGVBZGRyZXNzKCksIHVzZXIuZ2V0QWNjb3VudElkKCkpKTsKKyAgICBuLnNldEFjY2Vzc1BhdGgoQWNjZXNzUGF0aC5HSVQpOworICAgIHJldHVybiBuOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHNlcnZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZhaWx1cmUgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0FsaWFzQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0FsaWFzQ29tbWFuZC5qYXZhCmluZGV4IDk1ODJjOTMuLmI0NmZjZWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9BbGlhc0NvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQWxpYXNDb21tYW5kLmphdmEKQEAgLTYwLDI2ICs2MCwyNiBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGJlZ2luKEVudmlyb25tZW50IGVudikgdGhyb3dzIFVubG9nZ2VkRmFpbHVyZSwgSU9FeGNlcHRpb24gewotICAgIE1hcDxTdHJpbmcsIFByb3ZpZGVyPENvbW1hbmQ+PiBtYXAgPSByb290LmdldE1hcCgpOworICAgIE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gbWFwID0gcm9vdC5nZXRNYXAoKTsKICAgICBmb3IgKFN0cmluZyBuYW1lIDogY2hhaW4oY29tbWFuZCkpIHsKLSAgICAgIFByb3ZpZGVyPD8gZXh0ZW5kcyBDb21tYW5kPiBwID0gbWFwLmdldChuYW1lKTsKKyAgICAgIENvbW1hbmRQcm92aWRlciBwID0gbWFwLmdldChuYW1lKTsKICAgICAgIGlmIChwID09IG51bGwpIHsKICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBnZXROYW1lKCkgKyAiOiBub3QgZm91bmQiKTsKICAgICAgIH0KIAotICAgICAgQ29tbWFuZCBjbWQgPSBwLmdldCgpOworICAgICAgQ29tbWFuZCBjbWQgPSBwLmdldFByb3ZpZGVyKCkuZ2V0KCk7CiAgICAgICBpZiAoIShjbWQgaW5zdGFuY2VvZiBEaXNwYXRjaENvbW1hbmQpKSB7CiAgICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZ2V0TmFtZSgpICsgIjogbm90IGZvdW5kIik7CiAgICAgICB9CiAgICAgICBtYXAgPSAoKERpc3BhdGNoQ29tbWFuZCkgY21kKS5nZXRNYXAoKTsKICAgICB9CiAKLSAgICBQcm92aWRlcjw/IGV4dGVuZHMgQ29tbWFuZD4gcCA9IG1hcC5nZXQoY29tbWFuZC52YWx1ZSgpKTsKKyAgICBDb21tYW5kUHJvdmlkZXIgcCA9IG1hcC5nZXQoY29tbWFuZC52YWx1ZSgpKTsKICAgICBpZiAocCA9PSBudWxsKSB7CiAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsIGdldE5hbWUoKSArICI6IG5vdCBmb3VuZCIpOwogICAgIH0KIAotICAgIENvbW1hbmQgY21kID0gcC5nZXQoKTsKKyAgICBDb21tYW5kIGNtZCA9IHAuZ2V0UHJvdmlkZXIoKS5nZXQoKTsKICAgICBjaGVja1JlcXVpcmVzQ2FwYWJpbGl0eShjbWQpOwogICAgIGlmIChjbWQgaW5zdGFuY2VvZiBCYXNlQ29tbWFuZCkgewogICAgICAgQmFzZUNvbW1hbmQgYmMgPSAoQmFzZUNvbW1hbmQpY21kOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Jhc2VDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQmFzZUNvbW1hbmQuamF2YQppbmRleCA5ZTA0ZjA1Li45OGI3NDBjIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQmFzZUNvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQmFzZUNvbW1hbmQuamF2YQpAQCAtNjIsNyArNjIsNiBAQAogICBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1RfRk9VTkQgPSBQUklWQVRFX1NUQVRVUyB8IDI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19OT1RfQURNSU4gPSBQUklWQVRFX1NUQVRVUyB8IDM7CiAKLSAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgIEBPcHRpb24obmFtZSA9ICItLSIsIHVzYWdlID0gImVuZCBvZiBvcHRpb25zIiwgaGFuZGxlciA9IEVuZE9mT3B0aW9uc0hhbmRsZXIuY2xhc3MpCiAgIHByaXZhdGUgYm9vbGVhbiBlbmRPZk9wdGlvbnM7CiAKQEAgLTQyOSw3ICs0MjgsNyBAQAogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0aHVuay5ydW4oKTsKICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZS5nZXRNZXNzYWdlKCkgKyAiIG5vIHN1Y2ggcHJvamVjdCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZS5nZXRNZXNzYWdlKCkgKyAiIG5vIHN1Y2ggY2hhbmdlIik7CiAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRGYWN0b3J5UHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kRmFjdG9yeVByb3ZpZGVyLmphdmEKaW5kZXggN2YwOGQ0OS4uOTEwZjVmMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZEZhY3RvcnlQcm92aWRlci5qYXZhCkBAIC0xNiw5ICsxNiwxMSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkF0b21pY3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaFNjb3BlLkNvbnRleHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCkBAIC01NiwxNSArNTgsMTcgQEAKICAgcHJpdmF0ZSBmaW5hbCBTc2hTY29wZSBzc2hTY29wZTsKICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc3RhcnRFeGVjdXRvcjsKICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBkZXN0cm95RXhlY3V0b3I7CisgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKIAogICBASW5qZWN0CiAgIENvbW1hbmRGYWN0b3J5UHJvdmlkZXIoCiAgICAgICBAQ29tbWFuZE5hbWUoQ29tbWFuZHMuUk9PVCkgZmluYWwgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIgZCwKICAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZywgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZSwKLSAgICAgIGZpbmFsIFNzaExvZyBsLCBmaW5hbCBTc2hTY29wZSBzKSB7CisgICAgICBmaW5hbCBTc2hMb2cgbCwgZmluYWwgU3NoU2NvcGUgcywgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YpIHsKICAgICBkaXNwYXRjaGVyID0gZDsKICAgICBsb2cgPSBsOwogICAgIHNzaFNjb3BlID0gczsKKyAgICBzY2hlbWFGYWN0b3J5ID0gc2Y7CiAKICAgICBpbnQgdGhyZWFkcyA9IGNmZy5nZXRJbnQoInNzaGQiLCJjb21tYW5kU3RhcnRUaHJlYWRzIiwgMik7CiAgICAgc3RhcnRFeGVjdXRvciA9IHdvcmtRdWV1ZS5jcmVhdGVRdWV1ZSh0aHJlYWRzLCAiU3NoQ29tbWFuZFN0YXJ0Iik7CkBAIC0xMjIsNyArMTI2LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oZmluYWwgU2VydmVyU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICBmaW5hbCBTc2hTZXNzaW9uIHMgPSBzZXNzaW9uLmdldEF0dHJpYnV0ZShTc2hTZXNzaW9uLktFWSk7Ci0gICAgICB0aGlzLmN0eCA9IHNzaFNjb3BlLm5ld0NvbnRleHQocywgY29tbWFuZExpbmUpOworICAgICAgdGhpcy5jdHggPSBzc2hTY29wZS5uZXdDb250ZXh0KHNjaGVtYUZhY3RvcnksIHMsIGNvbW1hbmRMaW5lKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBFbnZpcm9ubWVudCBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0xOTIsNyArMTk2LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBsb2coZmluYWwgaW50IHJjKSB7CiAgICAgICBpZiAobG9nZ2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7Ci0gICAgICAgIGxvZy5vbkV4ZWN1dGUocmMpOworICAgICAgICBsb2cub25FeGVjdXRlKGNtZCwgcmMpOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRNZXRhRGF0YS5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRNZXRhRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2VlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1ldGFEYXRhLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFubm90YXRpb24gdGFnZ2VkIG9uIGEgY29uY3JldGUgQ29tbWFuZCB0byBkZXNjcmliZSB3aGF0IGl0IGlzIGRvaW5nCisgKi8KK0BUYXJnZXQoIHtFbGVtZW50VHlwZS5UWVBFfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIENvbW1hbmRNZXRhRGF0YSB7CisgIFN0cmluZyBuYW1lKCk7CisgIFN0cmluZyBkZXNjcigpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1vZHVsZS5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRNb2R1bGUuamF2YQppbmRleCA3Njk5YmRkLi5lN2U4YTQ0IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kTW9kdWxlLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgLyoqCiAgICAqIENvbmZpZ3VyZSBhIGNvbW1hbmQgdG8gYmUgaW52b2tlZCBieSBuYW1lLgogICAgKgotICAgKkBwYXJhbSBwYXJlbnQgY29udGV4dCBvZiB0aGUgcGFyZW50IGNvbW1hbmQsIHRoYXQgdGhpcyBjb21tYW5kIGlzIGEKKyAgICogQHBhcmFtIHBhcmVudCBjb250ZXh0IG9mIHRoZSBwYXJlbnQgY29tbWFuZCwgdGhhdCB0aGlzIGNvbW1hbmQgaXMgYQogICAgKiAgICAgICAgc3ViY29tbWFuZCBvZi4KICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdGhlIGNsaWVudCB3aWxsIHByb3ZpZGUgaW4gb3JkZXIgdG8KICAgICogICAgICAgIGNhbGwgdGhlIGNvbW1hbmQuCkBAIC02MSw2ICs2MSw0MiBAQAogICB9CiAKICAgLyoqCisgICAqIENvbmZpZ3VyZSBhIGNvbW1hbmQgdG8gYmUgaW52b2tlZCBieSBuYW1lLiBUaGUgY29tbWFuZCBpcyBib3VuZCB0byB0aGUgcGFzc2VkIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gcGFyZW50IGNvbnRleHQgb2YgdGhlIHBhcmVudCBjb21tYW5kLCB0aGF0IHRoaXMgY29tbWFuZCBpcyBhCisgICAqICAgICAgICBzdWJjb21tYW5kIG9mLgorICAgKiBAcGFyYW0gY2xhenogY2xhc3Mgb2YgdGhlIGNvbW1hbmQgd2l0aCB7QGxpbmsgQ29tbWFuZE1ldGFEYXRhfSBhbm5vdGF0aW9uCisgICAqICAgICAgICB0byByZXRyaWV2ZSB0aGUgbmFtZSBhbmQgdGhlIGRlc2NyaXB0aW9uIGZyb20KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGNvbW1hbmQoZmluYWwgQ29tbWFuZE5hbWUgcGFyZW50LAorICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJhc2VDb21tYW5kPiBjbGF6eikgeworICAgIENvbW1hbmRNZXRhRGF0YSBtZXRhID0gKENvbW1hbmRNZXRhRGF0YSljbGF6ei5nZXRBbm5vdGF0aW9uKENvbW1hbmRNZXRhRGF0YS5jbGFzcyk7CisgICAgaWYgKG1ldGEgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm8gQ29tbWFuZE1ldGFEYXRhIGFubm90YXRpb24gZm91bmQiKTsKKyAgICB9CisgICAgYmluZChDb21tYW5kcy5rZXkocGFyZW50LCBtZXRhLm5hbWUoKSwgbWV0YS5kZXNjcigpKSkudG8oY2xhenopOworICB9CisKKyAgLyoqCisgICAqIEFsaWFzIG9uZSBjb21tYW5kIHRvIGFub3RoZXIuIFRoZSBhbGlhcyBpcyBib3VuZCB0byB0aGUgcGFzc2VkIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gcGFyZW50IGNvbnRleHQgb2YgdGhlIHBhcmVudCBjb21tYW5kLCB0aGF0IHRoaXMgY29tbWFuZCBpcyBhCisgICAqICAgICAgICBzdWJjb21tYW5kIG9mLgorICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0aGUgY2xpZW50IHdpbGwgcHJvdmlkZSBpbiBvcmRlciB0bworICAgKiAgICAgICAgY2FsbCB0aGUgY29tbWFuZC4KKyAgICogQHBhcmFtIGNsYXp6IGNsYXNzIG9mIHRoZSBjb21tYW5kIHdpdGgge0BsaW5rIENvbW1hbmRNZXRhRGF0YX0gYW5ub3RhdGlvbgorICAgKiAgICAgICAgdG8gcmV0cmlldmUgdGhlIGRlc2NyaXB0aW9uIGZyb20KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGFsaWFzKGZpbmFsIENvbW1hbmROYW1lIHBhcmVudCwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQmFzZUNvbW1hbmQ+IGNsYXp6KSB7CisgICAgQ29tbWFuZE1ldGFEYXRhIG1ldGEgPSAoQ29tbWFuZE1ldGFEYXRhKWNsYXp6LmdldEFubm90YXRpb24oQ29tbWFuZE1ldGFEYXRhLmNsYXNzKTsKKyAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyBDb21tYW5kTWV0YURhdGEgYW5ub3RhdGlvbiBmb3VuZCIpOworICAgIH0KKyAgICBiaW5kKENvbW1hbmRzLmtleShwYXJlbnQsIG5hbWUsIG1ldGEuZGVzY3IoKSkpLnRvKGNsYXp6KTsKKyAgfQorCisgIC8qKgogICAgKiBBbGlhcyBvbmUgY29tbWFuZCB0byBhbm90aGVyLgogICAgKgogICAgKiBAcGFyYW0gZnJvbSB0aGUgbmV3IGNvbW1hbmQgbmFtZSB0aGF0IHdoZW4gY2FsbGVkIHdpbGwgYWN0dWFsbHkgZGVsZWdhdGUgdG8KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTdjOTdiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLkNvbW1hbmQ7CisKK2ZpbmFsIGNsYXNzIENvbW1hbmRQcm92aWRlciB7CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDb21tYW5kPiBwcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgQ29tbWFuZFByb3ZpZGVyKGZpbmFsIFByb3ZpZGVyPENvbW1hbmQ+IHAsIGZpbmFsIFN0cmluZyBkKSB7CisgICAgdGhpcy5wcm92aWRlciA9IHA7CisgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGQ7CisgIH0KKworICBwdWJsaWMgUHJvdmlkZXI8Q29tbWFuZD4gZ2V0UHJvdmlkZXIoKSB7CisgICAgcmV0dXJuIHByb3ZpZGVyOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gZGVzY3JpcHRpb247CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kcy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRzLmphdmEKaW5kZXggNTM0MGQ2Zi4uOTI5YTg5NSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRzLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRzLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuQ29tbWFuZDsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CkBAIC00MSw2ICs0MiwxMSBAQAogICAgIHJldHVybiBLZXkuZ2V0KENvbW1hbmQuY2xhc3MsIG5hbWVkKHBhcmVudCwgbmFtZSkpOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBLZXk8Q29tbWFuZD4ga2V5KGZpbmFsIENvbW1hbmROYW1lIHBhcmVudCwKKyAgICAgIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3IpIHsKKyAgICByZXR1cm4gS2V5LmdldChDb21tYW5kLmNsYXNzLCBuYW1lZChwYXJlbnQsIG5hbWUsIGRlc2NyKSk7CisgIH0KKwogICAvKiogQ3JlYXRlIGEgQ29tbWFuZE5hbWUgYW5ub3RhdGlvbiBmb3IgdGhlIHN1cHBsaWVkIG5hbWUuICovCiAgIHB1YmxpYyBzdGF0aWMgQ29tbWFuZE5hbWUgbmFtZWQoZmluYWwgU3RyaW5nIG5hbWUpIHsKICAgICByZXR1cm4gbmV3IENvbW1hbmROYW1lKCkgewpAQCAtNzgsNiArODQsMTIgQEAKICAgICByZXR1cm4gbmV3IE5lc3RlZENvbW1hbmROYW1lSW1wbChwYXJlbnQsIG5hbWUpOwogICB9CiAKKyAgLyoqIENyZWF0ZSBhIENvbW1hbmROYW1lIGFubm90YXRpb24gZm9yIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBkZXNjcmlwdGlvbi4gKi8KKyAgcHVibGljIHN0YXRpYyBDb21tYW5kTmFtZSBuYW1lZChmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgZmluYWwgU3RyaW5nIGRlc2NyKSB7CisgICAgcmV0dXJuIG5ldyBOZXN0ZWRDb21tYW5kTmFtZUltcGwocGFyZW50LCBuYW1lLCBkZXNjcik7CisgIH0KKwogICAvKiogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgY29tbWFuZCwgcG9zc2libHkgaW5jbHVkaW5nIGFueSBwYXJlbnRzLiAqLwogICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lT2YoZmluYWwgQ29tbWFuZE5hbWUgbmFtZSkgewogICAgIGlmIChuYW1lIGluc3RhbmNlb2YgTmVzdGVkQ29tbWFuZE5hbWVJbXBsKSB7CkBAIC0xMDQsMTMgKzExNiwyMiBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTmVzdGVkQ29tbWFuZE5hbWVJbXBsIGltcGxlbWVudHMgQ29tbWFuZE5hbWUgeworICBzdGF0aWMgZmluYWwgY2xhc3MgTmVzdGVkQ29tbWFuZE5hbWVJbXBsIGltcGxlbWVudHMgQ29tbWFuZE5hbWUgewogICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZE5hbWUgcGFyZW50OwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3I7CiAKICAgICBOZXN0ZWRDb21tYW5kTmFtZUltcGwoZmluYWwgQ29tbWFuZE5hbWUgcGFyZW50LCBmaW5hbCBTdHJpbmcgbmFtZSkgewogICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgdGhpcy5kZXNjciA9IFN0cmluZ1V0aWxzLkVNUFRZOworICAgIH0KKworICAgIE5lc3RlZENvbW1hbmROYW1lSW1wbChmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3IpIHsKKyAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIHRoaXMuZGVzY3IgPSBkZXNjcjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTExOCw2ICsxMzksMTAgQEAKICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZGVzY3IoKSB7CisgICAgICByZXR1cm4gZGVzY3I7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKICAgICAgIHJldHVybiBDb21tYW5kTmFtZS5jbGFzczsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EYXRhYmFzZVB1YktleUF1dGguamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EYXRhYmFzZVB1YktleUF1dGguamF2YQppbmRleCBhNjlhMmYxLi44M2JjOGE1IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGF0YWJhc2VQdWJLZXlBdXRoLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0RhdGFiYXNlUHViS2V5QXV0aC5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFNzaEtleTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QZWVyRGFlbW9uVXNlcjsKQEAgLTIzLDcgKzIyLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaFNjb3BlLkNvbnRleHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwpAQCAtNDMsNyArNDEsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMTczLDcgKzE3MCw3IEBACiAgICAgICAvLyBzZXNzaW9uLCByZWNvcmQgYSBsb2dpbiBldmVudCBpbiB0aGUgbG9nIGFuZCBhZGQKICAgICAgIC8vIGEgY2xvc2UgbGlzdGVuZXIgdG8gcmVjb3JkIGEgbG9nb3V0IGV2ZW50LgogICAgICAgLy8KLSAgICAgIENvbnRleHQgY3R4ID0gc3NoU2NvcGUubmV3Q29udGV4dChzZCwgbnVsbCk7CisgICAgICBDb250ZXh0IGN0eCA9IHNzaFNjb3BlLm5ld0NvbnRleHQobnVsbCwgc2QsIG51bGwpOwogICAgICAgQ29udGV4dCBvbGQgPSBzc2hTY29wZS5zZXQoY3R4KTsKICAgICAgIHRyeSB7CiAgICAgICAgIHNzaExvZy5vbkxvZ2luKCk7CkBAIC0xODUsNyArMTgyLDcgQEAKICAgICAgICAgICBuZXcgSW9GdXR1cmVMaXN0ZW5lcjxJb0Z1dHVyZT4oKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9wZXJhdGlvbkNvbXBsZXRlKElvRnV0dXJlIGZ1dHVyZSkgewotICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGN0eCA9IHNzaFNjb3BlLm5ld0NvbnRleHQoc2QsIG51bGwpOworICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGN0eCA9IHNzaFNjb3BlLm5ld0NvbnRleHQobnVsbCwgc2QsIG51bGwpOwogICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IG9sZCA9IHNzaFNjb3BlLnNldChjdHgpOwogICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHNzaExvZy5vbkxvZ291dCgpOwpAQCAtMjAxLDEzICsxOTgsNyBAQAogCiAgIHByaXZhdGUgSWRlbnRpZmllZFVzZXIgY3JlYXRlVXNlcihmaW5hbCBTc2hTZXNzaW9uIHNkLAogICAgICAgZmluYWwgU3NoS2V5Q2FjaGVFbnRyeSBrZXkpIHsKLSAgICByZXR1cm4gdXNlckZhY3RvcnkuY3JlYXRlKEFjY2Vzc1BhdGguU1NIX0NPTU1BTkQsCi0gICAgICAgIG5ldyBQcm92aWRlcjxTb2NrZXRBZGRyZXNzPigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2QuZ2V0UmVtb3RlQWRkcmVzcygpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwga2V5LmdldEFjY291bnQoKSk7CisgICAgcmV0dXJuIHVzZXJGYWN0b3J5LmNyZWF0ZShzZC5nZXRSZW1vdGVBZGRyZXNzKCksIGtleS5nZXRBY2NvdW50KCkpOwogICB9CiAKICAgcHJpdmF0ZSBTc2hLZXlDYWNoZUVudHJ5IGZpbmQoZmluYWwgSXRlcmFibGU8U3NoS2V5Q2FjaGVFbnRyeT4ga2V5TGlzdCwKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmQuamF2YQppbmRleCA2OTFmM2EwLi40NTViNzMyIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Rpc3BhdGNoQ29tbWFuZC5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkF0b21pY3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CkBAIC0yOSw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0zOSwxNCArNDEsMTQgQEAKICAqLwogZmluYWwgY2xhc3MgRGlzcGF0Y2hDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgRGlzcGF0Y2hDb21tYW5kIGNyZWF0ZShNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gbWFwKTsKKyAgICBEaXNwYXRjaENvbW1hbmQgY3JlYXRlKE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gbWFwKTsKICAgfQogCiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb3ZpZGVyPENvbW1hbmQ+PiBjb21tYW5kczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDb21tYW5kUHJvdmlkZXI+IGNvbW1hbmRzOwogICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxDb21tYW5kPiBhdG9taWNDbWQ7CiAKLSAgQEFyZ3VtZW50KGluZGV4ID0gMCwgcmVxdWlyZWQgPSB0cnVlLCBtZXRhVmFyID0gIkNPTU1BTkQiLCBoYW5kbGVyID0gU3ViY29tbWFuZEhhbmRsZXIuY2xhc3MpCisgIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gZmFsc2UsIG1ldGFWYXIgPSAiQ09NTUFORCIsIGhhbmRsZXIgPSBTdWJjb21tYW5kSGFuZGxlci5jbGFzcykKICAgcHJpdmF0ZSBTdHJpbmcgY29tbWFuZE5hbWU7CiAKICAgQEFyZ3VtZW50KGluZGV4ID0gMSwgbXVsdGlWYWx1ZWQgPSB0cnVlLCBtZXRhVmFyID0gIkFSRyIpCkBAIC01NCwxMyArNTYsMTMgQEAKIAogICBASW5qZWN0CiAgIERpc3BhdGNoQ29tbWFuZChmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3UsCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgTWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IGFsbCkgeworICAgICAgQEFzc2lzdGVkIGZpbmFsIE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gYWxsKSB7CiAgICAgY3VycmVudFVzZXIgPSBjdTsKICAgICBjb21tYW5kcyA9IGFsbDsKICAgICBhdG9taWNDbWQgPSBBdG9taWNzLm5ld1JlZmVyZW5jZSgpOwogICB9CiAKLSAgTWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IGdldE1hcCgpIHsKKyAgTWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBnZXRNYXAoKSB7CiAgICAgcmV0dXJuIGNvbW1hbmRzOwogICB9CiAKQEAgLTY4LDggKzcwLDEzIEBACiAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEVudmlyb25tZW50IGVudikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICB0cnkgewogICAgICAgcGFyc2VDb21tYW5kTGluZSgpOworICAgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShjb21tYW5kTmFtZSkpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgbXNnLndyaXRlKHVzYWdlKCkpOworICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsIG1zZy50b1N0cmluZygpKTsKKyAgICAgIH0KIAotICAgICAgZmluYWwgUHJvdmlkZXI8Q29tbWFuZD4gcCA9IGNvbW1hbmRzLmdldChjb21tYW5kTmFtZSk7CisgICAgICBmaW5hbCBDb21tYW5kUHJvdmlkZXIgcCA9IGNvbW1hbmRzLmdldChjb21tYW5kTmFtZSk7CiAgICAgICBpZiAocCA9PSBudWxsKSB7CiAgICAgICAgIFN0cmluZyBtc2cgPQogICAgICAgICAgICAgKGdldE5hbWUoKS5pc0VtcHR5KCkgPyAiR2Vycml0IENvZGUgUmV2aWV3IiA6IGdldE5hbWUoKSkgKyAiOiAiCkBAIC03Nyw3ICs4NCw3IEBACiAgICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgbXNnKTsKICAgICAgIH0KIAotICAgICAgZmluYWwgQ29tbWFuZCBjbWQgPSBwLmdldCgpOworICAgICAgZmluYWwgQ29tbWFuZCBjbWQgPSBwLmdldFByb3ZpZGVyKCkuZ2V0KCk7CiAgICAgICBjaGVja1JlcXVpcmVzQ2FwYWJpbGl0eShjbWQpOwogICAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEJhc2VDb21tYW5kKSB7CiAgICAgICAgIGZpbmFsIEJhc2VDb21tYW5kIGJjID0gKEJhc2VDb21tYW5kKSBjbWQ7CkBAIC0xMzgsOSArMTQ1LDE3IEBACiAgICAgfQogICAgIHVzYWdlLmFwcGVuZCgiIGFyZTpcbiIpOwogICAgIHVzYWdlLmFwcGVuZCgiXG4iKTsKKworICAgIGludCBtYXhMZW5ndGggPSAtMTsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogY29tbWFuZHMua2V5U2V0KCkpIHsKKyAgICAgIG1heExlbmd0aCA9IE1hdGgubWF4KG1heExlbmd0aCwgbmFtZS5sZW5ndGgoKSk7CisgICAgfQorICAgIFN0cmluZyBmb3JtYXQgPSAiJS0iICsgbWF4TGVuZ3RoICsgInMgICAlcyI7CiAgICAgZm9yIChTdHJpbmcgbmFtZSA6IFNldHMubmV3VHJlZVNldChjb21tYW5kcy5rZXlTZXQoKSkpIHsKKyAgICAgIGZpbmFsIENvbW1hbmRQcm92aWRlciBwID0gY29tbWFuZHMuZ2V0KG5hbWUpOwogICAgICAgdXNhZ2UuYXBwZW5kKCIgICAiKTsKLSAgICAgIHVzYWdlLmFwcGVuZChuYW1lKTsKKyAgICAgIHVzYWdlLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdCwgbmFtZSwKKyAgICAgICAgICBTdHJpbmdzLm51bGxUb0VtcHR5KHAuZ2V0RGVzY3JpcHRpb24oKSkpKTsKICAgICAgIHVzYWdlLmFwcGVuZCgiXG4iKTsKICAgICB9CiAgICAgdXNhZ2UuYXBwZW5kKCJcbiIpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Rpc3BhdGNoQ29tbWFuZFByb3ZpZGVyLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIuamF2YQppbmRleCBiNzZmZjcxLi5lOWEzMWM5IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIuamF2YQpAQCAtMzksNyArMzksNyBAQAogICBwcml2YXRlIERpc3BhdGNoQ29tbWFuZC5GYWN0b3J5IGZhY3Rvcnk7CiAKICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQ7Ci0gIHByaXZhdGUgdm9sYXRpbGUgQ29uY3VycmVudE1hcDxTdHJpbmcsIFByb3ZpZGVyPENvbW1hbmQ+PiBtYXA7CisgIHByaXZhdGUgdm9sYXRpbGUgQ29uY3VycmVudE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gbWFwOwogCiAgIHB1YmxpYyBEaXNwYXRjaENvbW1hbmRQcm92aWRlcihmaW5hbCBDb21tYW5kTmFtZSBjbikgewogICAgIHRoaXMucGFyZW50ID0gY247CkBAIC01Miw4ICs1Miw4IEBACiAKICAgcHVibGljIFJlZ2lzdHJhdGlvbkhhbmRsZSByZWdpc3RlcihmaW5hbCBDb21tYW5kTmFtZSBuYW1lLAogICAgICAgZmluYWwgUHJvdmlkZXI8Q29tbWFuZD4gY21kKSB7Ci0gICAgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFByb3ZpZGVyPENvbW1hbmQ+PiBtID0gZ2V0TWFwKCk7Ci0gICAgaWYgKG0ucHV0SWZBYnNlbnQobmFtZS52YWx1ZSgpLCBjbWQpICE9IG51bGwpIHsKKyAgICBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtID0gZ2V0TWFwKCk7CisgICAgaWYgKG0ucHV0SWZBYnNlbnQobmFtZS52YWx1ZSgpLCBuZXcgQ29tbWFuZFByb3ZpZGVyKGNtZCwgbnVsbCkpICE9IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obmFtZS52YWx1ZSgpICsgIiBleGlzdHMiKTsKICAgICB9CiAgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25IYW5kbGUoKSB7CkBAIC02Niw4ICs2Niw4IEBACiAKICAgcHVibGljIFJlZ2lzdHJhdGlvbkhhbmRsZSByZXBsYWNlKGZpbmFsIENvbW1hbmROYW1lIG5hbWUsCiAgICAgICBmaW5hbCBQcm92aWRlcjxDb21tYW5kPiBjbWQpIHsKLSAgICBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IG0gPSBnZXRNYXAoKTsKLSAgICBtLnB1dChuYW1lLnZhbHVlKCksIGNtZCk7CisgICAgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gbSA9IGdldE1hcCgpOworICAgIG0ucHV0KG5hbWUudmFsdWUoKSwgbmV3IENvbW1hbmRQcm92aWRlcihjbWQsIG51bGwpKTsKICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkhhbmRsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewpAQCAtNzYsNyArNzYsNyBAQAogICAgIH07CiAgIH0KIAotICBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IGdldE1hcCgpIHsKKyAgQ29uY3VycmVudE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gZ2V0TWFwKCkgewogICAgIGlmIChtYXAgPT0gbnVsbCkgewogICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgewpAQCAtODgsMTQgKzg4LDIxIEBACiAgIH0KIAogICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IGNyZWF0ZU1hcCgpIHsKLSAgICBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IG0gPSBNYXBzLm5ld0NvbmN1cnJlbnRNYXAoKTsKKyAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBjcmVhdGVNYXAoKSB7CisgICAgQ29uY3VycmVudE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gbSA9IE1hcHMubmV3Q29uY3VycmVudE1hcCgpOwogICAgIGZvciAoZmluYWwgQmluZGluZzw/PiBiIDogYWxsQ29tbWFuZHMoKSkgewogICAgICAgZmluYWwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYi5nZXRLZXkoKS5nZXRBbm5vdGF0aW9uKCk7CiAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbW1hbmROYW1lKSB7CiAgICAgICAgIGZpbmFsIENvbW1hbmROYW1lIG4gPSAoQ29tbWFuZE5hbWUpIGFubm90YXRpb247CiAgICAgICAgIGlmICghQ29tbWFuZHMuQ01EX1JPT1QuZXF1YWxzKG4pICYmIENvbW1hbmRzLmlzQ2hpbGQocGFyZW50LCBuKSkgewotICAgICAgICAgIG0ucHV0KG4udmFsdWUoKSwgKFByb3ZpZGVyPENvbW1hbmQ+KSBiLmdldFByb3ZpZGVyKCkpOworICAgICAgICAgIFN0cmluZyBkZXNjciA9IG51bGw7CisgICAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBDb21tYW5kcy5OZXN0ZWRDb21tYW5kTmFtZUltcGwpIHsKKyAgICAgICAgICAgIENvbW1hbmRzLk5lc3RlZENvbW1hbmROYW1lSW1wbCBpbXBsID0KKyAgICAgICAgICAgICAgICAoKENvbW1hbmRzLk5lc3RlZENvbW1hbmROYW1lSW1wbCkgYW5ub3RhdGlvbik7CisgICAgICAgICAgICBkZXNjciA9IGltcGwuZGVzY3IoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbS5wdXQobi52YWx1ZSgpLAorICAgICAgICAgICAgICBuZXcgQ29tbWFuZFByb3ZpZGVyKChQcm92aWRlcjxDb21tYW5kPikgYi5nZXRQcm92aWRlcigpLCBkZXNjcikpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL05vU2hlbGwuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Ob1NoZWxsLmphdmEKaW5kZXggZDJmZGY3OC4uY2RlN2FlOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL05vU2hlbGwuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvTm9TaGVsbC5qYXZhCkBAIC0xNSwxMCArMTUsMTIgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoU2NvcGUuQ29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKQEAgLTU4LDYgKzYwLDcgQEAKIAogICBzdGF0aWMgY2xhc3MgU2VuZE1lc3NhZ2UgaW1wbGVtZW50cyBDb21tYW5kLCBTZXNzaW9uQXdhcmUgewogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TWVzc2FnZUZhY3Rvcnk+IG1lc3NhZ2VGYWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKICAgICBwcml2YXRlIGZpbmFsIFNzaFNjb3BlIHNzaFNjb3BlOwogCiAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbjsKQEAgLTY3LDggKzcwLDEwIEBACiAgICAgcHJpdmF0ZSBDb250ZXh0IGNvbnRleHQ7CiAKICAgICBASW5qZWN0Ci0gICAgU2VuZE1lc3NhZ2UoUHJvdmlkZXI8TWVzc2FnZUZhY3Rvcnk+IG1lc3NhZ2VGYWN0b3J5LCBTc2hTY29wZSBzc2hTY29wZSkgeworICAgIFNlbmRNZXNzYWdlKFByb3ZpZGVyPE1lc3NhZ2VGYWN0b3J5PiBtZXNzYWdlRmFjdG9yeSwKKyAgICAgICAgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YsIFNzaFNjb3BlIHNzaFNjb3BlKSB7CiAgICAgICB0aGlzLm1lc3NhZ2VGYWN0b3J5ID0gbWVzc2FnZUZhY3Rvcnk7CisgICAgICB0aGlzLnNjaGVtYUZhY3RvcnkgPSBzZjsKICAgICAgIHRoaXMuc3NoU2NvcGUgPSBzc2hTY29wZTsKICAgICB9CiAKQEAgLTg5LDcgKzk0LDggQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKGZpbmFsIFNlcnZlclNlc3Npb24gc2Vzc2lvbikgewotICAgICAgdGhpcy5jb250ZXh0ID0gc3NoU2NvcGUubmV3Q29udGV4dChzZXNzaW9uLmdldEF0dHJpYnV0ZShTc2hTZXNzaW9uLktFWSksICIiKTsKKyAgICAgIFNzaFNlc3Npb24gcyA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKFNzaFNlc3Npb24uS0VZKTsKKyAgICAgIHRoaXMuY29udGV4dCA9IHNzaFNjb3BlLm5ld0NvbnRleHQoc2NoZW1hRmFjdG9yeSwgcywgIiIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEVudmlyb25tZW50IGVudikgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9QbHVnaW5Db21tYW5kTW9kdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvUGx1Z2luQ29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDRkYmI4ZDcuLjAxM2YwNzAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9QbHVnaW5Db21tYW5kTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1BsdWdpbkNvbW1hbmRNb2R1bGUuamF2YQpAQCAtMTYsMjEgKzE2LDE3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5QbHVnaW5OYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE5hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkRpc3BhdGNoQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmJpbmRlci5MaW5rZWRCaW5kaW5nQnVpbGRlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuQ29tbWFuZDsKIAogaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQbHVnaW5Db21tYW5kTW9kdWxlIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFBsdWdpbkNvbW1hbmRNb2R1bGUgZXh0ZW5kcyBDb21tYW5kTW9kdWxlIHsKICAgcHJpdmF0ZSBDb21tYW5kTmFtZSBjb21tYW5kOwogCiAgIEBJbmplY3QKLSAgdm9pZCBzZXRQbHVnaW5OYW1lKEBQbHVnaW5OYW1lIFN0cmluZyBuYW1lKSB7CisgIHZvaWQgc2V0UGx1Z2luTmFtZShAUGx1Z2luTmFtZSBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2NyKSB7CiAgICAgdGhpcy5jb21tYW5kID0gQ29tbWFuZHMubmFtZWQobmFtZSk7CiAgIH0KIApAQCAtNDYsNCArNDIsMTMgQEAKICAgcHJvdGVjdGVkIExpbmtlZEJpbmRpbmdCdWlsZGVyPENvbW1hbmQ+IGNvbW1hbmQoU3RyaW5nIHN1YkNtZCkgewogICAgIHJldHVybiBiaW5kKENvbW1hbmRzLmtleShjb21tYW5kLCBzdWJDbWQpKTsKICAgfQorCisgIHByb3RlY3RlZCB2b2lkIGNvbW1hbmQoQ2xhc3M8PyBleHRlbmRzIEJhc2VDb21tYW5kPiBjbGF6eikgeworICAgIGNvbW1hbmQoY29tbWFuZCwgY2xhenopOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgYWxpYXMoZmluYWwgU3RyaW5nIG5hbWUsIENsYXNzPD8gZXh0ZW5kcyBCYXNlQ29tbWFuZD4gY2xhenopIHsKKyAgICBhbGlhcyhjb21tYW5kLCBuYW1lLCBjbGF6eik7CisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhCmluZGV4IDAzNDg1ZjcuLmFmYjI1MzcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yLmphdmEKQEAgLTE0LDIyICsxNCwyOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuQXV0b1JlZ2lzdGVyVXRpbC5jYWxjdWxhdGVCaW5kQW5ub3RhdGlvbjsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4cG9ydDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5JbnZhbGlkUGx1Z2luRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLk1vZHVsZUdlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLkNvbW1hbmQ7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGNsYXNzIFNzaEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvcgogICAgIGV4dGVuZHMgQWJzdHJhY3RNb2R1bGUKICAgICBpbXBsZW1lbnRzIE1vZHVsZUdlbmVyYXRvciB7CiAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8Q29tbWFuZD4+IGNvbW1hbmRzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHlwZUxpdGVyYWw8Pz4sIENsYXNzPD8+PiBsaXN0ZW5lcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CiAgIHByaXZhdGUgQ29tbWFuZE5hbWUgY29tbWFuZDsKIAogICBAT3ZlcnJpZGUKQEAgLTM5LDYgKzQ2LDE2IEBACiAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDbGFzczxDb21tYW5kPj4gZSA6IGNvbW1hbmRzLmVudHJ5U2V0KCkpIHsKICAgICAgIGJpbmQoQ29tbWFuZHMua2V5KGNvbW1hbmQsIGUuZ2V0S2V5KCkpKS50byhlLmdldFZhbHVlKCkpOwogICAgIH0KKyAgICBmb3IgKE1hcC5FbnRyeTxUeXBlTGl0ZXJhbDw/PiwgQ2xhc3M8Pz4+IGUgOiBsaXN0ZW5lcnMuZW50cmllcygpKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIFR5cGVMaXRlcmFsPE9iamVjdD4gdHlwZSA9IChUeXBlTGl0ZXJhbDxPYmplY3Q+KSBlLmdldEtleSgpOworCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIENsYXNzPE9iamVjdD4gaW1wbCA9IChDbGFzczxPYmplY3Q+KSBlLmdldFZhbHVlKCk7CisKKyAgICAgIEFubm90YXRpb24gbiA9IGNhbGN1bGF0ZUJpbmRBbm5vdGF0aW9uKGltcGwpOworICAgICAgYmluZCh0eXBlKS5hbm5vdGF0ZWRXaXRoKG4pLnRvKGltcGwpOworICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldFBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKQEAgLTY2LDYgKzgzLDEyIEBACiAgICAgfQogICB9CiAKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgbGlzdGVuKFR5cGVMaXRlcmFsPD8+IHRsLCBDbGFzczw/PiBjbGF6eikgeworICAgIGxpc3RlbmVycy5wdXQodGwsIGNsYXp6KTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgTW9kdWxlIGNyZWF0ZSgpIHRocm93cyBJbnZhbGlkUGx1Z2luRXhjZXB0aW9uIHsKICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoY29tbWFuZCAhPSBudWxsLCAicGx1Z2luTmFtZSBtdXN0IGJlIHByb3ZpZGVkIik7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoRGFlbW9uLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoRGFlbW9uLmphdmEKaW5kZXggNjY0Y2U0NS4uYzQzZGU2MCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaERhZW1vbi5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hEYWVtb24uamF2YQpAQCAtMTQsNiArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hBZGRyZXNzZXNNb2R1bGUuSUFOQV9TU0hfUE9SVDsKKwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CiAKQEAgLTIxLDcgKzIzLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hBZHZlcnRpc2VkQWRkcmVzc2VzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaExpc3RlbkFkZHJlc3NlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5JZEdlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5Tb2NrZXRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTExNCwxMyArMTE4LDEwIEBACiAgKi8KIEBTaW5nbGV0b24KIHB1YmxpYyBjbGFzcyBTc2hEYWVtb24gZXh0ZW5kcyBTc2hTZXJ2ZXIgaW1wbGVtZW50cyBTc2hJbmZvLCBMaWZlY3ljbGVMaXN0ZW5lciB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJQU5BX1NTSF9QT1JUID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9SVCA9IDI5NDE4OwotCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTc2hEYWVtb24uY2xhc3MpOwogCiAgIHByaXZhdGUgZmluYWwgTGlzdDxTb2NrZXRBZGRyZXNzPiBsaXN0ZW47Ci0gIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGFkdmVydGlzZWRBZGRyZXNzOworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBhZHZlcnRpc2VkOwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4ga2VlcEFsaXZlOwogICBwcml2YXRlIGZpbmFsIExpc3Q8SG9zdEtleT4gaG9zdEtleXM7CiAgIHByaXZhdGUgdm9sYXRpbGUgSW9BY2NlcHRvciBhY2NlcHRvcjsKQEAgLTEyOSwxMSArMTMwLDEzIEBACiAgIFNzaERhZW1vbihmaW5hbCBDb21tYW5kRmFjdG9yeSBjb21tYW5kRmFjdG9yeSwgZmluYWwgTm9TaGVsbCBub1NoZWxsLAogICAgICAgZmluYWwgUHVibGlja2V5QXV0aGVudGljYXRvciB1c2VyQXV0aCwKICAgICAgIGZpbmFsIEtleVBhaXJQcm92aWRlciBob3N0S2V5UHJvdmlkZXIsIGZpbmFsIElkR2VuZXJhdG9yIGlkR2VuZXJhdG9yLAotICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnLCBmaW5hbCBTc2hMb2cgc3NoTG9nKSB7CisgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcsIGZpbmFsIFNzaExvZyBzc2hMb2csCisgICAgICBAU3NoTGlzdGVuQWRkcmVzc2VzIGZpbmFsIExpc3Q8U29ja2V0QWRkcmVzcz4gbGlzdGVuLAorICAgICAgQFNzaEFkdmVydGlzZWRBZGRyZXNzZXMgZmluYWwgTGlzdDxTdHJpbmc+IGFkdmVydGlzZWQpIHsKICAgICBzZXRQb3J0KElBTkFfU1NIX1BPUlQgLyogbmV2ZXIgdXNlZCAqLyk7CiAKLSAgICBsaXN0ZW4gPSBwYXJzZUxpc3RlbihjZmcpOwotICAgIGFkdmVydGlzZWRBZGRyZXNzID0gcGFyc2VBZHZlcnRpc2VkQWRkcmVzcyhjZmcpOworICAgIHRoaXMubGlzdGVuID0gbGlzdGVuOworICAgIHRoaXMuYWR2ZXJ0aXNlZCA9IGFkdmVydGlzZWQ7CiAgICAgcmV1c2VBZGRyZXNzID0gY2ZnLmdldEJvb2xlYW4oInNzaGQiLCAicmV1c2VhZGRyZXNzIiwgdHJ1ZSk7CiAgICAga2VlcEFsaXZlID0gY2ZnLmdldEJvb2xlYW4oInNzaGQiLCAidGNwa2VlcGFsaXZlIiwgdHJ1ZSk7CiAKQEAgLTE0OSw2ICsxNTIsMTggQEAKICAgICAgICAgU3RyaW5nLnZhbHVlT2YoTUlMTElTRUNPTkRTLmNvbnZlcnQoQ29uZmlnVXRpbC5nZXRUaW1lVW5pdChjZmcsICJzc2hkIiwKICAgICAgICAgICAgIG51bGwsICJsb2dpbkdyYWNlVGltZSIsIDEyMCwgU0VDT05EUyksIFNFQ09ORFMpKSk7CiAKKyAgICBsb25nIGlkbGVUaW1lb3V0U2Vjb25kcyA9IENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLCAic3NoZCIsIG51bGwsCisgICAgICAgICJpZGxlVGltZW91dCIsIDAsIFNFQ09ORFMpOworICAgIGlmIChpZGxlVGltZW91dFNlY29uZHMgPT0gMCkgeworICAgICAgLy8gU2luY2UgQXBhY2hlIFNTSEQgZG9lcyBub3QgYWxsb3cgdG8gdHVybiBvZmYgY2xvc2luZyBpZGxlIGNvbm5lY3Rpb25zLAorICAgICAgLy8gd2UgZmFrZSBpdCBieSB1c2luZyB0aGUgaGlnaGVzdCB0aW1lb3V0IGFsbG93ZWQgYnkgQXBhY2hlIFNTSEQsIHdoaWNoCisgICAgICAvLyBhbW91bnRzIHRvIH4yNCBkYXlzLgorICAgICAgaWRsZVRpbWVvdXRTZWNvbmRzID0gTUlMTElTRUNPTkRTLnRvU2Vjb25kcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorICAgIGdldFByb3BlcnRpZXMoKS5wdXQoCisgICAgICAgIElETEVfVElNRU9VVCwKKyAgICAgICAgU3RyaW5nLnZhbHVlT2YoU0VDT05EUy50b01pbGxpcyhpZGxlVGltZW91dFNlY29uZHMpKSk7CisKICAgICBmaW5hbCBpbnQgbWF4Q29ubmVjdGlvbnNQZXJVc2VyID0KICAgICAgICAgY2ZnLmdldEludCgic3NoZCIsICJtYXhDb25uZWN0aW9uc1BlclVzZXIiLCA2NCk7CiAgICAgaWYgKDAgPCBtYXhDb25uZWN0aW9uc1BlclVzZXIpIHsKQEAgLTI2OCw3ICsyODMsNyBAQAogICAgICAgYnVmLnB1dFJhd1B1YmxpY0tleShwdWIpOwogICAgICAgZmluYWwgYnl0ZVtdIGtleUJpbiA9IGJ1Zi5nZXRDb21wYWN0RGF0YSgpOwogCi0gICAgICBmb3IgKGZpbmFsIFN0cmluZyBhZGRyIDogbXlBZHZlcnRpc2VkQWRkcmVzc2VzKCkpIHsKKyAgICAgIGZvciAoZmluYWwgU3RyaW5nIGFkZHIgOiBhZHZlcnRpc2VkKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgci5hZGQobmV3IEhvc3RLZXkoYWRkciwga2V5QmluKSk7CiAgICAgICAgIH0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgewpAQCAtMjc5LDM2ICsyOTQsNiBAQAogICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHIpOwogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbXlBZHZlcnRpc2VkQWRkcmVzc2VzKCkgewotICAgIGlmIChhZHZlcnRpc2VkQWRkcmVzcyAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gYWR2ZXJ0aXNlZEFkZHJlc3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IGFkZHJzID0gbXlBZGRyZXNzZXMoKTsKLSAgICAgIExpc3Q8U3RyaW5nPiBzdHJBZGRycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhZGRycy5zaXplKCkpOwotICAgICAgZm9yIChmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBhZGRyIDogYWRkcnMpIHsKLSAgICAgICAgc3RyQWRkcnMuYWRkKFNvY2tldFV0aWwuZm9ybWF0KGFkZHIsIElBTkFfU1NIX1BPUlQpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdHJBZGRyczsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IG15QWRkcmVzc2VzKCkgewotICAgIEFycmF5TGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gcHViID0gbmV3IEFycmF5TGlzdDxJbmV0U29ja2V0QWRkcmVzcz4oKTsKLSAgICBBcnJheUxpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IGxvY2FsID0gbmV3IEFycmF5TGlzdDxJbmV0U29ja2V0QWRkcmVzcz4oKTsKLQotICAgIGZvciAoZmluYWwgU29ja2V0QWRkcmVzcyBhZGRyIDogbGlzdGVuKSB7Ci0gICAgICBpZiAoYWRkciBpbnN0YW5jZW9mIEluZXRTb2NrZXRBZGRyZXNzKSB7Ci0gICAgICAgIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGluZXRBZGRyID0gKEluZXRTb2NrZXRBZGRyZXNzKSBhZGRyOwotICAgICAgICBpZiAoaW5ldEFkZHIuZ2V0QWRkcmVzcygpLmlzTG9vcGJhY2tBZGRyZXNzKCkpIHsKLSAgICAgICAgICBsb2NhbC5hZGQoaW5ldEFkZHIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1Yi5hZGQoaW5ldEFkZHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwdWIuaXNFbXB0eSgpID8gbG9jYWwgOiBwdWI7Ci0gIH0KLQogICBwcml2YXRlIExpc3Q8UHVibGljS2V5PiBteUhvc3RLZXlzKCkgewogICAgIGZpbmFsIEtleVBhaXJQcm92aWRlciBwID0gZ2V0S2V5UGFpclByb3ZpZGVyKCk7CiAgICAgZmluYWwgTGlzdDxQdWJsaWNLZXk+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFB1YmxpY0tleT4oMik7CkBAIC0zMzYsNDIgKzMyMSw2IEBACiAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKICAgfQogCi0gIHByaXZhdGUgTGlzdDxTdHJpbmc+IHBhcnNlQWR2ZXJ0aXNlZEFkZHJlc3MoZmluYWwgQ29uZmlnIGNmZykgewotICAgIGZpbmFsIFN0cmluZ1tdIHdhbnQgPSBjZmcuZ2V0U3RyaW5nTGlzdCgic3NoZCIsIG51bGwsICJhZHZlcnRpc2VkYWRkcmVzcyIpOwotICAgIGlmICh3YW50Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qod2FudCk7Ci0gIH0KLQotICBwcml2YXRlIExpc3Q8U29ja2V0QWRkcmVzcz4gcGFyc2VMaXN0ZW4oZmluYWwgQ29uZmlnIGNmZykgewotICAgIGZpbmFsIEFycmF5TGlzdDxTb2NrZXRBZGRyZXNzPiBiaW5kID0gbmV3IEFycmF5TGlzdDxTb2NrZXRBZGRyZXNzPigyKTsKLSAgICBmaW5hbCBTdHJpbmdbXSB3YW50ID0gY2ZnLmdldFN0cmluZ0xpc3QoInNzaGQiLCBudWxsLCAibGlzdGVuYWRkcmVzcyIpOwotICAgIGlmICh3YW50ID09IG51bGwgfHwgd2FudC5sZW5ndGggPT0gMCkgewotICAgICAgYmluZC5hZGQobmV3IEluZXRTb2NrZXRBZGRyZXNzKERFRkFVTFRfUE9SVCkpOwotICAgICAgcmV0dXJuIGJpbmQ7Ci0gICAgfQotCi0gICAgaWYgKHdhbnQubGVuZ3RoID09IDEgJiYgaXNPZmYod2FudFswXSkpIHsKLSAgICAgIHJldHVybiBiaW5kOwotICAgIH0KLQotICAgIGZvciAoZmluYWwgU3RyaW5nIGRlc2MgOiB3YW50KSB7Ci0gICAgICB0cnkgewotICAgICAgICBiaW5kLmFkZChTb2NrZXRVdGlsLnJlc29sdmUoZGVzYywgREVGQVVMVF9QT1JUKSk7Ci0gICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICBsb2cuZXJyb3IoIkJhZCBzc2hkLmxpc3RlbmFkZHJlc3M6ICIgKyBkZXNjICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJpbmQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT2ZmKFN0cmluZyBsaXN0ZW5Ib3N0bmFtZSkgewotICAgIHJldHVybiAib2ZmIi5lcXVhbHNJZ25vcmVDYXNlKGxpc3Rlbkhvc3RuYW1lKQotICAgICAgICB8fCAibm9uZSIuZXF1YWxzSWdub3JlQ2FzZShsaXN0ZW5Ib3N0bmFtZSkKLSAgICAgICAgfHwgIm5vIi5lcXVhbHNJZ25vcmVDYXNlKGxpc3Rlbkhvc3RuYW1lKTsKLSAgfQotCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICBwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVyQm91bmN5Q2FzdGxlKCkgewogICAgIHNldEtleUV4Y2hhbmdlRmFjdG9yaWVzKEFycmF5cy48TmFtZWRGYWN0b3J5PEtleUV4Y2hhbmdlPj4gYXNMaXN0KApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaExvZy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaExvZy5qYXZhCmluZGV4IGM5YWMzZTcuLjMzNjQ5MGMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hMb2cuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTG9nLmphdmEKQEAgLTE0LDkgKzE0LDExIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0RXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0U2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdC5Tc2hBdWRpdEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBlZXJEYWVtb25Vc2VyOwpAQCAtNDIsNyArNDQsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCiAgIHZvaWQgb25Mb2dpbigpIHsKICAgICBhc3luYy5hcHBlbmQobG9nKCJMT0dJTiBGUk9NICIgKyBzZXNzaW9uLmdldCgpLmdldFJlbW90ZUFkZHJlc3NBc1N0cmluZygpKSk7Ci0gICAgYXVkaXQoY29udGV4dC5nZXQoKSwgIjAiLCAiTE9HSU4iLCBuZXcgU3RyaW5nW10ge30pOworICAgIGF1ZGl0KGNvbnRleHQuZ2V0KCksICIwIiwgIkxPR0lOIik7CiAgIH0KIAogICB2b2lkIG9uQXV0aEZhaWwoZmluYWwgU3NoU2Vzc2lvbiBzZCkgewpAQCAtMTI3LDE4ICsxMjgsMTQgQEAKICAgICB9CiAKICAgICBhc3luYy5hcHBlbmQoZXZlbnQpOwotICAgIGF1ZGl0KG51bGwsICJGQUlMIiwgIkFVVEgiLCBuZXcgU3RyaW5nW10ge3NkLmdldFJlbW90ZUFkZHJlc3NBc1N0cmluZygpfSk7CisgICAgYXVkaXQobnVsbCwgIkZBSUwiLCAiQVVUSCIpOwogICB9CiAKLSAgdm9pZCBvbkV4ZWN1dGUoaW50IGV4aXRWYWx1ZSkgeworICB2b2lkIG9uRXhlY3V0ZShEaXNwYXRjaENvbW1hbmQgZGNtZCwgaW50IGV4aXRWYWx1ZSkgewogICAgIGZpbmFsIENvbnRleHQgY3R4ID0gY29udGV4dC5nZXQoKTsKICAgICBjdHguZmluaXNoZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAotICAgIGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSA9IGN0eC5nZXRDb21tYW5kTGluZSgpOwotICAgIFN0cmluZyBjbWQgPSBRdW90ZWRTdHJpbmcuQk9VUk5FLnF1b3RlKGNvbW1hbmRMaW5lKTsKLSAgICBpZiAoY21kID09IGNvbW1hbmRMaW5lKSB7Ci0gICAgICBjbWQgPSAiJyIgKyBjb21tYW5kTGluZSArICInIjsKLSAgICB9CisgICAgU3RyaW5nIGNtZCA9IGV4dHJhY3RXaGF0KGRjbWQpOwogCiAgICAgZmluYWwgTG9nZ2luZ0V2ZW50IGV2ZW50ID0gbG9nKGNtZCk7CiAgICAgZXZlbnQuc2V0UHJvcGVydHkoUF9XQUlULCAoY3R4LnN0YXJ0ZWQgLSBjdHguY3JlYXRlZCkgKyAibXMiKTsKQEAgLTE2NSwxOSArMTYyLDU0IEBACiAgICAgZXZlbnQuc2V0UHJvcGVydHkoUF9TVEFUVVMsIHN0YXR1cyk7CiAKICAgICBhc3luYy5hcHBlbmQoZXZlbnQpOwotICAgIGF1ZGl0KGNvbnRleHQuZ2V0KCksIHN0YXR1cywgZ2V0Q29tbWFuZChjb21tYW5kTGluZSksCi0gICAgICAgIENvbW1hbmRGYWN0b3J5UHJvdmlkZXIuc3BsaXQoY29tbWFuZExpbmUpKTsKKyAgICBhdWRpdChjb250ZXh0LmdldCgpLCBzdGF0dXMsIGRjbWQpOwogICB9CiAKLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tbWFuZChTdHJpbmcgY29tbWFuZExpbmUpIHsKLSAgICBjb21tYW5kTGluZSA9IGNvbW1hbmRMaW5lLnRyaW0oKTsKLSAgICBpbnQgc3BhY2VQb3MgPSBjb21tYW5kTGluZS5pbmRleE9mKCcgJyk7Ci0gICAgcmV0dXJuIChzcGFjZVBvcyA+IDAgPyBjb21tYW5kTGluZS5zdWJzdHJpbmcoMCwgc3BhY2VQb3MpOmNvbW1hbmRMaW5lKTsKKyAgcHJpdmF0ZSBNdWx0aW1hcDxTdHJpbmcsID8+IGV4dHJhY3RQYXJhbWV0ZXJzKERpc3BhdGNoQ29tbWFuZCBkY21kKSB7CisgICAgU3RyaW5nW10gY21kQXJncyA9IGRjbWQuZ2V0QXJndW1lbnRzKCk7CisgICAgU3RyaW5nIHBhcmFtTmFtZSA9IG51bGw7CisgICAgaW50IGFyZ1BvcyA9IDA7CisgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcm1zID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBjbWRBcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICBTdHJpbmcgYXJnID0gY21kQXJnc1tpXTsKKyAgICAgIC8vIC0tIHN0b3AgcGFyYW1ldGVycyBwYXJzaW5nCisgICAgICBpZiAoYXJnLmVxdWFscygiLS0iKSkgeworICAgICAgICBmb3IgKGkrKzsgaSA8IGNtZEFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBwYXJtcy5wdXQoIiQiICsgYXJnUG9zKyssIGNtZEFyZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gLS1wYXJhbT12YWx1ZQorICAgICAgaW50IGVxUG9zID0gYXJnLmluZGV4T2YoJz0nKTsKKyAgICAgIGlmIChhcmcuc3RhcnRzV2l0aCgiLS0iKSAmJiBlcVBvcyA+IDApIHsKKyAgICAgICAgcGFybXMucHV0KGFyZy5zdWJzdHJpbmcoMCwgZXFQb3MpLCBhcmcuc3Vic3RyaW5nKGVxUG9zICsgMSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIC1wIHZhbHVlIG9yIC0tcGFyYW0gdmFsdWUKKyAgICAgIGlmIChhcmcuc3RhcnRzV2l0aCgiLSIpKSB7CisgICAgICAgIGlmIChwYXJhbU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgIHBhcm1zLnB1dChwYXJhbU5hbWUsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHBhcmFtTmFtZSA9IGFyZzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyB2YWx1ZQorICAgICAgaWYgKHBhcmFtTmFtZSA9PSBudWxsKSB7CisgICAgICAgIHBhcm1zLnB1dCgiJCIgKyBhcmdQb3MrKywgYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcm1zLnB1dChwYXJhbU5hbWUsIGFyZyk7CisgICAgICAgIHBhcmFtTmFtZSA9IG51bGw7CisgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbU5hbWUgIT0gbnVsbCkgeworICAgICAgcGFybXMucHV0KHBhcmFtTmFtZSwgbnVsbCk7CisgICAgfQorICAgIHJldHVybiBwYXJtczsKICAgfQogCiAgIHZvaWQgb25Mb2dvdXQoKSB7CiAgICAgYXN5bmMuYXBwZW5kKGxvZygiTE9HT1VUIikpOwotICAgIGF1ZGl0KGNvbnRleHQuZ2V0KCksICIwIiwgIkxPR09VVCIsIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgYXVkaXQoY29udGV4dC5nZXQoKSwgIjAiLCAiTE9HT1VUIik7CiAgIH0KIAogICBwcml2YXRlIExvZ2dpbmdFdmVudCBsb2coZmluYWwgU3RyaW5nIG1zZykgewpAQCAtNDE2LDIxICs0NDgsMjggQEAKICAgICB9CiAgIH0KIAotICB2b2lkIGF1ZGl0KENvbnRleHQgY3R4LCBPYmplY3QgcmVzdWx0LCBTdHJpbmcgY29tbWFuZE5hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgdm9pZCBhdWRpdChDb250ZXh0IGN0eCwgT2JqZWN0IHJlc3VsdCwgU3RyaW5nIGNtZCkgewogICAgIGZpbmFsIFN0cmluZyBzaWQgPSBleHRyYWN0U2Vzc2lvbklkKGN0eCk7CiAgICAgZmluYWwgbG9uZyBjcmVhdGVkID0gZXh0cmFjdENyZWF0ZWQoY3R4KTsKLSAgICBmaW5hbCBTdHJpbmcgd2hhdCA9IGV4dHJhY3RXaGF0KGNvbW1hbmROYW1lLCBhcmdzKTsKLSAgICBhdWRpdFNlcnZpY2UuZGlzcGF0Y2gobmV3IEF1ZGl0RXZlbnQoc2lkLCBleHRyYWN0Q3VycmVudFVzZXIoY3R4KSwgInNzaDoiCi0gICAgICAgICsgd2hhdCwgY3JlYXRlZCwgQXJyYXlzLmFzTGlzdChhcmdzKSwgcmVzdWx0KSk7CisgICAgYXVkaXRTZXJ2aWNlLmRpc3BhdGNoKG5ldyBTc2hBdWRpdEV2ZW50KHNpZCwgZXh0cmFjdEN1cnJlbnRVc2VyKGN0eCksIGNtZCwKKyAgICAgICAgY3JlYXRlZCwgbnVsbCwgcmVzdWx0KSk7CiAgIH0KIAotICBwcml2YXRlIFN0cmluZyBleHRyYWN0V2hhdChTdHJpbmcgY29tbWFuZE5hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gY29tbWFuZE5hbWU7Ci0gICAgaWYgKCJnZXJyaXQiLmVxdWFscyhjb21tYW5kTmFtZSkpIHsKLSAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpCi0gICAgICAgIHJlc3VsdCA9ICJnZXJyaXQiKyIuIithcmdzWzFdOworICB2b2lkIGF1ZGl0KENvbnRleHQgY3R4LCBPYmplY3QgcmVzdWx0LCBEaXNwYXRjaENvbW1hbmQgY21kKSB7CisgICAgZmluYWwgU3RyaW5nIHNpZCA9IGV4dHJhY3RTZXNzaW9uSWQoY3R4KTsKKyAgICBmaW5hbCBsb25nIGNyZWF0ZWQgPSBleHRyYWN0Q3JlYXRlZChjdHgpOworICAgIGF1ZGl0U2VydmljZS5kaXNwYXRjaChuZXcgU3NoQXVkaXRFdmVudChzaWQsIGV4dHJhY3RDdXJyZW50VXNlcihjdHgpLAorICAgICAgICBleHRyYWN0V2hhdChjbWQpLCBjcmVhdGVkLCBleHRyYWN0UGFyYW1ldGVycyhjbWQpLCByZXN1bHQpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RXaGF0KERpc3BhdGNoQ29tbWFuZCBkY21kKSB7CisgICAgU3RyaW5nIGNvbW1hbmROYW1lID0gZGNtZC5nZXRDb21tYW5kTmFtZSgpOworICAgIFN0cmluZ1tdIGFyZ3MgPSBkY21kLmdldEFyZ3VtZW50cygpOworICAgIGlmIChhcmdzLmxlbmd0aCA+IDEpIHsKKyAgICAgIHJldHVybiBjb21tYW5kTmFtZSArICIuIiArIGFyZ3NbMV07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBjb21tYW5kTmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCiAgIHByaXZhdGUgbG9uZyBleHRyYWN0Q3JlYXRlZChmaW5hbCBDb250ZXh0IGN0eCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaE1vZHVsZS5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaE1vZHVsZS5qYXZhCmluZGV4IDdmNGExZjcuLjZmYWQ0MmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTW9kdWxlLmphdmEKQEAgLTIyLDExICsyMiwxMCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DbWRMaW5lUGFyc2VyTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QZWVyRGFlbW9uVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVtb3RlUGVlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DaGFuZ2VVc2VyTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkZhY3RvcnlNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRSZXF1ZXN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQXN5bmNSZWNlaXZlQ29tbWl0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlF1ZXVlUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuTW9kdWxlR2VuZXJhdG9yOwpAQCAtNDQsNiArNDMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuQ29tbWFuZEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5QdWJsaWNrZXlBdXRoZW50aWNhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKwogaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtNjYsMTAgKzY2LDEwIEBACiAgICAgYmluZChTc2hTY29wZS5jbGFzcykuaW4oU0lOR0xFVE9OKTsKIAogICAgIGNvbmZpZ3VyZVJlcXVlc3RTY29wZSgpOworICAgIGluc3RhbGwobmV3IEFzeW5jUmVjZWl2ZUNvbW1pdHMuTW9kdWxlKCkpOwogICAgIGluc3RhbGwobmV3IENtZExpbmVQYXJzZXJNb2R1bGUoKSk7CiAgICAgY29uZmlndXJlQWxpYXNlcygpOwogCi0gICAgaW5zdGFsbChTc2hLZXlDYWNoZUltcGwubW9kdWxlKCkpOwogICAgIGJpbmQoU3NoTG9nLmNsYXNzKTsKICAgICBiaW5kKFNzaEluZm8uY2xhc3MpLnRvKFNzaERhZW1vbi5jbGFzcykuaW4oU0lOR0xFVE9OKTsKICAgICBmYWN0b3J5KERpc3BhdGNoQ29tbWFuZC5GYWN0b3J5LmNsYXNzKTsKQEAgLTgzLDggKzgzLDYgQEAKICAgICBiaW5kKFdvcmtRdWV1ZS5FeGVjdXRvci5jbGFzcykuYW5ub3RhdGVkV2l0aChTdHJlYW1Db21tYW5kRXhlY3V0b3IuY2xhc3MpCiAgICAgICAgIC50b1Byb3ZpZGVyKFN0cmVhbUNvbW1hbmRFeGVjdXRvclByb3ZpZGVyLmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIGJpbmQoUXVldWVQcm92aWRlci5jbGFzcykudG8oQ29tbWFuZEV4ZWN1dG9yUXVldWVQcm92aWRlci5jbGFzcykuaW4oU0lOR0xFVE9OKTsKLSAgICBiaW5kKEFjY291bnRNYW5hZ2VyLmNsYXNzKTsKLSAgICBmYWN0b3J5KENoYW5nZVVzZXJOYW1lLkZhY3RvcnkuY2xhc3MpOwogCiAgICAgYmluZChQdWJsaWNrZXlBdXRoZW50aWNhdG9yLmNsYXNzKS50byhEYXRhYmFzZVB1YktleUF1dGguY2xhc3MpOwogICAgIGJpbmQoS2V5UGFpclByb3ZpZGVyLmNsYXNzKS50b1Byb3ZpZGVyKEhvc3RLZXlQcm92aWRlci5jbGFzcykuaW4oU0lOR0xFVE9OKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hTY29wZS5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNjb3BlLmphdmEKaW5kZXggZDZmNjZjYS4uNjRhMWE0MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNjb3BlLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNjb3BlLmphdmEKQEAgLTE0LDE5ICsxNCwyMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlJlcXVlc3RDbGVhbnVwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuUmVxdWVzdENvbnRleHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5PdXRPZlNjb3BlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNjb3BlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnV0aWwuUHJvdmlkZXJzOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIEd1aWNlIHNjb3BlcyBmb3Igc3RhdGUgZHVyaW5nIGFuIFNTSCBjb25uZWN0aW9uLiAqLwpAQCAtMzQsMjkgKzM4LDM0IEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEtleTxSZXF1ZXN0Q2xlYW51cD4gUkNfS0VZID0KICAgICAgIEtleS5nZXQoUmVxdWVzdENsZWFudXAuY2xhc3MpOwogCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEtleTxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gREJfS0VZID0KKyAgICAgIEtleS5nZXQoUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIuY2xhc3MpOworCiAgIGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBSZXF1ZXN0Q29udGV4dCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0Q2xlYW51cCBjbGVhbnVwOworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENsZWFudXAgY2xlYW51cCA9IG5ldyBSZXF1ZXN0Q2xlYW51cCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwPEtleTw/PiwgT2JqZWN0PiBtYXAgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3Rvcnk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTc2hTZXNzaW9uIHNlc3Npb247CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29tbWFuZExpbmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8S2V5PD8+LCBPYmplY3Q+IG1hcDsKIAogICAgIGZpbmFsIGxvbmcgY3JlYXRlZDsKICAgICB2b2xhdGlsZSBsb25nIHN0YXJ0ZWQ7CiAgICAgdm9sYXRpbGUgbG9uZyBmaW5pc2hlZDsKIAotICAgIHByaXZhdGUgQ29udGV4dChmaW5hbCBTc2hTZXNzaW9uIHMsIGZpbmFsIFN0cmluZyBjLCBmaW5hbCBsb25nIGF0KSB7Ci0gICAgICBjbGVhbnVwID0gbmV3IFJlcXVlc3RDbGVhbnVwKCk7CisgICAgcHJpdmF0ZSBDb250ZXh0KFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmLCBmaW5hbCBTc2hTZXNzaW9uIHMsCisgICAgICAgIGZpbmFsIFN0cmluZyBjLCBmaW5hbCBsb25nIGF0KSB7CisgICAgICBzY2hlbWFGYWN0b3J5ID0gc2Y7CiAgICAgICBzZXNzaW9uID0gczsKICAgICAgIGNvbW1hbmRMaW5lID0gYzsKLQotICAgICAgbWFwID0gbmV3IEhhc2hNYXA8S2V5PD8+LCBPYmplY3Q+KCk7Ci0gICAgICBtYXAucHV0KFJDX0tFWSwgY2xlYW51cCk7Ci0KICAgICAgIGNyZWF0ZWQgPSBzdGFydGVkID0gZmluaXNoZWQgPSBhdDsKKyAgICAgIG1hcC5wdXQoUkNfS0VZLCBjbGVhbnVwKTsKKyAgICAgIG1hcC5wdXQoREJfS0VZLCBuZXcgUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIoCisgICAgICAgICAgc2NoZW1hRmFjdG9yeSwKKyAgICAgICAgICBQcm92aWRlcnMub2YoY2xlYW51cCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIENvbnRleHQoQ29udGV4dCBwLCBTc2hTZXNzaW9uIHMsIFN0cmluZyBjKSB7Ci0gICAgICB0aGlzKHMsIGMsIHAuY3JlYXRlZCk7CisgICAgICB0aGlzKHAuc2NoZW1hRmFjdG9yeSwgcywgYywgcC5jcmVhdGVkKTsKICAgICAgIHN0YXJ0ZWQgPSBwLnN0YXJ0ZWQ7CiAgICAgICBmaW5pc2hlZCA9IHAuZmluaXNoZWQ7CiAgICAgfQpAQCAtNzMsMTIgKzgyLDE2IEBACiAgICAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgewogICAgICAgZmluYWwgQ3VycmVudFVzZXIgdXNlciA9IHNlc3Npb24uZ2V0Q3VycmVudFVzZXIoKTsKICAgICAgIGlmICh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJGYWN0b3J5LmNyZWF0ZSh1c2VyLmdldEFjY2Vzc1BhdGgoKSwgLy8KLSAgICAgICAgICAgICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldEFjY291bnRJZCgpKTsKKyAgICAgICAgcmV0dXJuIHVzZXJGYWN0b3J5LmNyZWF0ZSgoKElkZW50aWZpZWRVc2VyKSB1c2VyKS5nZXRBY2NvdW50SWQoKSk7CiAgICAgICB9CiAgICAgICByZXR1cm4gdXNlcjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvdmlkZXI8UmV2aWV3RGI+IGdldFJldmlld0RiUHJvdmlkZXIoKSB7CisgICAgICByZXR1cm4gKFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyKSBtYXAuZ2V0KERCX0tFWSk7CisgICAgfQorCiAgICAgc3luY2hyb25pemVkIDxUPiBUIGdldChLZXk8VD4ga2V5LCBQcm92aWRlcjxUPiBjcmVhdG9yKSB7CiAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgIFQgdCA9IChUKSBtYXAuZ2V0KGtleSk7CkBAIC0xMTQsOCArMTI3LDkgQEAKICAgICBwcml2YXRlIGZpbmFsIFNzaFNjb3BlIHNzaFNjb3BlOwogCiAgICAgQEluamVjdAotICAgIFByb3BhZ2F0b3IoU3NoU2NvcGUgc3NoU2NvcGUsIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKLSAgICAgIHN1cGVyKFJFUVVFU1QsIGN1cnJlbnQsIGxvY2FsKTsKKyAgICBQcm9wYWdhdG9yKFNzaFNjb3BlIHNzaFNjb3BlLCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgICBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlclByb3ZpZGVyKSB7CisgICAgICBzdXBlcihSRVFVRVNULCBjdXJyZW50LCBsb2NhbCwgZGJQcm92aWRlclByb3ZpZGVyKTsKICAgICAgIHRoaXMuc3NoU2NvcGUgPSBzc2hTY29wZTsKICAgICB9CiAKQEAgLTE0OCw4ICsxNjIsOCBAQAogICAgIHRoaXMudXNlckZhY3RvcnkgPSB1c2VyRmFjdG9yeTsKICAgfQogCi0gIENvbnRleHQgbmV3Q29udGV4dChTc2hTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBjb21tYW5kTGluZSkgewotICAgIHJldHVybiBuZXcgQ29udGV4dChzZXNzaW9uLCBjb21tYW5kTGluZSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICBDb250ZXh0IG5ld0NvbnRleHQoU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YsIFNzaFNlc3Npb24gcywgU3RyaW5nIGNtZCkgeworICAgIHJldHVybiBuZXcgQ29udGV4dChzZiwgcywgY21kLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgIH0KIAogICBwcml2YXRlIENvbnRleHQgbmV3Q29udGludWluZ0NvbnRleHQoQ29udGV4dCBjdHgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hTZXNzaW9uLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoU2Vzc2lvbi5qYXZhCmluZGV4IDNjNGQ0ZjguLjJjYzE2YjUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hTZXNzaW9uLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNlc3Npb24uamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLlNlc3Npb24uQXR0cmlidXRlS2V5OwpAQCAtNDMsNiArNDQsNyBAQAogICB9CiAKICAgU3NoU2Vzc2lvbihTc2hTZXNzaW9uIHBhcmVudCwgU29ja2V0QWRkcmVzcyBwZWVyLCBDdXJyZW50VXNlciB1c2VyKSB7CisgICAgdXNlci5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguU1NIX0NPTU1BTkQpOwogICAgIHRoaXMuc2Vzc2lvbklkID0gcGFyZW50LnNlc3Npb25JZDsKICAgICB0aGlzLnJlbW90ZUFkZHJlc3MgPSBwZWVyOwogICAgIGlmIChwYXJlbnQucmVtb3RlQWRkcmVzcyA9PSBwZWVyKSB7CkBAIC04Myw2ICs4NSwxMCBAQAogICAgIGF1dGhFcnJvciA9IGVycm9yOwogICB9CiAKKyAgdm9pZCBzZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGggcGF0aCkgeworICAgIGlkZW50aXR5LnNldEFjY2Vzc1BhdGgocGF0aCk7CisgIH0KKwogICAvKiogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGRpZCBub3Qgc3VjY2VlZC4gKi8KICAgYm9vbGVhbiBpc0F1dGhlbnRpY2F0aW9uRXJyb3IoKSB7CiAgICAgcmV0dXJuIGF1dGhFcnJvciAhPSBudWxsOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1N1RXhlYy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1N1RXhlYy5qYXZhCmluZGV4IDMzNDU5YzIuLmNjZjIzZTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9TdUV4ZWMuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3VFeGVjLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BdG9taWNzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBlZXJEYWVtb25Vc2VyOwpAQCAtMTE2LDE0ICsxMTUsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICBwZWVyID0gcGVlckFkZHJlc3M7CiAgICAgfQotCi0gICAgcmV0dXJuIG5ldyBTc2hTZXNzaW9uKHNlc3Npb24uZ2V0KCksIHBlZXIsIHVzZXJGYWN0b3J5LmNyZWF0ZSgKLSAgICAgICAgQWNjZXNzUGF0aC5TU0hfQ09NTUFORCwgbmV3IFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwZWVyOwotICAgICAgICAgIH0KLSAgICAgICAgfSwgYWNjb3VudElkKSk7CisgICAgcmV0dXJuIG5ldyBTc2hTZXNzaW9uKHNlc3Npb24uZ2V0KCksIHBlZXIsCisgICAgICAgIHVzZXJGYWN0b3J5LmNyZWF0ZShwZWVyLCBhY2NvdW50SWQpKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBqb2luKExpc3Q8U3RyaW5nPiBhcmdzKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5RdWVyeVNoZWxsLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5RdWVyeVNoZWxsLmphdmEKaW5kZXggMDhjNjUwYy4uMTUyMjlkYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FkbWluUXVlcnlTaGVsbC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9BZG1pblF1ZXJ5U2hlbGwuamF2YQpAQCAtMTUsOCArMTUsMTEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkFkbWluSGlnaFByaW9yaXR5Q29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0yNCwxMSArMjcsMTUgQEAKIAogLyoqIE9wZW5zIGEgcXVlcnkgcHJvY2Vzc29yLiAqLwogQEFkbWluSGlnaFByaW9yaXR5Q29tbWFuZAotQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQUNDRVNTX0RBVEFCQVNFKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImdzcWwiLCBkZXNjciA9ICJBZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2UgdG8gYWN0aXZlIGRhdGFiYXNlIikKIGZpbmFsIGNsYXNzIEFkbWluUXVlcnlTaGVsbCBleHRlbmRzIFNzaENvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgUXVlcnlTaGVsbC5GYWN0b3J5IGZhY3Rvcnk7CiAKKyAgQEluamVjdAorICBwcml2YXRlIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOworCiAgIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIHVzYWdlID0gIlNldCBvdXRwdXQgZm9ybWF0IikKICAgcHJpdmF0ZSBRdWVyeVNoZWxsLk91dHB1dEZvcm1hdCBmb3JtYXQgPSBRdWVyeVNoZWxsLk91dHB1dEZvcm1hdC5QUkVUVFk7CiAKQEAgLTM2LDEzICs0MywzNyBAQAogICBwcml2YXRlIFN0cmluZyBxdWVyeTsKIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotICAgIGZpbmFsIFF1ZXJ5U2hlbGwgc2hlbGwgPSBmYWN0b3J5LmNyZWF0ZShpbiwgb3V0KTsKLSAgICBzaGVsbC5zZXRPdXRwdXRGb3JtYXQoZm9ybWF0KTsKLSAgICBpZiAocXVlcnkgIT0gbnVsbCkgewotICAgICAgc2hlbGwuZXhlY3V0ZShxdWVyeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNoZWxsLnJ1bigpOworICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7CisgICAgdHJ5IHsKKyAgICAgIGNoZWNrUGVybWlzc2lvbigpOworCisgICAgICBmaW5hbCBRdWVyeVNoZWxsIHNoZWxsID0gZmFjdG9yeS5jcmVhdGUoaW4sIG91dCk7CisgICAgICBzaGVsbC5zZXRPdXRwdXRGb3JtYXQoZm9ybWF0KTsKKyAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7CisgICAgICAgIHNoZWxsLmV4ZWN1dGUocXVlcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hlbGwucnVuKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiAiICsgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgcGVybWl0dGVkIHRvIHBlcmZvcm0gcmF3IHF1ZXJpZXMuCisgICAqIDxwPgorICAgKiBBcyB0aGUgQFJlcXVpcmVDYXBhYmlsaXR5IGd1YXJkcyBhdCB2YXJpb3VzIGVudHJ5IHBvaW50cyBvZiBpbnRlcm5hbAorICAgKiBjb21tYW5kcyBpbXBsaWNpdGx5IGFkZCBhZG1pbmlzdHJhdG9ycyAod2hpY2ggd2Ugd2FudCB0byBhdm9pZCksIHdlIGFsc28KKyAgICogY2hlY2sgcGVybWlzc2lvbnMgd2l0aGluIFF1ZXJ5U2hlbGwgYW5kIGdyYW50IGFjY2VzcyBvbmx5IHRvIHRob3NlIHdobworICAgKiBjYW5QZXJmb3JtUmF3UXVlcnksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBhZG1pbmlzdHJhdG9ycyBvciBub3QuCisgICAqCisgICAqIEB0aHJvd3MgUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrUGVybWlzc2lvbigpIHRocm93cyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIHsKKyAgICBpZiAoIWN1cnJlbnRVc2VyLmdldENhcGFiaWxpdGllcygpLmNhbkFjY2Vzc0RhdGFiYXNlKCkpIHsKKyAgICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgXCJBY2Nlc3MgRGF0YWJhc2VcIiBjYXBhYmlsaXR5LiIsCisgICAgICAgICAgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKSkpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FkbWluU2V0UGFyZW50LmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQppbmRleCA2NDgzZTI0Li5mYWYyMjI0IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQpAQCAtMTQsNiArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CkBAIC0yMyw2ICsyNiw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zNSwxMSArMzksMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2V0LXByb2plY3QtcGFyZW50IiwgZGVzY3IgPSAiQ2hhbmdlIHRoZSBwcm9qZWN0IHBlcm1pc3Npb25zIGFyZSBpbmhlcml0ZWQgZnJvbSIpCiBmaW5hbCBjbGFzcyBBZG1pblNldFBhcmVudCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWRtaW5TZXRQYXJlbnQuY2xhc3MpOwogCkBAIC0xOTcsMTcgKzIwMywxNSBAQAogICB9CiAKICAgcHJpdmF0ZSBTZXQ8UHJvamVjdC5OYW1lS2V5PiBnZXRBbGxQYXJlbnRzKGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSkgewotICAgIGZpbmFsIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHBhcmVudHMgPSBuZXcgSGFzaFNldDxQcm9qZWN0Lk5hbWVLZXk+KCk7Ci0gICAgUHJvamVjdC5OYW1lS2V5IHAgPSBwcm9qZWN0TmFtZTsKLSAgICB3aGlsZSAocCAhPSBudWxsICYmIHBhcmVudHMuYWRkKHApKSB7Ci0gICAgICBmaW5hbCBQcm9qZWN0U3RhdGUgZSA9IHByb2plY3RDYWNoZS5nZXQocCk7Ci0gICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgIC8vIElmIHdlIGNhbid0IGdldCBpdCBmcm9tIHRoZSBjYWNoZSwgcHJldGVuZCBpdCdzIG5vdCBwcmVzZW50LgotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHAgPSBlLmdldFByb2plY3QoKS5nZXRQYXJlbnQoYWxsUHJvamVjdHNOYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudHM7CisgICAgUHJvamVjdFN0YXRlIHBzID0gcHJvamVjdENhY2hlLmdldChwcm9qZWN0TmFtZSk7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoSXRlcmFibGVzLnRyYW5zZm9ybSgKKyAgICAgIHBzICE9IG51bGwgPyBwcy5wYXJlbnRzKCkgOiBDb2xsZWN0aW9ucy48UHJvamVjdFN0YXRlPiBlbXB0eVNldCgpLAorICAgICAgbmV3IEZ1bmN0aW9uPFByb2plY3RTdGF0ZSwgUHJvamVjdC5OYW1lS2V5PiAoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGFwcGx5KFByb2plY3RTdGF0ZSBpbikgeworICAgICAgICAgIHJldHVybiBpbi5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpOworICAgICAgICB9CisgICAgICB9KSk7CiAgIH0KIAogICBwcml2YXRlIExpc3Q8UHJvamVjdD4gZ2V0Q2hpbGRyZW4oZmluYWwgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUpIHsKQEAgLTIxOSw3ICsyMjMsNyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgaWYgKHBhcmVudE5hbWUuZXF1YWxzKGUuZ2V0UHJvamVjdCgpLmdldFBhcmVudChwcm9qZWN0TmFtZSkpKSB7CisgICAgICBpZiAocGFyZW50TmFtZS5lcXVhbHMoZS5nZXRQcm9qZWN0KCkuZ2V0UGFyZW50KGFsbFByb2plY3RzTmFtZSkpKSB7CiAgICAgICAgIGNoaWxkUHJvamVjdHMuYWRkKGUuZ2V0UHJvamVjdCgpKTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQXBwcm92ZU9wdGlvbi5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FwcHJvdmVPcHRpb24uamF2YQppbmRleCBhMWI4OTg4Li4yOTI1MGQzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQXBwcm92ZU9wdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9BcHByb3ZlT3B0aW9uLmphdmEKQEAgLTE0LDkgKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CiAKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZVBhcnNlcjsKQEAgLTMxLDExICszMCwxMSBAQAogZmluYWwgY2xhc3MgQXBwcm92ZU9wdGlvbiBpbXBsZW1lbnRzIE9wdGlvbiwgU2V0dGVyPFNob3J0PiB7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzYWdlOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZSB0eXBlOworICBwcml2YXRlIGZpbmFsIExhYmVsVHlwZSB0eXBlOwogCiAgIHByaXZhdGUgU2hvcnQgdmFsdWU7CiAKLSAgQXBwcm92ZU9wdGlvbihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHVzYWdlLCBmaW5hbCBBcHByb3ZhbFR5cGUgdHlwZSkgeworICBBcHByb3ZlT3B0aW9uKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdXNhZ2UsIGZpbmFsIExhYmVsVHlwZSB0eXBlKSB7CiAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7CiAgICAgdGhpcy50eXBlID0gdHlwZTsKQEAgLTEwMCw4ICs5OSw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRDYXRlZ29yeUlkKCkgewotICAgIHJldHVybiB0eXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKTsKKyAgU3RyaW5nIGdldExhYmVsTmFtZSgpIHsKKyAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBPbmVBcmd1bWVudE9wdGlvbkhhbmRsZXI8U2hvcnQ+IHsKQEAgLTEyMiw4ICsxMjEsOCBAQAogICAgICAgfQogCiAgICAgICBmaW5hbCBzaG9ydCB2YWx1ZSA9IFNob3J0LnBhcnNlU2hvcnQoYXJndW1lbnQpOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIG1pbiA9IGNtZE9wdGlvbi50eXBlLmdldE1pbigpOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIG1heCA9IGNtZE9wdGlvbi50eXBlLmdldE1heCgpOworICAgICAgZmluYWwgTGFiZWxWYWx1ZSBtaW4gPSBjbWRPcHRpb24udHlwZS5nZXRNaW4oKTsKKyAgICAgIGZpbmFsIExhYmVsVmFsdWUgbWF4ID0gY21kT3B0aW9uLnR5cGUuZ2V0TWF4KCk7CiAKICAgICAgIGlmICh2YWx1ZSA8IG1pbi5nZXRWYWx1ZSgpIHx8IHZhbHVlID4gbWF4LmdldFZhbHVlKCkpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjbWRPcHRpb24ubmFtZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0JhbkNvbW1pdENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9CYW5Db21taXRDb21tYW5kLmphdmEKaW5kZXggOTM5ZDY4YS4uMDI2OGJjMCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0JhbkNvbW1pdENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFuQ29tbWl0Q29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5CYW5Db21taXRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImJhbi1jb21taXQiLCBkZXNjciA9ICJCYW4gYSBjb21taXQgZnJvbSBhIHByb2plY3QncyByZXBvc2l0b3J5IikKIHB1YmxpYyBjbGFzcyBCYW5Db21taXRDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLXJlYXNvbiIsIGFsaWFzZXMgPSB7Ii1yIn0sIG1ldGFWYXIgPSAiUkVBU09OIiwgdXNhZ2UgPSAicmVhc29uIGZvciBiYW5uaW5nIHRoZSBjb21taXQiKQogICBwcml2YXRlIFN0cmluZyByZWFzb247CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFzZVRlc3RQcm9sb2dDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFzZVRlc3RQcm9sb2dDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxM2ZkNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9CYXNlVGVzdFByb2xvZ0NvbW1hbmQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZXNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aXNpb25SZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlzaW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLkZpbHRlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworYWJzdHJhY3QgY2xhc3MgQmFzZVRlc3RQcm9sb2dDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisgIHByaXZhdGUgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoKTsKKworICBASW5qZWN0CisgIHByaXZhdGUgQ2hhbmdlc0NvbGxlY3Rpb24gY2hhbmdlczsKKworICBASW5qZWN0CisgIHByaXZhdGUgUmV2aXNpb25zIHJldmlzaW9uczsKKworICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIHVzYWdlID0gIkNoYW5nZUlkIHRvIGxvYWQgaW4gcHJvbG9nIGVudmlyb25tZW50IikKKyAgcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VJZDsKKworICBAT3B0aW9uKG5hbWUgPSAiLXMiLAorICAgICAgdXNhZ2UgPSAiUmVhZCBwcm9sb2cgc2NyaXB0IGZyb20gc3RkaW4gaW5zdGVhZCBvZiByZWFkaW5nIHJ1bGVzLnBsIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoIikKKyAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlU3RkaW47CisKKyAgQE9wdGlvbihuYW1lID0gIi0tbm8tZmlsdGVycyIsIGFsaWFzZXMgPSB7Ii1uIn0sCisgICAgICB1c2FnZSA9ICJEb24ndCBydW4gdGhlIHN1Ym1pdF9maWx0ZXIvMiBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdHMiKQorICB2b2lkIHNldE5vRmlsdGVycyhib29sZWFuIG5vKSB7CisgICAgaW5wdXQuZmlsdGVycyA9IG5vID8gRmlsdGVycy5TS0lQIDogRmlsdGVycy5SVU47CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVzdE1vZGlmeVZpZXc8UmV2aXNpb25SZXNvdXJjZSwgSW5wdXQ+IGNyZWF0ZVZpZXcoKTsKKworICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBydW4oKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKKyAgICB0cnkgeworICAgICAgUmV2aXNpb25SZXNvdXJjZSByZXZpc2lvbiA9IHJldmlzaW9ucy5wYXJzZSgKKyAgICAgICAgICBjaGFuZ2VzLnBhcnNlKAorICAgICAgICAgICAgICBUb3BMZXZlbFJlc291cmNlLklOU1RBTkNFLAorICAgICAgICAgICAgICBJZFN0cmluZy5mcm9tVXJsKGNoYW5nZUlkKSksCisgICAgICAgICAgSWRTdHJpbmcuZnJvbVVybCgiY3VycmVudCIpKTsKKyAgICAgIGlmICh1c2VTdGRpbikgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IElPLnJlYWRXaG9sZVN0cmVhbShpbiwgNDA5Nik7CisgICAgICAgIGlucHV0LnJ1bGUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZSgKKyAgICAgICAgICAgIGJ1Zi5hcnJheSgpLAorICAgICAgICAgICAgYnVmLmFycmF5T2Zmc2V0KCksCisgICAgICAgICAgICBidWYubGltaXQoKSk7CisgICAgICB9CisgICAgICBPYmplY3QgcmVzdWx0ID0gY3JlYXRlVmlldygpLmFwcGx5KHJldmlzaW9uLCBpbnB1dCk7CisgICAgICBPdXRwdXRGb3JtYXQuSlNPTi5uZXdHc29uKCkudG9Kc29uKHJlc3VsdCwgc3Rkb3V0KTsKKyAgICAgIHN0ZG91dC5wcmludCgnXG4nKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiUHJvY2Vzc2luZyBvZiBwcm9sb2cgc2NyaXB0IGZhaWxlZDogIiArIGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZUFjY291bnRDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQppbmRleCBkNmZlY2FiLi5jMjA5MjQ5IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRCeUVtYWlsQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoS2V5Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1EdXBsaWNhdGVLZXlFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTQ3LDYgKzQ4LDcgQEAKIAogLyoqIENyZWF0ZSBhIG5ldyB1c2VyIGFjY291bnQuICoqLwogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9BQ0NPVU5UKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImNyZWF0ZS1hY2NvdW50IiwgZGVzY3IgPSAiQ3JlYXRlIGEgbmV3IGJhdGNoL3JvbGUgYWNjb3VudCIpCiBmaW5hbCBjbGFzcyBDcmVhdGVBY2NvdW50Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1ncm91cCIsIGFsaWFzZXMgPSB7Ii1nIn0sIG1ldGFWYXIgPSAiR1JPVVAiLCB1c2FnZSA9ICJncm91cHMgdG8gYWRkIGFjY291bnQgdG8iKQogICBwcml2YXRlIExpc3Q8QWNjb3VudEdyb3VwLklkPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cC5JZD4oKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVHcm91cENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVHcm91cENvbW1hbmQuamF2YQppbmRleCA3MjhjMjBjLi42NjA0NjBhIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlR3JvdXBDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZUdyb3VwQ29tbWFuZC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtQ3JlYXRlR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMzcsNiArMzgsNyBAQAogICogT3B0aW9uYWxseSwgcHV0cyBhbiBpbml0aWFsIHNldCBvZiB1c2VyIGluIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwLgogICovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX0dST1VQKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImNyZWF0ZS1ncm91cCIsIGRlc2NyID0gIkNyZWF0ZSBhIG5ldyBhY2NvdW50IGdyb3VwIikKIGZpbmFsIGNsYXNzIENyZWF0ZUdyb3VwQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1vd25lciIsIGFsaWFzZXMgPSB7Ii1vIn0sIG1ldGFWYXIgPSAiR1JPVVAiLCB1c2FnZSA9ICJvd25pbmcgZ3JvdXAsIGlmIG5vdCBzcGVjaWZpZWQgdGhlIGdyb3VwIHdpbGwgYmUgc2VsZi1vd25pbmciKQogICBwcml2YXRlIEFjY291bnRHcm91cC5JZCBvd25lckdyb3VwSWQ7CkBAIC01NywxMCArNTksMTAgQEAKICAgQE9wdGlvbihuYW1lID0gIi0tdmlzaWJsZS10by1hbGwiLCB1c2FnZSA9ICJ0byBtYWtlIHRoZSBncm91cCB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzIikKICAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKIAotICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuSWQ+IGluaXRpYWxHcm91cHMgPSBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuSWQ+KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpbml0aWFsR3JvdXBzID0gbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+KCk7CiAKICAgQE9wdGlvbihuYW1lID0gIi0tZ3JvdXAiLCBhbGlhc2VzID0gIi1nIiwgbWV0YVZhciA9ICJHUk9VUCIsIHVzYWdlID0gImluaXRpYWwgc2V0IG9mIGdyb3VwcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JvdXAiKQotICB2b2lkIGFkZEdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5JZCBpZCkgeworICB2b2lkIGFkZEdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGlkKSB7CiAgICAgaW5pdGlhbEdyb3Vwcy5hZGQoaWQpOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVQcm9qZWN0Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKaW5kZXggNWY1YjFlMy4uYmQ2MjRhZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKQEAgLTE5LDExICsxOSwxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5QZXJmb3JtQ3JlYXRlUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DcmVhdGVQcm9qZWN0QXJnczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TdWdnZXN0UGFyZW50Q2FuZGlkYXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zNCw2ICszNiw3IEBACiAKIC8qKiBDcmVhdGUgYSBuZXcgcHJvamVjdC4gKiovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1QpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiY3JlYXRlLXByb2plY3QiLCBkZXNjciA9ICJDcmVhdGUgYSBuZXcgcHJvamVjdCBhbmQgYXNzb2NpYXRlZCBHaXQgcmVwb3NpdG9yeSIpCiBmaW5hbCBjbGFzcyBDcmVhdGVQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1uYW1lIiwgYWxpYXNlcyA9IHsiLW4ifSwgbWV0YVZhciA9ICJOQU1FIiwgdXNhZ2UgPSAibmFtZSBvZiBwcm9qZWN0IHRvIGJlIGNyZWF0ZWQgKGRlcHJlY2F0ZWQgb3B0aW9uKSIpCiAgIHZvaWQgc2V0UHJvamVjdE5hbWVGcm9tT3B0aW9uKFN0cmluZyBuYW1lKSB7CkBAIC02NCwxNyArNjcsMzcgQEAKICAgICAgICsgIihkZWZhdWx0OiBNRVJHRV9JRl9ORUNFU1NBUlkpIikKICAgcHJpdmF0ZSBTdWJtaXRUeXBlIHN1Ym1pdFR5cGUgPSBTdWJtaXRUeXBlLk1FUkdFX0lGX05FQ0VTU0FSWTsKIAorICBAT3B0aW9uKG5hbWUgPSAiLS1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgdXNhZ2UgPSAiaWYgY29udHJpYnV0b3IgYWdyZWVtZW50IGlzIHJlcXVpcmVkIikKKyAgcHJpdmF0ZSBJbmhlcml0YWJsZUJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQ7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tc2lnbmVkLW9mZi1ieSIsIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgcmVxdWlyZWQiKQorICBwcml2YXRlIEluaGVyaXRhYmxlQm9vbGVhbiBzaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCisgIEBPcHRpb24obmFtZSA9ICItLWNvbnRlbnQtbWVyZ2UiLCB1c2FnZSA9ICJhbGxvdyBhdXRvbWF0aWMgY29uZmxpY3QgcmVzb2x2aW5nIHdpdGhpbiBmaWxlcyIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCisgIEBPcHRpb24obmFtZSA9ICItLWNoYW5nZS1pZCIsIHVzYWdlID0gImlmIGNoYW5nZS1pZCBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRCA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCiAgIEBPcHRpb24obmFtZSA9ICItLXVzZS1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgYWxpYXNlcyA9IHsiLS1jYSJ9LCB1c2FnZSA9ICJpZiBjb250cmlidXRvciBhZ3JlZW1lbnQgaXMgcmVxdWlyZWQiKQotICBwcml2YXRlIGJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzOworICB2b2lkIHNldFVzZUNvbnRyaWJ1dG9yQXJncmVlbWVudHMoYm9vbGVhbiBvbikgeworICAgIGNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tdXNlLXNpZ25lZC1vZmYtYnkiLCBhbGlhc2VzID0geyItLXNvIn0sIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgcmVxdWlyZWQiKQotICBwcml2YXRlIGJvb2xlYW4gc2lnbmVkT2ZmQnk7CisgIHZvaWQgc2V0VXNlU2lnbmVkT2ZmQnkoYm9vbGVhbiBvbikgeworICAgIHNpZ25lZE9mZkJ5ID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS11c2UtY29udGVudC1tZXJnZSIsIHVzYWdlID0gImFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRlbnRNZXJnZTsKKyAgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoYm9vbGVhbiBvbikgeworICAgIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tcmVxdWlyZS1jaGFuZ2UtaWQiLCBhbGlhc2VzID0geyItLWlkIn0sIHVzYWdlID0gImlmIGNoYW5nZS1pZCBpcyByZXF1aXJlZCIpCi0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQ7CisgIHZvaWQgc2V0UmVxdWlyZUNoYW5nZUlkKGJvb2xlYW4gb24pIHsKKyAgICByZXF1aXJlQ2hhbmdlSUQgPSBJbmhlcml0YWJsZUJvb2xlYW4uVFJVRTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLWJyYW5jaCIsIGFsaWFzZXMgPSB7Ii1iIn0sIG1ldGFWYXIgPSAiQlJBTkNIIiwgdXNhZ2UgPSAiaW5pdGlhbCBicmFuY2ggbmFtZVxuIgogICAgICAgKyAiKGRlZmF1bHQ6IG1hc3RlcikiKQpAQCAtOTUsNyArMTE4LDcgQEAKICAgfQogCiAgIEBJbmplY3QKLSAgcHJpdmF0ZSBDcmVhdGVQcm9qZWN0LkZhY3RvcnkgQ3JlYXRlUHJvamVjdEZhY3Rvcnk7CisgIHByaXZhdGUgUGVyZm9ybUNyZWF0ZVByb2plY3QuRmFjdG9yeSBmYWN0b3J5OwogCiAgIEBJbmplY3QKICAgcHJpdmF0ZSBTdWdnZXN0UGFyZW50Q2FuZGlkYXRlcy5GYWN0b3J5IHN1Z2dlc3RQYXJlbnRDYW5kaWRhdGVzRmFjdG9yeTsKQEAgLTEyMSw4ICsxNDQsNyBAQAogICAgICAgICBhcmdzLmJyYW5jaCA9IGJyYW5jaDsKICAgICAgICAgYXJncy5jcmVhdGVFbXB0eUNvbW1pdCA9IGNyZWF0ZUVtcHR5Q29tbWl0OwogCi0gICAgICAgIGZpbmFsIENyZWF0ZVByb2plY3QgY3JlYXRlUHJvamVjdCA9Ci0gICAgICAgICAgICBDcmVhdGVQcm9qZWN0RmFjdG9yeS5jcmVhdGUoYXJncyk7CisgICAgICAgIGZpbmFsIFBlcmZvcm1DcmVhdGVQcm9qZWN0IGNyZWF0ZVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZShhcmdzKTsKICAgICAgICAgY3JlYXRlUHJvamVjdC5jcmVhdGVQcm9qZWN0KCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBMaXN0PFByb2plY3QuTmFtZUtleT4gcGFyZW50Q2FuZGlkYXRlcyA9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvRGVmYXVsdENvbW1hbmRNb2R1bGUuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDJhNGRlZGMuLjM1YTRlMTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCkBAIC0zNiwyNSArMzYsMjggQEAKICAgICAvLyBTbGF2ZUNvbW1hbmRNb2R1bGUuCiAKICAgICBjb21tYW5kKGdlcnJpdCkudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIoZ2Vycml0KSk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJiYW4tY29tbWl0IikudG8oQmFuQ29tbWl0Q29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJmbHVzaC1jYWNoZXMiKS50byhGbHVzaENhY2hlcy5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJscy1wcm9qZWN0cyIpLnRvKExpc3RQcm9qZWN0c0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAibHMtZ3JvdXBzIikudG8oTGlzdEdyb3Vwc0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicXVlcnkiKS50byhRdWVyeS5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzaG93LWNhY2hlcyIpLnRvKFNob3dDYWNoZXMuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2hvdy1jb25uZWN0aW9ucyIpLnRvKFNob3dDb25uZWN0aW9ucy5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzaG93LXF1ZXVlIikudG8oU2hvd1F1ZXVlLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgInN0cmVhbS1ldmVudHMiKS50byhTdHJlYW1FdmVudHMuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAidmVyc2lvbiIpLnRvKFZlcnNpb25Db21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQmFuQ29tbWl0Q29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIEZsdXNoQ2FjaGVzLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgTGlzdFByb2plY3RzQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIExpc3RHcm91cHNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgTHNVc2VyUmVmcy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFF1ZXJ5LmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgU2hvd0NhY2hlcy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFNob3dDb25uZWN0aW9ucy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFNob3dRdWV1ZS5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFN0cmVhbUV2ZW50cy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFZlcnNpb25Db21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgR2FyYmFnZUNvbGxlY3Rpb25Db21tYW5kLmNsYXNzKTsKIAogICAgIGNvbW1hbmQoZ2Vycml0LCAicGx1Z2luIikudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIocGx1Z2luKSk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJscyIpLnRvKFBsdWdpbkxzQ29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJlbmFibGUiKS50byhQbHVnaW5FbmFibGVDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKHBsdWdpbiwgImluc3RhbGwiKS50byhQbHVnaW5JbnN0YWxsQ29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJyZWxvYWQiKS50byhQbHVnaW5SZWxvYWRDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKHBsdWdpbiwgInJlbW92ZSIpLnRvKFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQocGx1Z2luLCAiYWRkIikudG8oQ29tbWFuZHMua2V5KHBsdWdpbiwgImluc3RhbGwiKSk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJybSIpLnRvKENvbW1hbmRzLmtleShwbHVnaW4sICJyZW1vdmUiKSk7CisKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luTHNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luRW5hYmxlQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChwbHVnaW4sIFBsdWdpbkluc3RhbGxDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luUmVsb2FkQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChwbHVnaW4sIFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOworICAgIGFsaWFzKHBsdWdpbiwgImFkZCIsIFBsdWdpbkluc3RhbGxDb21tYW5kLmNsYXNzKTsKKyAgICBhbGlhcyhwbHVnaW4sICJybSIsIFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOwogCiAgICAgY29tbWFuZChnaXQpLnRvUHJvdmlkZXIobmV3IERpc3BhdGNoQ29tbWFuZFByb3ZpZGVyKGdpdCkpOwogICAgIGNvbW1hbmQoZ2l0LCAicmVjZWl2ZS1wYWNrIikudG8oQ29tbWFuZHMua2V5KGdlcnJpdCwgInJlY2VpdmUtcGFjayIpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9GbHVzaENhY2hlcy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKaW5kZXggZmE2MzA0MS4uMTNhYmRmNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5CYXNlQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKQEAgLTMxLDYgKzMyLDcgQEAKIAogLyoqIENhdXNlcyB0aGUgY2FjaGVzIHRvIHB1cmdlIGFsbCBlbnRyaWVzIGFuZCByZWxvYWQuICovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuRkxVU0hfQ0FDSEVTKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImZsdXNoLWNhY2hlcyIsIGRlc2NyID0gIkZsdXNoIHNvbWUvYWxsIHNlcnZlciBjYWNoZXMgZnJvbSBtZW1vcnkiKQogZmluYWwgY2xhc3MgRmx1c2hDYWNoZXMgZXh0ZW5kcyBDYWNoZUNvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFU1NJT05TID0gIndlYl9zZXNzaW9ucyI7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9HYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9HYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYxMTUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFJ1bnMgdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uICovCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuUlVOX0dDKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImdjIiwgZGVzY3IgPSAiUnVuIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24iKQorcHVibGljIGNsYXNzIEdhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kIHsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1hbGwiLCB1c2FnZSA9ICJydW5zIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhbGwgcHJvamVjdHMiKQorICBwcml2YXRlIGJvb2xlYW4gYWxsOworCisgIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gZmFsc2UsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJOQU1FIiwKKyAgICAgIHVzYWdlID0gInByb2plY3RzIGZvciB3aGljaCB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBzaG91bGQgYmUgcnVuIikKKyAgcHJpdmF0ZSBMaXN0PFByb2plY3RDb250cm9sPiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdENvbnRyb2w+KCk7CisKKyAgQEluamVjdAorICBwcml2YXRlIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uLkZhY3RvcnkgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5OworCisgIHByaXZhdGUgUHJpbnRXcml0ZXIgc3Rkb3V0OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzdGFydChFbnZpcm9ubWVudCBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnRUaHJlYWQobmV3IENvbW1hbmRSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0ZG91dCA9IHRvUHJpbnRXcml0ZXIob3V0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwYXJzZUNvbW1hbmRMaW5lKCk7CisgICAgICAgICAgdmVyaWZ5Q29tbWFuZExpbmUoKTsKKyAgICAgICAgICBydW5HQygpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29tbWFuZExpbmUoKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKKyAgICBpZiAoIWFsbCAmJiBwcm9qZWN0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwKKyAgICAgICAgICAibmVlZHMgcHJvamVjdHMgYXMgY29tbWFuZCBhcmd1bWVudHMgb3IgLS1hbGwgb3B0aW9uIik7CisgICAgfQorICAgIGlmIChhbGwgJiYgIXByb2plY3RzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLAorICAgICAgICAgICJlaXRoZXIgc3BlY2lmeSBwcm9qZWN0cyBhcyBjb21tYW5kIGFyZ3VtZW50cyBvciB1c2UgLS1hbGwgb3B0aW9uIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1bkdDKCkgeworICAgIExpc3Q8UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0TmFtZXM7CisgICAgaWYgKGFsbCkgeworICAgICAgcHJvamVjdE5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KHByb2plY3RDYWNoZS5hbGwoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb2plY3ROYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShwcm9qZWN0cy5zaXplKCkpOworICAgICAgZm9yIChQcm9qZWN0Q29udHJvbCBwYyA6IHByb2plY3RzKSB7CisgICAgICAgIHByb2plY3ROYW1lcy5hZGQocGMuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgICB9CisgICAgfQorCisgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5LmNyZWF0ZSgpLnJ1bihwcm9qZWN0TmFtZXMsIHN0ZG91dCk7CisgICAgaWYgKHJlc3VsdC5oYXNFcnJvcnMoKSkgeworICAgICAgZm9yIChHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvciBlIDogcmVzdWx0LmdldEVycm9ycygpKSB7CisgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgIHN3aXRjaCAoZS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICBjYXNlIFJFUE9TSVRPUllfTk9UX0ZPVU5EOgorICAgICAgICAgICAgbXNnID0gImVycm9yOiBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKSArICJcIiBub3QgZm91bmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHQ19BTFJFQURZX1NDSEVEVUxFRDoKKyAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIgorICAgICAgICAgICAgICAgICsgZS5nZXRQcm9qZWN0TmFtZSgpICsgIlwiIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdDX0ZBSUxFRDoKKyAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKQorICAgICAgICAgICAgICAgICsgIlwiIGZhaWxlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbXNnID0gImVycm9yOiBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHByb2plY3QgXCIiICsgZS5nZXRQcm9qZWN0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiXCIgZmFpbGVkOiAiICsgZS5nZXRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgc3Rkb3V0LnByaW50KG1zZyArICJcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xpc3RHcm91cHNDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQppbmRleCBmODg1NmYyLi5lNWI0MjAzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQpAQCAtMTQsOTMgKzE0LDkxIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5HZXRHcm91cHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5WaXNpYmxlR3JvdXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5MaXN0R3JvdXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5pb3V0aWwuQ29sdW1uRm9ybWF0dGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5VXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5FbnZpcm9ubWVudDsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogCi1wdWJsaWMgY2xhc3MgTGlzdEdyb3Vwc0NvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJscy1ncm91cHMiLCBkZXNjciA9ICJMaXN0IGdyb3VwcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIiKQorcHVibGljIGNsYXNzIExpc3RHcm91cHNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBASW5qZWN0Ci0gIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBwcml2YXRlIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OwotCi0gIEBPcHRpb24obmFtZSA9ICItLXByb2plY3QiLCBhbGlhc2VzID0geyItcCJ9LAotICAgICAgdXNhZ2UgPSAicHJvamVjdHMgZm9yIHdoaWNoIHRoZSBncm91cHMgc2hvdWxkIGJlIGxpc3RlZCIpCi0gIHByaXZhdGUgZmluYWwgTGlzdDxQcm9qZWN0Q29udHJvbD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RDb250cm9sPigpOwotCi0gIEBPcHRpb24obmFtZSA9ICItLXZpc2libGUtdG8tYWxsIiwgdXNhZ2UgPSAidG8gbGlzdCBvbmx5IGdyb3VwcyB0aGF0IGFyZSB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzIikKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKLQotICBAT3B0aW9uKG5hbWUgPSAiLS10eXBlIiwgdXNhZ2UgPSAidHlwZSBvZiBncm91cCIpCi0gIHByaXZhdGUgQWNjb3VudEdyb3VwLlR5cGUgZ3JvdXBUeXBlOwotCi0gIEBPcHRpb24obmFtZSA9ICItLXVzZXIiLCBhbGlhc2VzID0geyItdSJ9LAotICAgICAgdXNhZ2UgPSAidXNlciBmb3Igd2hpY2ggdGhlIGdyb3VwcyBzaG91bGQgYmUgbGlzdGVkIikKLSAgcHJpdmF0ZSBBY2NvdW50LklkIHVzZXI7Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tdmVyYm9zZSIsIGFsaWFzZXMgPSB7Ii12In0sCi0gICAgICB1c2FnZSA9ICJ2ZXJib3NlIG91dHB1dCBmb3JtYXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZSAiICsKLSAgICAgICAgICAiZ3JvdXAgbmFtZSwgVVVJRCwgZGVzY3JpcHRpb24sIHR5cGUsIG93bmVyIGdyb3VwIG5hbWUsICIgKwotICAgICAgICAgICJvd25lciBncm91cCBVVUlELCBhbmQgd2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwiKQotICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZU91dHB1dDsKKyAgcHJpdmF0ZSBNeUxpc3RHcm91cHMgaW1wbDsKIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEZhaWx1cmUgewotICAgIHRyeSB7Ci0gICAgICBpZiAodXNlciAhPSBudWxsICYmICFwcm9qZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiZmF0YWw6IC0tdXNlciBhbmQgLS1wcm9qZWN0IG9wdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlLiIpOworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBFbnZpcm9ubWVudCBlbnYpIHsKKyAgICBzdGFydFRocmVhZChuZXcgQ29tbWFuZFJ1bm5hYmxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2VDb21tYW5kTGluZShpbXBsKTsKKyAgICAgICAgaWYgKGltcGwuZ2V0VXNlcigpICE9IG51bGwgJiYgIWltcGwuZ2V0UHJvamVjdHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsICJmYXRhbDogLS11c2VyIGFuZCAtLXByb2plY3Qgb3B0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUuIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgc3Rkb3V0ID0gdG9QcmludFdyaXRlcihvdXQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGltcGwuZGlzcGxheShzdGRvdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgICB9CiAgICAgICB9CisgICAgfSk7CisgIH0KIAotICAgICAgZmluYWwgVmlzaWJsZUdyb3VwcyB2aXNpYmxlR3JvdXBzID0gdmlzaWJsZUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCk7Ci0gICAgICB2aXNpYmxlR3JvdXBzLnNldE9ubHlWaXNpYmxlVG9BbGwodmlzaWJsZVRvQWxsKTsKLSAgICAgIHZpc2libGVHcm91cHMuc2V0R3JvdXBUeXBlKGdyb3VwVHlwZSk7Ci0gICAgICBmaW5hbCBHcm91cExpc3QgZ3JvdXBMaXN0OwotICAgICAgaWYgKCFwcm9qZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZ3JvdXBMaXN0ID0gdmlzaWJsZUdyb3Vwcy5nZXQocHJvamVjdHMpOwotICAgICAgfSBlbHNlIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgZ3JvdXBMaXN0ID0gdmlzaWJsZUdyb3Vwcy5nZXQodXNlckZhY3RvcnkuY3JlYXRlKHVzZXIpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdyb3VwTGlzdCA9IHZpc2libGVHcm91cHMuZ2V0KCk7Ci0gICAgICB9CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15TGlzdEdyb3VwcyBleHRlbmRzIExpc3RHcm91cHMgeworICAgIEBPcHRpb24obmFtZSA9ICItLXZlcmJvc2UiLCBhbGlhc2VzID0geyItdiJ9LAorICAgICAgICB1c2FnZSA9ICJ2ZXJib3NlIG91dHB1dCBmb3JtYXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZSAiICsKKyAgICAgICAgICAgICJncm91cCBuYW1lLCBVVUlELCBkZXNjcmlwdGlvbiwgb3duZXIgZ3JvdXAgbmFtZSwgIiArCisgICAgICAgICAgICAib3duZXIgZ3JvdXAgVVVJRCwgYW5kIHdoZXRoZXIgdGhlIGdyb3VwIGlzIHZpc2libGUgdG8gYWxsIikKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZU91dHB1dDsKIAotICAgICAgZmluYWwgQ29sdW1uRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBDb2x1bW5Gb3JtYXR0ZXIoc3Rkb3V0LCAnXHQnKTsKLSAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwIGcgOiBncm91cExpc3QuZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihnLmdldE5hbWUoKSk7CisgICAgQEluamVjdAorICAgIE15TGlzdEdyb3VwcyhmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCisgICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5HZW5lcmljRmFjdG9yeSBnZW5lcmljR3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgICAgZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IGlkZW50aWZpZWRVc2VyLAorICAgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgICAgZmluYWwgUHJvdmlkZXI8R2V0R3JvdXBzPiBhY2NvdW50R2V0R3JvdXBzLAorICAgICAgICBmaW5hbCBHcm91cEpzb24ganNvbikgeworICAgICAgc3VwZXIoZ3JvdXBDYWNoZSwgZ3JvdXBDb250cm9sRmFjdG9yeSwgZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICAgICAgaWRlbnRpZmllZFVzZXIsIHVzZXJGYWN0b3J5LCBhY2NvdW50R2V0R3JvdXBzLCBqc29uKTsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BsYXkoZmluYWwgUHJpbnRXcml0ZXIgb3V0KSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvbHVtbkZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQ29sdW1uRm9ybWF0dGVyKG91dCwgJ1x0Jyk7CisgICAgICBmb3IgKGZpbmFsIEdyb3VwSW5mbyBpbmZvIDogZ2V0KCkpIHsKKyAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihPYmplY3RzLmZpcnN0Tm9uTnVsbChpbmZvLm5hbWUsICJuL2EiKSk7CiAgICAgICAgIGlmICh2ZXJib3NlT3V0cHV0KSB7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihLZXlVdGlsLmRlY29kZShnLmdldEdyb3VwVVVJRCgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKAotICAgICAgICAgICAgICBnLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCA/IGcuZ2V0RGVzY3JpcHRpb24oKSA6ICIiKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKGcuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBvd25pbmdHcm91cCA9Ci0gICAgICAgICAgICAgIGdyb3VwQ2FjaGUuZ2V0KGcuZ2V0T3duZXJHcm91cFVVSUQoKSk7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbigKLSAgICAgICAgICAgICAgb3duaW5nR3JvdXAgIT0gbnVsbCA/IG93bmluZ0dyb3VwLmdldE5hbWUoKSA6ICJuL2EiKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKEtleVV0aWwuZGVjb2RlKGcuZ2V0T3duZXJHcm91cFVVSUQoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihCb29sZWFuLnRvU3RyaW5nKGcuaXNWaXNpYmxlVG9BbGwoKSkpOworICAgICAgICAgIEFjY291bnRHcm91cCBvID0gaW5mby5vd25lcklkICE9IG51bGwKKyAgICAgICAgICAgICAgPyBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLlVVSUQoVXJsLmRlY29kZShpbmZvLm93bmVySWQpKSkKKyAgICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihVcmwuZGVjb2RlKGluZm8uaWQpKTsKKyAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKFN0cmluZ3MubnVsbFRvRW1wdHkoaW5mby5kZXNjcmlwdGlvbikpOworICAgICAgICAgIGZvcm1hdHRlci5hZGRDb2x1bW4obyAhPSBudWxsID8gby5nZXROYW1lKCkgOiAibi9hIik7CisgICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihvICE9IG51bGwgPyBvLmdldEdyb3VwVVVJRCgpLmdldCgpIDogIiIpOworICAgICAgICAgIGZvcm1hdHRlci5hZGRDb2x1bW4oQm9vbGVhbi50b1N0cmluZyhPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICAgICAgaW5mby5vcHRpb25zLnZpc2libGVUb0FsbCwgQm9vbGVhbi5GQUxTRSkpKTsKICAgICAgICAgfQogICAgICAgICBmb3JtYXR0ZXIubmV4dExpbmUoKTsKICAgICAgIH0KICAgICAgIGZvcm1hdHRlci5maW5pc2goKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBkaWUoZSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdFByb2plY3RzQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xpc3RQcm9qZWN0c0NvbW1hbmQuamF2YQppbmRleCAxM2UzZjE3Li5hYjcwMzk1IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdFByb2plY3RzQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9MaXN0UHJvamVjdHNDb21tYW5kLmphdmEKQEAgLTE2LDEwICsxNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTGlzdFByb2plY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQmFzZUNvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5FbnZpcm9ubWVudDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMtcHJvamVjdHMiLCBkZXNjciA9ICJMaXN0IHByb2plY3RzIHZpc2libGUgdG8gdGhlIGNhbGxlciIpCiBmaW5hbCBjbGFzcyBMaXN0UHJvamVjdHNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgTGlzdFByb2plY3RzIGltcGw7CkBAIC0zMSw3ICszNSw4IEBACiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcGFyc2VDb21tYW5kTGluZShpbXBsKTsKICAgICAgICAgaWYgKCFpbXBsLmdldEZvcm1hdCgpLmlzSnNvbigpKSB7Ci0gICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIChpbXBsLmdldFNob3dCcmFuY2goKSAhPSBudWxsKSkgeworICAgICAgICAgIExpc3Q8U3RyaW5nPiBzaG93QnJhbmNoID0gaW1wbC5nZXRTaG93QnJhbmNoKCk7CisgICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIChzaG93QnJhbmNoICE9IG51bGwpICYmICFzaG93QnJhbmNoLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiZmF0YWw6IC0tdHJlZSBhbmQgLS1zaG93LWJyYW5jaCBvcHRpb25zIGFyZSBub3QgY29tcGF0aWJsZS4iKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIGltcGwuaXNTaG93RGVzY3JpcHRpb24oKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xzVXNlclJlZnMuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9Mc1VzZXJSZWZzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYmY5NQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9Mc1VzZXJSZWZzLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ2hhbmdlQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRhZ0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVmlzaWJsZVJlZkZpbHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMtdXNlci1yZWZzIiwgZGVzY3IgPSAiTGlzdCByZWZzIHZpc2libGUgdG8gYSBzcGVjaWZpYyB1c2VyIikKK3B1YmxpYyBjbGFzcyBMc1VzZXJSZWZzIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKworICBASW5qZWN0CisgIHByaXZhdGUgUmV2aWV3RGIgZGI7CisKKyAgQEluamVjdAorICBwcml2YXRlIFRhZ0NhY2hlIHRhZ0NhY2hlOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1wcm9qZWN0IiwgYWxpYXNlcyA9IHsiLXAifSwgbWV0YVZhciA9ICJQUk9KRUNUIiwKKyAgICAgIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAicHJvamVjdCBmb3Igd2hpY2ggdGhlIHJlZnMgc2hvdWxkIGJlIGxpc3RlZCIpCisgIHByaXZhdGUgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2w7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tdXNlciIsIGFsaWFzZXMgPSB7Ii11In0sICBtZXRhVmFyID0gIlVTRVIiLAorICAgICAgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJ1c2VyIGZvciB3aGljaCB0aGUgZ3JvdXBzIHNob3VsZCBiZSBsaXN0ZWQiKQorICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1vbmx5LXJlZnMtaGVhZHMiLCB1c2FnZSA9ICJsaXN0IG9ubHkgcmVmcyB1bmRlciByZWZzL2hlYWRzIikKKyAgcHJpdmF0ZSBib29sZWFuIG9ubHlSZWZzSGVhZHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7CisgICAgQWNjb3VudCB1c2VyQWNjb3VudCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHVzZXJBY2NvdW50ID0gYWNjb3VudFJlc29sdmVyLmZpbmQodXNlck5hbWUpOworICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBkaWUoZSk7CisgICAgfQorCisgICAgaWYgKHVzZXJBY2NvdW50ID09IG51bGwpIHsKKyAgICAgIHN0ZG91dC5wcmludCgiTm8gc2luZ2xlIHVzZXIgY291bGQgYmUgZm91bmQgd2hlbiBzZWFyY2hpbmcgZm9yOiAiICsgdXNlck5hbWUgKyAnXG4nKTsKKyAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSB1c2VyRmFjdG9yeS5jcmVhdGUodXNlckFjY291bnQuZ2V0SWQoKSk7CisgICAgUHJvamVjdENvbnRyb2wgdXNlclByb2plY3RDb250cm9sID0gcHJvamVjdENvbnRyb2wuZm9yVXNlcih1c2VyKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBudWxsOworICAgIHRyeSB7CisgICAgICByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkodXNlclByb2plY3RDb250cm9sLmdldFByb2plY3QoKQorICAgICAgICAgICAgICAuZ2V0TmFtZUtleSgpKTsKKworICAgICAgTWFwPFN0cmluZywgUmVmPiByZWZzTWFwID0KKyAgICAgICAgICBuZXcgVmlzaWJsZVJlZkZpbHRlcih0YWdDYWNoZSwgY2hhbmdlQ2FjaGUsIHJlcG8sIHVzZXJQcm9qZWN0Q29udHJvbCwKKyAgICAgICAgICAgICAgZGIsIHRydWUpLmZpbHRlcihyZXBvLmdldEFsbFJlZnMoKSwgZmFsc2UpOworCisgICAgICBmb3IgKGZpbmFsIFN0cmluZyByZWYgOiByZWZzTWFwLmtleVNldCgpKSB7CisgICAgICAgIGlmICghb25seVJlZnNIZWFkcyB8fCByZWYuc3RhcnRzV2l0aChCcmFuY2guUl9IRUFEUykpIHsKKyAgICAgICAgICBzdGRvdXQucHJpbnRsbihyZWYpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiAnIgorICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSArICInOiBub3QgYSBnaXQgYXJjaGl2ZSIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiBFcnJvciBvcGVuaW5nOiAnIgorICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9NYXN0ZXJDb21tYW5kTW9kdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTWFzdGVyQ29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDkwYmMwN2UuLjMwZjNjOTUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9NYXN0ZXJDb21tYW5kTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL01hc3RlckNvbW1hbmRNb2R1bGUuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmROYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5EaXNwYXRjaENvbW1hbmRQcm92aWRlcjsKIAogCiAvKiogUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGEgR2Vycml0IHNlcnZlciBpbiBtYXN0ZXIgbW9kZSBzdXBwb3J0cy4gKi8KQEAgLTI0LDE5ICsyNSwyNCBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgIGZpbmFsIENvbW1hbmROYW1lIGdlcnJpdCA9IENvbW1hbmRzLm5hbWVkKCJnZXJyaXQiKTsKKyAgICBmaW5hbCBDb21tYW5kTmFtZSB0ZXN0U3VibWl0ID0gQ29tbWFuZHMubmFtZWQoZ2Vycml0LCAidGVzdC1zdWJtaXQiKTsKIAotICAgIGNvbW1hbmQoZ2Vycml0LCAiYXBwcm92ZSIpLnRvKFJldmlld0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAiY3JlYXRlLWFjY291bnQiKS50byhDcmVhdGVBY2NvdW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJjcmVhdGUtZ3JvdXAiKS50byhDcmVhdGVHcm91cENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicmVuYW1lLWdyb3VwIikudG8oUmVuYW1lR3JvdXBDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgImNyZWF0ZS1wcm9qZWN0IikudG8oQ3JlYXRlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAiZ3NxbCIpLnRvKEFkbWluUXVlcnlTaGVsbC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJ0ZXN0LXN1Ym1pdC1ydWxlIikudG8oVGVzdFN1Ym1pdFJ1bGUuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2V0LXJldmlld2VycyIpLnRvKFNldFJldmlld2Vyc0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicmVjZWl2ZS1wYWNrIikudG8oUmVjZWl2ZS5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzZXQtcHJvamVjdC1wYXJlbnQiKS50byhBZG1pblNldFBhcmVudC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJyZXZpZXciKS50byhSZXZpZXdDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgInNldC1hY2NvdW50IikudG8oU2V0QWNjb3VudENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2V0LXByb2plY3QiKS50byhTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIENyZWF0ZUFjY291bnRDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQ3JlYXRlR3JvdXBDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmVuYW1lR3JvdXBDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQ3JlYXRlUHJvamVjdENvbW1hbmQuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBBZG1pblF1ZXJ5U2hlbGwuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBTZXRSZXZpZXdlcnNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmVjZWl2ZS5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIEFkbWluU2V0UGFyZW50LmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmV2aWV3Q29tbWFuZC5jbGFzcyk7CisgICAgLy8gZGVwcmVjYXRlZCBhbGlhcyB0byByZXZpZXcgY29tbWFuZAorICAgIGFsaWFzKGdlcnJpdCwgImFwcHJvdmUiLCBSZXZpZXdDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgU2V0QWNjb3VudENvbW1hbmQuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CisKKyAgICBjb21tYW5kKGdlcnJpdCwgInRlc3Qtc3VibWl0IikudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIodGVzdFN1Ym1pdCkpOworICAgIGNvbW1hbmQodGVzdFN1Ym1pdCwgVGVzdFN1Ym1pdFJ1bGVDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHRlc3RTdWJtaXQsIFRlc3RTdWJtaXRUeXBlQ29tbWFuZC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5FbmFibGVDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luRW5hYmxlQ29tbWFuZC5qYXZhCmluZGV4IDRkZjNhZWUuLjcwOWUzMzcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5FbmFibGVDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkVuYWJsZUNvbW1hbmQuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbkluc3RhbGxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTG9hZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTI3LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiZW5hYmxlIiwgZGVzY3IgPSAiRW5hYmxlIHBsdWdpbnMiKQogZmluYWwgY2xhc3MgUGx1Z2luRW5hYmxlQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAQXJndW1lbnQoaW5kZXggPSAwLCBtZXRhVmFyID0gIk5BTUUiLCByZXF1aXJlZCA9IHRydWUsIHVzYWdlID0gInBsdWdpbihzKSB0byBlbmFibGUiKQogICBMaXN0PFN0cmluZz4gbmFtZXM7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luSW5zdGFsbENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCmluZGV4IDEyNzIyZWMuLmZjMDM2ZmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5Mb2FkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiaW5zdGFsbCIsIGRlc2NyID0gIkluc3RhbGwvQWRkIGEgcGx1Z2luIikKIGZpbmFsIGNsYXNzIFBsdWdpbkluc3RhbGxDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLW5hbWUiLCBhbGlhc2VzID0geyItbiJ9LCB1c2FnZSA9ICJpbnN0YWxsIHVuZGVyIG5hbWUiKQogICBwcml2YXRlIFN0cmluZyBuYW1lOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkxzQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkxzQ29tbWFuZC5qYXZhCmluZGV4IDZkNzQ5MGYuLmFiNmM5NzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5Mc0NvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luTHNDb21tYW5kLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5MaXN0UGx1Z2luczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuRW52aXJvbm1lbnQ7CkBAIC0yNSw2ICsyNiw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMiLCBkZXNjciA9ICJMaXN0IHRoZSBpbnN0YWxsZWQgcGx1Z2lucyIpCiBmaW5hbCBjbGFzcyBQbHVnaW5Mc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAgIEBJbmplY3QKICAgcHJpdmF0ZSBMaXN0UGx1Z2lucyBpbXBsOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbG9hZENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZWxvYWRDb21tYW5kLmphdmEKaW5kZXggZDI0MjlhOS4uODVhZGUwMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbG9hZENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luUmVsb2FkQ29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5Mb2FkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtMjcsNiArMjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZWxvYWQiLCBkZXNjciA9ICJSZWxvYWQvUmVzdGFydCBwbHVnaW5zIikKIGZpbmFsIGNsYXNzIFBsdWdpblJlbG9hZENvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJOQU1FIiwgdXNhZ2UgPSAicGx1Z2lucyB0byByZWxvYWQvcmVzdGFydCIpCiAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbW92ZUNvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZW1vdmVDb21tYW5kLmphdmEKaW5kZXggOGJhYWI3Ny4uOTZhZGI4ZmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZW1vdmVDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbW92ZUNvbW1hbmQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTG9hZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTI2LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicmVtb3ZlIiwgZGVzY3IgPSAiRGlzYWJsZSBwbHVnaW5zIikKIGZpbmFsIGNsYXNzIFBsdWdpblJlbW92ZUNvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJOQU1FIiwgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJwbHVnaW4gdG8gcmVtb3ZlIikKICAgTGlzdDxTdHJpbmc+IG5hbWVzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5LmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQppbmRleCA2MzY4MGY4Li4yZDE3ODc2IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5RdWVyeVByb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0yMyw2ICsyNCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInF1ZXJ5IiwgZGVzY3IgPSAiUXVlcnkgdGhlIGNoYW5nZSBkYXRhYmFzZSIpCiBjbGFzcyBRdWVyeSBleHRlbmRzIFNzaENvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgUXVlcnlQcm9jZXNzb3IgcHJvY2Vzc29yOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5U2hlbGwuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9RdWVyeVNoZWxsLmphdmEKaW5kZXggMThjZTc3Zi4uMTYzMGQxMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5U2hlbGwuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnlTaGVsbC5qYXZhCkBAIC02Myw5ICs2Myw4IEBACiAKICAgQEluamVjdAogICBRdWVyeVNoZWxsKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IGRiRmFjdG9yeSwKLQotICBAQXNzaXN0ZWQgZmluYWwgSW5wdXRTdHJlYW0gaW4sIEBBc3Npc3RlZCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgQEFzc2lzdGVkIGZpbmFsIElucHV0U3RyZWFtIGluLCBAQXNzaXN0ZWQgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgdGhpcy5kYkZhY3RvcnkgPSBkYkZhY3Rvcnk7CiAgICAgdGhpcy5pbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKICAgICB0aGlzLm91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURi04IikpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlY2VpdmUuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZWNlaXZlLmphdmEKaW5kZXggYjRkZTc1Yi4uZTBkZDM4ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlY2VpdmUuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmVjZWl2ZS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5UcmFuc2ZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlZpc2libGVSZWZGaWx0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5BYnN0cmFjdEdpdENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVG9vTGFyZ2VPYmplY3RJblBhY2tFeGNlcHRpb247CkBAIC00MSw2ICs0Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqIFJlY2VpdmVzIGNoYW5nZSB1cGxvYWQgb3ZlciBTU0ggdXNpbmcgdGhlIEdpdCByZWNlaXZlLXBhY2sgcHJvdG9jb2wuICovCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicmVjZWl2ZS1wYWNrIiwgZGVzY3IgPSAiU3RhbmRhcmQgR2l0IHNlcnZlciBzaWRlIGNvbW1hbmQgZm9yIGNsaWVudCBzaWRlIGdpdCBwdXNoIikKIGZpbmFsIGNsYXNzIFJlY2VpdmUgZXh0ZW5kcyBBYnN0cmFjdEdpdENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVjZWl2ZS5jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZW5hbWVHcm91cENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZW5hbWVHcm91cENvbW1hbmQuamF2YQppbmRleCBiOWFiYzkyLi5mM2MxYmIzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmVuYW1lR3JvdXBDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlbmFtZUdyb3VwQ29tbWFuZC5qYXZhCkBAIC0xOCwxMiArMTgsMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1SZW5hbWVHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZW5hbWUtZ3JvdXAiLCBkZXNjciA9ICJSZW5hbWUgYW4gYWNjb3VudCBncm91cCIpCiBwdWJsaWMgY2xhc3MgUmVuYW1lR3JvdXBDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgbWV0YVZhciA9ICJHUk9VUCIsIHVzYWdlID0gIm5hbWUgb2YgdGhlIGdyb3VwIHRvIGJlIHJlbmFtZWQiKQogICBwcml2YXRlIFN0cmluZyBncm91cE5hbWU7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmV2aWV3Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Jldmlld0NvbW1hbmQuamF2YQppbmRleCA1ZWJiNmM3Li41NzY5YTIyIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmV2aWV3Q29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZXZpZXdDb21tYW5kLmphdmEKQEAgLTE0LDI1ICsxNCwzNiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdC5FcnJvci5UeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5BYmFuZG9uQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQWJhbmRvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZVJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUG9zdFJldmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJlc3RvcmU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpc2lvblJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuU3VibWl0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuRGVsZXRlRHJhZnRQYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlB1Ymxpc2hEcmFmdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlJlc3RvcmVDaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5TdWJtaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlB1Ymxpc2hDb21tZW50czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnV0aWwuY2xpLkNtZExpbmVQYXJzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTQwLDcgKzUxLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTQ4LDExICs1OCwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZXZpZXciLCBkZXNjciA9ICJWZXJpZnksIGFwcHJvdmUgYW5kL29yIHN1Ym1pdCBvbmUgb3IgbW9yZSBwYXRjaCBzZXRzIikKIHB1YmxpYyBjbGFzcyBSZXZpZXdDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmV2aWV3Q29tbWFuZC5jbGFzcyk7CkBAIC02NiwxMyArNzcsMTIgQEAKICAgICByZXR1cm4gcGFyc2VyOwogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8UGF0Y2hTZXQuSWQ+IHBhdGNoU2V0SWRzID0gbmV3IEhhc2hTZXQ8UGF0Y2hTZXQuSWQ+KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PFBhdGNoU2V0PiBwYXRjaFNldHMgPSBuZXcgSGFzaFNldDxQYXRjaFNldD4oKTsKIAotICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJ7Q09NTUlUIHwgQ0hBTkdFLFBBVENIU0VUfSIsCi0gICAgICB1c2FnZSA9ICJsaXN0IG9mIGNvbW1pdHMgb3IgcGF0Y2ggc2V0cyB0byByZXZpZXciKQorICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJ7Q09NTUlUIHwgQ0hBTkdFLFBBVENIU0VUfSIsIHVzYWdlID0gImxpc3Qgb2YgY29tbWl0cyBvciBwYXRjaCBzZXRzIHRvIHJldmlldyIpCiAgIHZvaWQgYWRkUGF0Y2hTZXRJZChmaW5hbCBTdHJpbmcgdG9rZW4pIHsKICAgICB0cnkgewotICAgICAgcGF0Y2hTZXRJZHMuYWRkQWxsKHBhcnNlUGF0Y2hTZXRJZCh0b2tlbikpOworICAgICAgcGF0Y2hTZXRzLmFkZChwYXJzZVBhdGNoU2V0KHRva2VuKSk7CiAgICAgfSBjYXRjaCAoVW5sb2dnZWRGYWlsdXJlIGUpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CkBAIC0xMDUsMzEgKzExNSw1NCBAQAogICBAT3B0aW9uKG5hbWUgPSAiLS1kZWxldGUiLCB1c2FnZSA9ICJkZWxldGUgdGhlIHNwZWNpZmllZCBkcmFmdCBwYXRjaCBzZXQocykiKQogICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlRHJhZnRQYXRjaFNldDsKIAotICBASW5qZWN0Ci0gIHByaXZhdGUgUmV2aWV3RGIgZGI7CisgIEBPcHRpb24obmFtZSA9ICItLWxhYmVsIiwgYWxpYXNlcyA9ICItbCIsIHVzYWdlID0gImN1c3RvbSBsYWJlbChzKSB0byBhc3NpZ24iLCBtZXRhVmFyID0gIkxBQkVMPVZBTFVFIikKKyAgdm9pZCBhZGRMYWJlbChmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihTcGxpdHRlci5vbignPScpLnNwbGl0KHRva2VuKSk7CisgICAgaWYgKHBhcnRzLnNpemUoKSAhPSAyKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGN1c3RvbSBsYWJlbCAiICsgdG9rZW4pOworICAgIH0KKyAgICBzaG9ydCB2YWx1ZTsKKyAgICB0cnkgeworICAgICAgdmFsdWUgPSBTaG9ydC5wYXJzZVNob3J0KHBhcnRzLmdldCgxKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY3VzdG9tIGxhYmVsIHZhbHVlICIKKyAgICAgICAgICArIHBhcnRzLmdldCgxKSk7CisgICAgfQorICAgIGN1c3RvbUxhYmVscy5wdXQocGFydHMuZ2V0KDApLCB2YWx1ZSk7CisgIH0KIAogICBASW5qZWN0Ci0gIHByaXZhdGUgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOworICBwcml2YXRlIFJldmlld0RiIGRiOwogCiAgIEBJbmplY3QKICAgcHJpdmF0ZSBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7CiAKICAgQEluamVjdAotICBwcml2YXRlIFByb3ZpZGVyPEFiYW5kb25DaGFuZ2U+IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKKyAgcHJpdmF0ZSBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKKyAgcHJpdmF0ZSBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8QWJhbmRvbj4gYWJhbmRvblByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBQcm92aWRlcjxQb3N0UmV2aWV3PiByZXZpZXdQcm92aWRlcjsKIAogICBASW5qZWN0CiAgIHByaXZhdGUgUHVibGlzaERyYWZ0LkZhY3RvcnkgcHVibGlzaERyYWZ0RmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgUHJvdmlkZXI8UmVzdG9yZUNoYW5nZT4gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOworICBwcml2YXRlIFByb3ZpZGVyPFJlc3RvcmU+IHJlc3RvcmVQcm92aWRlcjsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeTsKKyAgcHJpdmF0ZSBQcm92aWRlcjxTdWJtaXQ+IHN1Ym1pdFByb3ZpZGVyOwogCiAgIHByaXZhdGUgTGlzdDxBcHByb3ZlT3B0aW9uPiBvcHRpb25MaXN0OworICBwcml2YXRlIE1hcDxTdHJpbmcsIFNob3J0PiBjdXN0b21MYWJlbHM7CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewpAQCAtMTYwLDIwICsxOTMsMjAgQEAKICAgICB9CiAKICAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICBmb3IgKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQgOiBwYXRjaFNldElkcykgeworICAgIGZvciAoZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQgOiBwYXRjaFNldHMpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGFwcHJvdmVPbmUocGF0Y2hTZXRJZCk7CisgICAgICAgIGFwcHJvdmVPbmUocGF0Y2hTZXQpOwogICAgICAgfSBjYXRjaCAoVW5sb2dnZWRGYWlsdXJlIGUpIHsKICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgd3JpdGVFcnJvcigiZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSArICJcbiIpOwogICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgb2sgPSBmYWxzZTsKLSAgICAgICAgd3JpdGVFcnJvcigibm8gc3VjaCBjaGFuZ2UgIiArIHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCkpOworICAgICAgICB3cml0ZUVycm9yKCJubyBzdWNoIGNoYW5nZSAiICsgcGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICB3cml0ZUVycm9yKCJmYXRhbDogaW50ZXJuYWwgc2VydmVyIGVycm9yIHdoaWxlIGFwcHJvdmluZyAiCi0gICAgICAgICAgICArIHBhdGNoU2V0SWQgKyAiXG4iKTsKLSAgICAgICAgbG9nLmVycm9yKCJpbnRlcm5hbCBlcnJvciB3aGlsZSBhcHByb3ZpbmcgIiArIHBhdGNoU2V0SWQsIGUpOworICAgICAgICAgICAgKyBwYXRjaFNldC5nZXRJZCgpICsgIlxuIik7CisgICAgICAgIGxvZy5lcnJvcigiaW50ZXJuYWwgZXJyb3Igd2hpbGUgYXBwcm92aW5nICIgKyBwYXRjaFNldC5nZXRJZCgpLCBlKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE4Myw1NCArMjE2LDk3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGFwcHJvdmVPbmUoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkKLSAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgRW1haWxFeGNlcHRpb24sIEZhaWx1cmUsCi0gICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSB2b2lkIGFwcGx5UmV2aWV3KGZpbmFsIENoYW5nZUNvbnRyb2wgY3RsLCBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCwKKyAgICAgIGZpbmFsIFBvc3RSZXZpZXcuSW5wdXQgcmV2aWV3KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXZpZXdQcm92aWRlci5nZXQoKS5hcHBseShuZXcgUmV2aXNpb25SZXNvdXJjZSgKKyAgICAgICAgbmV3IENoYW5nZVJlc291cmNlKGN0bCksIHBhdGNoU2V0KSwgcmV2aWV3KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHByb3ZlT25lKGZpbmFsIFBhdGNoU2V0IHBhdGNoU2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgIGlmIChjaGFuZ2VDb21tZW50ID09IG51bGwpIHsKICAgICAgIGNoYW5nZUNvbW1lbnQgPSAiIjsKICAgICB9CiAKLSAgICBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHMgPSBuZXcgSGFzaFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+KCk7CisgICAgUG9zdFJldmlldy5JbnB1dCByZXZpZXcgPSBuZXcgUG9zdFJldmlldy5JbnB1dCgpOworICAgIHJldmlldy5tZXNzYWdlID0gU3RyaW5ncy5lbXB0eVRvTnVsbChjaGFuZ2VDb21tZW50KTsKKyAgICByZXZpZXcubGFiZWxzID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgcmV2aWV3LmRyYWZ0cyA9IFBvc3RSZXZpZXcuRHJhZnRIYW5kbGluZy5QVUJMSVNIOworICAgIHJldmlldy5zdHJpY3RMYWJlbHMgPSBmYWxzZTsKICAgICBmb3IgKEFwcHJvdmVPcHRpb24gYW8gOiBvcHRpb25MaXN0KSB7CiAgICAgICBTaG9ydCB2ID0gYW8udmFsdWUoKTsKICAgICAgIGlmICh2ICE9IG51bGwpIHsKLSAgICAgICAgYXBzLmFkZChuZXcgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkKGFvLmdldENhdGVnb3J5SWQoKSwgdikpOworICAgICAgICByZXZpZXcubGFiZWxzLnB1dChhby5nZXRMYWJlbE5hbWUoKSwgdik7CiAgICAgICB9CiAgICAgfQorICAgIHJldmlldy5sYWJlbHMucHV0QWxsKGN1c3RvbUxhYmVscyk7CisKKyAgICAvLyBJZiByZXZpZXcgbGFiZWxzIGFyZSBiZWluZyBhcHBsaWVkLCB0aGUgY29tbWVudCB3aWxsIGJlIGluY2x1ZGVkCisgICAgLy8gb24gdGhlIHJldmlldyBub3RlLiBXZSBkb24ndCBuZWVkIHRvIGFkZCBpdCBhZ2FpbiBvbiB0aGUgYWJhbmRvbgorICAgIC8vIG9yIHJlc3RvcmUgY29tbWVudC4KKyAgICBpZiAoIXJldmlldy5sYWJlbHMuaXNFbXB0eSgpICYmIChhYmFuZG9uQ2hhbmdlIHx8IHJlc3RvcmVDaGFuZ2UpKSB7CisgICAgICBjaGFuZ2VDb21tZW50ID0gbnVsbDsKKyAgICB9CiAKICAgICB0cnkgewotICAgICAgcHVibGlzaENvbW1lbnRzRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgY2hhbmdlQ29tbWVudCwgYXBzLCBmb3JjZU1lc3NhZ2UpLmNhbGwoKTsKKyAgICAgIENoYW5nZUNvbnRyb2wgY3RsID0KKyAgICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKHBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCkpOwogCiAgICAgICBpZiAoYWJhbmRvbkNoYW5nZSkgewotICAgICAgICBmaW5hbCBBYmFuZG9uQ2hhbmdlIGFiYW5kb25DaGFuZ2UgPSBhYmFuZG9uQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgICAgIGFiYW5kb25DaGFuZ2Uuc2V0Q2hhbmdlSWQocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICAgIGFiYW5kb25DaGFuZ2Uuc2V0TWVzc2FnZShjaGFuZ2VDb21tZW50KTsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IGFiYW5kb25DaGFuZ2UuY2FsbCgpOwotICAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKKyAgICAgICAgZmluYWwgQWJhbmRvbiBhYmFuZG9uID0gYWJhbmRvblByb3ZpZGVyLmdldCgpOworICAgICAgICBmaW5hbCBBYmFuZG9uLklucHV0IGlucHV0ID0gbmV3IEFiYW5kb24uSW5wdXQoKTsKKyAgICAgICAgaW5wdXQubWVzc2FnZSA9IGNoYW5nZUNvbW1lbnQ7CisgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYWJhbmRvbi5hcHBseShuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgaW5wdXQpOworICAgICAgICB9IGNhdGNoIChBdXRoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB3cml0ZUVycm9yKCJlcnJvcjogIiArIHBhcnNlRXJyb3IoVHlwZS5BQkFORE9OX05PVF9QRVJNSVRURUQpICsgIlxuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gZSkgeworICAgICAgICAgIHdyaXRlRXJyb3IoImVycm9yOiAiICsgcGFyc2VFcnJvcihUeXBlLkNIQU5HRV9JU19DTE9TRUQpICsgIlxuIik7CisgICAgICAgIH0KICAgICAgIH0gZWxzZSBpZiAocmVzdG9yZUNoYW5nZSkgewotICAgICAgICBmaW5hbCBSZXN0b3JlQ2hhbmdlIHJlc3RvcmVDaGFuZ2UgPSByZXN0b3JlQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgICAgIHJlc3RvcmVDaGFuZ2Uuc2V0Q2hhbmdlSWQocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICAgIHJlc3RvcmVDaGFuZ2Uuc2V0TWVzc2FnZShjaGFuZ2VDb21tZW50KTsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IHJlc3RvcmVDaGFuZ2UuY2FsbCgpOwotICAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKKyAgICAgICAgZmluYWwgUmVzdG9yZSByZXN0b3JlID0gcmVzdG9yZVByb3ZpZGVyLmdldCgpOworICAgICAgICBmaW5hbCBSZXN0b3JlLklucHV0IGlucHV0ID0gbmV3IFJlc3RvcmUuSW5wdXQoKTsKKyAgICAgICAgaW5wdXQubWVzc2FnZSA9IGNoYW5nZUNvbW1lbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzdG9yZS5hcHBseShuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgaW5wdXQpOworICAgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CisgICAgICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZSkgeworICAgICAgICAgIHdyaXRlRXJyb3IoImVycm9yOiAiICsgcGFyc2VFcnJvcihUeXBlLlJFU1RPUkVfTk9UX1BFUk1JVFRFRCkgKyAiXG4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgd3JpdGVFcnJvcigiZXJyb3I6ICIgKyBwYXJzZUVycm9yKFR5cGUuQ0hBTkdFX05PVF9BQkFORE9ORUQpICsgIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CiAgICAgICB9CisKICAgICAgIGlmIChzdWJtaXRDaGFuZ2UpIHsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IHN1Ym1pdEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKLSAgICAgICAgaGFuZGxlUmV2aWV3UmVzdWx0RXJyb3JzKHJlc3VsdCk7CisgICAgICAgIFN1Ym1pdCBzdWJtaXQgPSBzdWJtaXRQcm92aWRlci5nZXQoKTsKKyAgICAgICAgU3VibWl0LklucHV0IGlucHV0ID0gbmV3IFN1Ym1pdC5JbnB1dCgpOworICAgICAgICBpbnB1dC53YWl0Rm9yTWVyZ2UgPSB0cnVlOworICAgICAgICBzdWJtaXQuYXBwbHkobmV3IFJldmlzaW9uUmVzb3VyY2UoCisgICAgICAgICAgICBuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgcGF0Y2hTZXQpLAorICAgICAgICAgIGlucHV0KTsKICAgICAgIH0KICAgICB9IGNhdGNoIChJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IGVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEJhZFJlcXVlc3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgIH0KIAogICAgIGlmIChwdWJsaXNoUGF0Y2hTZXQpIHsKLSAgICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPSBwdWJsaXNoRHJhZnRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkKS5jYWxsKCk7CisgICAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgICBwdWJsaXNoRHJhZnRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldC5nZXRJZCgpKS5jYWxsKCk7CiAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKICAgICB9IGVsc2UgaWYgKGRlbGV0ZURyYWZ0UGF0Y2hTZXQpIHsKICAgICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPQotICAgICAgICAgIGRlbGV0ZURyYWZ0UGF0Y2hTZXRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkKS5jYWxsKCk7CisgICAgICAgICAgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0LmdldElkKCkpLmNhbGwoKTsKICAgICAgIGhhbmRsZVJldmlld1Jlc3VsdEVycm9ycyhyZXN1bHQpOwogICAgIH0KICAgfQpAQCAtMjM4LDQ2ICszMTQsNyBAQAogICBwcml2YXRlIHZvaWQgaGFuZGxlUmV2aWV3UmVzdWx0RXJyb3JzKGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQpIHsKICAgICBmb3IgKFJldmlld1Jlc3VsdC5FcnJvciByZXN1bHRFcnJvciA6IHJlc3VsdC5nZXRFcnJvcnMoKSkgewogICAgICAgU3RyaW5nIGVyck1zZyA9ICJlcnJvcjogKGNoYW5nZSAiICsgcmVzdWx0LmdldENoYW5nZUlkKCkgKyAiKSAiOwotICAgICAgc3dpdGNoIChyZXN1bHRFcnJvci5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBBQkFORE9OX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgZXJyTXNnICs9ICJub3QgcGVybWl0dGVkIHRvIGFiYW5kb24gY2hhbmdlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNUT1JFX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgZXJyTXNnICs9ICJub3QgcGVybWl0dGVkIHRvIHJlc3RvcmUgY2hhbmdlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVRfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gIm5vdCBwZXJtaXR0ZWQgdG8gc3VibWl0IGNoYW5nZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1VCTUlUX05PVF9SRUFEWToKLSAgICAgICAgICBlcnJNc2cgKz0gImFwcHJvdmFscyBvciBkZXBlbmRlbmNpZXMgbGFja2luZyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTkdFX0lTX0NMT1NFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gImNoYW5nZSBpcyBjbG9zZWQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5HRV9OT1RfQUJBTkRPTkVEOgotICAgICAgICAgIGVyck1zZyArPSAiY2hhbmdlIGlzIG5vdCBhYmFuZG9uZWQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBVQkxJU0hfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gIm5vdCBwZXJtaXR0ZWQgdG8gcHVibGlzaCBjaGFuZ2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFTEVURV9OT1RfUEVSTUlUVEVEOgotICAgICAgICAgIGVyck1zZyArPSAibm90IHBlcm1pdHRlZCB0byBkZWxldGUgY2hhbmdlL3BhdGNoIHNldCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlVMRV9FUlJPUjoKLSAgICAgICAgICBlcnJNc2cgKz0gInJ1bGUgZXJyb3IiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5PVF9BX0RSQUZUOgotICAgICAgICAgIGVyck1zZyArPSAiY2hhbmdlL3BhdGNoIHNldCBpcyBub3QgYSBkcmFmdCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0lUX0VSUk9SOgotICAgICAgICAgIGVyck1zZyArPSAiZXJyb3Igd3JpdGluZyBjaGFuZ2UgdG8gZ2l0IHJlcG9zaXRvcnkiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFU1RfQlJBTkNIX05PVF9GT1VORDoKLSAgICAgICAgICBlcnJNc2cgKz0gImRlc3RpbmF0aW9uIGJyYW5jaCBub3QgZm91bmQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGVyck1zZyArPSAiZmFpbHVyZSBpbiByZXZpZXciOwotICAgICAgfQorICAgICAgZXJyTXNnICs9IHBhcnNlRXJyb3IocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKTsKICAgICAgIGlmIChyZXN1bHRFcnJvci5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgICBlcnJNc2cgKz0gIjogIiArIHJlc3VsdEVycm9yLmdldE1lc3NhZ2UoKTsKICAgICAgIH0KQEAgLTI4NSw3ICszMjIsMzggQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIFNldDxQYXRjaFNldC5JZD4gcGFyc2VQYXRjaFNldElkKGZpbmFsIFN0cmluZyBwYXRjaElkZW50aXR5KQorICBwcml2YXRlIFN0cmluZyBwYXJzZUVycm9yKFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBBQkFORE9OX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBhYmFuZG9uIGNoYW5nZSI7CisgICAgICBjYXNlIFJFU1RPUkVfTk9UX1BFUk1JVFRFRDoKKyAgICAgICAgcmV0dXJuICJub3QgcGVybWl0dGVkIHRvIHJlc3RvcmUgY2hhbmdlIjsKKyAgICAgIGNhc2UgU1VCTUlUX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBzdWJtaXQgY2hhbmdlIjsKKyAgICAgIGNhc2UgU1VCTUlUX05PVF9SRUFEWToKKyAgICAgICAgcmV0dXJuICJhcHByb3ZhbHMgb3IgZGVwZW5kZW5jaWVzIGxhY2tpbmciOworICAgICAgY2FzZSBDSEFOR0VfSVNfQ0xPU0VEOgorICAgICAgICByZXR1cm4gImNoYW5nZSBpcyBjbG9zZWQiOworICAgICAgY2FzZSBDSEFOR0VfTk9UX0FCQU5ET05FRDoKKyAgICAgICAgcmV0dXJuICJjaGFuZ2UgaXMgbm90IGFiYW5kb25lZCI7CisgICAgICBjYXNlIFBVQkxJU0hfTk9UX1BFUk1JVFRFRDoKKyAgICAgICAgcmV0dXJuICJub3QgcGVybWl0dGVkIHRvIHB1Ymxpc2ggY2hhbmdlIjsKKyAgICAgIGNhc2UgREVMRVRFX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBkZWxldGUgY2hhbmdlL3BhdGNoIHNldCI7CisgICAgICBjYXNlIFJVTEVfRVJST1I6CisgICAgICAgIHJldHVybiAicnVsZSBlcnJvciI7CisgICAgICBjYXNlIE5PVF9BX0RSQUZUOgorICAgICAgICByZXR1cm4gImNoYW5nZS9wYXRjaCBzZXQgaXMgbm90IGEgZHJhZnQiOworICAgICAgY2FzZSBHSVRfRVJST1I6CisgICAgICAgIHJldHVybiAiZXJyb3Igd3JpdGluZyBjaGFuZ2UgdG8gZ2l0IHJlcG9zaXRvcnkiOworICAgICAgY2FzZSBERVNUX0JSQU5DSF9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiAiZGVzdGluYXRpb24gYnJhbmNoIG5vdCBmb3VuZCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gImZhaWx1cmUgaW4gcmV2aWV3IjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFBhdGNoU2V0IHBhcnNlUGF0Y2hTZXQoZmluYWwgU3RyaW5nIHBhdGNoSWRlbnRpdHkpCiAgICAgICB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlLCBPcm1FeGNlcHRpb24gewogICAgIC8vIEJ5IGNvbW1pdD8KICAgICAvLwpAQCAtMjk4LDE3ICszNjYsMTcgQEAKICAgICAgICAgcGF0Y2hlcyA9IGRiLnBhdGNoU2V0cygpLmJ5UmV2aXNpb25SYW5nZShpZCwgaWQubWF4KCkpOwogICAgICAgfQogCi0gICAgICBmaW5hbCBTZXQ8UGF0Y2hTZXQuSWQ+IG1hdGNoZXMgPSBuZXcgSGFzaFNldDxQYXRjaFNldC5JZD4oKTsKKyAgICAgIGZpbmFsIFNldDxQYXRjaFNldD4gbWF0Y2hlcyA9IG5ldyBIYXNoU2V0PFBhdGNoU2V0PigpOwogICAgICAgZm9yIChmaW5hbCBQYXRjaFNldCBwcyA6IHBhdGNoZXMpIHsKICAgICAgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQocHMuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKSk7CiAgICAgICAgIGlmIChpblByb2plY3QoY2hhbmdlKSkgewotICAgICAgICAgIG1hdGNoZXMuYWRkKHBzLmdldElkKCkpOworICAgICAgICAgIG1hdGNoZXMuYWRkKHBzKTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICBzd2l0Y2ggKG1hdGNoZXMuc2l6ZSgpKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIG5vIHN1Y2ggcGF0Y2ggc2V0Iik7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zMjUsNyArMzkzLDggQEAKICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIGlzIG5vdCBhIHZhbGlkIHBhdGNoIHNldCIpOwogICAgICAgfQotICAgICAgaWYgKGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKSA9PSBudWxsKSB7CisgICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKKyAgICAgIGlmIChwYXRjaFNldCA9PSBudWxsKSB7CiAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIG5vIHN1Y2ggcGF0Y2ggc2V0Iik7CiAgICAgICB9CiAgICAgICBpZiAocHJvamVjdENvbnRyb2wgIT0gbnVsbCkgewpAQCAtMzM1LDcgKzQwNCw3IEBACiAgICAgICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0Y2hTZXRJZCk7CisgICAgICByZXR1cm4gcGF0Y2hTZXQ7CiAgICAgfQogCiAgICAgdGhyb3cgZXJyb3IoIlwiIiArIHBhdGNoSWRlbnRpdHkgKyAiXCIgaXMgbm90IGEgdmFsaWQgcGF0Y2ggc2V0Iik7CkBAIC0zNTIsMTggKzQyMSwyNCBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VDb21tYW5kTGluZSgpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewogICAgIG9wdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmVPcHRpb24+KCk7CisgICAgY3VzdG9tTGFiZWxzID0gTWFwcy5uZXdIYXNoTWFwKCk7CiAKLSAgICBmb3IgKEFwcHJvdmFsVHlwZSB0eXBlIDogYXBwcm92YWxUeXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKKyAgICBQcm9qZWN0Q29udHJvbCBhbGxQcm9qZWN0c0NvbnRyb2w7CisgICAgdHJ5IHsKKyAgICAgIGFsbFByb2plY3RzQ29udHJvbCA9IHByb2plY3RDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGFsbFByb2plY3RzKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoIm1pc3NpbmcgIiArIGFsbFByb2plY3RzLmdldCgpKTsKKyAgICB9CisKKyAgICBmb3IgKExhYmVsVHlwZSB0eXBlIDogYWxsUHJvamVjdHNDb250cm9sLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkpIHsKICAgICAgIFN0cmluZyB1c2FnZSA9ICIiOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSA9IHR5cGUuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgIHVzYWdlID0gInNjb3JlIGZvciAiICsgY2F0ZWdvcnkuZ2V0TmFtZSgpICsgIlxuIjsKKyAgICAgIHVzYWdlID0gInNjb3JlIGZvciAiICsgdHlwZS5nZXROYW1lKCkgKyAiXG4iOwogCi0gICAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2IDogdHlwZS5nZXRWYWx1ZXMoKSkgeworICAgICAgZm9yIChMYWJlbFZhbHVlIHYgOiB0eXBlLmdldFZhbHVlcygpKSB7CiAgICAgICAgIHVzYWdlICs9IHYuZm9ybWF0KCkgKyAiXG4iOwogICAgICAgfQogCi0gICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9Ci0gICAgICAgICAgIi0tIiArIGNhdGVnb3J5LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJyAnLCAnLScpOworICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiLS0iICsgdHlwZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKICAgICAgIG9wdGlvbkxpc3QuYWRkKG5ldyBBcHByb3ZlT3B0aW9uKG5hbWUsIHVzYWdlLCB0eXBlKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2NwQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NjcENvbW1hbmQuamF2YQppbmRleCAwOWMyNWZmLi45ODczODBmIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2NwQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TY3BDb21tYW5kLmphdmEKQEAgLTkyLDYgKzkyLDcgQEAKIAogICBwcml2YXRlIHZvaWQgcnVuSW1wKCkgewogICAgIHRyeSB7CisgICAgICByZWFkQWNrKCk7CiAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRBY2NvdW50Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKaW5kZXggOTk0MGZjOC4uYTNlOWQ2ZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5SZWFsbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEtleUNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQmFzZUNvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTQ2LDYgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqIFNldCBhIHVzZXIncyBhY2NvdW50IHNldHRpbmdzLiAqKi8KK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzZXQtYWNjb3VudCIsIGRlc2NyID0gIkNoYW5nZSBhbiBhY2NvdW50J3Mgc2V0dGluZ3MiKQogZmluYWwgY2xhc3MgU2V0QWNjb3VudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgcmVxdWlyZWQgPSB0cnVlLCBtZXRhVmFyID0gIlVTRVIiLCB1c2FnZSA9ICJmdWxsIG5hbWUsIGVtYWlsLWFkZHJlc3MsIHNzaCB1c2VybmFtZSBvciBhY2NvdW50IGlkIikKQEAgLTE0NSw2ICsxNDcsNyBAQAogICAgIGlmIChmdWxsTmFtZSAhPSBudWxsKSB7CiAgICAgICBpZiAocmVhbG0uYWxsb3dzRWRpdChGaWVsZE5hbWUuRlVMTF9OQU1FKSkgewogICAgICAgICBhY2NvdW50LnNldEZ1bGxOYW1lKGZ1bGxOYW1lKTsKKyAgICAgICAgYWNjb3VudFVwZGF0ZWQgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiVGhlIHJlYWxtIGRvZXNuJ3QgYWxsb3cgZWRpdGluZyBuYW1lcyIpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2V0UHJvamVjdENvbW1hbmQuamF2YQppbmRleCA5MTQzZjViLi44YzA2Yzk3ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEKQEAgLTE3LDEyICsxNywxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTM2LDYgKzM4LDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzZXQtcHJvamVjdCIsIGRlc2NyID0gIkNoYW5nZSBhIHByb2plY3QncyBzZXR0aW5ncyIpCiBmaW5hbCBjbGFzcyBTZXRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQogICAgICAgLmdldExvZ2dlcihTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CkBAIC01MCwyOSArNTMsNTcgQEAKICAgICAgICsgIihkZWZhdWx0OiBNRVJHRV9JRl9ORUNFU1NBUlkpIikKICAgcHJpdmF0ZSBTdWJtaXRUeXBlIHN1Ym1pdFR5cGU7CiAKKyAgQE9wdGlvbihuYW1lID0gIi0tY29udHJpYnV0b3ItYWdyZWVtZW50cyIsIHVzYWdlID0gImlmIGNvbnRyaWJ1dG9yIGFncmVlbWVudCBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRyaWJ1dG9yQWdyZWVtZW50czsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1zaWduZWQtb2ZmLWJ5IiwgdXNhZ2UgPSAiaWYgc2lnbmVkLW9mZi1ieSBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIHNpZ25lZE9mZkJ5OworCisgIEBPcHRpb24obmFtZSA9ICItLWNvbnRlbnQtbWVyZ2UiLCB1c2FnZSA9ICJhbGxvdyBhdXRvbWF0aWMgY29uZmxpY3QgcmVzb2x2aW5nIHdpdGhpbiBmaWxlcyIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRlbnRNZXJnZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1jaGFuZ2UtaWQiLCB1c2FnZSA9ICJpZiBjaGFuZ2UtaWQgaXMgcmVxdWlyZWQiKQorICBwcml2YXRlIEluaGVyaXRhYmxlQm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQ7CisKICAgQE9wdGlvbihuYW1lID0gIi0tdXNlLWNvbnRyaWJ1dG9yLWFncmVlbWVudHMiLCBhbGlhc2VzID0geyItLWNhIn0sIHVzYWdlID0gImlmIGNvbnRyaWJ1dG9yIGFncmVlbWVudCBpcyByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBjb250cmlidXRvckFncmVlbWVudHM7CisgIHZvaWQgc2V0VXNlQ29udHJpYnV0b3JBcmdyZWVtZW50cyhib29sZWFuIG9uKSB7CisgICAgY29udHJpYnV0b3JBZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1uby1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgYWxpYXNlcyA9IHsiLS1uY2EifSwgdXNhZ2UgPSAiaWYgY29udHJpYnV0b3IgYWdyZWVtZW50IGlzIG5vdCByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBub0NvbnRyaWJ1dG9yQWdyZWVtZW50czsKKyAgdm9pZCBzZXROb0NvbnRyaWJ1dG9yQXJncmVlbWVudHMoYm9vbGVhbiBvbikgeworICAgIGNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLXVzZS1zaWduZWQtb2ZmLWJ5IiwgYWxpYXNlcyA9IHsiLS1zbyJ9LCB1c2FnZSA9ICJpZiBzaWduZWQtb2ZmLWJ5IGlzIHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIHNpZ25lZE9mZkJ5OworICB2b2lkIHNldFVzZVNpZ25lZE9mZkJ5KGJvb2xlYW4gb24pIHsKKyAgICBzaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tc2lnbmVkLW9mZi1ieSIsIGFsaWFzZXMgPSB7Ii0tbnNvIn0sIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgbm90IHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIG5vU2lnbmVkT2ZmQnk7CisgIHZvaWQgc2V0Tm9TaWduZWRPZmZCeShib29sZWFuIG9uKSB7CisgICAgc2lnbmVkT2ZmQnkgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS11c2UtY29udGVudC1tZXJnZSIsIHVzYWdlID0gImFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBCb29sZWFuIGNvbnRlbnRNZXJnZTsKKyAgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoYm9vbGVhbiBvbikgeworICAgIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tY29udGVudC1tZXJnZSIsIHVzYWdlID0gImRvbid0IGFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBCb29sZWFuIG5vQ29udGVudE1lcmdlOworICB2b2lkIHNldE5vQ29udGVudE1lcmdlKGJvb2xlYW4gb24pIHsKKyAgICBjb250ZW50TWVyZ2UgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1yZXF1aXJlLWNoYW5nZS1pZCIsIGFsaWFzZXMgPSB7Ii0taWQifSwgdXNhZ2UgPSAiaWYgY2hhbmdlLWlkIGlzIHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRDsKKyAgdm9pZCBzZXRSZXF1aXJlQ2hhbmdlSWQoYm9vbGVhbiBvbikgeworICAgIHJlcXVpcmVDaGFuZ2VJRCA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tY2hhbmdlLWlkIiwgYWxpYXNlcyA9IHsiLS1uaWQifSwgdXNhZ2UgPSAiaWYgY2hhbmdlLWlkIGlzIG5vdCByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBub1JlcXVpcmVDaGFuZ2VJRDsKKyAgdm9pZCBzZXROb0NoYW5nZUlkKGJvb2xlYW4gb24pIHsKKyAgICByZXF1aXJlQ2hhbmdlSUQgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1wcm9qZWN0LXN0YXRlIiwgYWxpYXNlcyA9IHsiLS1wcyJ9LCB1c2FnZSA9ICJwcm9qZWN0J3MgdmlzaWJpbGl0eSBzdGF0ZSIpCiAgIHByaXZhdGUgU3RhdGUgc3RhdGU7CkBAIC04NSw3ICsxMTYsNiBAQAogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7Ci0gICAgdmFsaWRhdGUoKTsKICAgICBQcm9qZWN0IGN0bFByb2plY3QgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0KCk7CiAgICAgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBjdGxQcm9qZWN0LmdldE5hbWVLZXkoKTsKICAgICBTdHJpbmcgbmFtZSA9IGN0bFByb2plY3QuZ2V0TmFtZSgpOwpAQCAtOTcsMzggKzEyNywyNyBAQAogICAgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CiAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7CiAKLSAgICAgICAgcHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQocmVxdWlyZUNoYW5nZUlEICE9IG51bGwgPyByZXF1aXJlQ2hhbmdlSUQKLSAgICAgICAgICAgIDogcHJvamVjdC5pc1JlcXVpcmVDaGFuZ2VJRCgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChub1JlcXVpcmVDaGFuZ2VJRCAhPSBudWxsCi0gICAgICAgICAgICA/ICFub1JlcXVpcmVDaGFuZ2VJRCA6IHByb2plY3QuaXNSZXF1aXJlQ2hhbmdlSUQoKSk7Ci0KLSAgICAgICAgcHJvamVjdC5zZXRTdWJtaXRUeXBlKHN1Ym1pdFR5cGUgIT0gbnVsbCA/IHN1Ym1pdFR5cGUgOiBwcm9qZWN0Ci0gICAgICAgICAgICAuZ2V0U3VibWl0VHlwZSgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZShjb250ZW50TWVyZ2UgIT0gbnVsbCA/IGNvbnRlbnRNZXJnZQotICAgICAgICAgICAgOiBwcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKG5vQ29udGVudE1lcmdlICE9IG51bGwgPyAhbm9Db250ZW50TWVyZ2UKLSAgICAgICAgICAgIDogcHJvamVjdC5pc1VzZUNvbnRlbnRNZXJnZSgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhjb250cmlidXRvckFncmVlbWVudHMgIT0gbnVsbAotICAgICAgICAgICAgPyBjb250cmlidXRvckFncmVlbWVudHMgOiBwcm9qZWN0LmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKG5vQ29udHJpYnV0b3JBZ3JlZW1lbnRzICE9IG51bGwKLSAgICAgICAgICAgID8gIW5vQ29udHJpYnV0b3JBZ3JlZW1lbnRzIDogcHJvamVjdC5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZVNpZ25lZE9mZkJ5KHNpZ25lZE9mZkJ5ICE9IG51bGwgPyBzaWduZWRPZmZCeSA6IHByb2plY3QKLSAgICAgICAgICAgIC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKG5vU2lnbmVkT2ZmQnkgIT0gbnVsbCA/ICFub1NpZ25lZE9mZkJ5Ci0gICAgICAgICAgICA6IHByb2plY3QuaXNVc2VDb250ZW50TWVyZ2UoKSk7Ci0KLSAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24gIT0gbnVsbCA/IHByb2plY3REZXNjcmlwdGlvbgotICAgICAgICAgICAgOiBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0U3RhdGUoc3RhdGUgIT0gbnVsbCA/IHN0YXRlIDogcHJvamVjdC5nZXRTdGF0ZSgpKTsKLQorICAgICAgICBpZiAocmVxdWlyZUNoYW5nZUlEICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChyZXF1aXJlQ2hhbmdlSUQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdWJtaXRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFN1Ym1pdFR5cGUoc3VibWl0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRlbnRNZXJnZSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoY29udGVudE1lcmdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJpYnV0b3JBZ3JlZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhjb250cmlidXRvckFncmVlbWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduZWRPZmZCeSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShzaWduZWRPZmZCeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2plY3REZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRTdGF0ZShzdGF0ZSk7CisgICAgICAgIH0KICAgICAgICAgbWQuc2V0TWVzc2FnZSgiUHJvamVjdCBzZXR0aW5ncyB1cGRhdGVkIik7CiAgICAgICAgIGNvbmZpZy5jb21taXQobWQpOwogICAgICAgfSBmaW5hbGx5IHsKQEAgLTE1NCwxOCArMTczLDQgQEAKICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZXJyLnRvU3RyaW5nKCkpOwogICAgIH0KICAgfQotCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewotICAgIGNoZWNrRXhjbHVzaXZpdHkoY29udGVudE1lcmdlLCAiLS11c2UtY29udGVudC1tZXJnZSIsCi0gICAgICAgIG5vQ29udGVudE1lcmdlLCAiLS1uby1jb250ZW50LW1lcmdlIik7Ci0KLSAgICBjaGVja0V4Y2x1c2l2aXR5KGNvbnRyaWJ1dG9yQWdyZWVtZW50cywgIi0tdXNlLWNvbnRyaWJ1dG9yLWFncmVlbWVudHMiLAotICAgICAgICBub0NvbnRyaWJ1dG9yQWdyZWVtZW50cywgIi0tbm8tY29udHJpYnV0b3ItYWdyZWVtZW50cyIpOwotCi0gICAgY2hlY2tFeGNsdXNpdml0eShzaWduZWRPZmZCeSwgIi0tdXNlLXNpZ25lZC1vZmYtYnkiLAotICAgICAgICBub1NpZ25lZE9mZkJ5LCAiLS1uby1zaWduZWQtb2ZmLWJ5Iik7Ci0KLSAgICBjaGVja0V4Y2x1c2l2aXR5KHJlcXVpcmVDaGFuZ2VJRCwgIi0tcmVxdWlyZS1jaGFuZ2UtaWQiLAotICAgICAgICBub1JlcXVpcmVDaGFuZ2VJRCwgIi0tbm8tY2hhbmdlLWlkIik7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRSZXZpZXdlcnNDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2V0UmV2aWV3ZXJzQ29tbWFuZC5qYXZhCmluZGV4IGY4NzM4MjQuLjhlOWJjYWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRSZXZpZXdlcnNDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFJldmlld2Vyc0NvbW1hbmQuamF2YQpAQCAtMTQsMjEgKzE0LDI1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkFkZFJldmlld2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5SZW1vdmVSZXZpZXdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZVJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuRGVsZXRlUmV2aWV3ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZXJSZXNvdXJjZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwpAQCAtMzYsMTIgKzQwLDEyIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInNldC1yZXZpZXdlcnMiLCBkZXNjciA9ICJBZGQgb3IgcmVtb3ZlIHJldmlld2VycyBvbiBhIGNoYW5nZSIpCiBwdWJsaWMgY2xhc3MgU2V0UmV2aWV3ZXJzQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNldFJldmlld2Vyc0NvbW1hbmQuY2xhc3MpOwpAQCAtNzIsMTAgKzc2LDEzIEBACiAgIHByaXZhdGUgUmV2aWV3RGIgZGI7CiAKICAgQEluamVjdAotICBwcml2YXRlIEFkZFJldmlld2VyLkZhY3RvcnkgYWRkUmV2aWV3ZXJGYWN0b3J5OworICBwcml2YXRlIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXZpZXdlckZhY3Rvcnk7CiAKICAgQEluamVjdAotICBwcml2YXRlIFJlbW92ZVJldmlld2VyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJGYWN0b3J5OworICBwcml2YXRlIFByb3ZpZGVyPFBvc3RSZXZpZXdlcnM+IHBvc3RSZXZpZXdlcnNQcm92aWRlcjsKKworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8RGVsZXRlUmV2aWV3ZXI+IGRlbGV0ZVJldmlld2VyUHJvdmlkZXI7CiAKICAgQEluamVjdAogICBwcml2YXRlIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKQEAgLTEwMiw2MiArMTA5LDQ4IEBACiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gbW9kaWZ5T25lKENoYW5nZS5JZCBjaGFuZ2VJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwotCi0gICAgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0OworICAgIENoYW5nZVJlc291cmNlIGNoYW5nZVJzcmMgPQorICAgICAgICBuZXcgQ2hhbmdlUmVzb3VyY2UoY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpKTsKICAgICBib29sZWFuIG9rID0gdHJ1ZTsKIAogICAgIC8vIFJlbW92ZSByZXZpZXdlcnMKICAgICAvLwotICAgIHJlc3VsdCA9IHJlbW92ZVJldmlld2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQsIHRvUmVtb3ZlKS5jYWxsKCk7Ci0gICAgb2sgJj0gcmVzdWx0LmdldEVycm9ycygpLmlzRW1wdHkoKTsKLSAgICBmb3IgKFJldmlld2VyUmVzdWx0LkVycm9yIHJlc3VsdEVycm9yIDogcmVzdWx0LmdldEVycm9ycygpKSB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUkVNT1ZFX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJub3QgcGVybWl0dGVkIHRvIHJlbW92ZSB7MH0gZnJvbSB7MX0iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPVUxEX05PVF9SRU1PVkU6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJjb3VsZCBub3QgcmVtb3ZlIHswfSBmcm9tIHsxfSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJjb3VsZCBub3QgcmVtb3ZlIHswfTogezJ9IjsKKyAgICBEZWxldGVSZXZpZXdlciBkZWxldGUgPSBkZWxldGVSZXZpZXdlclByb3ZpZGVyLmdldCgpOworICAgIGZvciAoQWNjb3VudC5JZCByZXZpZXdlciA6IHRvUmVtb3ZlKSB7CisgICAgICBSZXZpZXdlclJlc291cmNlIHJzcmMgPSByZXZpZXdlckZhY3RvcnkuY3JlYXRlKGNoYW5nZVJzcmMsIHJldmlld2VyKTsKKyAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7OworICAgICAgdHJ5IHsKKyAgICAgICAgZGVsZXRlLmFwcGx5KHJzcmMsIG5ldyBEZWxldGVSZXZpZXdlci5JbnB1dCgpKTsKKyAgICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoImNvdWxkIG5vdCByZW1vdmUgJXM6IG5vdCBmb3VuZCIsIHJldmlld2VyKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9yID0gU3RyaW5nLmZvcm1hdCgiY291bGQgbm90IHJlbW92ZSAlczogJXMiLAorICAgICAgICAgICAgcmV2aWV3ZXIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgIH0KLSAgICAgIHdyaXRlRXJyb3IoImVycm9yIiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwKLSAgICAgICAgICByZXN1bHRFcnJvci5nZXROYW1lKCksIGNoYW5nZUlkLCByZXN1bHRFcnJvci5nZXRUeXBlKCkpKTsKKyAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIHdyaXRlRXJyb3IoImVycm9yIiwgZXJyb3IpOworICAgICAgfQogICAgIH0KIAogICAgIC8vIEFkZCByZXZpZXdlcnMKICAgICAvLwotICAgIHJlc3VsdCA9Ci0gICAgICAgIGFkZFJldmlld2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQsIHRvQWRkLCB0cnVlKS5jYWxsKCk7Ci0gICAgb2sgJj0gcmVzdWx0LmdldEVycm9ycygpLmlzRW1wdHkoKTsKLSAgICBmb3IgKFJldmlld2VyUmVzdWx0LkVycm9yIHJlc3VsdEVycm9yIDogcmVzdWx0LmdldEVycm9ycygpKSB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUkVWSUVXRVJfTk9UX0ZPVU5EOgotICAgICAgICAgIG1lc3NhZ2UgPSAiYWNjb3VudCBvciBncm91cCB7MH0gbm90IGZvdW5kIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQ0NPVU5UX0lOQUNUSVZFOgotICAgICAgICAgIG1lc3NhZ2UgPSAiYWNjb3VudCB7MH0gaW5hY3RpdmUiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5HRV9OT1RfVklTSUJMRToKLSAgICAgICAgICBtZXNzYWdlID0gImNoYW5nZSB7MX0gbm90IHZpc2libGUgdG8gezB9IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUk9VUF9FTVBUWToKLSAgICAgICAgICBtZXNzYWdlID0gImdyb3VwIHswfSBpcyBlbXB0eSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1JPVVBfSEFTX1RPT19NQU5ZX01FTUJFUlM6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJncm91cCB7MH0gaGFzIHRvbyBtYW55IG1lbWJlcnMiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdST1VQX05PVF9BTExPV0VEOgotICAgICAgICAgIG1lc3NhZ2UgPSAiZ3JvdXAgezB9IGlzIG5vdCBhbGxvd2VkIGFzIHJldmlld2VyIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBtZXNzYWdlID0gImNvdWxkIG5vdCBhZGQgezB9OiB7Mn0iOworICAgIFBvc3RSZXZpZXdlcnMgcG9zdCA9IHBvc3RSZXZpZXdlcnNQcm92aWRlci5nZXQoKTsKKyAgICBmb3IgKFN0cmluZyByZXZpZXdlciA6IHRvQWRkKSB7CisgICAgICBQb3N0UmV2aWV3ZXJzLklucHV0IGlucHV0ID0gbmV3IFBvc3RSZXZpZXdlcnMuSW5wdXQoKTsKKyAgICAgIGlucHV0LnJldmlld2VyID0gcmV2aWV3ZXI7CisgICAgICBTdHJpbmcgZXJyb3I7CisgICAgICB0cnkgeworICAgICAgICBlcnJvciA9IHBvc3QuYXBwbHkoY2hhbmdlUnNyYywgaW5wdXQpLmVycm9yOworICAgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9yID0gU3RyaW5nLmZvcm1hdCgiY291bGQgbm90IGFkZCAlczogbm90IGZvdW5kIiwgcmV2aWV3ZXIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZXJyb3IgPSBTdHJpbmcuZm9ybWF0KCJjb3VsZCBub3QgYWRkICVzOiAlcyIsIHJldmlld2VyLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICB9Ci0gICAgICB3cml0ZUVycm9yKCJlcnJvciIsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsCi0gICAgICAgICAgcmVzdWx0RXJyb3IuZ2V0TmFtZSgpLCBjaGFuZ2VJZCwgcmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSk7CisgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB3cml0ZUVycm9yKCJlcnJvciIsIGVycm9yKTsKKyAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gb2s7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0NhY2hlcy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dDYWNoZXMuamF2YQppbmRleCBiZGNiNGZiLi4zMzY2ODQxIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0NhY2hlcy5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93Q2FjaGVzLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlLlRhc2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hEYWVtb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtMzIsNyArMzMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubWluYS5jb3JlLnNlcnZpY2UuSW9BY2NlcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1pbmEuY29yZS5zZXNzaW9uLklvU2Vzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlU3RhdEFjY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlU3RhdEFjY2Vzc29yOwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC01MCw2ICs1MSw3IEBACiAKIC8qKiBTaG93IHRoZSBjdXJyZW50IGNhY2hlIHN0YXRlcy4gKi8KIEBSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NBQ0hFUykKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzaG93LWNhY2hlcyIsIGRlc2NyID0gIkRpc3BsYXkgY3VycmVudCBjYWNoZSBzdGF0aXN0aWNzIikKIGZpbmFsIGNsYXNzIFNob3dDYWNoZXMgZXh0ZW5kcyBDYWNoZUNvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHNlcnZlclN0YXJ0ZWQ7CiAKQEAgLTI1MCw2ICsyNTIsMTAgQEAKICAgICAgICAgY2FzZSBSVU5OSU5HOiB0YXNrc1J1bm5pbmcrKzsgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVBRFk6IHRhc2tzUmVhZHkrKzsgYnJlYWs7CiAgICAgICAgIGNhc2UgU0xFRVBJTkc6IHRhc2tzU2xlZXBpbmcrKzsgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FOQ0VMTEVEOgorICAgICAgICBjYXNlIERPTkU6CisgICAgICAgIGNhc2UgT1RIRVI6CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICAgIHN0ZG91dC5mb3JtYXQoCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0Nvbm5lY3Rpb25zLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0Nvbm5lY3Rpb25zLmphdmEKaW5kZXggYTFhNWI4Zi4uMWMzZDgyOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dDb25uZWN0aW9ucy5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93Q29ubmVjdGlvbnMuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuSWRHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoRGFlbW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoU2Vzc2lvbjsKQEAgLTQxLDYgKzQyLDcgQEAKIAogLyoqIFNob3cgdGhlIGN1cnJlbnQgU1NIIGNvbm5lY3Rpb25zLiAqLwogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LlZJRVdfQ09OTkVDVElPTlMpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2hvdy1jb25uZWN0aW9ucyIsIGRlc2NyID0gIkRpc3BsYXkgYWN0aXZlIGNsaWVudCBTU0ggY29ubmVjdGlvbnMiKQogZmluYWwgY2xhc3MgU2hvd0Nvbm5lY3Rpb25zIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLW51bWVyaWMiLCBhbGlhc2VzID0geyItbiJ9LCB1c2FnZSA9ICJkb24ndCByZXNvbHZlIG5hbWVzIikKICAgcHJpdmF0ZSBib29sZWFuIG51bWVyaWM7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd1F1ZXVlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd1F1ZXVlLmphdmEKaW5kZXggZjg2MjQ4NC4uZmVlNTI3NSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dRdWV1ZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93UXVldWUuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5JZEdlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkFkbWluSGlnaFByaW9yaXR5Q29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zOSw2ICs0MCw3IEBACiAKIC8qKiBEaXNwbGF5IHRoZSBjdXJyZW50IHdvcmsgcXVldWUuICovCiBAQWRtaW5IaWdoUHJpb3JpdHlDb21tYW5kCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2hvdy1xdWV1ZSIsIGRlc2NyID0gIkRpc3BsYXkgdGhlIGJhY2tncm91bmQgd29yayBxdWV1ZXMsIGluY2x1ZGluZyByZXBsaWNhdGlvbiIpCiBmaW5hbCBjbGFzcyBTaG93UXVldWUgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQE9wdGlvbihuYW1lID0gIi13IiwgdXNhZ2UgPSAiZGlzcGxheSB3aXRob3V0IGxpbmUgd2lkdGggdHJ1bmNhdGlvbiIpCiAgIHByaXZhdGUgYm9vbGVhbiB3aWRlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1N0cmVhbUV2ZW50cy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1N0cmVhbUV2ZW50cy5qYXZhCmluZGV4IGZmNmRlYTkuLjFiODFhNDcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TdHJlYW1FdmVudHMuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU3RyZWFtRXZlbnRzLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZS5DYW5jZWxhYmxlUnVubmFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5CYXNlQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlN0cmVhbUNvbW1hbmRFeGVjdXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzdHJlYW0tZXZlbnRzIiwgZGVzY3IgPSAiTW9uaXRvciBldmVudHMgb2NjdXJyaW5nIGluIHJlYWwgdGltZSIpCiBmaW5hbCBjbGFzcyBTdHJlYW1FdmVudHMgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgdGhhdCBtYXkgYmUgcXVldWVkIHVwIGZvciBlYWNoIGNvbm5lY3Rpb24uICovCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRVZFTlRTID0gMTI4OwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1NDRlNC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkFjY291bnRBdHRyaWJ1dGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5TdWJtaXRMYWJlbEF0dHJpYnV0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLlN1Ym1pdFJlY29yZEF0dHJpYnV0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmNvbXBpbGVyLkNvbXBpbGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5CdWZmZXJpbmdQcm9sb2dDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuSmF2YU9iamVjdFRlcm07Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5MaXN0VGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZzsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ0NsYXNzTG9hZGVyOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nTWFjaGluZUNvcHk7Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TeW1ib2xUZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlZhcmlhYmxlVGVybTsKLQotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqIENvbW1hbmQgdGhhdCBhbGxvd3MgdGVzdGluZyBvZiBwcm9sb2cgc3VibWl0LXJ1bGVzIGluIGEgbGl2ZSBpbnN0YW5jZS4gKi8KLWZpbmFsIGNsYXNzIFRlc3RTdWJtaXRSdWxlIGV4dGVuZHMgU3NoQ29tbWFuZCB7Ci0gIEBJbmplY3QKLSAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKLQotICBASW5qZWN0Ci0gIHByaXZhdGUgUHJvbG9nRW52aXJvbm1lbnQuRmFjdG9yeSBlbnZGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2NGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOwotCi0gIGZpbmFsIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOwotCi0gIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAiQ2hhbmdlSWQgdG8gbG9hZCBpbiBwcm9sb2cgZW52aXJvbm1lbnQiKQotICBwcml2YXRlIFN0cmluZyBjaGFuZ2VJZDsKLQotICBAT3B0aW9uKG5hbWUgPSAiLXMiLAotICAgICAgdXNhZ2UgPSAiUmVhZCBwcm9sb2cgc2NyaXB0IGZyb20gc3RkaW4gaW5zdGVhZCBvZiByZWFkaW5nIHJ1bGVzLnBsIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoIikKLSAgcHJpdmF0ZSBib29sZWFuIHVzZVN0ZGluOwotCi0gIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIG1ldGFWYXIgPSAiRk1UIiwgdXNhZ2UgPSAiT3V0cHV0IGRpc3BsYXkgZm9ybWF0IikKLSAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tbm8tZmlsdGVycyIsIGFsaWFzZXMgPSB7Ii1uIn0sCi0gICAgICB1c2FnZSA9ICJEb24ndCBydW4gdGhlIHN1Ym1pdF9maWx0ZXIvMiBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdHMiKQotICBwcml2YXRlIGJvb2xlYW4gc2tpcFN1Ym1pdEZpbHRlcnM7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFDS0FHRV9MSVNUID0ge1Byb2xvZy5CVUlMVElOLCAiZ2Vycml0In07Ci0KLSAgQEluamVjdAotICBwdWJsaWMgVGVzdFN1Ym1pdFJ1bGUoQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91cykgewotICAgIGFub255bW91c0Nvd2FyZE5hbWUgPSBhbm9ueW1vdXM7Ci0gIH0KLSAgcHJpdmF0ZSBQcm9sb2dNYWNoaW5lQ29weSBuZXdNYWNoaW5lKCkgewotICAgIEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2wgY3RsID0gbmV3IEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2woKTsKLSAgICBjdGwuc2V0TWF4RGF0YWJhc2VTaXplKDE2ICogMTAyNCk7Ci0gICAgY3RsLnNldFByb2xvZ0NsYXNzTG9hZGVyKG5ldyBQcm9sb2dDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLSAgICByZXR1cm4gUHJvbG9nTWFjaGluZUNvcHkuc2F2ZShjdGwpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewotICAgIFB1c2hiYWNrUmVhZGVyIGluUmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCi0gICAgdHJ5IHsKLSAgICAgIFByb2xvZ0Vudmlyb25tZW50IHBjbDsKLQotICAgICAgTGlzdDxDaGFuZ2U+IGNoYW5nZUxpc3QgPQotICAgICAgICAgIGRiLmNoYW5nZXMoKS5ieUtleShuZXcgQ2hhbmdlLktleShjaGFuZ2VJZCkpLnRvTGlzdCgpOwotICAgICAgaWYgKGNoYW5nZUxpc3Quc2l6ZSgpICE9IDEpCi0gICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgIkludmFsaWQgQ2hhbmdlSWQiKTsKLQotICAgICAgQ2hhbmdlIGMgPSBjaGFuZ2VMaXN0LmdldCgwKTsKLSAgICAgIFBhdGNoU2V0IHBzID0gZGIucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgICAvLyBXaWxsIHRocm93IGV4Y2VwdGlvbiBpZiBjdXJyZW50IHVzZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBjaGFuZ2UsIGFuZAotICAgICAgLy8gdGh1cyB3aWxsIGxlYWsgaW5mb3JtYXRpb24gdGhhdCBhIGNoYW5nZS1pZCBpcyB2YWxpZCBldmVuIHRob3VnaCB0aGUKLSAgICAgIC8vIHVzZXIgYXJlIG5vdCBhbGxvd2VkIHRvIHNlZSB0aGUgY2hhbmdlLgotICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNTg2Ci0gICAgICBDaGFuZ2VDb250cm9sIGNjID0gY2NGYWN0b3J5LmNvbnRyb2xGb3IoYyk7Ci0gICAgICBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlID0gY2MuZ2V0UHJvamVjdENvbnRyb2woKS5nZXRQcm9qZWN0U3RhdGUoKTsKLQotICAgICAgaWYgKHVzZVN0ZGluKSB7Ci0gICAgICAgIHBjbCA9IGVudkZhY3RvcnkuY3JlYXRlKG5ld01hY2hpbmUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwY2wgPSBwcm9qZWN0U3RhdGUubmV3UHJvbG9nRW52aXJvbm1lbnQoKTsKLSAgICAgIH0KLQotICAgICAgcGNsLnNldChTdG9yZWRWYWx1ZXMuUkVWSUVXX0RCLCBkYik7Ci0gICAgICBwY2wuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0UsIGMpOwotICAgICAgcGNsLnNldChTdG9yZWRWYWx1ZXMuUEFUQ0hfU0VULCBwcyk7Ci0gICAgICBwY2wuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0VfQ09OVFJPTCwgY2MpOwotICAgICAgaWYgKHVzZVN0ZGluKSB7Ci0gICAgICAgIHBjbC5pbml0aWFsaXplKFBBQ0tBR0VfTElTVCk7Ci0gICAgICAgIHBjbC5leGVjdXRlKFByb2xvZy5CVUlMVElOLCAiY29uc3VsdF9zdHJlYW0iLAotICAgICAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4oInN0ZGluIiksIG5ldyBKYXZhT2JqZWN0VGVybShpblJlYWRlcikpOwotICAgICAgfQotCi0gICAgICBMaXN0PFRlcm0+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFRlcm0+KCk7Ci0gICAgICBUZXJtIHN1Ym1pdFJ1bGUgPQotICAgICAgICAgIHBjbC5vbmNlKCJnZXJyaXQiLCAibG9jYXRlX3N1Ym1pdF9ydWxlIiwgbmV3IFZhcmlhYmxlVGVybSgpKTsKLQotICAgICAgZm9yIChUZXJtW10gdGVtcGxhdGUgOiBwY2wuYWxsKCJnZXJyaXQiLCAiY2FuX3N1Ym1pdCIsIHN1Ym1pdFJ1bGUsCi0gICAgICAgICAgbmV3IFZhcmlhYmxlVGVybSgpKSkgewotICAgICAgICByZXN1bHRzLmFkZCh0ZW1wbGF0ZVsxXSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc2tpcFN1Ym1pdEZpbHRlcnMpIHsKLSAgICAgICAgcnVuU3VibWl0RmlsdGVycyhwcm9qZWN0U3RhdGUsIHJlc3VsdHMsIHBjbCk7Ci0gICAgICB9Ci0KLSAgICAgIExpc3Q8U3VibWl0UmVjb3JkPiByZXMgPSBjYy5yZXN1bHRzVG9TdWJtaXRSZWNvcmQoc3VibWl0UnVsZSwgcmVzdWx0cyk7Ci0gICAgICBmb3IgKFN1Ym1pdFJlY29yZCByIDogcmVzKSB7Ci0gICAgICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKLSAgICAgICAgICBTdWJtaXRSZWNvcmRBdHRyaWJ1dGUgc3VibWl0UmVjb3JkID0gbmV3IFN1Ym1pdFJlY29yZEF0dHJpYnV0ZSgpOwotICAgICAgICAgIHN1Ym1pdFJlY29yZC5zdGF0dXMgPSByLnN0YXR1cy5uYW1lKCk7Ci0KLSAgICAgICAgICBMaXN0PFN1Ym1pdExhYmVsQXR0cmlidXRlPiBzdWJtaXRMYWJlbHMgPSBuZXcgTGlua2VkTGlzdDxTdWJtaXRMYWJlbEF0dHJpYnV0ZT4oKTsKLSAgICAgICAgICBmb3IoU3VibWl0UmVjb3JkLkxhYmVsIGwgOiByLmxhYmVscykgewotICAgICAgICAgICAgU3VibWl0TGFiZWxBdHRyaWJ1dGUgbGFiZWwgPSBuZXcgU3VibWl0TGFiZWxBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gbC5sYWJlbDsKLSAgICAgICAgICAgIGxhYmVsLnN0YXR1cz0gbC5zdGF0dXMubmFtZSgpOwotICAgICAgICAgICAgaWYobC5hcHBsaWVkQnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICBBY2NvdW50IGEgPSBhY2NvdW50Q2FjaGUuZ2V0KGwuYXBwbGllZEJ5KS5nZXRBY2NvdW50KCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5ID0gbmV3IEFjY291bnRBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgICAgbGFiZWwuYnkuZW1haWwgPSBhLmdldFByZWZlcnJlZEVtYWlsKCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5Lm5hbWUgPSBhLmdldEZ1bGxOYW1lKCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5LnVzZXJuYW1lID0gYS5nZXRVc2VyTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VibWl0TGFiZWxzLmFkZChsYWJlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN1Ym1pdFJlY29yZC5sYWJlbHMgPSBzdWJtaXRMYWJlbHM7Ci0gICAgICAgICAgZm9ybWF0Lm5ld0dzb24oKS50b0pzb24oc3VibWl0UmVjb3JkLCBuZXcgVHlwZVRva2VuPFN1Ym1pdFJlY29yZEF0dHJpYnV0ZT4oKSB7fS5nZXRUeXBlKCksIHN0ZG91dCk7Ci0gICAgICAgICAgc3Rkb3V0LnByaW50KCdcbicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvcihTdWJtaXRSZWNvcmQuTGFiZWwgbCA6IHIubGFiZWxzKSB7Ci0gICAgICAgICAgICBzdGRvdXQucHJpbnQobC5sYWJlbCArICI6ICIgKyBsLnN0YXR1cyk7Ci0gICAgICAgICAgICBpZihsLmFwcGxpZWRCeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIEFjY291bnRJbmZvIGEgPSBuZXcgQWNjb3VudEluZm8oYWNjb3VudENhY2hlLmdldChsLmFwcGxpZWRCeSkuZ2V0QWNjb3VudCgpKTsKLSAgICAgICAgICAgICAgc3Rkb3V0LnByaW50KCIgYnkgIiArIGEuZ2V0TmFtZUVtYWlsKGFub255bW91c0Nvd2FyZE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZG91dC5wcmludCgnXG4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3Rkb3V0LnByaW50KCJcbiIgKyByLnN0YXR1cy5uYW1lKCkgKyAiXG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKCJQcm9jZXNzaW5nIG9mIHByb2xvZyBzY3JpcHQgZmFpbGVkOiAiICsgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJ1blN1Ym1pdEZpbHRlcnMoUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSwgTGlzdDxUZXJtPiByZXN1bHRzLAotICAgICAgUHJvbG9nRW52aXJvbm1lbnQgcGNsKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKLSAgICBQcm9qZWN0U3RhdGUgcGFyZW50U3RhdGUgPSBwcm9qZWN0U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICBQcm9sb2dFbnZpcm9ubWVudCBjaGlsZEVudiA9IHBjbDsKLSAgICBTZXQ8UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0c1NlZW4gPSBuZXcgSGFzaFNldDxQcm9qZWN0Lk5hbWVLZXk+KCk7Ci0gICAgcHJvamVjdHNTZWVuLmFkZChwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7Ci0KLSAgICB3aGlsZSAocGFyZW50U3RhdGUgIT0gbnVsbCkgewotICAgICAgaWYgKCFwcm9qZWN0c1NlZW4uYWRkKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpKSB7Ci0gICAgICAgIC8vIHBhcmVudCBoYXMgYmVlbiBzZWVuIGJlZm9yZSwgc3RvcCB3YWxrIHVwIGluaGVyaXRhbmNlIHRyZWUKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBQcm9sb2dFbnZpcm9ubWVudCBwYXJlbnRFbnY7Ci0gICAgICB0cnkgewotICAgICAgICBwYXJlbnRFbnYgPSBwYXJlbnRTdGF0ZS5uZXdQcm9sb2dFbnZpcm9ubWVudCgpOwotICAgICAgfSBjYXRjaCAoQ29tcGlsZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKLSAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArIGVycik7Ci0gICAgICB9Ci0KLSAgICAgIHBhcmVudEVudi5jb3B5U3RvcmVkVmFsdWVzKGNoaWxkRW52KTsKLSAgICAgIFRlcm0gZmlsdGVyUnVsZSA9Ci0gICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsICJsb2NhdGVfc3VibWl0X2ZpbHRlciIsIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICBpZiAoZmlsdGVyUnVsZSAhPSBudWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgVGVybSByZXN1bHRzVGVybSA9IENoYW5nZUNvbnRyb2wudG9MaXN0VGVybShyZXN1bHRzKTsKLSAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7Ci0gICAgICAgICAgVGVybVtdIHRlbXBsYXRlID0KLSAgICAgICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsICJmaWx0ZXJfc3VibWl0X3Jlc3VsdHMiLCBmaWx0ZXJSdWxlLAotICAgICAgICAgICAgICAgICAgcmVzdWx0c1Rlcm0sIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgVGVybT4gdGVybUxpc3QgPQotICAgICAgICAgICAgICAoKExpc3RUZXJtKSB0ZW1wbGF0ZVsyXSkudG9KYXZhKCk7Ci0gICAgICAgICAgcmVzdWx0cy5hZGRBbGwodGVybUxpc3QpOwotICAgICAgICB9IGNhdGNoIChQcm9sb2dFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiRXhjZXB0aW9uIGNhbGxpbmcgIiArIGZpbHRlclJ1bGUgKyAiIG9mICIKLSAgICAgICAgICAgICAgKyBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgZXJyKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKCJFeGNlcHRpb24gY2FsbGluZyAiICsgZmlsdGVyUnVsZSArICIgb2YgIgotICAgICAgICAgICAgICArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyBlcnIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBhcmVudFN0YXRlID0gcGFyZW50U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICAgIGNoaWxkRW52ID0gcGFyZW50RW52OwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzUxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpc2lvblJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFJ1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKKy8qKiBDb21tYW5kIHRoYXQgYWxsb3dzIHRlc3Rpbmcgb2YgcHJvbG9nIHN1Ym1pdC1ydWxlcyBpbiBhIGxpdmUgaW5zdGFuY2UuICovCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicnVsZSIsIGRlc2NyID0gIlRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcyIpCitmaW5hbCBjbGFzcyBUZXN0U3VibWl0UnVsZUNvbW1hbmQgZXh0ZW5kcyBCYXNlVGVzdFByb2xvZ0NvbW1hbmQgeworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8VGVzdFN1Ym1pdFJ1bGU+IHZpZXc7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBSZXN0TW9kaWZ5VmlldzxSZXZpc2lvblJlc291cmNlLCBJbnB1dD4gY3JlYXRlVmlldygpIHsKKyAgICByZXR1cm4gdmlldy5nZXQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRUeXBlQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRUeXBlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmZmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFR5cGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aXNpb25SZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAidHlwZSIsIGRlc2NyID0gIlRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlIikKK2ZpbmFsIGNsYXNzIFRlc3RTdWJtaXRUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VUZXN0UHJvbG9nQ29tbWFuZCB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBQcm92aWRlcjxUZXN0U3VibWl0VHlwZT4gdmlldzsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiBjcmVhdGVWaWV3KCkgeworICAgIHJldHVybiB2aWV3LmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVXBsb2FkLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVXBsb2FkLmphdmEKaW5kZXggNDZlYjc4OC4uZmMxMjdlYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1VwbG9hZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9VcGxvYWQuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ2hhbmdlQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5UYWdDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRyYW5zZmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVmlzaWJsZVJlZkZpbHRlcjsKQEAgLTM3LDYgKzM4LDkgQEAKICAgQEluamVjdAogICBwcml2YXRlIFRhZ0NhY2hlIHRhZ0NhY2hlOwogCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgcnVuSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmFpbHVyZSB7CiAgICAgaWYgKCFwcm9qZWN0Q29udHJvbC5jYW5SdW5VcGxvYWRQYWNrKCkpIHsKQEAgLTQ1LDcgKzQ5LDcgQEAKIAogICAgIGZpbmFsIFVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhyZXBvKTsKICAgICBpZiAoIXByb2plY3RDb250cm9sLmFsbFJlZnNBcmVWaXNpYmxlKCkpIHsKLSAgICAgIHVwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCByZXBvLAorICAgICAgdXAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IFZpc2libGVSZWZGaWx0ZXIodGFnQ2FjaGUsIGNoYW5nZUNhY2hlLCByZXBvLAogICAgICAgICAgIHByb2plY3RDb250cm9sLCBkYi5nZXQoKSwgdHJ1ZSkpOwogICAgIH0KICAgICB1cC5zZXRQYWNrQ29uZmlnKGNvbmZpZy5nZXRQYWNrQ29uZmlnKCkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1ZlcnNpb25Db21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQppbmRleCBhZGRiYjg0Li4yMDY2Y2MyIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQpAQCAtMTUsOSArMTUsMTIgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5WZXJzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInZlcnNpb24iLCBkZXNjciA9ICJEaXNwbGF5IGdlcnJpdCB2ZXJzaW9uIikKIGZpbmFsIGNsYXNzIFZlcnNpb25Db21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBGYWlsdXJlIHsKICAgICBTdHJpbmcgdiA9IFZlcnNpb24uZ2V0VmVyc2lvbigpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXV0aWwtY2xpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2dlcnJpdC11dGlsLWNsaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNDcwOTQyZC4uOTQxZmIzMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtY2xpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9nZXJyaXQtdXRpbC1jbGkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC03LDYgKzcsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLWNsaS9wb20ueG1sIGIvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKaW5kZXggNDg4NmQwOS4uMDRlM2IwOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKKysrIGIvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC11dGlsLWNsaTwvYXJ0aWZhY3RJZD4KQEAgLTM5LDYgKzM5LDExIEBACiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmluamVjdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmd1aWNlPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLWNsaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3V0aWwvY2xpL0NtZExpbmVQYXJzZXIuamF2YSBiL2dlcnJpdC11dGlsLWNsaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3V0aWwvY2xpL0NtZExpbmVQYXJzZXIuamF2YQppbmRleCBhOWY1MjI5Li42OTU5OGNlIDEwMDY0NAotLS0gYS9nZXJyaXQtdXRpbC1jbGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC91dGlsL2NsaS9DbWRMaW5lUGFyc2VyLmphdmEKKysrIGIvZ2Vycml0LXV0aWwtY2xpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdXRpbC9jbGkvQ21kTGluZVBhcnNlci5qYXZhCkBAIC0zNCw2ICszNCwxMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnV0aWwuY2xpOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRIYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwpAQCAtNTQsMTEgKzU4LDkgQEAKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogRXh0ZW5kZWQgY29tbWFuZCBsaW5lIHBhcnNlciB3aGljaCBoYW5kbGVzIC0tZm9vPXZhbHVlIGFyZ3VtZW50cy4KQEAgLTc2LDYgKzc4LDkgQEAKICAgcHJpdmF0ZSBmaW5hbCBJbmplY3RvciBpbmplY3RvcjsKICAgcHJpdmF0ZSBmaW5hbCBNeVBhcnNlciBwYXJzZXI7CiAKKyAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPcHRpb25IYW5kbGVyPiBvcHRpb25zOworCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQgbGluZSBvd25lciB0aGF0IHBhcnNlcyBhcmd1bWVudHMvb3B0aW9ucyBhbmQgc2V0IHRoZW0KICAgICogaW50byB0aGUgZ2l2ZW4gb2JqZWN0LgpAQCAtMTg2LDcgKzE5MSw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KGZpbmFsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gdG1wID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFyZ3MubGVuZ3RoKTsKKyAgICBMaXN0PFN0cmluZz4gdG1wID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGFyZ3MubGVuZ3RoKTsKICAgICBmb3IgKGludCBhcmdpID0gMDsgYXJnaSA8IGFyZ3MubGVuZ3RoOyBhcmdpKyspIHsKICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSBhcmdzW2FyZ2ldOwogICAgICAgaWYgKHN0ci5lcXVhbHMoIi0tIikpIHsKQEAgLTIxMSwzNiArMjE2LDMyIEBACiAKICAgcHVibGljIHZvaWQgcGFyc2VPcHRpb25NYXAoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtZXRlcnMpCiAgICAgICB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7Ci0gICAgcGFyc2VPcHRpb25NYXAocGFyYW1ldGVycywgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKTsKKyAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudCA6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgeworICAgICAgZm9yIChTdHJpbmcgdmFsIDogZW50LmdldFZhbHVlKCkpIHsKKyAgICAgICAgbWFwLnB1dChlbnQuZ2V0S2V5KCksIHZhbCk7CisgICAgICB9CisgICAgfQorICAgIHBhcnNlT3B0aW9uTWFwKG1hcCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBwYXJzZU9wdGlvbk1hcChNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1ldGVycywKLSAgICAgIFNldDxTdHJpbmc+IGFyZ05hbWVzKQorICBwdWJsaWMgdm9pZCBwYXJzZU9wdGlvbk1hcChNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKQogICAgICAgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewotICAgIEFycmF5TGlzdDxTdHJpbmc+IHRtcCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudCA6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgewotICAgICAgU3RyaW5nIG5hbWUgPSBlbnQuZ2V0S2V5KCk7Ci0gICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICBuYW1lID0gIi0iICsgbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuYW1lID0gIi0tIiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICBMaXN0PFN0cmluZz4gdG1wID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KDIgKiBwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiBwYXJhbXMua2V5U2V0KCkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gbWFrZU9wdGlvbihrZXkpOwogCi0gICAgICBpZiAoZmluZEhhbmRsZXIobmFtZSkgaW5zdGFuY2VvZiBCb29sZWFuT3B0aW9uSGFuZGxlcikgeworICAgICAgaWYgKGlzQm9vbGVhbihuYW1lKSkgewogICAgICAgICBib29sZWFuIG9uID0gZmFsc2U7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZW50LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICBvbiA9IHRvQm9vbGVhbihlbnQuZ2V0S2V5KCksIHZhbHVlKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwYXJhbXMuZ2V0KGtleSkpIHsKKyAgICAgICAgICBvbiA9IHRvQm9vbGVhbihrZXksIHZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAob24pIHsKICAgICAgICAgICB0bXAuYWRkKG5hbWUpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGVudC5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgaWYgKCFhcmdOYW1lcy5jb250YWlucyhlbnQuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICB0bXAuYWRkKG5hbWUpOwotICAgICAgICAgIH0KKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwYXJhbXMuZ2V0KGtleSkpIHsKKyAgICAgICAgICB0bXAuYWRkKG5hbWUpOwogICAgICAgICAgIHRtcC5hZGQodmFsdWUpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0yNDgsMjIgKzI0OSw0NCBAQAogICAgIHBhcnNlci5wYXJzZUFyZ3VtZW50KHRtcC50b0FycmF5KG5ldyBTdHJpbmdbdG1wLnNpemUoKV0pKTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGlzQm9vbGVhbihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBmaW5kSGFuZGxlcihtYWtlT3B0aW9uKG5hbWUpKSBpbnN0YW5jZW9mIEJvb2xlYW5PcHRpb25IYW5kbGVyOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbWFrZU9wdGlvbihTdHJpbmcgbmFtZSkgeworICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgbmFtZSA9ICItIiArIG5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gIi0tIiArIG5hbWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuYW1lOworICB9CisKICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgcHJpdmF0ZSBPcHRpb25IYW5kbGVyIGZpbmRIYW5kbGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgZm9yIChPcHRpb25IYW5kbGVyIGhhbmRsZXIgOiBwYXJzZXIub3B0aW9ucykgeworICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgIG9wdGlvbnMgPSBpbmRleChwYXJzZXIub3B0aW9ucyk7CisgICAgfQorICAgIHJldHVybiBvcHRpb25zLmdldChuYW1lKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9wdGlvbkhhbmRsZXI+IGluZGV4KExpc3Q8T3B0aW9uSGFuZGxlcj4gaW4pIHsKKyAgICBNYXA8U3RyaW5nLCBPcHRpb25IYW5kbGVyPiBtID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChPcHRpb25IYW5kbGVyIGhhbmRsZXIgOiBpbikgewogICAgICAgaWYgKGhhbmRsZXIub3B0aW9uIGluc3RhbmNlb2YgTmFtZWRPcHRpb25EZWYpIHsKICAgICAgICAgTmFtZWRPcHRpb25EZWYgZGVmID0gKE5hbWVkT3B0aW9uRGVmKSBoYW5kbGVyLm9wdGlvbjsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGRlZi5uYW1lKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBkZWYuYWxpYXNlcygpKSB7Ci0gICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFsaWFzKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICAgIGlmICghZGVmLmlzQXJndW1lbnQoKSkgeworICAgICAgICAgIG0ucHV0KGRlZi5uYW1lKCksIGhhbmRsZXIpOworICAgICAgICAgIGZvciAoU3RyaW5nIGFsaWFzIDogZGVmLmFsaWFzZXMoKSkgeworICAgICAgICAgICAgbS5wdXQoYWxpYXMsIGhhbmRsZXIpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gbTsKICAgfQogCiAgIHByaXZhdGUgYm9vbGVhbiB0b0Jvb2xlYW4oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewpAQCAtMzI0LDExICszNDcsMTAgQEAKICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9wdGlvbnNJbml0aWFsaXplZCgpIHsKICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICAgaGVscCA9IG5ldyBIZWxwT3B0aW9uKCk7Ci0gICAgICAgIG9wdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9wdGlvbkhhbmRsZXI+KCk7CisgICAgICAgIG9wdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICAgICAgYWRkT3B0aW9uKGhlbHAsIGhlbHApOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLXNzbC9wb20ueG1sIGIvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKaW5kZXggYmVlZGI4Zi4uNjlhZTNiNSAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKKysrIGIvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjYtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC11dGlsLXNzbDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC13YXIvcG9tLnhtbCBiL2dlcnJpdC13YXIvcG9tLnhtbAppbmRleCAxZjM3NTBlLi4wZWJiYzhhIDEwMDY0NAotLS0gYS9nZXJyaXQtd2FyL3BvbS54bWwKKysrIGIvZ2Vycml0LXdhci9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtd2FyPC9hcnRpZmFjdElkPgpAQCAtMzYsOSArMzYsOCBAQAogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDwhLS0gY29tcGlsZSwgbm90IHByb3ZpZGVkLiBvdXIgZW1iZWRkZWQgSmV0dHkgbmVlZHMgdGhpcyAtLT4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgIDxhcnRpZmFjdElkPnRvbWNhdC1zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CkBAIC01OSwxNCArNTgsMTIgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmJjcHJvdi1qZGsxNTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5iY3BnLWpkazE1PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTQwPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAKQEAgLTEwMiwxMCArOTksODkgQEAKICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBnbTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnBsdWdpbnM8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICA8bmFtZT4hZ2Vycml0LnBsdWdpbnMuc2tpcDwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDwhLS0gQ09SRSBQTFVHSU4gTElTVCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZXNvdXJjZS5nZXJyaXQucGx1Z2lucy5yZXBsaWNhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5yZXBsaWNhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlc291cmNlLmdlcnJpdC5wbHVnaW5zLnJldmlld25vdGVzPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnJldmlld25vdGVzPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGVzb3VyY2UuZ2Vycml0LnBsdWdpbnMudmFsaWRhdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisKICAgPGJ1aWxkPgorCTxwbHVnaW5NYW5hZ2VtZW50PgorCSAgPHBsdWdpbnM+CisJICAgIDxwbHVnaW4+CisJICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgorCSAgICAgIDxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgorCSAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorCSAgICAgIDxjb25maWd1cmF0aW9uPgorCSAgICAgICAgPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbnM+CisJICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbj4KKwkgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisJICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisJICAgICAgICAgICAgICAgIDx2ZXJzaW9uUmFuZ2U+WzIuMCwpPC92ZXJzaW9uUmFuZ2U+CisJICAgICAgICAgICAgICAgIDxnb2Fscz4KKwkgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5LWRlcGVuZGVuY2llczwvZ29hbD4KKwkgICAgICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+Z29hbD4KKwkgICAgICAgICAgICAgICAgPC9nb2Fscz4KKwkgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCSAgICAgICAgICAgICAgPGFjdGlvbj4KKwkgICAgICAgICAgICAgICAgPGV4ZWN1dGUgLz4KKwkgICAgICAgICAgICAgIDwvYWN0aW9uPgorCSAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgorCSAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbnM+CisJICAgICAgICA8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkgICAgICA8L2NvbmZpZ3VyYXRpb24+CisJICAgIDwvcGx1Z2luPgorCSAgPC9wbHVnaW5zPgorCTwvcGx1Z2luTWFuYWdlbWVudD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTEzOCw5ICsyMTQsNTkgQEAKIAogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXNlcnZsZXQtYXBpPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8aW5jbHVkZUdyb3VwSWRzPm9yZy5hcGFjaGUudG9tY2F0LG9yZy5lY2xpcHNlLmpldHR5PC9pbmNsdWRlR3JvdXBJZHM+CisgICAgICAgICAgICAgIDxleGNsdWRlQXJ0aWZhY3RJZHM+c2VydmxldC1hcGk8L2V4Y2x1ZGVBcnRpZmFjdElkcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS1wbHVnaW5zPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8IS0tIENPUkUgUExVR0lOIExJU1QgLS0+CisgICAgICAgICAgICAgIDxpbmNsdWRlQXJ0aWZhY3RJZHM+Y29tbWl0LW1lc3NhZ2UtbGVuZ3RoLXZhbGlkYXRvcixyZXBsaWNhdGlvbixyZXZpZXdub3RlczwvaW5jbHVkZUFydGlmYWN0SWRzPgorICAgICAgICAgICAgICA8aW5jbHVkZVR5cGVzPmphcjwvaW5jbHVkZVR5cGVzPgorICAgICAgICAgICAgICA8c3RyaXBWZXJzaW9uPnRydWU8L3N0cmlwVmVyc2lvbj4KKyAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS9XRUItSU5GL3BsdWdpbnM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktc2VydmxldC1hcGk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHRhcmdldD4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZHN0IiBsb2NhdGlvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0vV0VCLUlORi9wZ20tbGliIiAvPgorCisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtkc3R9IiAvPgorICAgICAgICAgICAgICAgIDxjb3B5IG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7ZHN0fSI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDwvY29weT4KKyAgICAgICAgICAgICAgPC90YXJnZXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KICAgICAgICAgICAgIDxpZD5jb3B5LWxpY2Vuc2U8L2lkPgogICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KQEAgLTE2MSw3ICsyODcsNyBAQAogICAgICAgICAgICAgPGlkPmluY2x1ZGUtZG9jdW1lbnRhdGlvbjwvaWQ+CiAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFyZ2V0IGlmPSJnZXJyaXQuaW5jbHVkZS1kb2N1bWVudGF0aW9uIj4KKyAgICAgICAgICAgICAgPHRhcmdldCB1bmxlc3M9ImdlcnJpdC5kb2N1bWVudGF0aW9uLnNraXAiPgogICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uL0RvY3VtZW50YXRpb24iIC8+CiAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dCIgbG9jYXRpb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IiAvPgogICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkc3QiIGxvY2F0aW9uPSIke291dH0vRG9jdW1lbnRhdGlvbiIgLz4KQEAgLTE4NCw2ICszMTAsMzMgQEAKICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgogICAgICAgICAgICAgPC9nb2Fscz4KICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmluY2x1ZGUtcmVsZWFzZS1ub3RlczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dGFyZ2V0IHVubGVzcz0iZ2Vycml0LmRvY3VtZW50YXRpb24uc2tpcCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vUmVsZWFzZU5vdGVzIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQiIGxvY2F0aW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZHN0IiBsb2NhdGlvbj0iJHtvdXR9L1JlbGVhc2VOb3RlcyIgLz4KKworICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtzcmN9IiBleGVjdXRhYmxlPSJtYWtlIj4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IlZFUlNJT049JHtwcm9qZWN0LnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iY2xlYW4iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+CisgICAgICAgICAgICAgICAgPC9leGVjPgorCisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtkc3R9IiAvPgorICAgICAgICAgICAgICAgIDxjb3B5IG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7ZHN0fSI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouaHRtbCIgLz4KKyAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgIDwvdGFyZ2V0PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CmRpZmYgLS1naXQgYS9nZXJyaXQtd2FyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViQXBwSW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCmluZGV4IDFhNTU2YzIuLmQwYjhjMzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCisrKyBiL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuaW5qZWN0LlN0YWdlLlBST0RVQ1RJT047CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HZXJyaXRVaU9wdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQuT3BlbklkTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnBsdWdpbnMuSHR0cFBsdWdpbk1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWdNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmxNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRHbG9iYWxNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWdNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5NYXN0ZXJOb2RlU3RhcnR1cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwpAQCAtMzcsMTIgKzM5LDE2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuU2lnbmVkVG9rZW5FbWFpbFRva2VuVmVyaWZpZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuU210cEVtYWlsU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5JbnRyYUxpbmVXb3JrZXJQb29sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbkd1aWNlRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YWJhc2VNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFWZXJzaW9uQ2hlY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hLZXlDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kcy5NYXN0ZXJDb21tYW5kTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwpAQCAtNTYsNiArNjIsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuR3VpY2VTZXJ2bGV0Q29udGV4dExpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNwaS5NZXNzYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTE0NCwxMCArMTUxLDM1IEBACiAgIHByaXZhdGUgSW5qZWN0b3IgY3JlYXRlRGJJbmplY3RvcigpIHsKICAgICBmaW5hbCBMaXN0PE1vZHVsZT4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlPigpOwogICAgIGlmIChzaXRlUGF0aCAhPSBudWxsKSB7Ci0gICAgICBtb2R1bGVzLmFkZChuZXcgTGlmZWN5Y2xlTW9kdWxlKCkgeworICAgICAgTW9kdWxlIHNpdGVQYXRoTW9kdWxlID0gbmV3IEFic3RyYWN0TW9kdWxlKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICAgIGJpbmQoRmlsZS5jbGFzcykuYW5ub3RhdGVkV2l0aChTaXRlUGF0aC5jbGFzcykudG9JbnN0YW5jZShzaXRlUGF0aCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBtb2R1bGVzLmFkZChzaXRlUGF0aE1vZHVsZSk7CisKKyAgICAgIE1vZHVsZSBjb25maWdNb2R1bGUgPSBuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCk7CisgICAgICBtb2R1bGVzLmFkZChjb25maWdNb2R1bGUpOworCisgICAgICBJbmplY3RvciBjZmdJbmplY3RvciA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKHNpdGVQYXRoTW9kdWxlLCBjb25maWdNb2R1bGUpOworICAgICAgQ29uZmlnIGNmZyA9IGNmZ0luamVjdG9yLmdldEluc3RhbmNlKEtleS5nZXQoQ29uZmlnLmNsYXNzLAorICAgICAgICAgIEdlcnJpdFNlcnZlckNvbmZpZy5jbGFzcykpOworICAgICAgU3RyaW5nIGRiVHlwZSA9IGNmZy5nZXRTdHJpbmcoImRhdGFiYXNlIiwgbnVsbCwgInR5cGUiKTsKKworICAgICAgZmluYWwgRGF0YVNvdXJjZVR5cGUgZHN0ID0gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IERhdGFTb3VyY2VNb2R1bGUoKSwKKyAgICAgICAgICBjb25maWdNb2R1bGUsIHNpdGVQYXRoTW9kdWxlKS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgIEtleS5nZXQoRGF0YVNvdXJjZVR5cGUuY2xhc3MsIE5hbWVzLm5hbWVkKGRiVHlwZS50b0xvd2VyQ2FzZSgpKSkpOworICAgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLnRvSW5zdGFuY2UoZHN0KTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIG1vZHVsZXMuYWRkKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgICAgICAgYmluZChEYXRhU291cmNlUHJvdmlkZXIuQ29udGV4dC5jbGFzcykudG9JbnN0YW5jZSgKICAgICAgICAgICAgICAgRGF0YVNvdXJjZVByb3ZpZGVyLkNvbnRleHQuTVVMVElfVVNFUik7CiAgICAgICAgICAgYmluZChLZXkuZ2V0KERhdGFTb3VyY2UuY2xhc3MsIE5hbWVzLm5hbWVkKCJSZXZpZXdEYiIpKSkudG9Qcm92aWRlcigKQEAgLTE1NSw3ICsxODcsNiBAQAogICAgICAgICAgIGxpc3RlbmVyKCkudG8oRGF0YVNvdXJjZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgfQogICAgICAgfSk7Ci0gICAgICBtb2R1bGVzLmFkZChuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCkpOwogCiAgICAgfSBlbHNlIHsKICAgICAgIG1vZHVsZXMuYWRkKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7CkBAIC0xOTksMTEgKzIzMCwxMSBAQAogICAgIG1vZHVsZXMuYWRkKG5ldyBXb3JrUXVldWUuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBDaGFuZ2VIb29rUnVubmVyLk1vZHVsZSgpKTsKICAgICBtb2R1bGVzLmFkZChuZXcgUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZSgpKTsKKyAgICBtb2R1bGVzLmFkZChuZXcgSW50cmFMaW5lV29ya2VyUG9vbC5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQoY2ZnSW5qZWN0b3IuZ2V0SW5zdGFuY2UoR2Vycml0R2xvYmFsTW9kdWxlLmNsYXNzKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IERlZmF1bHRDYWNoZUZhY3RvcnkuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTbXRwRW1haWxTZW5kZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTaWduZWRUb2tlbkVtYWlsVG9rZW5WZXJpZmllci5Nb2R1bGUoKSk7Ci0gICAgbW9kdWxlcy5hZGQobmV3IFNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBQbHVnaW5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IENhbm9uaWNhbFdlYlVybE1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMjExLDcgKzI0MiwxNCBAQAogICAgICAgICByZXR1cm4gSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmNsYXNzOwogICAgICAgfQogICAgIH0pOworICAgIG1vZHVsZXMuYWRkKFNzaEtleUNhY2hlSW1wbC5tb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IE1hc3Rlck5vZGVTdGFydHVwKCkpOworICAgIG1vZHVsZXMuYWRkKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKEdlcnJpdFVpT3B0aW9ucy5jbGFzcykudG9JbnN0YW5jZShuZXcgR2Vycml0VWlPcHRpb25zKGZhbHNlKSk7CisgICAgICB9CisgICAgfSk7CiAgICAgcmV0dXJuIGNmZ0luamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobW9kdWxlcyk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXdhci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL2dlcnJpdC13YXIvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKaW5kZXggNDVmNjMwZS4uMWZjY2E2ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXdhci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgYi9nZXJyaXQtd2FyL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0zOCwxMCArMzgsOCBAQAogCiAjIFNpbGVuY2Ugbm9uLWNyaXRpY2FsIG1lc3NhZ2VzIGZyb20gb3BlbmlkNGphdmEKICMKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmh0dHA9V0FSTgogbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUueG1sPVdBUk4KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmU9V0FSTgotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PVdBUk4KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kQmFzZT1FUlJPUgogbG9nNGoubG9nZ2VyLm9yZy5vcGVuaWQ0amF2YT1XQVJOCiBsb2c0ai5sb2dnZXIub3JnLm9wZW5pZDRqYXZhLmNvbnN1bWVyLkNvbnN1bWVyTWFuYWdlcj1GQVRBTAogbG9nNGoubG9nZ2VyLm9yZy5vcGVuaWQ0amF2YS5kaXNjb3ZlcnkuRGlzY292ZXJ5PUVSUk9SCkBAIC01NywzICs1NSw2IEBACiAjIFNpbGVuY2Ugbm9uLWNyaXRpY2FsIG1lc3NhZ2VzIGZyb20gVmVsb2NpdHkKICMKIGxvZzRqLmxvZ2dlci52ZWxvY2l0eT1XQVJOCisKKyMgU2lsZW5jZSBub24tY3JpdGljYWwgbWVzc2FnZXMgZnJvbSBhcGFjaGUuaHR0cAorbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuaHR0cD1XQVJOCmRpZmYgLS1naXQgYS9wbHVnaW5zL1JFQURNRSBiL3BsdWdpbnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL1JFQURNRQpAQCAtMCwwICsxLDExIEBACitJZiB5b3UgYXJlIGFkZGluZyBhIGRpcmVjdG9yeSBoZXJlOgorCistIFNlYXJjaCBhbGwgcG9tLnhtbCBmaWxlcyBmb3IgIkNPUkUgUExVR0lOIExJU1QiLgorLSBBZGQgdGhlIG5ldyBwbHVnaW4gdG8gdGhhdCBsb2NhdGlvbi4KKy0gKG9wdGlvbmFsKSBUaGFuayB0aGUgTWF2ZW4gZGV2ZWxvcGVycyBmb3IgbWFraW5nIHRoaXMgZWFzeS4KKworLSBFbnN1cmUgdGhlIHBsdWdpbidzIHBvbS54bWwgPHZlcnNpb24+IGlzIHRoZSBzYW1lIGFzIEdlcnJpdCdzCisgIG93biBwb20ueG1sKHMpLiBHZXJyaXQgd2lsbCBvbmx5IGVtYmVkIGEgcGx1Z2luIHRoYXQgaGFzIHRoZQorICBzYW1lIHZlcnNpb24gYXMgaXRzZWxmLgorCistIFJlZ2lzdGVyIHRoZSBwbHVnaW4gYXMgYSBzdWJtb2R1bGUgd2l0aCBnaXQgc3VibW9kdWxlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yIGIvcGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yCm5ldyBmaWxlIG1vZGUgMTYwMDAwCmluZGV4IDAwMDAwMDAuLjc0ZWM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IKQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgNzRlYzU0ZmVjZGQzOTM2NTQxZDg1MTU3YTVkZDJiMDIyYjQxNjk0MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXBsaWNhdGlvbiBiL3BsdWdpbnMvcmVwbGljYXRpb24KbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uZWU2ODdkNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmVwbGljYXRpb24KQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgZWU2ODdkNDJiZmY3ZDFhODI2MGQ3ODI2NTQzOTJiNTBjNjk0MjE2ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXZpZXdub3RlcyBiL3BsdWdpbnMvcmV2aWV3bm90ZXMKbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uMzdkYjVjZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmV2aWV3bm90ZXMKQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgMzdkYjVjZmJiMjczNzViZmJmYWFiMjFlZWQ1MjA1MDllZTFkMDcxMApkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggZWNhNDkwMi4uYmU1YWNjZiAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjIuNi1TTkFQU0hPVDwvdmVyc2lvbj4KIAogICA8bmFtZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBQYXJlbnQ8L25hbWU+CiAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC88L3VybD4KQEAgLTQ2LDE0ICs0NiwxNSBAQAogICA8L2lzc3VlTWFuYWdlbWVudD4KIAogICA8cHJvcGVydGllcz4KLSAgICA8amdpdFZlcnNpb24+Mi4wLjAuMjAxMjA2MTMwOTAwLXIuMjMtZ2IzZGJmMTk8L2pnaXRWZXJzaW9uPgotICAgIDxnd3Rvcm1WZXJzaW9uPjEuNDwvZ3d0b3JtVmVyc2lvbj4KKyAgICA8amdpdFZlcnNpb24+Mi4zLjEuMjAxMzAyMjAxODM4LXIuMjA4LWc3NWUxYmRiPC9qZ2l0VmVyc2lvbj4KKyAgICA8Z3d0b3JtVmVyc2lvbj4xLjY8L2d3dG9ybVZlcnNpb24+CiAgICAgPGd3dGpzb25ycGNWZXJzaW9uPjEuMzwvZ3d0anNvbnJwY1ZlcnNpb24+Ci0gICAgPGd3dGV4cHVpVmVyc2lvbj4xLjIuNjwvZ3d0ZXhwdWlWZXJzaW9uPgotICAgIDxnd3RWZXJzaW9uPjIuNC4wPC9nd3RWZXJzaW9uPgorICAgIDxnd3RleHB1aVZlcnNpb24+MS4zLjI8L2d3dGV4cHVpVmVyc2lvbj4KKyAgICA8Z3d0VmVyc2lvbj4yLjUuMDwvZ3d0VmVyc2lvbj4KKyAgICA8Ym91bmN5Q2FzdGxlVmVyc2lvbj4xNDA8L2JvdW5jeUNhc3RsZVZlcnNpb24+CiAgICAgPHNsZjRqVmVyc2lvbj4xLjYuMTwvc2xmNGpWZXJzaW9uPgogICAgIDxndWljZVZlcnNpb24+My4wPC9ndWljZVZlcnNpb24+Ci0gICAgPGpldHR5VmVyc2lvbj43LjIuMS52MjAxMDExMTE8L2pldHR5VmVyc2lvbj4KKyAgICA8amV0dHlWZXJzaW9uPjguMS43LnYyMDEyMDkxMDwvamV0dHlWZXJzaW9uPgogCiAgICAgPGd3dC5jb21waWxlUmVwb3J0PmZhbHNlPC9nd3QuY29tcGlsZVJlcG9ydD4KIApAQCAtNzYsNiArNzcsNyBAQAogICAgIDxtb2R1bGU+Z2Vycml0LWNvbW1vbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LWNhY2hlLWgyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5nZXJyaXQtaHR0cGQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmdlcnJpdC1nd3R1aTwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LWxhdW5jaGVyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5nZXJyaXQtbWFpbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LW9wZW5pZDwvbW9kdWxlPgpAQCAtODcsMjQgKzg5LDI5IEBACiAgICAgPG1vZHVsZT5nZXJyaXQtZ3d0ZGVidWc8L21vZHVsZT4KICAgICA8bW9kdWxlPmdlcnJpdC13YXI8L21vZHVsZT4KIAorICAgIDxtb2R1bGU+Z2Vycml0LWFjY2VwdGFuY2UtdGVzdHM8L21vZHVsZT4KICAgICA8bW9kdWxlPmdlcnJpdC1leHRlbnNpb24tYXBpPC9tb2R1bGU+Ci0KLSAgICA8bW9kdWxlPmdlcnJpdC1nd3R1aTwvbW9kdWxlPgorICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1hcGk8L21vZHVsZT4KKyAgICA8bW9kdWxlPmdlcnJpdC1wbHVnaW4tYXJjaGV0eXBlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5nZXJyaXQtcGx1Z2luLWd3dHVpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZTwvbW9kdWxlPgorICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlPC9tb2R1bGU+CiAgIDwvbW9kdWxlcz4KIAogICA8cHJvZmlsZXM+CiAgICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+YWxsPC9pZD4KLSAgICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPmdlcnJpdC1wbHVnaW4tYXBpPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1hcmNoZXR5cGU8L21vZHVsZT4KLSAgICAgIDwvbW9kdWxlcz4KLSAgICA8L3Byb2ZpbGU+Ci0gICAgPHByb2ZpbGU+CisgICAgICA8aWQ+cGx1Z2luczwvaWQ+CiAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICA8bmFtZT4hZ2Vycml0LnBsdWdpbnMuc2tpcDwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgIDxpZD5uby1wbHVnaW5zPC9pZD4KKyAgICAgIDxtb2R1bGVzPgorICAgICAgICA8IS0tIENPUkUgUExVR0lOIExJU1QgLS0+CisgICAgICAgIDxtb2R1bGU+cGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cGx1Z2lucy9yZXBsaWNhdGlvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBsdWdpbnMvcmV2aWV3bm90ZXM8L21vZHVsZT4KKyAgICAgIDwvbW9kdWxlcz4KICAgICA8L3Byb2ZpbGU+CiAgIDwvcHJvZmlsZXM+CiAKQEAgLTM2OSw3ICszNzYsMTMgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi4xMzwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KQEAgLTM4MSw3ICszOTQsNyBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+Mi41LjA8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgogCiAgICAgICAgIDxwbHVnaW4+CkBAIC00MDksNyArNDIyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KICAgICAgICAgICAgICAgICAgIDxhY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZ25vcmUvPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGU+CisgICAgICAgICAgICAgICAgICAgICAgPHJ1bk9uSW5jcmVtZW50YWw+ZmFsc2U8L3J1bk9uSW5jcmVtZW50YWw+CisgICAgICAgICAgICAgICAgICAgICAgPHJ1bk9uQ29uZmlndXJhdGlvbj50cnVlPC9ydW5PbkNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0ZT4KICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgogICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgogICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CkBAIC00MjIsNyArNDM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KICAgICAgICAgICAgICAgICAgIDxhY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZ25vcmUvPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8cnVuT25JbmNyZW1lbnRhbD5mYWxzZTwvcnVuT25JbmNyZW1lbnRhbD4KKyAgICAgICAgICAgICAgICAgICAgICA8cnVuT25Db25maWd1cmF0aW9uPnRydWU8L3J1bk9uQ29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGU+CiAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgpAQCAtNDc4LDcgKzQ5Nyw3IEBACiAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEyLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MTQuMDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CkBAIC01NjMsNyArNTgyLDcgQEAKICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC41LjEtcjEwOTU4MDk8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjAuNi4wPC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTY4OCw3ICs3MDcsMTMgQEAKICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmJjcGctamRrMTU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+JHtib3VuY3lDYXN0bGVWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YmNwcm92LWpkazE1PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2JvdW5jeUNhc3RsZVZlcnNpb259PC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTc2MSwxOSArNzg2LDE5IEBACiAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPmNvbS5oMmRhdGFiYXNlPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5oMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE0NzwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MS4zLjE2ODwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPnBvc3RncmVzcWw8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnBvc3RncmVzcWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjkuMC04MDEuamRiYzQ8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjkuMS05MDEtMS5qZGJjNDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CkBAIC03ODMsOCArODA4LDggQEAKICAgICAgICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgIDwhLS0gdXNlIEFwYWNoZSBqYXZheC5zZXJ2bGV0IG5vdCBDRERMIC0tPgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHkub3JiaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0PC9hcnRpZmFjdElkPgogICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICA8L2RlcGVuZGVuY3k+CkBAIC04MDIsNiArODI3LDEyIEBACiAgICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dG9tY2F0LXNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj43LjAuMzI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPiR7Z3d0VmVyc2lvbn08L3ZlcnNpb24+CkBAIC04MjYsNyArODU3LDcgQEAKICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qdW5pdmVyc2FsY2hhcmRldDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXZlcnNhbGNoYXJkZXQ8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgpAQCAtODQ4LDYgKzg3OSwxNyBAQAogICAgICAgICA8YXJ0aWZhY3RJZD5wZWdkb3duPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4xLjEuMDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5wYXJib2lsZWQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBhcmJvaWxlZC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjEuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcucGFyYm9pbGVkPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wYXJib2lsZWQtamF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xLjM8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPC9kZXBlbmRlbmNpZXM+CiAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CiAKQEAgLTg2OCwxMSArOTEwLDYgQEAKICAgICA8L3JlcG9zaXRvcnk+CiAKICAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpZD5vYmplY3R3ZWItcmVwb3NpdG9yeTwvaWQ+Ci0gICAgICA8dXJsPmh0dHA6Ly9tYXZlbi5vYmplY3R3ZWIub3JnL21hdmVuMi88L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0KLSAgICA8cmVwb3NpdG9yeT4KICAgICAgIDxpZD5jbG9qYXJzLXJlcG88L2lkPgogICAgICAgPHVybD5odHRwOi8vY2xvamFycy5vcmcvcmVwbzwvdXJsPgogICAgIDwvcmVwb3NpdG9yeT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2Uuc2ggYi90b29scy9yZWxlYXNlLnNoCmluZGV4IGRlMTgzNTcuLjg4ZTRhMDAgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2Uuc2gKKysrIGIvdG9vbHMvcmVsZWFzZS5zaApAQCAtMSwxNiArMSwyNSBAQAogIyEvYmluL3NoCiAKLWluY2x1ZGVfZG9jcz0tRGdlcnJpdC5pbmNsdWRlLWRvY3VtZW50YXRpb249MQorZmxhZ3M9CiAKIHdoaWxlIFsgJCMgLWd0IDAgXQogZG8KIAljYXNlICIkMSIgaW4KIAktLW5vLWRvY3VtZW50YXRpb258LS13aXRob3V0LWRvY3VtZW50YXRpb24pCi0JCWluY2x1ZGVfZG9jcz0KKwkJZmxhZ3M9IiRmbGFncyAtRGdlcnJpdC5kb2N1bWVudGF0aW9uLnNraXA9dHJ1ZSIKKwkJc2hpZnQKKwkJOzsKKwktLW5vLXBsdWdpbnN8LS13aXRob3V0LXBsdWdpbnMpCisJCWZsYWdzPSIkZmxhZ3MgLURnZXJyaXQucGx1Z2lucy5za2lwPXRydWUiCisJCXNoaWZ0CisJCTs7CisJLS1uby10ZXN0c3wtLXdpdGhvdXQtdGVzdHMpCisJCWZsYWdzPSIkZmxhZ3MgLURnZXJyaXQuYWNjZXB0YW5jZS10ZXN0cy5za2lwPXRydWUiCisJCWZsYWdzPSIkZmxhZ3MgLURtYXZlbi50ZXN0cy5za2lwPXRydWUiCiAJCXNoaWZ0CiAJCTs7CiAJKikKLQkJZWNobyA+JjIgInVzYWdlOiAkMCBbLS13aXRob3V0LWRvY3VtZW50YXRpb25dIgorCQllY2hvID4mMiAidXNhZ2U6ICQwIFstLW5vLWRvY3VtZW50YXRpb25dIFstLW5vLXBsdWdpbnNdIFstLW5vLXRlc3RzXSIKIAkJZXhpdCAxCiAJZXNhYwogZG9uZQpAQCAtMjUsNyArMzQsNyBAQAogZmkKIAogLi90b29scy92ZXJzaW9uLnNoIC0tcmVsZWFzZSAmJgotbXZuIGNsZWFuIGluc3RhbGwgJGluY2x1ZGVfZG9jcyAtUCBhbGwKK212biBjbGVhbiBwYWNrYWdlIHZlcmlmeSAkZmxhZ3MKIHJjPSQ/CiAuL3Rvb2xzL3ZlcnNpb24uc2ggLS1yZXNldAogCmRpZmYgLS1naXQgYS90b29scy92ZXJzaW9uLnNoIGIvdG9vbHMvdmVyc2lvbi5zaAppbmRleCBkM2U0Y2Q1Li5kZWYwOTlkIDEwMDc1NQotLS0gYS90b29scy92ZXJzaW9uLnNoCisrKyBiL3Rvb2xzL3ZlcnNpb24uc2gKQEAgLTYsNyArNiwxNSBAQAogIyBKYXZhIGJhc2VkIE1hdmVuIHBsdWdpbiBzbyBpdHMgZnVsbHkgcG9ydGFibGUuCiAjCiAKLVBPTV9GSUxFUz0kKGdpdCBscy1maWxlcyB8IGdyZXAgcG9tLnhtbCB8IGdyZXAgLXYgZ2Vycml0LXBsdWdpbi1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCkKK1NFUlZFUl9QT01TPSQoZ2l0IGxzLWZpbGVzIHwgZ3JlcCBwb20ueG1sIHwgZ3JlcCAtdiAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCkKK1BPTV9GSUxFUz0kU0VSVkVSX1BPTVMKKworIyBDT1JFIFBMVUdJTiBMSVNUCitQTFVHSU5TPSJjb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yIHJlcGxpY2F0aW9uIHJldmlld25vdGVzIgorZm9yIHAgaW4gJFBMVUdJTlMKK2RvCisJUE9NX0ZJTEVTPSIkUE9NX0ZJTEVTICQoY2QgcGx1Z2lucy8kcCAmJiBnaXQgbHMtZmlsZXMgfCBncmVwIHBvbS54bWwgfCBzZWQgcyxeLHBsdWdpbnMvJHAvLCkiCitkb25lCiAKIGNhc2UgIiQxIiBpbgogLS1zbmFwc2hvdD0qKQpAQCAtMjcsNyArMzUsMTEgQEAKIAk7OwogCiAtLXJlc2V0KQotCWdpdCBjaGVja291dCBIRUFEIC0tICRQT01fRklMRVMKKwlnaXQgY2hlY2tvdXQgSEVBRCAtLSAkU0VSVkVSX1BPTVMKKwlmb3IgcCBpbiAkUExVR0lOUworCWRvCisJCShjZCBwbHVnaW5zLyRwOyBnaXQgY2hlY2tvdXQgJChnaXQgbHMtZmlsZXMgfCBncmVwIHBvbS54bWwpKQorCWRvbmUKIAlleGl0ICQ/CiAJOzsKIApAQCAtNDAsNyArNTIsNyBAQAogdiopIFY9JChlY2hvICIkViIgfCBwZXJsIC1wZSBzL152Ly8pIDs7CiBlc2FjCiAKLXBlcmwgLXBpIC1lICcKK3BlcmwgLXBpLmJhayAtZSAnCiAJaWYgKCRBUkdWIG5lICRvbGRfYXJndikgewogCQkkc2Vlbl92ZXJzaW9uID0gMDsKIAkJJG9sZF9hcmd2ID0gJEFSR1Y7CkBAIC01MCwzICs2Miw4IEBACiAJCXN7KDx2ZXJzaW9uPikuKig8L3ZlcnNpb24+KX17JHsxfSciJFYiJyR7Mn19OwogCX0KIAknICRQT01fRklMRVMKKworZm9yIHBvbSBpbiAkUE9NX0ZJTEVTCitkbworCXJtIC1mICR7cG9tfS5iYWsKK2RvbmUK